Bug 59208 - Weaver fails in BCEL for large classes
Summary: Weaver fails in BCEL for large classes
Status: RESOLVED FIXED
Alias: None
Product: AspectJ
Classification: Tools
Component: Compiler (show other bugs)
Version: 1.2   Edit
Hardware: PC Windows 2000
: P3 normal (vote)
Target Milestone: 1.2.1   Edit
Assignee: Adrian Colyer CLA
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2004-04-20 05:23 EDT by Per S Hustad CLA
Modified: 2004-10-21 04:31 EDT (History)
0 users

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Per S Hustad CLA 2004-04-20 05:23:13 EDT
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
Comment 1 Per S Hustad CLA 2004-04-22 15:39:17 EDT
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.
Comment 2 Adrian Colyer CLA 2004-08-10 07:15:34 EDT
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.
Comment 3 Adrian Colyer CLA 2004-08-10 12:03:17 EDT
Fix now available in latest build on AspectJ download page.
Comment 4 Adrian Colyer CLA 2004-10-21 04:31:45 EDT
Fix released as part of AspectJ 1.2.1