format: spec the inlined-call virtual activation contract#229
Merged
Conversation
Document how an inlined internal call is represented and how a debugger reconstructs its virtual activation, per the inlining design (gnidan rulings: reuse jump:true, omit arg/return value pointers in v1, adopt DWARF "activation" naming). - invoke.mdx: add "Inlined internal calls" (jump:true = call kind not a literal JUMP; target omitted; transform:["inline"]) and a "Reconstructing activations" section defining the real-vs-virtual activation distinction, annotation-driven per-instruction membership (robust to non-contiguous inlined bodies), graceful identity degradation, and v1 value resolution (structure + locals; no arguments/data pointers). - transform.mdx: enrich the inline id (virtual activation, cross- link) and add an inlined-call-site worked example noting that a helper inlined at N sites yields N virtual activations. No schema change. Scope-agnostic re: the single- vs multi-site heuristic (bugc pass scope, decision #3, still open).
Reflect gnidan's #3 heuristic (leaf or small, non-recursive, internal, at all call sites) as compiler-typical, keeping the threshold qualitative — the format is invariant to the eligibility rule.
Contributor
|
Apply debugger review precision notes on #229: - Real-vs-virtual: the reliable discriminator is the inline transform marker, not target-absence — a real internal call may also omit target (#213), so no-target does NOT imply virtual. Reword the real/virtual clauses accordingly. - Membership: reword "iff it carries transform:["inline"]" (read as exact array equality) to "carries an inline identifier in its transform list" so composed markers like ["inline","fold"] still confer membership.
Apply debugger note (a): "reliably carries ... identity" contradicted the graceful-degradation paragraph (identity is optional). Reword to "an inlining compiler typically preserves declaration and per-instruction source ranges; identity fields remain optional and degrade gracefully" — a compiler-behavior expectation, not a format guarantee.
This was referenced Jul 2, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Documents how an inlined internal call is represented in the program-context format and how a debugger reconstructs its virtual activation — the format half of the inlining design (task #16), landed against the frozen contract.
This is spec-prose only: no schema change and no compiler code. It follows gnidan's rulings on the design — reuse
jump:true, omit arg/return value pointers in v1, and adopt DWARF's "activation" vocabulary for the derived call-stack entry.invoke.mdx
jump:truemarks the internal-call kind, not a literal JUMP (an inlined call has none);targetomitted; siblingtransform:["inline"]. Notes that a helper inlined at several sites yields several independent virtual activations.arguments/datapointers).transform.mdx
inlineidentifier (virtual activation + cross-link) and adds an inlined-call-site worked example.Guardrail preserved
No new frame/activation context type — an activation is derived from
invoke/return+transform:["inline"]. The existingframecontext stays cleanly = compilation-layer (keeping #152 unentangled).Scope
Written scope-agnostically re: the bugc single- vs multi-site heuristic (pass-scope decision #3, still open) — only a future worked example's exact scope wording depends on it.
yarn workspace @ethdebug/format-web buildpasses (MDX + cross-page anchors validated).