Bug 115204 - WildAnnotationTypePattern.java:61 NPE after renaming method-annotation class
Summary: WildAnnotationTypePattern.java:61 NPE after renaming method-annotation class
Status: RESOLVED FIXED
Alias: None
Product: AspectJ
Classification: Tools
Component: Compiler (show other bugs)
Version: 1.5.0M4   Edit
Hardware: PC Windows XP
: P2 normal (vote)
Target Milestone: 1.5.0RC1   Edit
Assignee: Andrew Clement CLA
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2005-11-05 06:03 EST by Wes Isberg CLA
Modified: 2005-11-22 22:55 EST (History)
0 users

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Wes Isberg CLA 2005-11-05 06:03:26 EST
Sorry I don't have a small test case.  It looks like the NPE happens when the
annotation refered to by a (compiled?) aspect no longer exists because it was
renamed.  The class being woven is the first one (alphabetically), and the
method being woven does not have the annotation on it.

Let me know if you need a test case.
(And sorry for the late bugs - I'm just now writing the article.)

------------------------------------------------------------------
java.lang.NullPointerException
at
org.aspectj.weaver.patterns.WildAnnotationTypePattern.matches(WildAnnotationTypePattern.java:61)
at
org.aspectj.weaver.patterns.SignaturePattern.matchesAnnotations(SignaturePattern.java:321)
at
org.aspectj.weaver.patterns.SignaturePattern.matchesExactly(SignaturePattern.java:169)
at org.aspectj.weaver.patterns.SignaturePattern.matches(SignaturePattern.java:131)
at
org.aspectj.weaver.patterns.WithincodePointcut.matchInternal(WithincodePointcut.java:73)
at org.aspectj.weaver.patterns.Pointcut.match(Pointcut.java:143)
at org.aspectj.weaver.patterns.AndPointcut.matchInternal(AndPointcut.java:55)
at org.aspectj.weaver.patterns.Pointcut.match(Pointcut.java:143)
at org.aspectj.weaver.patterns.AndPointcut.matchInternal(AndPointcut.java:55)
at org.aspectj.weaver.patterns.Pointcut.match(Pointcut.java:143)
at org.aspectj.weaver.ShadowMunger.match(ShadowMunger.java:64)
at org.aspectj.weaver.Advice.match(Advice.java:109)
at org.aspectj.weaver.bcel.BcelAdvice.match(BcelAdvice.java:97)
at org.aspectj.weaver.bcel.BcelClassWeaver.match(BcelClassWeaver.java:1749)
at
org.aspectj.weaver.bcel.BcelClassWeaver.matchInvokeInstruction(BcelClassWeaver.java:1736)
at org.aspectj.weaver.bcel.BcelClassWeaver.match(BcelClassWeaver.java:1533)
at org.aspectj.weaver.bcel.BcelClassWeaver.match(BcelClassWeaver.java:1359)
at org.aspectj.weaver.bcel.BcelClassWeaver.weave(BcelClassWeaver.java:382)
at org.aspectj.weaver.bcel.BcelClassWeaver.weave(BcelClassWeaver.java:98)
at org.aspectj.weaver.bcel.BcelWeaver.weave(BcelWeaver.java:1478)
at org.aspectj.weaver.bcel.BcelWeaver.weaveWithoutDump(BcelWeaver.java:1443)
at org.aspectj.weaver.bcel.BcelWeaver.weaveAndNotify(BcelWeaver.java:1217)
at org.aspectj.weaver.bcel.BcelWeaver.weave(BcelWeaver.java:1021)
at
org.aspectj.ajdt.internal.compiler.AjCompilerAdapter.weave(AjCompilerAdapter.java:300)
at
org.aspectj.ajdt.internal.compiler.AjCompilerAdapter.afterCompiling(AjCompilerAdapter.java:178)
at
org.aspectj.ajdt.internal.compiler.CompilerAdapter.ajc$afterReturning$org_aspectj_ajdt_internal_compiler_CompilerAdapter$2$f9cc9ca0(CompilerAdapter.aj:70)
at org.aspectj.org.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:367)
at
org.aspectj.ajdt.internal.core.builder.AjBuildManager.performCompilation(AjBuildManager.java:759)
at
org.aspectj.ajdt.internal.core.builder.AjBuildManager.doBuild(AjBuildManager.java:225)
at
org.aspectj.ajdt.internal.core.builder.AjBuildManager.batchBuild(AjBuildManager.java:151)
at org.aspectj.ajde.internal.CompilerAdapter.compile(CompilerAdapter.java:122)
at
org.aspectj.ajde.internal.AspectJBuildManager$CompilerThread.run(AspectJBuildManager.java:191)

