Bug 138286

Summary: perthis() causes ClassCastException
Product: [Tools] AspectJ Reporter: Howard M. Lewis Ship <hlship>
Component: CompilerAssignee: aspectj inbox <aspectj-inbox>
Status: RESOLVED FIXED QA Contact:
Severity: normal    
Priority: P3    
Version: unspecified   
Target Milestone: 1.5.2   
Hardware: PC   
OS: Windows XP   
Whiteboard:
Attachments:
Description Flags
Abstract aspect
none
Concrete aspect
none
Annotation
none
patch containing failing testcase aclement: iplog+

Description Howard M. Lewis Ship CLA 2006-04-24 18:29:34 EDT
When using perthis() with an aspect, I see the following Internal Compiler 

AJDT 1.3.1 / AspectJ 1.5.1a
Build 20060406092046
Eclipse 3.1.2, Windows XP, JDK 1.5


Error:

java.lang.ClassCastException
at org.aspectj.weaver.patterns.PerThisOrTargetPointcutVisitor.getPerTypePointcut(PerThisOrTargetPointcutVisitor.java:41)
at org.aspectj.weaver.patterns.PerThisOrTargetPointcutVisitor.visit(PerThisOrTargetPointcutVisitor.java:108)
at org.aspectj.weaver.patterns.AndPointcut.accept(AndPointcut.java:119)
at org.aspectj.weaver.patterns.PerThisOrTargetPointcutVisitor.getPerTypePointcut(PerThisOrTargetPointcutVisitor.java:41)
at org.aspectj.weaver.PerObjectInterfaceTypeMunger.getTestTypePattern(PerObjectInterfaceTypeMunger.java:64)
at org.aspectj.weaver.PerObjectInterfaceTypeMunger.matches(PerObjectInterfaceTypeMunger.java:85)
at org.aspectj.weaver.ConcreteTypeMunger.matches(ConcreteTypeMunger.java:65)
at org.aspectj.weaver.bcel.BcelClassWeaver.weave(BcelClassWeaver.java:508)
at org.aspectj.weaver.bcel.BcelClassWeaver.weave(BcelClassWeaver.java:109)
at org.aspectj.weaver.bcel.BcelWeaver.weave(BcelWeaver.java:1560)
at org.aspectj.weaver.bcel.BcelWeaver.weaveWithoutDump(BcelWeaver.java:1511)
at org.aspectj.weaver.bcel.BcelWeaver.weaveAndNotify(BcelWeaver.java:1291)
at org.aspectj.weaver.bcel.BcelWeaver.weave(BcelWeaver.java:1089)
at org.aspectj.ajdt.internal.compiler.AjCompilerAdapter.weave(AjCompilerAdapter.java:311)
at org.aspectj.ajdt.internal.compiler.AjCompilerAdapter.afterCompiling(AjCompilerAdapter.java:183)
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:862)
at org.aspectj.ajdt.internal.core.builder.AjBuildManager.doBuild(AjBuildManager.java:242)
at org.aspectj.ajdt.internal.core.builder.AjBuildManager.batchBuild(AjBuildManager.java:161)
at org.aspectj.ajdt.internal.core.builder.AjBuildManager.doBuild(AjBuildManager.java:278)
at org.aspectj.ajdt.internal.core.builder.AjBuildManager.incrementalBuild(AjBuildManager.java:168)
at org.aspectj.ajde.internal.CompilerAdapter.compile(CompilerAdapter.java:117)
at org.aspectj.ajde.internal.AspectJBuildManager$CompilerThread.run(AspectJBuildManager.java:191)

trouble in: 
public abstract class org.apache.tapestry.internal.aspects.AbstractClassTargetting extends java.lang.Object:
  public void <init>():
                    ALOAD_0     // Lorg/apache/tapestry/internal/aspects/AbstractClassTargetting; this   (line 10)
                    INVOKESPECIAL java.lang.Object.<init> ()V
    initialization(void org.apache.tapestry.internal.aspects.AbstractClassTargetting.<init>())
    |               ALOAD_0
    |               INVOKEVIRTUAL java.lang.Object.getClass ()Ljava/lang/Class;
    |               LDC org.apache.tapestry.internal.annotations.Synchronized
    |               INVOKEVIRTUAL java.lang.Class.isAnnotationPresent (Ljava/lang/Class;)Z
    |               IFEQ L0
    |               ALOAD_0
    |               INVOKESTATIC org.apache.tapestry.internal.aspects.InternalSynchronization.ajc$perObjectBind (Ljava/lang/Object;)V
    | constructor-execution(void org.apache.tapestry.internal.aspects.AbstractClassTargetting.<init>())
    | |         L0: ALOAD_0
    | |             INVOKEVIRTUAL java.lang.Object.getClass ()Ljava/lang/Class;
    | |             LDC org.apache.tapestry.internal.annotations.Synchronized
    | |             INVOKEVIRTUAL java.lang.Class.isAnnotationPresent (Ljava/lang/Class;)Z
    | |             IFEQ L1
    | |             ALOAD_0
    | |             INVOKESTATIC org.apache.tapestry.internal.aspects.InternalSynchronization.ajc$perObjectBind (Ljava/lang/Object;)V
    | |         L1: RETURN
    | constructor-execution(void org.apache.tapestry.internal.aspects.AbstractClassTargetting.<init>())
    initialization(void org.apache.tapestry.internal.aspects.AbstractClassTargetting.<init>())
  end public void <init>()

  abstract void ajc$pointcut$$targetClasses$274()    org.aspectj.weaver.MethodDeclarationLineNumber: 16:628
;

end public abstract class org.apache.tapestry.internal.aspects.AbstractClassTargetting

when weaving type org.apache.tapestry.internal.aspects.AbstractClassTargetting
when weaving aspects 
when weaving 
when batch building BuildConfig[C:\workspace\.metadata\.plugins\org.eclipse.ajdt.core\tapestry5.generated.lst] #Files=70



I'll attach the corresponding files.
Comment 1 Howard M. Lewis Ship CLA 2006-04-24 18:30:23 EDT
Created attachment 39367 [details]
Abstract aspect
Comment 2 Howard M. Lewis Ship CLA 2006-04-24 18:30:48 EDT
Created attachment 39368 [details]
Concrete aspect
Comment 3 Howard M. Lewis Ship CLA 2006-04-24 18:31:10 EDT
Created attachment 39369 [details]
Annotation
Comment 4 Helen Beeken CLA 2006-04-26 11:35:49 EDT
Created attachment 39541 [details]
patch containing failing testcase

From the supplied testcase I've narrowed it down to a smaller version which reproduces the problem. Apply the attached patch to the tests project.
Comment 5 Andrew Clement CLA 2006-04-26 12:58:38 EDT
I've fixed this - based on the fix I've slightly reworked the testcase to confirm it's behaving as expected when the code runs.  The problem is that the perthis() is entirely depending on annotation existence - which (somewhere in the depths) causes us problems when we try and treat an AnnotationTypePattern as a TypePattern, when they are different things.  We have to create an 'AnyWithAnnotationTypePattern()' whose contents are the AnnotationTypePattern - then we can treat this new object as a standard TypePattern. clear ;)
Comment 6 Andrew Clement CLA 2006-04-27 06:16:08 EDT
fix available, will be in AJDT shortly.