Community
Participate
Working Groups
This problem was first observed when weaving large binary legacy classes with the ajc 1.2 rc1 candidate. It turns out that BCEL fails with different error messages dependent on whether we are doing a binary weave or a straight ajc compile. In the latter case, the error message is rather confusing. To reproduce: 1. Compile and run the following code to produce Foo.java // File FooProducer.java public class FooProducer { public static final int N_METHODS = 50; public static final int N_STATEMENTS = Short.MAX_VALUE/(2 * N_METHODS); public static void main(String[] args) { System.out.println("public class Foo {"); System.out.println("static java.util.Set hs = new java.util.HashSet ();"); for (int i = 0; i < N_METHODS; i++) { System.out.println("public void test" + i + "() { "); for (int j = 0; j < N_STATEMENTS; j++) { System.out.println("hs.add(new Object());"); } System.out.println("}"); } System.out.println("}"); } }// End of FooProducer.java 2. Create the following Aspect: // File a.aj aspect a { boolean around() : (target(java.util.HashSet) && call(boolean add(..) ) ) { return false; } } // End of a.aj *** 3.a - straight compile and weave: ajc - sourceroots . ABORT Exception thrown from AspectJ 1.2rc1 This might be logged as a bug already -- find current bugs at http://bugs.eclipse.org/bugs/buglist.cgi?product=AspectJ&component=Compiler Bugs for exceptions thrown have titles File:line from the top stack, e.g., "SomeFile.java:243" If you don't find the exception below in a bug, please add a new bug at http://bugs.eclipse.org/bugs/enter_bug.cgi?product=AspectJ To make the bug a priority, please include a test program that can reproduce this exception. Expected class `CONSTANT_Utf8' at index 25700 and got CONSTANT_NameAndType[12] (name_index = 25696, signature_index = 81) Expected class `CONSTANT_Utf8' at index 25700 and got CONSTANT_NameAndType[12] (name_index = 25696, signature_index = 81) org.apache.bcel.classfile.ClassFormatException: Expected class `CONSTANT_Utf8' at index 25700 and got CONSTANT_NameAndType[12](name_index = 25696, signature_index = 81) at org.apache.bcel.classfile.ConstantPool.getConstant (ConstantPool.java:271) at org.apache.bcel.classfile.Attribute.readAttribute(Attribute.java:163) at org.apache.bcel.classfile.FieldOrMethod.<init>(FieldOrMethod.java:98) at org.apache.bcel.classfile.Field.<init>(Field.java:83) at org.apache.bcel.classfile.ClassParser.readFields (ClassParser.java:270) at org.apache.bcel.classfile.ClassParser.parse(ClassParser.java:172) at org.aspectj.weaver.bcel.Utility.makeJavaClass(Utility.java:358) at org.aspectj.weaver.bcel.UnwovenClassFile.getJavaClass (UnwovenClassFile.java:63) at org.aspectj.weaver.bcel.UnwovenClassFile.getClassName (UnwovenClassFile.java:147) at org.aspectj.ajdt.internal.compiler.WeaverAdapter.acceptResult (WeaverAdapter.java:177) at org.aspectj.weaver.bcel.BcelWeaver.weaveAndNotify (BcelWeaver.java:621) at org.aspectj.weaver.bcel.BcelWeaver.weave(BcelWeaver.java:563) at org.aspectj.ajdt.internal.compiler.AjCompilerAdapter.weave (AjCompilerAdapter.java:239) at org.aspectj.ajdt.internal.compiler.AjCompilerAdapter.afterCompiling (AjCompilerAdapter.java:114) at org.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:376) at org.aspectj.ajdt.internal.core.builder.AjBuildManager.performCompilation (AjBuildManager.java:600) at org.aspectj.ajdt.internal.core.builder.AjBuildManager.doBuild (AjBuildManager.java:160) at org.aspectj.ajdt.internal.core.builder.AjBuildManager.batchBuild (AjBuildManager.java:94) at org.aspectj.ajdt.ajc.AjdtCommand.doCommand(AjdtCommand.java:102) at org.aspectj.ajdt.ajc.AjdtCommand.runCommand(AjdtCommand.java:53) at org.aspectj.tools.ajc.Main.run(Main.java:280) at org.aspectj.tools.ajc.Main.runMain(Main.java:217) at org.aspectj.tools.ajc.Main.main(Main.java:79) 1 fail|abort Signal 127 *** 3b - binary weave ajc -noweave -outjar test.jar a.aj javac -d classes Foo.java ajc -aspectpath test.jar -inpath classes ABORT Exception thrown from AspectJ 1.2rc1 This might be logged as a bug already -- find current bugs at http://bugs.eclipse.org/bugs/buglist.cgi?product=AspectJ&component=Compiler Bugs for exceptions thrown have titles File:line from the top stack, e.g., "SomeFile.java:243" If you don't find the exception below in a bug, please add a new bug at http://bugs.eclipse.org/bugs/enter_bug.cgi?product=AspectJ To make the bug a priority, please include a test program that can reproduce this exception. Class can't be both final and abstract Class can't be both final and abstract org.apache.bcel.classfile.ClassFormatException: Class can't be both final and abstract at org.apache.bcel.classfile.ClassParser.readClassInfo (ClassParser.java:242) at org.apache.bcel.classfile.ClassParser.parse(ClassParser.java:165) at org.aspectj.weaver.bcel.Utility.makeJavaClass(Utility.java:358) at org.aspectj.weaver.bcel.UnwovenClassFile.getJavaClass (UnwovenClassFile.java:63) at org.aspectj.weaver.bcel.UnwovenClassFile.getClassName (UnwovenClassFile.java:147) at org.aspectj.ajdt.internal.compiler.WeaverAdapter.acceptResult (WeaverAdapter.java:177) at org.aspectj.weaver.bcel.BcelWeaver.weaveAndNotify (BcelWeaver.java:621) at org.aspectj.weaver.bcel.BcelWeaver.weave(BcelWeaver.java:563) at org.aspectj.ajdt.internal.compiler.AjCompilerAdapter.weave (AjCompilerAdapter.java:239) at org.aspectj.ajdt.internal.compiler.AjCompilerAdapter.afterCompiling (AjCompilerAdapter.java:114) at org.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:376) at org.aspectj.ajdt.internal.core.builder.AjBuildManager.performCompilation (AjBuildManager.java:600) at org.aspectj.ajdt.internal.core.builder.AjBuildManager.doBuild (AjBuildManager.java:160) at org.aspectj.ajdt.internal.core.builder.AjBuildManager.batchBuild (AjBuildManager.java:94) at org.aspectj.ajdt.ajc.AjdtCommand.doCommand(AjdtCommand.java:102) at org.aspectj.ajdt.ajc.AjdtCommand.runCommand(AjdtCommand.java:53) at org.aspectj.tools.ajc.Main.run(Main.java:280) at org.aspectj.tools.ajc.Main.runMain(Main.java:217) at org.aspectj.tools.ajc.Main.main(Main.java:79) 1 fail|abort Signal 127
Seems like the bug is caused by a truncation of the ConstantPool unsigned short limit of 65535 when BcelClassWeaver writes the bytecode after weaving. I.e. this happens when the ConstantPool size is larger than 65535. There is not much ajc can do about that limit but I propose that a more meaningful error message is generated by the weaver in this case.
In both scenarios the compilation will now fail cleanly with an error message: The class Foo exceeds the maximum class size supported by the JVM (constant pool too big). Will close this bug once the fix is available in a published build. Thanks for the clear test case.
Fix now available in latest build on AspectJ download page.
Fix released as part of AspectJ 1.2.1