From 86f31acf6789be116dcc54ed85b069a37c0f7aa8 Mon Sep 17 00:00:00 2001 From: Mel Date: Thu, 11 Aug 2022 01:25:47 +0000 Subject: Actual modules and core --- pkg/lang/vm/exe.go | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 pkg/lang/vm/exe.go (limited to 'pkg/lang/vm/exe.go') 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 +} -- cgit 1.4.1