Bug 138286 - perthis() causes ClassCastException
Summary: perthis() causes ClassCastException
Status: RESOLVED FIXED
Alias: None
Product: AspectJ
Classification: Tools
Component: Compiler (show other bugs)
Version: unspecified   Edit
Hardware: PC Windows XP
: P3 normal (vote)
Target Milestone: 1.5.2   Edit
Assignee: aspectj inbox CLA
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2006-04-24 18:29 EDT by Howard M. Lewis Ship CLA
Modified: 2012-04-03 15:48 EDT (History)
0 users

See Also:


Attachments
Abstract aspect (3.21 KB, application/octet-stream)
2006-04-24 18:30 EDT, Howard M. Lewis Ship CLA
no flags Details
Concrete aspect (502 bytes, application/octet-stream)
2006-04-24 18:30 EDT, Howard M. Lewis Ship CLA
no flags Details
Annotation (2.06 KB, application/octet-stream)
2006-04-24 18:31 EDT, Howard M. Lewis Ship CLA
no flags Details
patch containing failing testcase (2.66 KB, patch)
2006-04-26 11:35 EDT, Helen Beeken CLA
aclement: iplog+
Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
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.