trouble in: 
public class com.isberg.articles.aop7.bean.ABeanTest$APlus extends java.lang.Object:
  TypeMungers: [(BcelTypeMunger ResolvedTypeMunger(Method, java.lang.String
com.isberg.articles.aop7.bean.ABeanTest$CPlus.propertyName(java.lang.String)))]
     declares: [declare parents: com.isberg.articles.aop7.bean.ABeanTest$CPlus
extends (com.isberg.articles.aop7.bean.ABean$IBean);]
  private static Throwable ajc$initFailureCause
  public static final com.isberg.articles.aop7.bean.ABeanTest$APlus
ajc$perSingletonInstance
  static void <clinit>():
    staticinitialization(void
com.isberg.articles.aop7.bean.ABeanTest$APlus.<clinit>())
    | catch java.lang.Throwable -> E0
    | |             INVOKESTATIC
com.isberg.articles.aop7.bean.ABeanTest$APlus.ajc$postClinit ()V   (line 125)
    | catch java.lang.Throwable -> E0
    |               GOTO L0
    |           E0: ASTORE_0
    |               ALOAD_0
    |               PUTSTATIC
com.isberg.articles.aop7.bean.ABeanTest$APlus.ajc$initFailureCause
Ljava/lang/Throwable;
    |           L0: RETURN
    staticinitialization(void
com.isberg.articles.aop7.bean.ABeanTest$APlus.<clinit>())
  end static void <clinit>()

  void <init>():
                    ALOAD_0     // com.isberg.articles.aop7.bean.ABeanTest$APlus
this   (line 125)
                    INVOKESPECIAL java.lang.Object.<init> ()V
    constructor-execution(void
com.isberg.articles.aop7.bean.ABeanTest$APlus.<init>())
    |               RETURN
    constructor-execution(void
com.isberg.articles.aop7.bean.ABeanTest$APlus.<init>())
  end void <init>()

  void ajc$declare_parents_1()   
org.aspectj.weaver.MethodDeclarationLineNumber: 127:3678
:
                    RETURN   (line 127)
  end void ajc$declare_parents_1()

  public static String
ajc$interMethod$com_isberg_articles_aop7_bean_ABeanTest$APlus$com_isberg_articles_aop7_bean_ABeanTest$CPlus$propertyName(com.isberg.articles.aop7.bean.ABeanTest$CPlus,
String)    EffectiveSignatureAttribute(java.lang.String
com.isberg.articles.aop7.bean.ABeanTest$CPlus.propertyName(java.lang.String),
method-execution)
:
    method-execution(java.lang.String
com.isberg.articles.aop7.bean.ABeanTest$CPlus.propertyName(java.lang.String))
    |               ALOAD_0     // com.isberg.articles.aop7.bean.ABeanTest$CPlus
ajc$this_   (line 132)
    |               ALOAD_1     // java.lang.String methodName
    |               INVOKESTATIC
com.isberg.articles.aop7.bean.ABean.ajc$interMethod$com_isberg_articles_aop7_bean_ABean$com_isberg_articles_aop7_bean_ABean$IBean$propertyName
(Lcom/isberg/articles/aop7/bean/ABean$IBean;Ljava/lang/String;)Ljava/lang/String;
    |               ASTORE_2
    |               LDC "something"   (line 133)
    |               ALOAD_2     // java.lang.String result
    | method-call(boolean java.lang.String.equals(java.lang.Object))
    | |             INVOKEVIRTUAL java.lang.String.equals (Ljava/lang/Object;)Z
    | method-call(boolean java.lang.String.equals(java.lang.Object))
    |               IFEQ L0
    |               LDC "a"   (line 134)
    |               ASTORE_2     // java.lang.String result
    |           L0: ALOAD_2     // java.lang.String result   (line 136)
    |               ARETURN
    method-execution(java.lang.String
com.isberg.articles.aop7.bean.ABeanTest$CPlus.propertyName(java.lang.String))
  end public static String
ajc$interMethod$com_isberg_articles_aop7_bean_ABeanTest$APlus$com_isberg_articles_aop7_bean_ABeanTest$CPlus$propertyName(com.isberg.articles.aop7.bean.ABeanTest$CPlus,
String)

  public static String
ajc$interMethodDispatch1$com_isberg_articles_aop7_bean_ABeanTest$APlus$com_isberg_articles_aop7_bean_ABeanTest$CPlus$propertyName(com.isberg.articles.aop7.bean.ABeanTest$CPlus,
String)    EffectiveSignatureAttribute(java.lang.String
com.isberg.articles.aop7.bean.ABeanTest$CPlus.propertyName(java.lang.String),
method-call)
:
                    ALOAD_0
                    ALOAD_1
                    INVOKEVIRTUAL
com.isberg.articles.aop7.bean.ABeanTest$CPlus.propertyName
(Ljava/lang/String;)Ljava/lang/String;
                    ARETURN
  end public static String
