about summary refs log tree commit diff
path: root/pkg/lang/vm/vm.go
diff options
context:
space:
mode:
authorMel <einebeere@gmail.com>2022-05-20 20:28:17 +0200
committerMel <einebeere@gmail.com>2022-05-20 20:28:17 +0200
commit6fe6e6546c4801f850d943c699fccdd5dc6ea723 (patch)
tree560aab21c9e76047730773ac4bd694e570ffc06e /pkg/lang/vm/vm.go
parent20d84ae7ffd8a8e4c9397470e5b0459fec9a86ba (diff)
downloadjinx-6fe6e6546c4801f850d943c699fccdd5dc6ea723.tar.zst
jinx-6fe6e6546c4801f850d943c699fccdd5dc6ea723.zip
Continuous VM stack implementation
Diffstat (limited to 'pkg/lang/vm/vm.go')
-rw-r--r--pkg/lang/vm/vm.go15
1 files changed, 9 insertions, 6 deletions
diff --git a/pkg/lang/vm/vm.go b/pkg/lang/vm/vm.go
index 8fdc0d5..a428bfd 100644
--- a/pkg/lang/vm/vm.go
+++ b/pkg/lang/vm/vm.go
@@ -8,19 +8,19 @@ import (
 type VM struct {
 	code  *code.Code
 	pc    int
-	stack CallStack
+	stack Stack
 }
 
 func New(code *code.Code) *VM {
 	return &VM{
 		code:  code,
 		pc:    0,
-		stack: NewCallStack(),
+		stack: NewStack(),
 	}
 }
 
 func (vm *VM) GetResult() (string, error) {
-	res, err := vm.stack.Top().Pop()
+	res, err := vm.stack.Pop()
 	if err != nil {
 		return "", err
 	}
@@ -89,8 +89,13 @@ func (vm *VM) step(op code.Op) (stepDecision, error) {
 	case code.OpPushObject:
 		panic("not implemented")
 
+	case code.OpShift:
+		by, advance := vm.code.GetInt(vm.pc)
+		vm.pc += advance
+
+		err = vm.stack.ShiftTopCallBase(int(by))
 	case code.OpDrop:
-		_, err = vm.stack.Top().Pop()
+		_, err = vm.stack.Pop()
 
 	case code.OpGetGlobal:
 		panic("not implemented")
@@ -103,8 +108,6 @@ func (vm *VM) step(op code.Op) (stepDecision, error) {
 		panic("not implemented")
 	case code.OpGetMethod:
 		panic("not implemented")
-	case code.OpGetArg:
-		vm.execGetArg()
 	case code.OpGetEnv:
 		panic("not implemented")