about summary refs log tree commit diff
path: root/pkg/lang/vm/utils.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/lang/vm/utils.go')
-rw-r--r--pkg/lang/vm/utils.go27
1 files changed, 25 insertions, 2 deletions
diff --git a/pkg/lang/vm/utils.go b/pkg/lang/vm/utils.go
index 00311ef..2b7fa6f 100644
--- a/pkg/lang/vm/utils.go
+++ b/pkg/lang/vm/utils.go
@@ -1,6 +1,7 @@
 package vm
 
 import (
+	"jinx/pkg/lang/vm/code"
 	"jinx/pkg/lang/vm/mem"
 	"jinx/pkg/lang/vm/value"
 )
@@ -14,14 +15,14 @@ func (vm *VM) popAndDrop() (value.Value, error) {
 	return v, nil
 }
 
-func (vm *VM) popCallAndDrop() (int, error) {
+func (vm *VM) popCallAndDrop() (code.Pos, error) {
 	envPtr := vm.stack.CurrentCallEnv()
 	vm.memory.Release(envPtr)
 
 	for !vm.stack.ReachedBaseOfCall() {
 		_, err := vm.popAndDrop()
 		if err != nil {
-			return 0, err
+			return code.Pos{}, err
 		}
 	}
 
@@ -63,6 +64,8 @@ func (vm *VM) getMemCell(ptr mem.Ptr, kind mem.CellKind, allowNil bool) (mem.Cel
 		_, ok = cell.(value.TypeCell)
 	case mem.CellKindObject:
 		_, ok = cell.(value.ObjectCell)
+	case mem.CellKindGlobal:
+		_, ok = cell.(value.GlobalCell)
 	}
 
 	if !ok {
@@ -71,3 +74,23 @@ func (vm *VM) getMemCell(ptr mem.Ptr, kind mem.CellKind, allowNil bool) (mem.Cel
 
 	return cell, nil
 }
+
+func (vm *VM) module() int {
+	return vm.pos.Module
+}
+
+func (vm *VM) pc() int {
+	return vm.pos.PC
+}
+
+func (vm *VM) setPC(pc int) {
+	vm.pos.PC = pc
+}
+
+func (vm *VM) advancePC(by int) {
+	vm.pos.PC += by
+}
+
+func (vm *VM) setPos(pos code.Pos) {
+	vm.pos = pos
+}