ajc$interMethodDispatch1$com_isberg_articles_aop7_bean_ABeanTest$APlus$com_isberg_articles_aop7_bean_ABeanTest$CPlus$propertyName(com.isberg.articles.aop7.bean.ABeanTest$CPlus,
String)

  public static com.isberg.articles.aop7.bean.ABeanTest$APlus aspectOf()   
org.aspectj.weaver.AjAttribute$AjSynthetic@591171
:
                    GETSTATIC
com.isberg.articles.aop7.bean.ABeanTest$APlus.ajc$perSingletonInstance
Lcom/isberg/articles/aop7/bean/ABeanTest$APlus;
                    IFNONNULL L0
                    NEW org.aspectj.lang.NoAspectBoundException
                    DUP
                    LDC "com_isberg_articles_aop7_bean_ABeanTest$APlus"
                    GETSTATIC
com.isberg.articles.aop7.bean.ABeanTest$APlus.ajc$initFailureCause
Ljava/lang/Throwable;
                    INVOKESPECIAL org.aspectj.lang.NoAspectBoundException.<init>
(Ljava/lang/String;Ljava/lang/Throwable;)V
                    ATHROW
                L0: GETSTATIC
com.isberg.articles.aop7.bean.ABeanTest$APlus.ajc$perSingletonInstance
Lcom/isberg/articles/aop7/bean/ABeanTest$APlus;
                    ARETURN
  end public static com.isberg.articles.aop7.bean.ABeanTest$APlus aspectOf()

  public static boolean hasAspect()   
org.aspectj.weaver.AjAttribute$AjSynthetic@16e3eb3
:
                    GETSTATIC
com.isberg.articles.aop7.bean.ABeanTest$APlus.ajc$perSingletonInstance
Lcom/isberg/articles/aop7/bean/ABeanTest$APlus;
                    IFNULL L0
                    ICONST_1
                    IRETURN
                L0: ICONST_0
                    IRETURN
  end public static boolean hasAspect()

  private static void ajc$postClinit()   
org.aspectj.weaver.AjAttribute$AjSynthetic@d7cf62
:
                    NEW com.isberg.articles.aop7.bean.ABeanTest$APlus
                    DUP
                    INVOKESPECIAL
com.isberg.articles.aop7.bean.ABeanTest$APlus.<init> ()V
                    PUTSTATIC
com.isberg.articles.aop7.bean.ABeanTest$APlus.ajc$perSingletonInstance
Lcom/isberg/articles/aop7/bean/ABeanTest$APlus;
                    RETURN
  end private static void ajc$postClinit()
end public class com.isberg.articles.aop7.bean.ABeanTest$APlus

when matching pointcut ((withincode(@(Parallel) * *(..)) && call(void *(..))) &&
percflow(com.isberg.articles.aop7.concurrent.ParallelMethodImpl on
execution(@(Parallel) * *(..))))
when matching shadow method-call(boolean java.lang.String.equals(java.lang.Object))
when weaving type com.isberg.articles.aop7.bean.ABeanTest$APlus
when weaving aspects 
when weaving 
when batch building
BuildConfig[c:\home\ws\main-31\.metadata\.plugins\org.eclipse.ajdt.core\devworks-fall.generated.lst]
#Files=70
Comment 1 Adrian Colyer CLA 2005-11-10 11:16:20 EST
for investigation prior to RC1
Comment 2 Andrew Clement CLA 2005-11-18 05:33:47 EST
fix checked in. waiting on build.
Comment 3 Andrew Clement CLA 2005-11-18 07:08:00 EST
fix available.  Wes, if you remember and still have the environment, can you try
it out when AJDT gets updated (probably Monday?).
Comment 4 Wes Isberg CLA 2005-11-22 22:55:05 EST
I'm unable to reproduce in AJDT 20051122132809.

There is the usual incremental issue that after code has been invalidated by something like rename, not all dependent code is wiped, so an illegal class seems to be constructed.  In this case, when running the class I get a VerifyError:
----------------------------------
Exception in thread "main" java.lang.VerifyError: (class: bugs/Bug115204, method: <clinit> signature: ()V) Stack size too large
	at bugs.Bug115204Class.main(Bug115204Class.java)
----------------------------------
I don't think it's related and I think it's already a bug.  

But just in case, here's the procedure and the code:

- define all classes/aspects
- rename the annotation class  from Annot to AnnotRenamed
- run the main class
RESULT: VerifyError above

The code:
------------------------------------
package bugs;

public aspect Bug115204 {
    before() : execution(@Annot void Bug115204Class.*(..)) {
        System.out.println("before " + thisJoinPoint);
    }
}
------------------------------------
package bugs;

public class Bug115204Class {

    @Annot()
    public static void main(String[] args) {
        System.out.println("Bug115204Class.main(String[])");
    }
}

------------------------------------
package bugs;

public @interface Annot {
}

------------------------------------ becomes
package bugs;

public @interface AnnotRenamed {
}