RFR: JDK-8230105: -XDfind=diamond crashes

Vicente Romero vicente.romero at oracle.com
Wed Aug 28 20:02:18 UTC 2019



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