chore: sync upstream (29 Commits) #20

Merged
alf merged 29 commits from chore/sync-upstream-20261109 into main 2026-11-09 11:20:12 +00:00
Owner

Upstream-Sync von upstream/main (29 Commits). Fast-Forward.

  • 7102429a perf(grid): skip hidden row runs and keep sheet geometry and CF statistics between frames (#3580) (#3629)
  • 76416d48 Merge pull request #3641 from dotCooCoo/chore/craft-update-1b34eba41
  • 3004a05e Updates: take craft-update from craft-libs main at 1b34eba41
  • 01033f2c Merge pull request #3621 from dotCooCoo/chore/craft-update-updater-fixes
  • 99bbd237 Updates: the updater reports installing, ready, installed and failed, and installs at exit
  • 2c58c769 Merge pull request #2696 from vangel76/perf/calc-spill-unblock-2684
  • c000e1b3 Merge pull request #2694 from vangel76/perf/calc-spill-index-2683
  • 0f5a860d Merge perf/calc-spill-index-2683 (with upstream/main) into perf/calc-spill-unblock-2684
  • 17131fb0 Merge upstream/main into perf/calc-spill-index-2683
  • 865a7f6a Merge upstream/main into perf/calc-spill-unblock-2684
  • 1458f452 Merge upstream/main into perf/calc-spill-index-2683
  • bcad4a75 Merge calc: register a Python result's spill in the spill index (#2694) into perf/calc-spill-unblock-2684
  • e85b24df calc: register a Python result's spill in the spill index
  • a9db1da9 Merge upstream/main into perf/calc-spill-index-2683
  • 96672e8a Drop helpers the merged range reads no longer use
Upstream-Sync von `upstream/main` (29 Commits). Fast-Forward. - 7102429a perf(grid): skip hidden row runs and keep sheet geometry and CF statistics between frames (#3580) (#3629) - 76416d48 Merge pull request #3641 from dotCooCoo/chore/craft-update-1b34eba41 - 3004a05e Updates: take craft-update from craft-libs main at 1b34eba41 - 01033f2c Merge pull request #3621 from dotCooCoo/chore/craft-update-updater-fixes - 99bbd237 Updates: the updater reports installing, ready, installed and failed, and installs at exit - 2c58c769 Merge pull request #2696 from vangel76/perf/calc-spill-unblock-2684 - c000e1b3 Merge pull request #2694 from vangel76/perf/calc-spill-index-2683 - 0f5a860d Merge perf/calc-spill-index-2683 (with upstream/main) into perf/calc-spill-unblock-2684 - 17131fb0 Merge upstream/main into perf/calc-spill-index-2683 - 865a7f6a Merge upstream/main into perf/calc-spill-unblock-2684 - 1458f452 Merge upstream/main into perf/calc-spill-index-2683 - bcad4a75 Merge calc: register a Python result's spill in the spill index (#2694) into perf/calc-spill-unblock-2684 - e85b24df calc: register a Python result's spill in the spill index - a9db1da9 Merge upstream/main into perf/calc-spill-index-2683 - 96672e8a Drop helpers the merged range reads no longer use
alf added 29 commits 2026-11-09 11:20:12 +00:00
A cell read and a range read looked at every spill computed so far in
the pass, and cells_changed looked at every spill range of the sheet for
each changed cell. A spatial index (16 x 16 cell blocks) now finds the
areas covering a cell or meeting a range. Where areas overlap, the one
that counted before (first/last in the pass's spill map order) still
counts.

Fixes #2683

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Clearing a cell walked every formula in the graph, and each changed cell
scanned a 64 x 64 window of stored cells, to find formulas showing
#SPILL!. Calc now keeps the set of cells whose value is #SPILL! (filled
in rebuild, kept up to date by cells_changed and the write-back of a
run) and takes those candidates from it. The same set replaces the walk
over the graph in run for areas a formula stopped spilling over. Each
entry is checked against the workbook before it is used.

Fixes #2684

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
A full-height column spill takes 65,536 blocks to register, which a 17-cell paste elsewhere
never needed. A sheet's spill areas are now indexed only when their block count is below what
testing each area against each changed cell would cost; otherwise the plain containment check
runs, as before. Results are unchanged.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The spill-error set was ranged by rows only and filtered by column afterwards, so an edit in
column A walked every #SPILL! cell to its right in the same rows. Each row now keeps its own
column set and a window lookup takes one column range per row that has an entry. Results are
unchanged. Also covers an array spilling right over the cleared cell.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
A full-height column spill took 65,536 block registrations, on every pass
that produced it. Areas over 1024 blocks are now tested directly by each
lookup instead. Adds a randomized comparison against a scan of all areas.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
A batch spread over several sheets used its total length for every sheet, so a
one-cell sheet with many spills built the block index as if it had the whole
batch's lookups.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
python_result wrote into spills but not into spill_index, so indexed readers
(cell_value, range_values, visit_range) missed a Python array laid out in the
same pass. Insert on spill, remove when blocked, as the formula path does.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
perf(calc): index spill areas so cell and range reads don't scan every spill
perf(calc): find formulas a cleared cell may unblock from a set of #SPILL! cells
craft-update, craft-window, craft-print and craft-ui move from craft-libs
c5a1cbfb to c7c84230, a branch with storytold/craft-libs#687 and #696
merged into craft-libs main.

- The check result window shows whenever the updater's status is not
  idle, so the first start after an update reports that it installed or
  why it failed. Restart to Update asks the app to quit once nothing is
  unsaved.
- An update's close request quits the app (Quit asks about each unsaved
  workbook), so every workbook window closes.
- on_exit starts the install helper of a ready update before the macOS
  process exit.
Updates: the updater reports installing, ready, installed and failed, and installs at exit
Updates: take craft-update from craft-libs main at 1b34eba41
perf(grid): skip hidden row runs and keep sheet geometry and CF statistics between frames (#3580) (#3629)
Some checks failed
ci.yml / perf(grid): skip hidden row runs and keep sheet geometry and CF statistics between frames (#3580) (#3629) (pull_request) Failing after 0s
nix.yml / perf(grid): skip hidden row runs and keep sheet geometry and CF statistics between frames (#3580) (#3629) (pull_request) Failing after 0s
sonarcloud.yml / perf(grid): skip hidden row runs and keep sheet geometry and CF statistics between frames (#3580) (#3629) (pull_request) Failing after 0s
ci.yml / perf(grid): skip hidden row runs and keep sheet geometry and CF statistics between frames (#3580) (#3629) (push) Failing after 0s
nix.yml / perf(grid): skip hidden row runs and keep sheet geometry and CF statistics between frames (#3580) (#3629) (push) Failing after 0s
sonarcloud.yml / perf(grid): skip hidden row runs and keep sheet geometry and CF statistics between frames (#3580) (#3629) (push) Failing after 0s
7102429a9a
A sheet whose filter hides a million rows walked every hidden row
several times per frame (cells, gridlines, headers), rebuilt the row
index, the outline and the used range every frame, and a conditional
format over a whole column rescanned it every frame for its statistics.

- LineIndex::next_visible / visible step over a run of hidden lines in
  one O(log n) search; the grid's row and column loops use them.
- The grid keeps the active sheet's line index, outlines, used range and
  CfCache between frames, tied to the sheet by a Weak: any change goes
  through Arc::make_mut, which moves or copies a sheet that has a weak
  reference, so the cache can't outlive a change.
- Scroll offsets for the scrollbars and the scroll limit come from the
  line index instead of walking every custom row.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
alf merged commit 7102429a9a into main 2026-11-09 11:20:12 +00:00
alf deleted branch chore/sync-upstream-20261109 2026-11-09 11:20:13 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
iris/gridcraft!20
No description provided.