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 }