q/src/core/CompileMemoryStore.go

37 lines
840 B
Go

package core
import (
"git.urbach.dev/cli/q/src/asm"
"git.urbach.dev/cli/q/src/errors"
"git.urbach.dev/cli/q/src/expression"
)
// CompileMemoryStore compiles a variable-width store to memory.
func (f *Function) CompileMemoryStore(root *expression.Expression) error {
parameters := root.Children[1:]
name := parameters[0].Token.Text(f.File.Bytes)
numBytes, err := f.ToNumber(parameters[1].Token)
if err != nil {
return err
}
value := parameters[2]
variable := f.VariableByName(name)
if variable == nil {
return errors.New(&errors.UnknownIdentifier{Name: name}, f.File, parameters[0].Token.Position)
}
defer f.UseVariable(variable)
memory := asm.Memory{
Base: variable.Value.Register,
OffsetRegister: -1,
Length: byte(numBytes),
}
_, err = f.ExpressionToMemory(value, memory)
return err
}