src/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java

changeset 1515
b61e5f801f7c
parent 1510
7873d37f5b37
child 1587
f1f605f85850
     1.1 --- a/src/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java	Tue Jan 22 16:23:35 2013 +0000
     1.2 +++ b/src/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java	Tue Jan 22 16:39:51 2013 +0000
     1.3 @@ -859,8 +859,8 @@
     1.4              finally {
     1.5                  frameStack = prevStack;
     1.6              }
     1.7 -            if (frameStack.nonEmpty() && enclosingLambda() != null) {
     1.8 -                // Any class defined within a lambda is an implicit 'this' reference
     1.9 +            if (!tree.sym.isStatic() && frameStack.nonEmpty() && enclosingLambda() != null) {
    1.10 +                // Any (non-static) class defined within a lambda is an implicit 'this' reference
    1.11                  // because its constructor will reference the enclosing class
    1.12                  ((LambdaTranslationContext) context()).addSymbol(tree.sym.type.getEnclosingType().tsym, CAPTURED_THIS);
    1.13              }
    1.14 @@ -994,6 +994,11 @@
    1.15           * (required to skip synthetic lambda symbols)
    1.16           */
    1.17          private Symbol owner() {
    1.18 +            return owner(false);
    1.19 +        }
    1.20 +
    1.21 +        @SuppressWarnings("fallthrough")
    1.22 +        private Symbol owner(boolean skipLambda) {
    1.23              List<Frame> frameStack2 = frameStack;
    1.24              while (frameStack2.nonEmpty()) {
    1.25                  switch (frameStack2.head.tree.getTag()) {
    1.26 @@ -1012,7 +1017,8 @@
    1.27                      case METHODDEF:
    1.28                          return ((JCMethodDecl)frameStack2.head.tree).sym;
    1.29                      case LAMBDA:
    1.30 -                        return ((LambdaTranslationContext)contextMap.get(frameStack2.head.tree)).translatedSym;
    1.31 +                        if (!skipLambda)
    1.32 +                            return ((LambdaTranslationContext)contextMap.get(frameStack2.head.tree)).translatedSym;
    1.33                      default:
    1.34                          frameStack2 = frameStack2.tail;
    1.35                  }
    1.36 @@ -1311,8 +1317,9 @@
    1.37              }
    1.38  
    1.39              Type enclosingType() {
    1.40 -                //local inner classes defined inside a lambda are always non-static
    1.41 -                return owner.enclClass().type;
    1.42 +                return owner.isStatic() ?
    1.43 +                        Type.noType :
    1.44 +                        owner.enclClass().type;
    1.45              }
    1.46  
    1.47              Type generatedLambdaSig() {

mercurial