diff options
Diffstat (limited to 'pkg/lang/vm/exec.go')
| -rw-r--r-- | pkg/lang/vm/exec.go | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/pkg/lang/vm/exec.go b/pkg/lang/vm/exec.go index 8cdcdcc..c2d847f 100644 --- a/pkg/lang/vm/exec.go +++ b/pkg/lang/vm/exec.go @@ -987,7 +987,7 @@ func (vm *VM) execCall(argCount uint) error { } } - if err = vm.stack.PushCall(fn.Pos(), vm.pos, fn.Env()); err != nil { + if err = vm.stack.PushCall(fn, vm.pos); err != nil { return err } @@ -997,7 +997,7 @@ func (vm *VM) execCall(argCount uint) error { return err } - if _, err := vm.stack.PopCall(); err != nil { + if _, _, err := vm.stack.PopCall(); err != nil { return err } @@ -1007,6 +1007,11 @@ func (vm *VM) execCall(argCount uint) error { vm.stack.Push(value.NewNull()) } + // If the function was native we can drop it immidiately, after the call. + if err := f.Drop(vm.memory); err != nil { + return err + } + return nil } @@ -1016,6 +1021,8 @@ func (vm *VM) execCall(argCount uint) error { vm.setPos(fn.Pos()) + // Note that value 'f' is still not dropped, as it's enviroment has + // been stored in the call stack. It will be dropped on the next return. return nil } |
