Uploaded image for project: 'Commons JCI'
  1. Commons JCI
  2. JCI-53

Stack overflow on cross imports in commons-jci-janino

    XMLWordPrintableJSON

    Details

    • Type: Bug
    • Status: Closed
    • Priority: Blocker
    • Resolution: Fixed
    • Affects Version/s: 1.0
    • Fix Version/s: 1.1
    • Component/s: compiler janino
    • Labels:
      None

      Description

      A stack overflow occurs when trying to compile classes with cross references using commons-jci-janino, because an infinite recursion. The simple presence of cross reference import is enough to cause the problem.

      Example: the following classes will recreate the problem:

      package test;
      
      import static test.Func2.func2;
      
      public class Func1 {
         public static boolean func1() throws Exception {
             return true;
         }
      }
      
      package test;
      
      import static test.Func1.func1;
      
      public class Func2 {
         public static boolean func2() throws Exception {
             return true;
         }
      } 
      

      The exception stack is:

      java.lang.StackOverflowError
      	at org.codehaus.janino.Parser.parseAndExpression(Parser.java)
      	at org.codehaus.janino.Parser.parseExclusiveOrExpression(Parser.java)
      	at org.codehaus.janino.Parser.parseInclusiveOrExpression(Parser.java)
      	at org.codehaus.janino.Parser.parseConditionalAndExpression(Parser.java)
      	at org.codehaus.janino.Parser.parseConditionalOrExpression(Parser.java)
      	at org.codehaus.janino.Parser.parseConditionalExpression(Parser.java)
      	at org.codehaus.janino.Parser.parseAssignmentExpression(Parser.java)
      	at org.codehaus.janino.Parser.parseExpression(Parser.java)
      	at org.codehaus.janino.Parser.parseReturnStatement(Parser.java)
      	at org.codehaus.janino.Parser.parseStatement(Parser.java)
      	at org.codehaus.janino.Parser.parseBlockStatement(Parser.java)
      	at org.codehaus.janino.Parser.parseBlockStatements(Parser.java)
      	at org.codehaus.janino.Parser.parseBlock(Parser.java)
      	at org.codehaus.janino.Parser.parseMethodBody(Parser.java)
      	at org.codehaus.janino.Parser.parseMethodDeclarationRest(Parser.java)
      	at org.codehaus.janino.Parser.parseClassBodyDeclaration(Parser.java)
      	at org.codehaus.janino.Parser.parseClassBody(Parser.java)
      	at org.codehaus.janino.Parser.parseClassDeclarationRest(Parser.java)
      	at org.codehaus.janino.Parser.parsePackageMemberTypeDeclaration(Parser.java)
      	at org.codehaus.janino.Parser.parseCompilationUnit(Parser.java)
      	at org.drools.commons.jci.compilers.JaninoJavaCompiler$CompilingIClassLoader.findIClass(JaninoJavaCompiler.java:90)
      	at org.codehaus.janino.IClassLoader.loadIClass(IClassLoader.java)
      	at org.codehaus.janino.UnitCompiler.loadFullyQualifiedClass(UnitCompiler.java)
      	at org.codehaus.janino.UnitCompiler.import2(UnitCompiler.java)
      	at org.codehaus.janino.UnitCompiler.access$2(UnitCompiler.java)
      	at org.codehaus.janino.UnitCompiler$1.visitSingleStaticImportDeclaration(UnitCompiler.java)
      	at org.codehaus.janino.Java$CompilationUnit$SingleStaticImportDeclaration.accept(Java.java)
      	at org.codehaus.janino.UnitCompiler.<init>(UnitCompiler.java)
      	at org.drools.commons.jci.compilers.JaninoJavaCompiler$CompilingIClassLoader.findIClass(JaninoJavaCompiler.java:91)
      	at org.codehaus.janino.IClassLoader.loadIClass(IClassLoader.java)
      	at org.codehaus.janino.UnitCompiler.loadFullyQualifiedClass(UnitCompiler.java)
      	at org.codehaus.janino.UnitCompiler.import2(UnitCompiler.java)
      	at org.codehaus.janino.UnitCompiler.access$2(UnitCompiler.java)
      	at org.codehaus.janino.UnitCompiler$1.visitSingleStaticImportDeclaration(UnitCompiler.java)
      	at org.codehaus.janino.Java$CompilationUnit$SingleStaticImportDeclaration.accept(Java.java)
      	at org.codehaus.janino.UnitCompiler.<init>(UnitCompiler.java)
      	at org.drools.commons.jci.compilers.JaninoJavaCompiler$CompilingIClassLoader.findIClass(JaninoJavaCompiler.java:91)
      	at org.codehaus.janino.IClassLoader.loadIClass(IClassLoader.java)
      	at org.codehaus.janino.UnitCompiler.loadFullyQualifiedClass(UnitCompiler.java)
      	at org.codehaus.janino.UnitCompiler.import2(UnitCompiler.java)
      	at org.codehaus.janino.UnitCompiler.access$2(UnitCompiler.java)
      	at org.codehaus.janino.UnitCompiler$1.visitSingleStaticImportDeclaration(UnitCompiler.java)
      	at org.codehaus.janino.Java$CompilationUnit$SingleStaticImportDeclaration.accept(Java.java)
      	at org.codehaus.janino.UnitCompiler.<init>(UnitCompiler.java)
      	at org.drools.commons.jci.compilers.JaninoJavaCompiler$CompilingIClassLoader.findIClass(JaninoJavaCompiler.java:91)
      	at org.codehaus.janino.IClassLoader.loadIClass(IClassLoader.java)
      	at org.codehaus.janino.UnitCompiler.loadFullyQualifiedClass(UnitCompiler.java)
              (... and the loop continues ... )
      

      Please note that the problem does not occur when using commons-jci-eclipse or when using JANINO from command line:

      [etirelli@localhost test]$ ../janino-2.5.9/bin/janinoc test/*.java
      [etirelli@localhost test]$ 
      

      This problem is affecting JANINO support in the Drools project as described in ticket:

      http://jira.jboss.com/jira/browse/JBRULES-1013

      Thanks,
      Edson

        Attachments

          Activity

            People

            • Assignee:
              tcurdt Torsten Curdt
              Reporter:
              tirelli Edson Tirelli
            • Votes:
              1 Vote for this issue
              Watchers:
              3 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved: