From 4de53a5665b77a926a8c70cd0d535f0e35ee4c9f Mon Sep 17 00:00:00 2001 From: Tim Voronov Date: Thu, 19 Jun 2025 19:52:10 -0400 Subject: [PATCH] Refactor loop compilation; update initialization logic for zero/one registers and adjust range iteration handling, restructure range iterator tests, and align imports for consistency --- pkg/compiler/internal/loop_collect_aggr.go | 6 +++--- pkg/vm/internal/range_iter_test.go | 25 +++++++++++----------- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/pkg/compiler/internal/loop_collect_aggr.go b/pkg/compiler/internal/loop_collect_aggr.go index a054ac9b..2fa52a78 100644 --- a/pkg/compiler/internal/loop_collect_aggr.go +++ b/pkg/compiler/internal/loop_collect_aggr.go @@ -74,15 +74,15 @@ func (cc *LoopCollectCompiler) compileGlobalAggregation(c fql.ICollectAggregator cc.ctx.Symbols.ExitScope() // Now we can iterate over the grouped items - zero := loadConstant(cc.ctx, runtime.Int(0)) - one := loadConstant(cc.ctx, runtime.Int(1)) + zero := cc.ctx.Registers.Allocate(core.Temp) + cc.ctx.Emitter.EmitA(vm.OpLoadZero, zero) // We move the aggregator to a temporary register to access it later from the new loop aggregator := cc.ctx.Registers.Allocate(core.Temp) cc.ctx.Emitter.EmitAB(vm.OpMove, aggregator, parentLoop.Dst) // CreateFor new loop with 1 iteration only cc.ctx.Symbols.EnterScope() - cc.ctx.Emitter.EmitABC(vm.OpRange, parentLoop.Src, zero, one) + cc.ctx.Emitter.EmitABC(vm.OpRange, parentLoop.Src, zero, zero) loop := cc.ctx.Loops.CreateFor(core.TemporalLoop, parentLoop.Src, parentLoop.Distinct) loop.Dst = parentLoop.Dst loop.Allocate = true diff --git a/pkg/vm/internal/range_iter_test.go b/pkg/vm/internal/range_iter_test.go index 4da57bba..ddf7ca5b 100644 --- a/pkg/vm/internal/range_iter_test.go +++ b/pkg/vm/internal/range_iter_test.go @@ -2,6 +2,7 @@ package internal_test import ( "context" + "github.com/MontFerret/ferret/pkg/vm/internal" "testing" "github.com/MontFerret/ferret/pkg/runtime" @@ -12,8 +13,8 @@ import ( func TestRangeIterator(t *testing.T) { Convey("Zero value", t, func() { ctx := context.Background() - r := NewRange(0, 0) - iter := NewRangeIterator(r) + r := internal.NewRange(0, 0) + iter := internal.NewRangeIterator(r) hasNext, err := iter.HasNext(ctx) So(err, ShouldBeNil) @@ -32,8 +33,8 @@ func TestRangeIterator(t *testing.T) { Convey("Two values", t, func() { ctx := context.Background() - r := NewRange(0, 1) - iter := NewRangeIterator(r) + r := internal.NewRange(0, 1) + iter := internal.NewRangeIterator(r) hasNext, err := iter.HasNext(ctx) So(err, ShouldBeNil) @@ -58,8 +59,8 @@ func TestRangeIterator(t *testing.T) { Convey("Two values (2)", t, func() { ctx := context.Background() - r := NewRange(1, 2) - iter := NewRangeIterator(r) + r := internal.NewRange(1, 2) + iter := internal.NewRangeIterator(r) hasNext, err := iter.HasNext(ctx) So(err, ShouldBeNil) @@ -84,8 +85,8 @@ func TestRangeIterator(t *testing.T) { Convey("Multiple ascending values", t, func() { ctx := context.Background() - r := NewRange(0, 10) - iter := NewRangeIterator(r) + r := internal.NewRange(0, 10) + iter := internal.NewRangeIterator(r) actual := make([]runtime.Int, 0, 10) @@ -104,8 +105,8 @@ func TestRangeIterator(t *testing.T) { Convey("Multiple descending values", t, func() { ctx := context.Background() - r := NewRange(10, 0) - iter := NewRangeIterator(r) + r := internal.NewRange(10, 0) + iter := internal.NewRangeIterator(r) actual := make([]runtime.Int, 0, 10) @@ -126,8 +127,8 @@ func TestRangeIterator(t *testing.T) { func BenchmarkRangeIterator(b *testing.B) { size := 100 ctx := context.Background() - r := NewRange(0, int64(size)) - iter := NewRangeIterator(r) + r := internal.NewRange(0, int64(size)) + iter := internal.NewRangeIterator(r) b.ResetTimer()