SOfError by Lambda expr in Local Class

bitter_fox bitterfoxc at gmail.com
Fri Dec 6 16:23:19 PST 2013


Hi,
Does anyone know the state of this issue?

Regards,
bitter_fox


2013/12/1 bitter_fox <bitterfoxc at gmail.com>

> 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