diff options
Diffstat (limited to 'pkg/lang/vm/exec.go')
| -rw-r--r-- | pkg/lang/vm/exec.go | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/pkg/lang/vm/exec.go b/pkg/lang/vm/exec.go index be72158..4fbc516 100644 --- a/pkg/lang/vm/exec.go +++ b/pkg/lang/vm/exec.go @@ -69,6 +69,23 @@ func (vm *VM) execGetLocal(offset int) error { return nil } +func (vm *VM) execSetLocal(offset int) error { + new, err := vm.stack.Pop() + if err != nil { + return err + } + + local, err := vm.stack.Local(int(offset)) + if err != nil { + return err + } + + local.Drop(vm.memory) + + stackIndex := vm.stack.LocalToStackIndex(offset) + return vm.stack.Set(stackIndex, new) +} + func (vm *VM) execPushType(name string) error { ref, err := value.NewType(vm.memory, name) if err != nil { @@ -556,6 +573,44 @@ func (vm *VM) execSub() error { return nil } +func (vm *VM) execMod() error { + x, err := vm.popAndDrop() + if err != nil { + return err + } + y, err := vm.popAndDrop() + if err != nil { + return err + } + + var res value.Value + + switch x.Type() { + case value.IntType: + xv := x.Data().(value.IntData).Get() + switch y.Type() { + case value.IntType: + yv := y.Data().(value.IntData).Get() + res = value.NewInt(xv % yv) + default: + return ErrInvalidOperandTypes{ + Op: code.OpMod, + X: x.Type(), + Y: y.Type(), + } + } + default: + return ErrInvalidOperandTypes{ + Op: code.OpMod, + X: x.Type(), + Y: y.Type(), + } + } + + vm.stack.Push(res) + return nil +} + func (vm *VM) execIndex() error { v, err := vm.popAndDrop() if err != nil { |
