package core import ( "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/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), } index := left.Children[1] if index.Token.IsNumeric() { offset, err := f.ToNumber(index.Token) if err != nil { return err } memory.Offset = int8(offset) } else { typ, indexRegister, isTemporary, err := f.Evaluate(index) if err != nil { return err } if !types.Is(typ, types.Int) { return errors.New(&errors.TypeMismatch{Encountered: typ.Name(), Expected: types.Int.Name()}, f.File, index.Token.Position) } memory.OffsetRegister = indexRegister if isTemporary { defer f.FreeRegister(indexRegister) } } _, err := f.ExpressionToMemory(right, memory) return err }