diff options
| author | Mel <einebeere@gmail.com> | 2022-07-27 11:01:29 +0000 |
|---|---|---|
| committer | Mel <einebeere@gmail.com> | 2022-07-27 11:01:29 +0000 |
| commit | 22a69393f58abcf3bcf9e7039f994dae78422213 (patch) | |
| tree | 6f88f586bd57d298d54e345a6c4b8d7144a5d2ec /pkg/lang/vm/utils.go | |
| parent | 45b6f073fe398e820e9e4a82900bc282ee32af9b (diff) | |
| download | jinx-22a69393f58abcf3bcf9e7039f994dae78422213.tar.zst jinx-22a69393f58abcf3bcf9e7039f994dae78422213.zip | |
Implement VM modules and globals
Diffstat (limited to 'pkg/lang/vm/utils.go')
| -rw-r--r-- | pkg/lang/vm/utils.go | 27 |
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 +} |
