Skip to content

Raise ruby/spec floor 22140 -> 22215 after wave 29 - #652

Merged
tannevaled merged 1 commit into
mainfrom
wave29/floor
Sep 25, 2026
Merged

tannevaled merged 1 commit into
mainfrom
wave29/floor

Conversation

@tannevaled

Copy link
Copy Markdown
Contributor

Three units, and this wave is mostly the line map paying out.

PR area
#649 harvesting what #645 made possible — owner-qualified backtrace labels (Object#foo where we printed foo), warn(uplevel:), Thread.each_caller_location
#650 keywords decided at the call site, post parameters binding before optionals, duplicated parameter names as SyntaxError, the implicit it block parameter
#648 Marshal's ivar and extend containers, Time's instance variables and the :zone/:offset round trip, String#unpack encodings (+27)
#647 dependency bump, green without intervention

Measurement

scripts/conformance/rubyspec/run.sh, pinned corpus 87b1631, 16-way, TIMEOUT=25, three consecutive runs:

passing examples: 22227   (files loaded: 2192, failed to load: 14)
passing examples: 22226
passing examples: 22226
frozen floor:     22140

Floor set eleven below the lowest run, the margin rule the last four bumps used.

Two things worth keeping from this wave

The keyword flag is negative on purpose. Only call sites the compiler can prove positional are flagged; Object#send, Proc#call and define_method bodies — which cannot say what was written — keep the older behaviour rather than silently losing keywords. A positive flag would have been simpler and would have broken the paths that cannot answer.

A defect this wave exposed rather than introduced — now #651. The VM keeps three parallel frame stacks in step by hand, and four sites truncate one of them alone. Nothing noticed while backtraces read only that stack; frameLabel now reads all three, so a single leaked entry makes every later label name a different frame. One site fixed in #649, three named with file and line and routed. The shape is the real problem: four sites found, nothing preventing a fifth, and one slice of frame structs would make the invariant unrepresentable to violate.

🤖 Generated with Claude Code

Three units, and this wave is mostly the line map paying out.

  #649  Harvesting what #645 made possible: owner-qualified backtrace labels
        (Object#foo where we printed foo), warn(uplevel:) prepending the
        caller's file and line — its scaffolding still carried the comment
        "rbgo has no caller line to prepend", untrue since yesterday — and
        Thread.each_caller_location.
  #650  Keywords decided at the CALL SITE, as MRI does: a trailing Hash is a
        positional argument unless the call site wrote it as keywords. The new
        flag is NEGATIVE on purpose — only sites the compiler can prove
        positional are flagged, so Object#send, Proc#call and define_method
        bodies keep the older behaviour rather than silently losing keywords.
        Also: post parameters bind BEFORE optionals (def q(a, b=9, *c, d) gave
        [1, nil, [], 2] where MRI gives [1, 9, [], 2]), a duplicated parameter
        name is a SyntaxError, and the implicit `it` block parameter.
  #648  Marshal's ivar and extend containers, Time's instance variables and
        the :zone/:offset round trip, String#unpack encodings         (+27)
  #647  dependency bump, green without intervention

Measured with scripts/conformance/rubyspec/run.sh against the pinned corpus at
87b1631, 16-way, TIMEOUT=25, three consecutive runs: 22227, 22226, 22226. The
floor is set eleven below the lowest — the margin rule the last four bumps
used.

One defect this wave exposed rather than introduced, now issue #651: three
parallel frame stacks are kept in step by hand, and FOUR sites truncate
frameNames alone. It went unnoticed while backtraces read that stack alone;
frameLabel now reads all three, so one leaked entry makes every later label
name a different frame. One site fixed in #649, three named and routed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@tannevaled
tannevaled merged commit 62ec8e1 into main Sep 25, 2026
7 checks passed
@tannevaled
tannevaled deleted the wave29/floor branch September 25, 2026 09:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant