diff options
Diffstat (limited to 'pkg/lang/vm/exe.go')
| -rw-r--r-- | pkg/lang/vm/exe.go | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/pkg/lang/vm/exe.go b/pkg/lang/vm/exe.go new file mode 100644 index 0000000..7d6fc61 --- /dev/null +++ b/pkg/lang/vm/exe.go @@ -0,0 +1,62 @@ +package vm + +import ( + "jinx/pkg/lang/vm/mem" + "jinx/pkg/lang/vm/stack" + "jinx/pkg/lang/vm/value" +) + +func (vm *VM) Mem() mem.Mem { + return vm.memory +} + +func (vm *VM) Stack() stack.Stack { + return vm.stack +} + +func (vm *VM) GetThis() (value.Value, error) { + err := vm.execGetEnv(0) + if err != nil { + return value.Value{}, err + } + + // Take it back! + this, err := vm.popAndDrop() + if err != nil { + return value.Value{}, err + } + + return this, nil +} + +func (vm *VM) AddGlobal(name string, v value.Value) error { + globalPtr, err := vm.memory.Allocate(mem.CellKindGlobal) + if err != nil { + return err + } + + globalCell := value.GlobalCell(v) + if err := vm.memory.Set(globalPtr, globalCell); err != nil { + return err + } + + vm.globals[name] = globalPtr + + return nil +} + +func (vm *VM) GetGlobal(name string) (value.Value, bool, error) { + ptr, ok := vm.globals[name] + if !ok { + return value.Value{}, false, nil + } + + cell, err := vm.getMemCell(ptr, mem.CellKindGlobal, false) + if err != nil { + return value.Value{}, false, err + } + + v := cell.(value.GlobalCell).Get() + + return v, true, nil +} |
