RFR: JDK-8230847: Trees.getScope may crash when invoked for statement inside switch.

Jan Lahoda jan.lahoda at oracle.com
Thu Sep 12 09:30:19 UTC 2019


There are some cases where the Trees.getScope may misbehave:
-consider code like this:
switch (i) {
      case 0:
          String.valueOf(0); //calling getScope on this place
          int i;

javac will create a copy the tree, attribute it, and stop the 
attribution at the specified place by throwing BreakAttr. But in the 
case above, Attr.handleSwitch will invoke Attr.addVars (in a finally), 
which will try to add the "int i;"'s symbol into a Scope, which fails, 
as that variable is not attributed. The proposed solution is to simply 
not call addVars if an exception is thrown, by moving the call out of 
the current finally block.

-the attribution when a scope is being computed is not running with a 
ArgumentAttr.withLocalCacheContext(), which may lead to the cache 
pollution, and trouble for further getScope (or other attribution) 
invocations (see the testMemberRefs() test). The proposal is to run with 
the withLocalCacheContext(), but as a more general approach, I tried to 
reuse as much as possible from the speculative attribution for Scope 
computation, as was proposed some time back.

-there is a corner case, where if the BreakAttr is thrown while 
attribution an annotation's type, Annotate.flush() may not finish, and 
there may be remaining tasks in the Annotate queues, which may fail on 
subsequent flushes (possibly due to subsequent invocations of 
getScope()). The proposed solution here is to save and restore the 
queues for the isolated/speculative attributions. In the current patch, 
this is being done for all speculative attributions, but if that would 
be too dangerous, we could move that to getScope computation only. (See 
tests testAnnotations() and testAnnotationsLazy().)

-there is a corner case, where calling getScope inside an initializer of 
a class that depends on itself (i.e. has a cyclic dependency) may crash, 
as the initializer is not properly recognized as an initializer. The 
proposed solution is to recognize initializers in erroneous classes as 

Proposed webrev:

JBS: https://bugs.openjdk.java.net/browse/JDK-8230847

How does this look?


More information about the compiler-dev mailing list