RFR: JDK-8230105: -XDfind=diamond crashes

Vicente Romero vicente.romero at oracle.com
Thu Aug 29 14:35:45 UTC 2019


looks good,

Thanks,
Vicente

On 8/29/19 6:13 AM, Maurizio Cimadamore wrote:
> Looks good - I've checked all the usages of the tri-state flag and 
> they look good (and I noted the actual resolution of this issue, which 
> is to tweak the check in ArgumentAttr.setResult).
>
> Maurizio
>
> On 29/08/2019 09:53, Jan Lahoda wrote:
>> Thanks for the comments!
>>
>> Updated webrev using the AttributionMode.FULL/ANALYZER/SPECULATIVE:
>> http://cr.openjdk.java.net/~jlahoda/8230105/webrev.01/
>>
>> Jan
>>
>> On 28. 08. 19 22:02, Vicente Romero wrote:
>>>
>>>
>>> On 8/28/19 4:00 PM, Maurizio Cimadamore wrote:
>>>> I agree with Vicente, maybe replacing NON_SPECULATIVE with NORMAL 
>>>> (or FULL) :-)
>>> yep I like FULL too
>>>>
>>>> Maurizio
>>>
>>> Vicente
>>>>
>>>> On 28/08/2019 20:03, Vicente Romero wrote:
>>>>> Hi Jan,
>>>>>
>>>>> I like the patch, I think it is very sensible. I just have a 
>>>>> cosmetic comment. I think that rebranding speculative attribution 
>>>>> to a concept based on its side-effects could bring confusion in 
>>>>> the future as the concept of speculative attribution is very deep 
>>>>> in the understanding we have of the attribution process. So what 
>>>>> I'm proposing is just a change in the name to the three states you 
>>>>> defined, just a proposal:
>>>>>
>>>>> enum AttributionMode {
>>>>>     NON_SPECULATIVE(false),
>>>>>     ANALYZER(true)
>>>>>     SPECULATIVE(true);
>>>>>
>>>>>     AttributionMode(boolean isSpeculative) {
>>>>>         this.isSpeculative = isSpeculative;
>>>>>     }
>>>>>
>>>>>     boolean isSpeculative() {
>>>>>         return isSpeculative;
>>>>>     }
>>>>>
>>>>>     final isSpeculative;
>>>>> }
>>>>>
>>>>> we can work on the names but my proposal is to put the 
>>>>> speculative-ness of the attribution foremost and the 
>>>>> side-effect-ness in second place. What do you think?
>>>>>
>>>>> Vicente
>>>>>
>>>>> On 8/26/19 6:50 AM, Jan Lahoda wrote:
>>>>>> Hi,
>>>>>>
>>>>>> JBS: https://bugs.openjdk.java.net/browse/JDK-8230105
>>>>>> Proposed webrev: 
>>>>>> http://cr.openjdk.java.net/~jlahoda/8230105/webrev.00/
>>>>>>
>>>>>> Consider this code:
>>>>>> ---
>>>>>> public class AnalyzerNotQuiteSpeculative {
>>>>>>     private void test() {
>>>>>>         Subclass1 c1 = null;
>>>>>>         Subclass2 c2 = null;
>>>>>>         Base b = null;
>>>>>>
>>>>>>         t(new C<Base>(c1).set(c2));
>>>>>>         t(new C<Base>(b).set(c2));
>>>>>>     }
>>>>>>
>>>>>>     public static class Base {}
>>>>>>     public static class Subclass1 extends Base {}
>>>>>>     public static class Subclass2 extends Base {}
>>>>>>     public class C<T extends Base> {
>>>>>>         public C(T t) {}
>>>>>>         public C<T> set(T t) { return this; }
>>>>>>     }
>>>>>>     <T extends Base> void t(C<? extends Base> l) {}
>>>>>> }
>>>>>> ---
>>>>>>
>>>>>> When run with -XDfind=diamond, this crashes with:
>>>>>> ---
>>>>>>
>>>>>>     at 
>>>>>> jdk.compiler/com.sun.tools.javac.util.Assert.error(Assert.java:162)
>>>>>>     at 
>>>>>> jdk.compiler/com.sun.tools.javac.comp.Analyzer.doAnalysis(Analyzer.java:581) 
>>>>>>
>>>>>> ...
>>>>>> ---
>>>>>>
>>>>>> The embedded (thrown away) exception is:
>>>>>> ---
>>>>>> java.lang.NullPointerException
>>>>>>     at 
>>>>>> jdk.compiler/com.sun.tools.javac.comp.Analyzer$DiamondInitializer.process(Analyzer.java:261) 
>>>>>>
>>>>>>     at 
>>>>>> jdk.compiler/com.sun.tools.javac.comp.Analyzer$DiamondInitializer.process(Analyzer.java:225) 
>>>>>>
>>>>>>     at 
>>>>>> jdk.compiler/com.sun.tools.javac.comp.Analyzer.doAnalysis(Analyzer.java:579) 
>>>>>>
>>>>>>     at 
>>>>>> jdk.compiler/com.sun.tools.javac.comp.Analyzer$2.flush(Analyzer.java:552) 
>>>>>>
>>>>>>     at 
>>>>>> jdk.compiler/com.sun.tools.javac.comp.Analyzer.flush(Analyzer.java:594) 
>>>>>>
>>>>>>     at 
>>>>>> jdk.compiler/com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1412) 
>>>>>>
>>>>>>     at 
>>>>>> jdk.compiler/com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1380) 
>>>>>>
>>>>>>     at 
>>>>>> jdk.compiler/com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:972) 
>>>>>>
>>>>>>     at 
>>>>>> jdk.compiler/com.sun.tools.javac.main.Main.compile(Main.java:318)
>>>>>>     at 
>>>>>> jdk.compiler/com.sun.tools.javac.main.Main.compile(Main.java:176)
>>>>>>     at jdk.compiler/com.sun.tools.javac.Main.compile(Main.java:57)
>>>>>>     at jdk.compiler/com.sun.tools.javac.Main.main(Main.java:43)
>>>>>> ---
>>>>>>
>>>>>> The reason for this exception seems to be that when the Analyzer 
>>>>>> is speculatively analyzing "t(new C<Base>(c1).set(c2));", 
>>>>>> ArgumentAttr.setResult will set a deferred type to "new 
>>>>>> C<Base>(c1).set(c2)" (because isSpeculative is true), which in 
>>>>>> turn will prevent the tree from being actually attributed. So 
>>>>>> when the analyzer asks for type of "new C<Base>(c1)", it gets null.
>>>>>>
>>>>>> It ultimate problem appears to be that analyzers want to analyze 
>>>>>> a piece of AST "as if" it was part of the source code, but 
>>>>>> without having permanent side effects. But, currently, there is 
>>>>>> only the AttrContext.isSpeculative boolean, which means both "no 
>>>>>> permanent sideeffects" and "the tree is a scratch tree, that can 
>>>>>> be modified in any way", and the latter is not quite the case 
>>>>>> when doing spec attribution for analyzers.
>>>>>>
>>>>>> The proposed solution is to make the isSpeculative flag 3 
>>>>>> tristate (by using enum and renaming the field), which should 
>>>>>> allow us to differentiate between "actual AST", "AST in analyzer" 
>>>>>> and "actual speculative AST".
>>>>>>
>>>>>> I also created a patch that runs analyzers on all source code 
>>>>>> which building and testing JDK, and fixed a few smallish trouble 
>>>>>> it found. The patch to run the analyzers is not part of the 
>>>>>> proposed patch, but can be seen here:
>>>>>> http://cr.openjdk.java.net/~jlahoda/8230105/webrev.runall/
>>>>>>
>>>>>> How does this look?
>>>>>>
>>>>>> Thanks,
>>>>>>     Jan
>>>>>
>>>



More information about the compiler-dev mailing list