about summary refs log tree commit diff
path: root/pkg/lang/vm/utils.go
diff options
context:
space:
mode:
authorMel <einebeere@gmail.com>2022-08-29 22:21:36 +0000
committerMel <einebeere@gmail.com>2022-08-29 22:21:36 +0000
commitb4a0f2209026a90bfd67072526f938e00c00af78 (patch)
treec830edfa2cab2b4a679b8501d36171a39b319a58 /pkg/lang/vm/utils.go
parent1bc5eb0d13bb001b4ac7f456c6a61fedcd53f0c8 (diff)
downloadjinx-b4a0f2209026a90bfd67072526f938e00c00af78.tar.zst
jinx-b4a0f2209026a90bfd67072526f938e00c00af78.zip
Put full function data onto call stack
Diffstat (limited to 'pkg/lang/vm/utils.go')
-rw-r--r--pkg/lang/vm/utils.go14
1 files changed, 10 insertions, 4 deletions
diff --git a/pkg/lang/vm/utils.go b/pkg/lang/vm/utils.go
index eddcc11..166d404 100644
--- a/pkg/lang/vm/utils.go
+++ b/pkg/lang/vm/utils.go
@@ -19,9 +19,6 @@ func (vm *VM) popAndDrop() (value.Value, error) {
 }
 
 func (vm *VM) popCallAndDrop() (code.Pos, error) {
-	envPtr := vm.stack.CurrentCallEnv()
-	vm.memory.Release(envPtr)
-
 	for !vm.stack.ReachedBaseOfCall() {
 		_, err := vm.popAndDrop()
 		if err != nil {
@@ -29,7 +26,16 @@ func (vm *VM) popCallAndDrop() (code.Pos, error) {
 		}
 	}
 
-	return vm.stack.PopCall()
+	fn, returnPos, err := vm.stack.PopCall()
+	if err != nil {
+		return code.Pos{}, err
+	}
+
+	if err := value.NewFunction(code.Pos{}, 0).WithData(fn).Drop(vm.memory); err != nil {
+		return code.Pos{}, err
+	}
+
+	return returnPos, nil
 }
 
 func (vm *VM) getMemCell(ptr mem.Ptr, kind mem.CellKind, allowNil bool) (mem.CellData, error) {