Three small tweaks to the pop-push hotspots in the VM. - ops_arith.go Inc/Dec/AddInt: unary ops mutate the top stack slot in place via peekPtr() instead of pop-compute-push. Drops the bounds check + cachedNil clear + push bounds check per call. Biggest beneficiary: FOR loop counters (implicit Inc) — every iteration of every PRG loop pays these ops once. - ops_collection.go ArrayGen: consume N slots via a single `copy` into the freshly-allocated result slice, then rewind sp and clear the intermediate slots for GC (the first slot is overwritten by the array push). Skips the N-deep pop loop. - ops_collection.go EvalBlock: read block value before shift, collapse args down one slot to overwrite the block position, then let the block run against the same in-place layout. Matches the Function()/PushSymbol round-trip removal from the prior commit. bench_sql deltas - B2 WHERE 83 → 78 µs (6%) - B3 ORDER BY 96 → 90 µs (6%) - B4 GROUP_HAVING 554 → 528 µs (5%) - B9 ROW_NUMBER 255 → 241 µs (5%) - B10 RANK PART 296 → 278 µs (6%) - B11 SUM OVER 320 → 300 µs (6%) - B15 CTE+WIN+JOIN 1826 →1743 µs (5%) Verification - go test ./... ALL PASS - FiveSql2 test_sql1999 43/43 - tests/compat_harbour 56/56 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
3.9 KiB
3.9 KiB