• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

solidjs / solid / 39014688291
78%
main: 89%

Build:
Build:
LAST BUILD BRANCH: fix/restore-deferred-releases
DEFAULT BRANCH: main
Ran 17 Oct 2026 07:52AM UTC
Jobs 1
Files 11
Run time 1min
Badge
Embed ▾
README BADGES
x

If you need to use a raster PNG badge, change the '.svg' to '.png' in the link

Markdown

Textile

RDoc

HTML

Rst

17 Oct 2026 07:43AM UTC coverage: 77.564%. Remained the same
39014688291

push

github

web-flow
perf(solid): a suspended read unwinds to its boundary through fewer handler frames (#4122)

* perf(solid): a suspended read unwinds to its boundary through fewer handler frames

Profiling the shell of a streamed page with ten pending boundaries
(pinned to a performance core, pre-warmed, 20 µs sampling) put a fifth of
the first chunk's CPU on the NotReadyError unwind itself, not on any work:
V8 runs a `finally` as a catch-and-rethrow, and between the suspended
read and the boundary's catch sat the sync memo's catch + finally, the
ssrScope closure's inner catch + outer finally, two runWithOwner frames
(catch for stampThrower + finally) and runWithBoundaryErrorContext's
finally — about eight re-raises per boundary at the cost of the throw
each. And every compiler hole memo was pulled twice: the eager pull at
creation met the NotReady (swallowed, "surface on read"), then ssr()'s
read pulled again and met it again.

Now:
- runWithOwner, createSyncMemo's pull, ssrScope's closure and
  runWithBoundaryErrorContext restore their state inline on the normal
  path and in one catch (which also stamps, where it did), no finally.
  runWithBoundaryErrorContext does its own owner swap instead of wrapping
  runWithOwner, and loses the render closure.
- A sync memo whose eager pull met a NotReadyError latches it for the rest
  of the synchronous turn: a read in that turn re-raises it instead of
  running the compute a second time. Nothing can settle the source inside
  a turn (promises settle on microtasks; server renders are pure), so the
  second pull could only reproduce the first's answer. One microtask,
  shared by every latch armed in the turn, clears them; the next turn —
  the boundary's retry, after the source may have settled — pulls as
  before. The latch is allocated only when a pull suspends.

No behavior or wire change; solid, web (default, server, hydrate) and
signals suites pass.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* perf(solid): ... (continued)

756 of 1050 branches covered (72.0%)

Branch coverage included in aggregate %.

1097 of 1339 relevant lines covered (81.93%)

27.83 hits per line

Jobs
ID Job ID Ran Files Coverage
1 39014688291.1 17 Oct 2026 07:52AM UTC 11
77.56
GitHub Action Run
Source Files on build 39014688291
  • Tree
  • List 11
  • Changed 0
  • Source Changed 0
  • Coverage Changed 0
Coverage ∆ File Lines Relevant Covered Missed Hits/Line Branch Hits Branch Misses
  • Back to Repo
  • Github Actions Build #39014688291
  • 4ff65801 on github
  • Prev Build on next (#39004208590)
  • Next Build on next (#39014813215)
  • Delete
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE TRIAL · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc