Bug 37325 - Weaver fails with NPE for very large source files
Summary: Weaver fails with NPE for very large source files
Status: RESOLVED FIXED
Alias: None
Product: AspectJ
Classification: Tools
Component: Compiler (show other bugs)
Version: unspecified   Edit
Hardware: PC Windows 2000
: P2 major (vote)
Target Milestone: ---   Edit
Assignee: Jim Hugunin CLA
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2003-05-07 10:23 EDT by Per S Hustad CLA
Modified: 2003-05-11 14:53 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 2003-05-07 10:23:05 EDT
Version:
AspectJ Compiler 1.1rc1

For very large source files, i.e number of lines exceeds 32762 lines (!)
the ajc fails with a NullPointerException. One might ask if anyone would
write such a large class but this could be the case with generated java
code...

To reproduce:
1: Create the aspect file:
*** File: A.aj
import org.aspectj.lang.JoinPoint;
aspect A  {

    pointcut executionAll() : (execution(* *.*(..)));

    Object around(): executionAll() {
     report("DEBUG TRACE:",thisJoinPoint);
     return proceed();
    }
    private void report(String t, JoinPoint x)
    {    
      System.out.println(t + x.toString());
    }
}
*** End of A.aj
2. Create the Test.java file. Note you must insert an enormous amount of 
comment lines ... 
*** File: Test.java
public class Test {
// Line 2
// INSERT something line Short.MAX_VALUE (32767) comment lines here 
// ...
// Line > 32768
public String getBug()
{
  return "test";
}

}
*** End of Test.java

3. Compile
ajc -sourceroots .
Stack trace:
trouble in: 
public class Test extends java.lang.Object:
  public static final org.aspectj.lang.JoinPoint$StaticPart ajc$tjp_0
  public void <init>():
                    ALOAD_0     // Test this   (line 1)
                    INVOKESPECIAL java.lang.Object.<init> ()V
    constructor-execution(void Test.<init>())
    |               RETURN
    constructor-execution(void Test.<init>())
  end public void <init>()

  public String getBug():
                    GETSTATIC Test.ajc$tjp_0 
Lorg/aspectj/lang/JoinPoint$StaticPart;
                    ALOAD_0
                    ALOAD_0
                    BIPUSH 0
                    ANEWARRAY java.lang.Object
                    ASTORE_2
                    ALOAD_2
                    INVOKESTATIC org.aspectj.runtime.reflect.Factory.makeJP 
(Lorg/aspectj/lang/JoinPoint$StaticPart;Ljava/lang/Object;Ljava/lang/Object;
[Ljava/lang/Object;)Lorg/aspectj/lang/JoinPoint;
                    ASTORE_1
    method-execution(java.lang.String Test.getBug())
    |               INVOKESTATIC A.aspectOf ()LA;
    |               ACONST_NULL
    |               ALOAD_1
    |               ASTORE 5
    |               ASTORE 4
    |               ASTORE_3
    | advice-execution(java.lang.Object A.ajc$around$A$77
(org.aspectj.runtime.internal.AroundClosure, org.aspectj.lang.JoinPoint))
    | |             ALOAD_3   (line 7)
    | |             LDC "DEBUG TRACE:"
    | |             ALOAD 5
    | |             INVOKESTATIC A.ajc$inlineAccessMethod$A$A$report 
(LA;Ljava/lang/String;Lorg/aspectj/lang/JoinPoint;)V
    | |             ALOAD 4   (line 8)
    | |             ASTORE 6
    | |             ALOAD_0
    | |             ALOAD_1
    | |             INVOKESTATIC Test.getBug_aroundBody0 
(LTest;Lorg/aspectj/lang/JoinPoint;)Ljava/lang/String;
    | |             GOTO L0
    | advice-execution(java.lang.Object A.ajc$around$A$77
(org.aspectj.runtime.internal.AroundClosure, org.aspectj.lang.JoinPoint))
    |           L0: NOP
    |               CHECKCAST java.lang.String
    |               ARETURN
    method-execution(java.lang.String Test.getBug())
  end public String getBug()

  static final String getBug_aroundBody0(Test, org.aspectj.lang.JoinPoint):
                    LDC "HHHH"   (line 32774)
                    ARETURN
  end static final String getBug_aroundBody0(Test, org.aspectj.lang.JoinPoint)
end public class Test
ABORT
Exception thrown from AspectJ 1.1rc1

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.
null
java.lang.NullPointerException
	at org.aspectj.weaver.bcel.Utility.createConstant(Utility.java:334)
	at org.aspectj.weaver.bcel.LazyClassGen.initializeTjp
(LazyClassGen.java:472)
	at org.aspectj.weaver.bcel.LazyClassGen.initializeAllTjps
(LazyClassGen.java:443)
	at org.aspectj.weaver.bcel.LazyClassGen.addAjcInitializers
(LazyClassGen.java:401)
	at org.aspectj.weaver.bcel.LazyClassGen.writeBack(LazyClassGen.java:155)
	at org.aspectj.weaver.bcel.LazyClassGen.getJavaClass
(LazyClassGen.java:169)
	at org.aspectj.weaver.bcel.BcelWeaver.dump(BcelWeaver.java:376)
	at org.aspectj.weaver.bcel.BcelWeaver.weave(BcelWeaver.java:323)
	at org.aspectj.weaver.bcel.BcelWeaver.weave(BcelWeaver.java:302)
	at org.aspectj.weaver.bcel.BcelWeaver.weave(BcelWeaver.java:265)
	at 
org.aspectj.ajdt.internal.core.builder.AjBuildManager.weaveAndGenerateClassFiles
(AjBuildManager.java:394)
	at org.aspectj.ajdt.internal.core.builder.AjBuildManager.batchBuild
(AjBuildManager.java:149)
	at org.aspectj.ajdt.ajc.AjdtCommand.runCommand(AjdtCommand.java:55)
	at org.aspectj.tools.ajc.Main.run(Main.java:216)
	at org.aspectj.tools.ajc.Main.runMain(Main.java:155)
	at org.aspectj.tools.ajc.Main.main(Main.java:72)


1 fail|abort
Signal 127

Reason:
The org.aspectj.weaver.bcel.Utility.createConstant branches dependent on
the source line number. When the number is greater than Short.MAX_VALUE
a NullPointerException is thrown because of a null "fact.getClassGen()".
Comment 1 Jim Hugunin CLA 2003-05-11 14:53:48 EDT
fixed in tree with test in bugs/LongFile.java