package core import ( "git.akyoto.dev/cli/q/src/build/asm" "git.akyoto.dev/cli/q/src/build/errors" "git.akyoto.dev/cli/q/src/build/expression" "git.akyoto.dev/cli/q/src/build/sizeof" "git.akyoto.dev/cli/q/src/build/types" ) // ExpressionToMemory puts the result of an expression into the specified memory address. func (f *Function) ExpressionToMemory(node *expression.Expression, memory asm.Memory) (types.Type, error) { if node.IsLeaf() && node.Token.IsNumeric() { number, err := f.Number(node.Token) if err != nil { return types.Invalid, err } size := byte(sizeof.Signed(int64(number))) if size != memory.Length { return types.Invalid, errors.New(&errors.NumberExceedsBounds{Number: number, ExpectedSize: memory.Length, Size: size}, f.File, node.Token.Position) } f.MemoryNumber(asm.STORE, memory, number) return types.Int, nil } tmp := f.NewRegister() defer f.FreeRegister(tmp) typ, err := f.ExpressionToRegister(node, tmp) f.MemoryRegister(asm.STORE, memory, tmp) return typ, err }