From d39c5ce889f260e6f9dd6b66112aaf1a7d6ec99b Mon Sep 17 00:00:00 2001 From: Tim Voronov Date: Mon, 7 Jul 2025 16:29:07 -0400 Subject: [PATCH] Refactor loop compilation to ensure scope management with `EnterScope` and `ExitScope`, update variable declaration for key/value names, and ensure compatibility with `FOR-IN` loops. --- pkg/compiler/internal/loop_sort.go | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/pkg/compiler/internal/loop_sort.go b/pkg/compiler/internal/loop_sort.go index 85f1be97..25da1462 100644 --- a/pkg/compiler/internal/loop_sort.go +++ b/pkg/compiler/internal/loop_sort.go @@ -137,6 +137,9 @@ func (c *LoopSortCompiler) finalizeSorting(loop *core.Loop, kv *core.KV, sorter // Finalize the current loop iteration loop.EmitFinalization(c.ctx.Emitter) + c.ctx.Symbols.ExitScope() + c.ctx.Symbols.EnterScope() + // Replace the loop source with sorted results c.ctx.Emitter.EmitAB(vm.OpMove, loop.Src, sorter) @@ -147,10 +150,14 @@ func (c *LoopSortCompiler) finalizeSorting(loop *core.Loop, kv *core.KV, sorter if loop.Kind != core.ForInLoop { // We switched from a ForWhileLoop to a ForInLoop because the underlying data is Iterable now. loop.Kind = core.ForInLoop - loop.ValueName = loop.KeyName - loop.Value = loop.Key - loop.Key = vm.NoopOperand - loop.KeyName = "" + } + + if loop.KeyName != "" { + loop.DeclareValueVar(loop.KeyName, c.ctx.Symbols) + } + + if loop.ValueName != "" { + loop.DeclareValueVar(loop.ValueName, c.ctx.Symbols) } // Reinitialize the loop to iterate over sorted data