diff options
| author | Mel <einebeere@gmail.com> | 2022-05-27 00:09:27 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-05-27 00:09:27 +0000 |
| commit | c2d4bf51de9a2d721168c62b14b89f5281ed366e (patch) | |
| tree | 09329cd24249e46fe6660fa9bd1f0efac29af38f /pkg/lang/vm/exec.go | |
| parent | 3f4efe745a0404953266476ec52db54b182de2f8 (diff) | |
| download | jinx-c2d4bf51de9a2d721168c62b14b89f5281ed366e.tar.zst jinx-c2d4bf51de9a2d721168c62b14b89f5281ed366e.zip | |
VM ARC
Diffstat (limited to 'pkg/lang/vm/exec.go')
| -rw-r--r-- | pkg/lang/vm/exec.go | 53 |
1 files changed, 30 insertions, 23 deletions
diff --git a/pkg/lang/vm/exec.go b/pkg/lang/vm/exec.go index 655f7f1..90b79a9 100644 --- a/pkg/lang/vm/exec.go +++ b/pkg/lang/vm/exec.go @@ -14,7 +14,7 @@ func (vm *VM) execPushFloat(x float64) { } func (vm *VM) execPushString(str string) { - vm.stack.Push(value.NewString(str)) + vm.stack.Push(value.NewString(&vm.memory, str)) } func (vm *VM) execPushBool(b bool) { @@ -26,7 +26,7 @@ func (vm *VM) execPushNull() { } func (vm *VM) execPushArray() { - vm.stack.Push(value.NewArray([]value.Value{})) + vm.stack.Push(value.NewArray(&vm.memory, []value.Value{})) } func (vm *VM) execPushFunction(pc int) { @@ -39,16 +39,18 @@ func (vm *VM) execGetLocal(offset int) error { return err } - vm.stack.Push(local) + v := local.Clone(&vm.memory) + + vm.stack.Push(v) return nil } func (vm *VM) execAdd() error { - x, err := vm.stack.Pop() + x, err := vm.popAndDrop() if err != nil { return err } - y, err := vm.stack.Pop() + y, err := vm.popAndDrop() if err != nil { return err } @@ -91,7 +93,8 @@ func (vm *VM) execAdd() error { case value.StringType: switch y.Type().Kind { case value.StringType: - res = value.NewString(x.Data().(value.StringData).Get() + y.Data().(value.StringData).Get()) + panic("not implemented") + // res = value.NewString(x.Data().(value.StringData).Get() + y.Data().(value.StringData).Get()) default: return ErrInvalidOperandTypes{ Op: code.OpAdd, @@ -112,11 +115,11 @@ func (vm *VM) execAdd() error { } func (vm *VM) execSub() error { - x, err := vm.stack.Pop() + x, err := vm.popAndDrop() if err != nil { return err } - y, err := vm.stack.Pop() + y, err := vm.popAndDrop() if err != nil { return err } @@ -169,11 +172,11 @@ func (vm *VM) execSub() error { } func (vm *VM) execIndex() error { - v, err := vm.stack.Pop() + v, err := vm.popAndDrop() if err != nil { return err } - i, err := vm.stack.Pop() + i, err := vm.popAndDrop() if err != nil { return err } @@ -184,13 +187,16 @@ func (vm *VM) execIndex() error { switch i.Type().Kind { case value.IntType: idx := i.Data().(value.IntData).Get() - if idx < 0 || idx >= int64(arr.Len()) { + len := int64(arr.Len(&vm.memory)) + if idx < 0 || idx >= len { return ErrArrayIndexOutOfBounds{ Index: int(idx), - Len: arr.Len(), + Len: int(len), } } - vm.stack.Push(arr.At(int(idx))) + + val := arr.At(&vm.memory, int(idx)).Clone(&vm.memory) + vm.stack.Push(val) default: return ErrInvalidOperandTypes{ Op: code.OpIndex, @@ -210,11 +216,11 @@ func (vm *VM) execIndex() error { } func (vm *VM) execLte() error { - x, err := vm.stack.Pop() + x, err := vm.popAndDrop() if err != nil { return err } - y, err := vm.stack.Pop() + y, err := vm.popAndDrop() if err != nil { return err } @@ -267,7 +273,7 @@ func (vm *VM) execLte() error { } func (vm *VM) execCall() error { - f, err := vm.stack.Pop() + f, err := vm.popAndDrop() if err != nil { return err } @@ -291,7 +297,7 @@ func (vm *VM) execCall() error { } func (vm *VM) execJumpIf(pc int, cond bool) error { - b, err := vm.stack.Pop() + b, err := vm.popAndDrop() if err != nil { return err } @@ -325,7 +331,7 @@ func (vm *VM) execRet() error { return err } - pc, err := vm.stack.PopCall() + pc, err := vm.popCallAndDrop() if err != nil { return err } @@ -336,7 +342,7 @@ func (vm *VM) execRet() error { } func (vm *VM) execTempArrLen() error { - a, err := vm.stack.Pop() + a, err := vm.popAndDrop() if err != nil { return err } @@ -344,7 +350,8 @@ func (vm *VM) execTempArrLen() error { switch a.Type().Kind { case value.ArrayType: arr := a.Data().(value.ArrayData) - res := value.NewInt(int64(arr.Len())) + len := int64(arr.Len(&vm.memory)) + res := value.NewInt(len) vm.stack.Push(res) default: return ErrInvalidOperandTypes{ @@ -357,11 +364,11 @@ func (vm *VM) execTempArrLen() error { } func (vm *VM) execTempArrPush() error { - a, err := vm.stack.Pop() + a, err := vm.popAndDrop() if err != nil { return err } - e, err := vm.stack.Pop() + e, err := vm.popAndDrop() if err != nil { return err } @@ -369,7 +376,7 @@ func (vm *VM) execTempArrPush() error { switch a.Type().Kind { case value.ArrayType: arr := a.Data().(value.ArrayData) - arr.Push(e) + arr.Push(&vm.memory, e) default: return ErrInvalidOperandType{ Op: code.OpTempArrPush, |
