package core import ( "fmt" "math" "git.urbach.dev/cli/q/src/asm" "git.urbach.dev/cli/q/src/ast" "git.urbach.dev/cli/q/src/errors" "git.urbach.dev/cli/q/src/eval" "git.urbach.dev/cli/q/src/types" ) // CompileAssignArray compiles an assign statement for array elements. func (f *Function) CompileAssignArray(node *ast.Assign) error { left := node.Expression.Children[0] right := node.Expression.Children[1] name := left.Children[0].Token.Text(f.File.Bytes) variable := f.VariableByName(name) if variable == nil { return errors.New(&errors.UnknownIdentifier{Name: name}, f.File, left.Children[0].Token.Position) } defer f.UseVariable(variable) memory := asm.Memory{ Base: variable.Register, Offset: 0, OffsetRegister: math.MaxUint8, Length: byte(1), } indexExpr := left.Children[1] index, err := f.Evaluate(indexExpr) if err != nil { return err } if !types.Is(index.Type, types.AnyInt) { return errors.New(&errors.TypeMismatch{Encountered: index.Type.Name(), Expected: types.AnyInt.Name()}, f.File, indexExpr.Token.Position) } switch index.Kind { case eval.Number: memory.Offset = int8(index.Number) case eval.Register: memory.OffsetRegister = index.Register defer f.FreeRegister(index.Register) default: panic(fmt.Errorf("%s: not implemented: %d", f.UniqueName, index.Kind)) } _, err = f.ExpressionToMemory(right, memory) return err }