diff options
| author | Mel <einebeere@gmail.com> | 2022-05-27 23:34:40 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-05-27 23:34:40 +0000 |
| commit | 83d1dc87f3336d70ccda476627c70c282b7b6e11 (patch) | |
| tree | 70610879d3de1ddf02bbe9067076fe65b52979a9 /pkg/lang/vm/vm.go | |
| parent | 47c4cd3705bee9d7154c42ce95aef6f8a19e0661 (diff) | |
| download | jinx-83d1dc87f3336d70ccda476627c70c282b7b6e11.tar.zst jinx-83d1dc87f3336d70ccda476627c70c282b7b6e11.zip | |
Function envs and value escaping
Diffstat (limited to 'pkg/lang/vm/vm.go')
| -rw-r--r-- | pkg/lang/vm/vm.go | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/pkg/lang/vm/vm.go b/pkg/lang/vm/vm.go index 7284257..c933af4 100644 --- a/pkg/lang/vm/vm.go +++ b/pkg/lang/vm/vm.go @@ -116,8 +116,22 @@ func (vm *VM) step(op code.Op) (stepDecision, error) { panic("not implemented") case code.OpGetMethod: panic("not implemented") + case code.OpGetEnv: - panic("not implemented") + envIndex, advance := vm.code.GetUint(vm.pc) + vm.pc += advance + + err = vm.execGetEnv(int(envIndex)) + case code.OpSetEnv: + envIndex, advance := vm.code.GetUint(vm.pc) + vm.pc += advance + + err = vm.execSetEnv(int(envIndex)) + case code.OpAddToEnv: + local, advance := vm.code.GetUint(vm.pc) + vm.pc += advance + + err = vm.execAddToEnv(int(local)) case code.OpAdd: err = vm.execAdd() @@ -166,6 +180,9 @@ func (vm *VM) popAndDrop() (value.Value, error) { } func (vm *VM) popCallAndDrop() (int, error) { + envPtr := vm.stack.CurrentCallEnv() + vm.memory.Release(envPtr) + for !vm.stack.ReachedBaseOfCall() { _, err := vm.popAndDrop() if err != nil { |
