From 22a69393f58abcf3bcf9e7039f994dae78422213 Mon Sep 17 00:00:00 2001 From: Mel Date: Wed, 27 Jul 2022 11:01:29 +0000 Subject: Implement VM modules and globals --- pkg/lang/vm/utils.go | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) (limited to 'pkg/lang/vm/utils.go') 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 +} -- cgit 1.4.1