about summary refs log tree commit diff
path: root/pkg/lang/vm/exe.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/lang/vm/exe.go')
-rw-r--r--pkg/lang/vm/exe.go62
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
+}