The following statement :
new SimpleCompiler().cook(new StringReader("class Test{Class c = String.class;}"));
throws Exception in thread "main" java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:449)
at java.util.AbstractList$Itr.next(AbstractList.java:420)
at org.codehaus.janino.UnitCompiler.initializeInstanceVariablesAndInvokeInstanceInitializers(UnitCompiler.java:4220)
at org.codehaus.janino.UnitCompiler.compile(UnitCompiler.java:1523)
at org.codehaus.janino.UnitCompiler.compile2(UnitCompiler.java:231)
at org.codehaus.janino.UnitCompiler.compile2(UnitCompiler.java:112)
at org.codehaus.janino.UnitCompiler$1.visitPackageMemberClassDeclaration(UnitCompiler.java:85)
at org.codehaus.janino.Java$PackageMemberClassDeclaration.accept(Java.java:676)
at org.codehaus.janino.UnitCompiler.compile(UnitCompiler.java:91)
at org.codehaus.janino.UnitCompiler.compileUnit(UnitCompiler.java:69)
at org.codehaus.janino.SimpleCompiler.compileToClassLoader(SimpleCompiler.java:396)
at org.codehaus.janino.SimpleCompiler.cook(SimpleCompiler.java:224)
at org.codehaus.janino.Cookable.cook(Cookable.java:68)
at org.codehaus.janino.Cookable.cook(Cookable.java:60)
Static variables don't throw any exceptions though.
I can't fix this right now because I'm not at home, but if you change the first two lines of UnitCompiler.initializeInstanceVariablesAndInvokeInstanceInitializers() from
for (Iterator it = cd.getDeclaringClass().variableDeclaratorsAndInitializers.iterator(); it.hasNext();) { Java.TypeBodyDeclaration tbd = (Java.TypeBodyDeclaration) it.next();to
, then it should work fine... please complain if not!
CU
Arno