fix(compiler): box a value-typed callee before the cast to IFn - #172
Merged
Conversation
ifn-invoke-compiler boxes a value-typed callee, so the cast to IFn runs on an object reference and the method verifies. castclass needs a reference, and the callee reached it unboxed, which made the JIT refuse the whole method. JVM Clojure emits the same shape, and the arguments beside it already convert the same way. The conversion is guarded on the callee being a value type: converting unconditionally sends an interface-typed callee through castclass Object and re-emits every invoke in the tree.
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.
Closes #171
InvalidCastException, matching JVM Clojure, which throwsClassCastExceptionfor the same form. A value-typed callee reached the cast toIFnunboxed, andcastclassneeds an object reference, so the JIT refused the whole method instead of the cast throwing.castclass Objectand re-emits every invoke in the tree; with the guard,check-driftrecompiles the whole stdlib to identical bytes.