From a651a96a19dddf942af6ba845a52fde49608da83 Mon Sep 17 00:00:00 2001 From: Diego Augusto Molina Date: Fri, 4 Jul 2025 15:10:17 -0300 Subject: [PATCH] fix VM not clearing memory references when reused --- vm/vm.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/vm/vm.go b/vm/vm.go index 3018619d..ed61d2f9 100644 --- a/vm/vm.go +++ b/vm/vm.go @@ -67,9 +67,11 @@ func (vm *VM) Run(program *Program, env any) (_ any, err error) { if vm.Stack == nil { vm.Stack = make([]any, 0, 2) } else { + clearSlice(vm.Stack) vm.Stack = vm.Stack[0:0] } if vm.Scopes != nil { + clearSlice(vm.Scopes) vm.Scopes = vm.Scopes[0:0] } if len(vm.Variables) < program.variables { @@ -614,3 +616,10 @@ func (vm *VM) Step() { func (vm *VM) Position() chan int { return vm.curr } + +func clearSlice[S ~[]E, E any](s S) { + var zero E + for i := range s { + s[i] = zero // clear mem, optimized by the compiler, in Go 1.21 the "clear" builtin can be used + } +}