Fix cppia JIT "Bad move target" on untyped register moves - #1366
Open
MeguminBOT wants to merge 1 commit into
Open
Fix cppia JIT "Bad move target" on untyped register moves#1366MeguminBOT wants to merge 1 commit into
MeguminBOT wants to merge 1 commit into
Conversation
CppiaCompiler::convert moves between two untyped registers in three places. getCommonType(jtAny, jtAny) returns jtAny, which move() rejects.
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.
Any binary subtraction inside a ternary that is converted to String or object triggers it.
Multiplication, division, unary minus and addition are unaffected, as is hoisting the subtraction into a local first.
CppiaCompiler::convertmoved between two registers without giving either a type in three places.move()decides what to emit fromgetCommonType(), andgetCommonType(jtAny, jtAny)returnsjtAny, which theswitch answers with
setError("Bad move target").All three sites are guarded by
inSrc.uses(SLJIT_R1)orinSrc==sJitTemp1, so they are only reached when the source value happens to live in R1.OpAdd::genCodeleaves its int result insJitTemp0and misses the guard, whileOpSub::genCodeusessJitTemp1and hits it, which is why addition compiles and subtraction does not.Reproducable steps
Run