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