commons-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Arno Unkrig (JIRA)" <j...@apache.org>
Subject [jira] Commented: (JCI-53) Stack overflow on cross imports in commons-jci-janino
Date Mon, 27 Aug 2007 20:17:30 GMT

    [ https://issues.apache.org/jira/browse/JCI-53?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12523097
] 

Arno Unkrig commented on JCI-53:
--------------------------------

Arno speaking,

hello there at APACHE.ORG... unfortunately I'm on vacation in italy these days, so don't be
confused when I mix up Ys and Zs on this italian keyboard in this italian internet cafe.

I will take a closer look at this when I get home. My quick analysis now is that there seems
to be a bug in jci-janino. Unfortunately the link

http://svn.apache.org/viewvc/jakarta/commons/proper/jci/trunk/

that I found on http://commons.apache.org/jci/source-repository.html does not work, so I cannot
look into the JCI source code. However JANINO's "Compiler" class does

        protected IClass findIClass(final String type) throws ClassNotFoundException {
            // ...

            // Check the already-parsed compilation units.
            for (int i = 0; i < Compiler.this.parsedCompilationUnits.size(); ++i) {
                UnitCompiler uc = (UnitCompiler) Compiler.this.parsedCompilationUnits.get(i);
                IClass res = uc.findClass(topLevelClassName);
                if (res != null) {
                    if (!className.equals(topLevelClassName)) {
                        res = uc.findClass(className);
                        if (res == null) return null;
                    }
                    this.defineIClass(res);
                    return res;
                } 
            }

, and this stops the recursion. Maybe it is possible that JaninoJavaCompiler can be rewritten
such that it uses org.codehaus.janino.Compiler instead of REIMPLEMENTING it.

Torsten, maybe the hint above helps? If not, I will look into it on saturday.


CU

Arno

> Stack overflow on cross imports in commons-jci-janino
> -----------------------------------------------------
>
>                 Key: JCI-53
>                 URL: https://issues.apache.org/jira/browse/JCI-53
>             Project: Commons JCI
>          Issue Type: Bug
>          Components: compiler janino
>    Affects Versions: 1.1
>            Reporter: Edson Tirelli
>            Assignee: Torsten Curdt
>            Priority: Blocker
>             Fix For: 1.1
>
>
> 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

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


Mime
View raw message