RFR JDK-8220018: javac crash when compiling try-catch-finally inside switch expression

Maurizio Cimadamore maurizio.cimadamore at oracle.com
Wed Jun 12 09:57:27 UTC 2019


Modulo 'yield' vs 'break', this loos good.

Maurizio

On 11/06/2019 16:07, Jan Lahoda wrote:
> Hi Bernard,
>
> Looks good to me. Any comments, Maurizio?
>
> Thanks,
>     Jan
>
> On 19. 05. 19 16:46, B. Blaser wrote:
>> Hi Jan and Maurizio,
>>
>> I've updated the webrev [1] as you both suggested:
>> * 'unwindBreak()' commented to warn for a possible dead code marking.
>> * 'reloadStackBeforeSwitchExpr()' added to factorize the stack 
>> reloading.
>> * 'test4()' below added to Jan's test cases.
>>
>> Does this look good to both of you (tier1 is OK)?
>>
>> Thanks,
>> Bernard
>>
>> [1] http://cr.openjdk.java.net/~bsrbnd/jdk8220018/webrev.01/
>>
>>
>> On Sat, 11 May 2019 at 13:29, B. Blaser <bsrbnd at gmail.com> wrote:
>>>
>>> Hi Jan and Maurizio,
>>>
>>> Thanks for both feedback.
>>>
>>> On Thu, 9 May 2019 at 14:35, Maurizio Cimadamore
>>> <maurizio.cimadamore at oracle.com> wrote:
>>>>
>>>> Hi,
>>>> I look at the code and discussed it offline with Jan extensively.
>>>>
>>>> I think the approach looks good, and it is inspired by what we already
>>>> do for return expressions (where we use intermediate locals to store
>>>> return expressions in case there's a finalizer).
>>>>
>>>> The only problem I have with this code is that it implicitly 
>>>> relies, in
>>>> the conditional context case, on the fact that, should the finalizer
>>>> complete abnormally (isAlive = false), then Code will refuse to 
>>>> emit any
>>>> additional statements (such as the loads required to restore the stack
>>>> state).
>>>>
>>>> I think the is brittle, and might bite us back in case we revisit this
>>>> code and add another statement whose behavior is NOT guarded by 
>>>> isAlive.
>>>>
>>>> So, I suggest either adding explicit comments, saying that unwindBreak
>>>> might affect isAlive and, as a result, following statements might 
>>>> not be
>>>> generated - or, wrap the code in an explicit `if (isAlive)` guard, as
>>>> done in the other branch of the visitBreak code.
>>>
>>> As first step, I guess I'd be more for simply adding a comment but we
>>> can still rework and consolidate this part later on if necessary.
>>>
>>>> As bonus point, since
>>>> we're restoring the stack in three different places, perhaps we can
>>>> factor the restoring code out to some common function.
>>>
>>> Of course ;-)
>>>
>>>> Cheers
>>>> Maurizio
>>>>
>>>>
>>>> On 09/05/2019 09:34, Jan Lahoda wrote:
>>>>> Hi Bernard,
>>>>>
>>>>> I apologize for late reply.
>>>
>>> No problem, I'm rather busy too...
>>>
>>>>> Thanks for the patch, looks OK to me, but
>>>>> I guess it would be good to have another review on this.
>>>>>
>>>>> Would it be possible to enhance the tests with the testcase below 
>>>>> (and
>>>>> any other testcases needed)?
>>>
>>> Yes, I'll also include this one.
>>>
>>> Cheers,
>>> Bernard
>>>
>>>
>>>>> Thanks,
>>>>>      Jan
>>>>>
>>>>> On 27. 03. 19 19:20, B. Blaser wrote:
>>>>>> Hi,
>>>>>>
>>>>>> Please review the following fix for [1] which has already been
>>>>>> discussed in the corresponding thread [2]:
>>>>>>
>>>>>> http://cr.openjdk.java.net/~bsrbnd/jdk8220018/webrev.00/
>>>>>>
>>>>>> It includes the variant I suggested to store the switch expression
>>>>>> result in a single temporary variable along with Jan's solution for
>>>>>> switch expressions used as conditions. Note that I had to do a tiny
>>>>>> correction to the latter (see 'code.resolve(value.trueJumps)') to 
>>>>>> make
>>>>>> the following example succeed:
>>>>>>
>>>>>>       public static void test4() {
>>>>>>           if (!switch (0) {
>>>>>>               default -> {
>>>>>>                   try {
>>>>>>                       break switch(0) { default -> true; };
>>>>>>                   }
>>>>>>                   finally {
>>>>>>                       break false;
>>>>>>                   }
>>>>>>               }
>>>>>>           }) {
>>>>>>               System.out.println("OK!");
>>>>>>           }
>>>>>>       }
>>>>>>
>>>>>> It also includes Jan's test case.
>>>>>>
>>>>>> Any feedback is welcome (tier1 is OK).
>>>>>>
>>>>>> Thanks,
>>>>>> Bernard
>>>>>>
>>>>>> [1] https://bugs.openjdk.java.net/browse/JDK-8220018
>>>>>> [2]
>>>>>> http://mail.openjdk.java.net/pipermail/compiler-dev/2019-March/013073.html 
>>>>>>
>>>>>>


More information about the compiler-dev mailing list