Something went wrong. Try again.
🌱 A minimal programming language and compiler. git.urbach.dev/cli/q
high-performance programming-language compiler
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263package core
import ( "git.urbach.dev/cli/q/src/errors" "git.urbach.dev/cli/q/src/expression" "git.urbach.dev/cli/q/src/ssa" "git.urbach.dev/cli/q/src/token" "git.urbach.dev/cli/q/src/types")
// evaluateArray converts a array indexing expression to an SSA value.func (f *Function) evaluateArray(expr *expression.Expression) (ssa.Value, error) { address := expr.Children[0] addressValue, err := f.evaluateRight(address)
if err != nil { return nil, err }
addressValue, addressType, length, err := f.decomposeSlice(addressValue)
if err != nil { return nil, err }
pointer, isPointer := types.Unwrap(addressType).(*types.Pointer)
if !isPointer { return nil, errors.New(&TypeNotIndexable{TypeName: addressType.Name()}, f.File, address.Source()) }
var indexValue ssa.Value
if len(expr.Children) > 1 { index := expr.Children[1]
if index.Token.Kind == token.Range { return f.evaluateSlice(expr, index, addressValue, length) } else { indexValue, err = f.evaluateRight(index)
if err != nil { return nil, err }
if !types.Is(indexValue.Type(), types.AnyInt) { return nil, errors.New(&TypeMismatch{Encountered: indexValue.Type().Name(), Expected: types.AnyInt.Name()}, f.File, index.Source()) } } } else { indexValue = f.Append(&ssa.Int{Int: 0}) }
memory := &ssa.Memory{ Address: addressValue, Index: indexValue, Scale: true, Typ: pointer.To, Source: expr.Source(), }
return memory, nil}