Skip to content

Backport upstream correctness fixes for elide.22 - #176

Merged
Sam Gammon (sgammon) merged 30 commits into
elide-25.5.xfrom
upstream/wave-16
Oct 31, 2026
Merged

Sam Gammon (sgammon) merged 30 commits into
elide-25.5.xfrom
upstream/wave-16

Conversation

@sgammon

Copy link
Copy Markdown
Member

Backport 29 upstream correctness fixes to the 25.5 line: Bytecode DSL generation and slow paths, raw floating-point constants, Vector API stamp propagation, interpreter/Ristretto dispatch and method handles, runtime startup and metadata, JFR accounting, and build/test reliability. Normalize the new changelog entries to 25.5.

Preserve the fork's receiver checks and dispatch publication when adapting the linkTo conversion fix. Skip the JFR write-lock patch already present in the fork. Hold broader refactors and EE-incompatible changes for separate work.

Validation on the combined elide.22 candidate: strict substratevm build, formatting/checkstyle, 60 Bytecode DSL tests, 22 native Ristretto/Truffle tests, Truffle SpotBugs, and EE LinkCheck. Shenandoah/Truffle integration is tracked separately in #174.

Gergö Barany (gergo-) and others added 30 commits October 30, 2026 15:10
Do not emit publishOldBytecodes() from updateBytecode unless instruction
tracing is enabled. That method is only generated when tracing (or other
bytecode-updatable features) is on, so a tracing-disabled root with no
instrumentations failed to compile.

Fixes oracle#14682

(cherry picked from commit 37de5e6)
Gate the generated updateBytecode call on isBytecodeUpdatable() rather
than enableInstructionTracing. Tracing-disabled roots with
@instrumentation still declare publishOldBytecodes and must invoke it
before invalidation.

(cherry picked from commit 8d308ee)
Rename InstructionTracingDisabledGenerationTest to NotUpdatableBytecodeTest
and describe the failure in terms of bytecode updatability. Drop the tests
that inspect generated methods; compiling the tracing-disabled root is the
regression check.

(cherry picked from commit f517e20)
Float.equals and Double.equals collapse every NaN to one canonical
payload, so distinct NaN constants shared a constant-pool slot.
ConstantsBuffer now compares and hashes those values with their raw
bits. Other constants are still deduplicated with equals, and +0.0
and -0.0 stay distinct as they already were.

Signed-off-by: The-Alchemist <kap4020@gmail.com>
(cherry picked from commit bc5b0a8)
Boxing-eliminated quickenings used null to mean that no unexpected operand was passed in. A real null was discarded and the slow path re-read a frame slot the fast path had already cleared.

Signed-off-by: The-Alchemist <kap4020@gmail.com>
(cherry picked from commit 11e6577)
The boxing-elimination slow path used a private Object sentinel to tell "no unexpected operand" apart from a null guest value. Pass the UnexpectedResultException instead: a null exception means the operand is still on the stack, and getResult() supplies the guest value when one was thrown, including null.

Signed-off-by: The-Alchemist <kap4020@gmail.com>
(cherry picked from commit 2fe6557)
@sgammon
Sam Gammon (sgammon) marked this pull request as ready for review October 31, 2026 00:17
@sgammon
Sam Gammon (sgammon) merged commit 9e009df into elide-25.5.x Oct 31, 2026
4 checks passed
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.

9 participants