1
0
mirror of https://github.com/MontFerret/ferret.git synced 2025-08-13 19:52:52 +02:00

Refactor loop compilation; update initialization logic for zero/one registers and adjust range iteration handling, restructure range iterator tests, and align imports for consistency

This commit is contained in:
Tim Voronov
2025-06-19 19:52:10 -04:00
parent 215501c78f
commit 4de53a5665
2 changed files with 16 additions and 15 deletions

View File

@@ -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

View File

@@ -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()