SOfError by Lambda expr in Local Class

bitter_fox bitterfoxc at gmail.com
Sat Nov 30 20:21:48 PST 2013


Hi,
When I compile the following code, StackOverflowError occur.

public class Main
{
    interface F {void f();}

    public static void main(String[] args)
    {
        class Local
        {
            public Local()
            {
                F f = () -> new Local();
            }
        }
    }
}

It may be a cause that
c.s.t.javac.comp.LambdaToMethod.LambdaAnalyzerPreprocessor#capturelocalClassDefs
is called recursively.

            void captureLocalClassDefs(Symbol csym, final
LambdaTranslationContext lambdaContext) {
                JCClassDecl localCDef = localClassDefs.get(csym);
                if (localCDef != null && localCDef.pos <
lambdaContext.tree.pos) {
                    BasicFreeVarCollector fvc = lower.new
BasicFreeVarCollector() {
                        @Override
                        void addFreeVars(ClassSymbol c) {
                            captureLocalClassDefs(c, lambdaContext);
                        }
            // ...
                    };
                    fvc.scan(localCDef);
                }
        }

Following is a stack trace of the Error
java.lang.StackOverflowError
    at com.sun.tools.javac.tree.JCTree$JCModifiers.accept(JCTree.java:2337)
    at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:49)
    at
com.sun.tools.javac.tree.TreeScanner.visitMethodDef(TreeScanner.java:84)
    at com.sun.tools.javac.tree.JCTree$JCMethodDecl.accept(JCTree.java:772)
    at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:49)
    at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:57)
    at
com.sun.tools.javac.tree.TreeScanner.visitClassDef(TreeScanner.java:80)
    at com.sun.tools.javac.tree.JCTree$JCClassDecl.accept(JCTree.java:687)
    at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:49)
    at
com.sun.tools.javac.comp.LambdaToMethod$LambdaAnalyzerPreprocessor.captureLocalClassDefs(LambdaToMethod.java:1325)
    at
com.sun.tools.javac.comp.LambdaToMethod$LambdaAnalyzerPreprocessor$1.addFreeVars(LambdaToMethod.java:1306)
    at
com.sun.tools.javac.comp.Lower$BasicFreeVarCollector.visitNewClass(Lower.java:242)
    at com.sun.tools.javac.tree.JCTree$JCNewClass.accept(JCTree.java:1510)
    at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:49)
    at
com.sun.tools.javac.tree.TreeScanner.visitLambda(TreeScanner.java:221)
    at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1618)
    at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:49)
    at com.sun.tools.javac.tree.TreeScanner.visitVarDef(TreeScanner.java:98)
    at
com.sun.tools.javac.tree.JCTree$JCVariableDecl.accept(JCTree.java:846)
    at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:49)
    at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:57)
    at com.sun.tools.javac.tree.TreeScanner.visitBlock(TreeScanner.java:105)
    at com.sun.tools.javac.tree.JCTree$JCBlock.accept(JCTree.java:903)
    at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:49)
    at
com.sun.tools.javac.tree.TreeScanner.visitMethodDef(TreeScanner.java:91)
    at com.sun.tools.javac.tree.JCTree$JCMethodDecl.accept(JCTree.java:772)
    at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:49)
    at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:57)
    at
com.sun.tools.javac.tree.TreeScanner.visitClassDef(TreeScanner.java:80)
    at com.sun.tools.javac.tree.JCTree$JCClassDecl.accept(JCTree.java:687)
    at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:49)
    at
com.sun.tools.javac.comp.LambdaToMethod$LambdaAnalyzerPreprocessor.captureLocalClassDefs(LambdaToMethod.java:1325)
    at
com.sun.tools.javac.comp.LambdaToMethod$LambdaAnalyzerPreprocessor$1.addFreeVars(LambdaToMethod.java:1306)
    at
com.sun.tools.javac.comp.Lower$BasicFreeVarCollector.visitNewClass(Lower.java:242)
    at com.sun.tools.javac.tree.JCTree$JCNewClass.accept(JCTree.java:1510)
    at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:49)
    at
com.sun.tools.javac.tree.TreeScanner.visitLambda(TreeScanner.java:221)
    at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1618)
    at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:49)
    at com.sun.tools.javac.tree.TreeScanner.visitVarDef(TreeScanner.java:98)
    at
com.sun.tools.javac.tree.JCTree$JCVariableDecl.accept(JCTree.java:846)
    at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:49)
    at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:57)
    at com.sun.tools.javac.tree.TreeScanner.visitBlock(TreeScanner.java:105)
    at com.sun.tools.javac.tree.JCTree$JCBlock.accept(JCTree.java:903)
    at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:49)
    at
com.sun.tools.javac.tree.TreeScanner.visitMethodDef(TreeScanner.java:91)
    at com.sun.tools.javac.tree.JCTree$JCMethodDecl.accept(JCTree.java:772)
    at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:49)
    at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:57)
    at
com.sun.tools.javac.tree.TreeScanner.visitClassDef(TreeScanner.java:80)
    at com.sun.tools.javac.tree.JCTree$JCClassDecl.accept(JCTree.java:687)
    at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:49)
    at
com.sun.tools.javac.comp.LambdaToMethod$LambdaAnalyzerPreprocessor.captureLocalClassDefs(LambdaToMethod.java:1325)
    at
com.sun.tools.javac.comp.LambdaToMethod$LambdaAnalyzerPreprocessor$1.addFreeVars(LambdaToMethod.java:1306)
    at
com.sun.tools.javac.comp.Lower$BasicFreeVarCollector.visitNewClass(Lower.java:242)
    at com.sun.tools.javac.tree.JCTree$JCNewClass.accept(JCTree.java:1510)
    at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:49)
    at
com.sun.tools.javac.tree.TreeScanner.visitLambda(TreeScanner.java:221)
    at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1618)
    at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:49)
    at com.sun.tools.javac.tree.TreeScanner.visitVarDef(TreeScanner.java:98)
    at
com.sun.tools.javac.tree.JCTree$JCVariableDecl.accept(JCTree.java:846)
    at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:49)
    at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:57)
    at com.sun.tools.javac.tree.TreeScanner.visitBlock(TreeScanner.java:105)
    at com.sun.tools.javac.tree.JCTree$JCBlock.accept(JCTree.java:903)
    at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:49)
    at
com.sun.tools.javac.tree.TreeScanner.visitMethodDef(TreeScanner.java:91)
    at com.sun.tools.javac.tree.JCTree$JCMethodDecl.accept(JCTree.java:772)
    at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:49)
    at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:57)
    at
com.sun.tools.javac.tree.TreeScanner.visitClassDef(TreeScanner.java:80)
    at com.sun.tools.javac.tree.JCTree$JCClassDecl.accept(JCTree.java:687)
    at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:49)
    at
com.sun.tools.javac.comp.LambdaToMethod$LambdaAnalyzerPreprocessor.captureLocalClassDefs(LambdaToMethod.java:1325)
.
.
.


Regards,
bitter_fox


More information about the lambda-dev mailing list