SOfError by Lambda expr in Local Class

Robert Field robert.field at oracle.com
Fri Dec 6 20:42:40 PST 2013


I have created P2 issue 8029725: Lambda reference to containing local 
class causes javac infinite recursion --

https://bugs.openjdk.java.net/browse/JDK-8029725

and assigned it to myself.

Thank you


On 12/06/13 16:23, bitter_fox wrote:
> 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