RFR: JDK-8222169: java.lang.AssertionError switch expression in ternary operator - ?

Vicente Romero vicente.romero at oracle.com
Wed May 15 15:40:44 UTC 2019


looks good,

Thanks,
Vicente

On 5/15/19 4:05 AM, Jan Lahoda wrote:
> Hi,
>
> There is a regression in how let expressions are handled in Gen, 
> related to recent changes for switch expressions. Consider code like:
>
> int t(boolean b, Integer i) {
>     return b ? 0 : i++;
> }
>
> This gets desugared into:
> int t(boolean b, Integer i) {
>         return b ? 0 : (let /*synthetic*/ final Integer $1357563986 = 
> i in (let i = Integer.valueOf((int)(i.intValue() + 1)); in 
> $1357563986)).intValue();
>     }
>
> When Gen.visitLetExpr is generating the let expression, it records the 
> stack size, so that for further statements, it can assert the 
> statements start at an appropriate stack depth (at "statement start"). 
> But, the issue here is that when the stack size is recorded, the state 
> of the bytecode is before the target of the jump for "b == false", 
> which jumps to the "else" section. I.e. the state of the bytecode is 
> before the ':', not after. And so '0' is on the stack. But, the code 
> for the let expression is after the target of the jump, and so the 
> real stack at the beginning of the code for the let expression is empty.
>
> The proposed solution is to simply resolve the jumps before recording 
> the size of the stack - that should ensure the correct stack size is 
> recorded. We already do that for Gen.visitSwitchExpression, but missed 
> it for visitLetExpr.
>
> Webrev: http://cr.openjdk.java.net/~jlahoda/8222169/webrev.00/
> JBS: https://bugs.openjdk.java.net/browse/JDK-8222169
>
> The patch also includes test based on Vicente's:
> http://cr.openjdk.java.net/~vromero/8222795/webrev.00/
>
> How does this look?
>
> Thanks,
>     Jan



More information about the compiler-dev mailing list