JDK-8147527: Wrong code generated for postfix unary operators

Jan Lahoda jan.lahoda at oracle.com
Mon Dec 5 06:49:28 UTC 2016


Hi,

Thanks for your cvomments. Updated webrev:
http://cr.openjdk.java.net/~jlahoda/8147527/webrev.02/

I changed the second comment to:
//"tmp1" and "tmp2" may refer to the same instance
//(for e.g. <Class>.super.<ident>). But further processing may
//change the components of the tree in place (see visitSelect),
//so cloning the tree to avoid interference between the two uses:

and added your testcase.

Any comments are welcome!

Jan

On 3.12.2016 13:07, B. Blaser wrote:
> Hi Jan,
>
> 2016-12-02 12:22 GMT+01:00 Jan Lahoda <jan.lahoda at oracle.com>:
>> Hi,
>>
>> I've added these comments:
>> //Need to use the "lhs" at two places, once on the future left hand side
>> //and once in the future binary operator. But further processing may change
>> //the components of the tree in place (see visitSelect for e.g.
>> <Class>.super.<ident>),
>> //so cloning the tree to avoid interference between the uses:
>>
> Marvellous!
>
>> //"tmp1" and "tmp2" may be the same instance
>> //(for e.g. <Class>.super.<ident>). But further processing may
>> //change the components of the tree in place (see visitSelect),
>> //so cloning the tree to avoid interference between the two uses:
>>
> Ok ("tmp2 may refer to the instance held in tmp1", to be exact).
>
>> Webrev:
>> http://cr.openjdk.java.net/~jlahoda/8147527/webrev.01/
>>
>> How does this look?
>>
> Perfect to me.
>
> I've also noticed that the desugared test probably misses a "qualified
> this" example (C.this.i++).
> This isn't really necessary but almost interesting as it involves the
> correct handling of "this$n" without any accessor generation (in
> opposition to "C.super.i++" which needs them), as shown below.
>
>> Thanks!
>>
>> Jan
>>
> That's all, thank you!
>
> Bernard
>
> diff -u test/tools/javac/desugar/BoxingAndSuper.java.rev01
> test/tools/javac/desugar/BoxingAndSuper.java
> --- test/tools/javac/desugar/BoxingAndSuper.java.rev01    2016-12-03
> 10:45:22.803874916 +0100
> +++ test/tools/javac/desugar/BoxingAndSuper.java    2016-12-03
> 12:12:16.246333070 +0100
> @@ -204,6 +204,25 @@
>                   "    (let /*synthetic*/ final Integer $le2 =
> (Integer)this.i in (let /*synthetic*/ final Integer $le3 = this.i =
> Integer.valueOf((int)(this.i.intValue() + 1)) in $le2));\n" +
>                   "}\n";
>           runTest(code, expected);
> +        //qualified this:
> +        runTest("public class Test {\n" +
> +                "   Integer i;\n" +
> +                "   class Inner1 {\n" +
> +                "       class Inner2 {\n" +
> +                "           private Integer dump() {\n" +
> +                "               return Test.this.i++;\n" +
> +                "           }\n" +
> +                "       }\n" +
> +                "   }\n" +
> +                "}",
> +                "Test.Inner1.Inner2.dump()java.lang.Integer\n" +
> +                "{\n" +
> +                "    return (let /*synthetic*/ final Integer $le0 =
> (Integer)this$1.this$0.i" +
> +                    " in (let /*synthetic*/ final Integer $le1 =
> this$1.this$0.i = " +
> +
> "Integer.valueOf((int)(this$1.this$0.i.intValue() + 1))" +
> +                        " in $le0));\n" +
> +                "}\n"
> +        );
>       }
>
>       private final ToolBox tb = new ToolBox();
>
>>
>> On 29.11.2016 22:07, B. Blaser wrote:
>>>
>>> Hi,
>>>
>>> 2016-11-29 16:28 GMT+01:00 Maurizio Cimadamore
>>> <maurizio.cimadamore at oracle.com>:
>>>>
>>>> Looks good to me. Use of shallow clone looks a tad odd - but I understand
>>>> why it's the way it is - maybe worth adding a comment?
>>>>
>>>> Maurizio
>>>
>>>
>>> I agree that a short comment might be helpful, something like:
>>>
>>> // Shallow clone shall fit JDK-8147527 requirements, according to
>>> related threads.
>>>
>>> Bernard
>>>
>>>> On 25/11/16 11:38, Jan Lahoda wrote:
>>>>>
>>>>>
>>>>> Hello,
>>>>>
>>>>> As noted here:
>>>>>
>>>>>
>>>>> http://mail.openjdk.java.net/pipermail/compiler-dev/2016-October/010452.html
>>>>>
>>>>> javac sometimes generates code incorrectly, as discussed further in the
>>>>> thread.
>>>>>
>>>>> The proposed fix is to not reuse the AST nodes on multiple places.
>>>>>
>>>>> Bug: https://bugs.openjdk.java.net/browse/JDK-8147527
>>>>> Webrev: http://cr.openjdk.java.net/~jlahoda/8147527/webrev.00/
>>>>>
>>>>> Any feedback is welcome.
>>>>>
>>>>> Thanks to Bernard for his work on this.
>>>>>
>>>>> Jan
>>>>
>>>>
>>>>
>>


More information about the compiler-dev mailing list