The Mozilla implementation of the logical assignment operators (see #138) uses a JSOP_GOTO, which in our version of SpiderMonkey still requires some special handling in IonControlFlow.cpp.
Until somebody understands that logic well enough to shoehorn in a proper solution, we need to disable Ion compilation when hitting a logical assignment operator in order to avoid triggering the diagnostic crash here.
Note for posterity if somebody wants to take a closer look and get Ion compilation working again for this case: This code for example
As noted here, the bytecode for an if-then-else looks roughly like
// IFEQ X ; src note (IF_ELSE, COND)
// ...
// GOTO Z
// X: JUMPTARGET ; else/else if
// ...
// Z: JUMPTARGET ; join
which is basically what we have here above between 00300: and 00341:, except that of course instead of IFEQ we're starting out with a AND/OR/COALESCE operator at the beginning.
So it should probably be possible to cobble something together by looking at the existing processIf… and processShortCircuit… routines in IonControlFlow.cpp.
The Mozilla implementation of the logical assignment operators (see #138) uses a
JSOP_GOTO
, which in our version of SpiderMonkey still requires some special handling inIonControlFlow.cpp
.Until somebody understands that logic well enough to shoehorn in a proper solution, we need to disable Ion compilation when hitting a logical assignment operator in order to avoid triggering the diagnostic crash here.
Note for posterity if somebody wants to take a closer look and get Ion compilation working again for this case: This code for example
gets compiled into this bytecode
So whereas the regular short-circuiting operators (&&, ||, ??) roughly resemble a
with the logical assignment operators we now have something like
As noted here, the bytecode for an if-then-else looks roughly like
which is basically what we have here above between 00300: and 00341:, except that of course instead of
IFEQ
we're starting out with aAND
/OR
/COALESCE
operator at the beginning.So it should probably be possible to cobble something together by looking at the existing
processIf…
andprocessShortCircuit…
routines inIonControlFlow.cpp
.