diff options
| author | Mel <einebeere@gmail.com> | 2022-08-11 01:25:47 +0000 |
|---|---|---|
| committer | Mel <einebeere@gmail.com> | 2022-08-11 01:25:47 +0000 |
| commit | 86f31acf6789be116dcc54ed85b069a37c0f7aa8 (patch) | |
| tree | bc7afd6a8c340825996d29c6cfd392ae42b4fbd5 /pkg/lang/vm/exe.go | |
| parent | c46b2bc7ce6df1f2c6c9494ef08015ec29992da5 (diff) | |
| download | jinx-86f31acf6789be116dcc54ed85b069a37c0f7aa8.tar.zst jinx-86f31acf6789be116dcc54ed85b069a37c0f7aa8.zip | |
Actual modules and core
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 +} |
