package core import ( "fmt" "git.urbach.dev/cli/q/src/asm" "git.urbach.dev/cli/q/src/eval" "git.urbach.dev/cli/q/src/expression" "git.urbach.dev/cli/q/src/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) { value, err := f.Evaluate(node) if err != nil { return nil, err } switch value := value.(type) { case eval.Number: f.MemoryNumber(asm.STORE, memory, value.Number) case eval.Register: f.MemoryRegister(asm.STORE, memory, value.Register) f.FreeRegister(value.Register) case eval.Memory: tmp := f.NewRegister() f.MemoryRegister(asm.LOAD, value.Memory, tmp) f.MemoryRegister(asm.STORE, memory, tmp) f.FreeRegister(tmp) case eval.Label: f.MemoryLabel(asm.STORE, memory, value.Label) default: panic(fmt.Errorf("%s: not implemented: %v", f.UniqueName, value)) } return value.Type(), err }