Community
Participate
Working Groups
class Base { /** extend when overriding - must call Base.lockResource() */ public void lockResource() { /* ... */ } } class Derived extends Base { boolean isLocked; public void lockResource() { // Whoops: didn't call super.lockResource() super.lockResource(); isLocked = true; } } public aspect EnsureOverriding pertarget(mustExtend()) { boolean calledSuper = false; pointcut mustExtend() : execution(void Base+.lockResource(..)) && !within(Base); after () returning: mustExtend() { System.err.println ("returning: "+calledSuper+"from "+thisJoinPoint+" at "+this); assert(calledSuper); if (!calledSuper) { throw new RuntimeException("bad"); } } after(Base a, Base b) returning: cflow(mustExtend() && target(a)) && execution(void Base.lockResource(..)) && target(b) { if (a == b) { System.err.println("made call"); calledSuper = true; } } public static void main(String args[]) { (new Derived()).lockResource(); } } error output: D:\devel\test>ajc -1.4 EnsureOverriding.aj trouble in: public class EnsureOverriding extends java.lang.Object implements EnsureOverrid ng$ajcMightHaveAspect: boolean calledSuper static final boolean $assertionsDisabled [Synthetic] static Class class$0 [Synthetic] private transient EnsureOverriding ajc$EnsureOverriding$perObjectField public static final org.aspectj.runtime.internal.CFlowStack ajc$cflowStack$0 static void <clinit>(): GETSTATIC EnsureOverriding.class$0 Ljava/lang/Class; (lin 16) DUP IFNONNULL L0 POP catch java.lang.ClassNotFoundException -> E0 | LDC "EnsureOverriding" | INVOKESTATIC java.lang.Class.forName (Ljava/lang/String;)Lj va/lang/Class; catch java.lang.ClassNotFoundException -> E0 DUP PUTSTATIC EnsureOverriding.class$0 Ljava/lang/Class; GOTO L0 E0: NEW java.lang.NoClassDefFoundError DUP_X1 SWAP INVOKEVIRTUAL java.lang.Throwable.getMessage ()Ljava/lang/S ring; INVOKESPECIAL java.lang.NoClassDefFoundError.<init> (Ljava/ ang/String;)V ATHROW L0: INVOKEVIRTUAL java.lang.Class.desiredAssertionStatus ()Z IFNE L1 ICONST_1 GOTO L2 L1: ICONST_0 L2: PUTSTATIC EnsureOverriding.$assertionsDisabled Z RETURN end static void <clinit>() public void <init>(): ALOAD_0 // EnsureOverriding this (line 16) INVOKESPECIAL java.lang.Object.<init> ()V ALOAD_0 // EnsureOverriding this (line 17) ICONST_0 PUTFIELD EnsureOverriding.calledSuper Z RETURN (line 16) end public void <init>() public void ajc$afterReturning$EnsureOverriding$21b(org.aspectj.lang.JoinPoin ) AdviceAttribute(afterReturning, mustExtend(), 2, 539) : GETSTATIC java.lang.System.err Ljava/io/PrintStream; (lin 22) NEW java.lang.StringBuffer DUP LDC "returning: " INVOKESPECIAL java.lang.StringBuffer.<init> (Ljava/lang/Str ng;)V ALOAD_0 // EnsureOverriding this GETFIELD EnsureOverriding.calledSuper Z INVOKEVIRTUAL java.lang.StringBuffer.append (Z)Ljava/lang/S ringBuffer; LDC " from " INVOKEVIRTUAL java.lang.StringBuffer.append (Ljava/lang/Str ng;)Ljava/lang/StringBuffer; ALOAD_1 // org.aspectj.lang.JoinPoint arg0 INVOKEVIRTUAL java.lang.StringBuffer.append (Ljava/lang/Obj ct;)Ljava/lang/StringBuffer; LDC " at " INVOKEVIRTUAL java.lang.StringBuffer.append (Ljava/lang/Str ng;)Ljava/lang/StringBuffer; ALOAD_0 // EnsureOverriding this INVOKEVIRTUAL java.lang.StringBuffer.append (Ljava/lang/Obj ct;)Ljava/lang/StringBuffer; INVOKEVIRTUAL java.lang.StringBuffer.toString ()Ljava/lang/ tring; INVOKEVIRTUAL java.io.PrintStream.println (Ljava/lang/Strin ;)V GETSTATIC EnsureOverriding.$assertionsDisabled Z (line 23 IFNE L0 ALOAD_0 // EnsureOverriding this GETFIELD EnsureOverriding.calledSuper Z IFNE L0 NEW java.lang.AssertionError DUP INVOKESPECIAL java.lang.AssertionError.<init> ()V ATHROW L0: ALOAD_0 // EnsureOverriding this (line 24) GETFIELD EnsureOverriding.calledSuper Z IFNE L1 NEW java.lang.RuntimeException DUP LDC "bad" INVOKESPECIAL java.lang.RuntimeException.<init> (Ljava/lang String;)V ATHROW L1: RETURN (line 25) end public void ajc$afterReturning$EnsureOverriding$21b(org.aspectj.lang.Join oint) public void ajc$afterReturning$EnsureOverriding$2f9(Base, Base) AdviceAttr bute(afterReturning, (cflow((mustExtend() && target(BindingTypePattern(Base, 0) )) && (execution(ExactTypePattern(void) ExactTypePattern(Base).lockResource(..) && target(BindingTypePattern(Base, 1)))), 0, 761) : ALOAD_1 // Base arg0 (line 29) ALOAD_2 // Base b IF_ACMPNE L0 GETSTATIC java.lang.System.err Ljava/io/PrintStream; (lin 30) LDC "made call" INVOKEVIRTUAL java.io.PrintStream.println (Ljava/lang/Strin ;)V ALOAD_0 // EnsureOverriding this (line 31) ICONST_1 PUTFIELD EnsureOverriding.calledSuper Z L0: RETURN (line 33) end public void ajc$afterReturning$EnsureOverriding$2f9(Base, Base) public static void main(String[]): NEW Derived (line 36) DUP INVOKESPECIAL Derived.<init> ()V INVOKEVIRTUAL Derived.lockResource ()V RETURN (line 37) end public static void main(String[]) public static EnsureOverriding aspectOf(Object) org.aspectj.weaver.AjAttri ute$AjSynthetic@16546ef : ALOAD_0 // java.lang.Object arg0 INSTANCEOF EnsureOverriding$ajcMightHaveAspect IFEQ L1 ALOAD_0 // java.lang.Object arg0 CHECKCAST EnsureOverriding$ajcMightHaveAspect INVOKEINTERFACE EnsureOverriding$ajcMightHaveAspect.ajc$Ens reOverriding$perObjectGet ()LEnsureOverriding; DUP IFNULL L0 ARETURN L0: POP L1: NEW org.aspectj.lang.NoAspectBoundException DUP INVOKESPECIAL org.aspectj.lang.NoAspectBoundException.<init ()V ATHROW end public static EnsureOverriding aspectOf(Object) public static boolean hasAspect(Object) org.aspectj.weaver.AjAttribute$AjS nthetic@1428ea : ALOAD_0 // java.lang.Object arg0 INSTANCEOF EnsureOverriding$ajcMightHaveAspect IFEQ L0 ALOAD_0 // java.lang.Object arg0 CHECKCAST EnsureOverriding$ajcMightHaveAspect INVOKEINTERFACE EnsureOverriding$ajcMightHaveAspect.ajc$Ens reOverriding$perObjectGet ()LEnsureOverriding; IFNULL L0 ICONST_1 IRETURN L0: ICONST_0 IRETURN end public static boolean hasAspect(Object) public static void ajc$perObjectBind(Object) org.aspectj.weaver.AjAttribut $AjSynthetic@18a49e0 : ALOAD_0 // java.lang.Object arg0 INSTANCEOF EnsureOverriding$ajcMightHaveAspect IFEQ L0 ALOAD_0 // java.lang.Object arg0 CHECKCAST EnsureOverriding$ajcMightHaveAspect INVOKEINTERFACE EnsureOverriding$ajcMightHaveAspect.ajc$Ens reOverriding$perObjectGet ()LEnsureOverriding; IFNONNULL L0 ALOAD_0 // java.lang.Object arg0 CHECKCAST EnsureOverriding$ajcMightHaveAspect NEW EnsureOverriding DUP INVOKESPECIAL EnsureOverriding.<init> ()V INVOKEINTERFACE EnsureOverriding$ajcMightHaveAspect.ajc$Ens reOverriding$perObjectSet (LEnsureOverriding;)V L0: RETURN end public static void ajc$perObjectBind(Object) public EnsureOverriding ajc$EnsureOverriding$perObjectGet(): ALOAD_0 GETFIELD EnsureOverriding.ajc$EnsureOverriding$perObjectFie d LEnsureOverriding; ARETURN end public EnsureOverriding ajc$EnsureOverriding$perObjectGet() public void ajc$EnsureOverriding$perObjectSet(EnsureOverriding): ALOAD_0 ALOAD_1 PUTFIELD EnsureOverriding.ajc$EnsureOverriding$perObjectFie d LEnsureOverriding; RETURN end public void ajc$EnsureOverriding$perObjectSet(EnsureOverriding) end public class EnsureOverriding Exception thrown from AspectJ 1.1b2 This might be logged as a bug already -- see the bug database at http://dev.eclipse.org (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 To make the bug a priority, please include a test program that can reproduce this exception. unimplemented unimplemented java.lang.RuntimeException: unimplemented at org.aspectj.weaver.bcel.LazyClassGen.getAjcClinit(Unknown Source) at org.aspectj.weaver.bcel.BcelCflowStackFieldAdder.munge(Unknown Sourc ) at org.aspectj.weaver.bcel.BcelClassWeaver.weave(Unknown Source) at org.aspectj.weaver.bcel.BcelClassWeaver.weave(Unknown Source) at org.aspectj.weaver.bcel.BcelWeaver.weave(Unknown Source) at org.aspectj.weaver.bcel.BcelWeaver.weave(Unknown Source) at org.aspectj.ajdt.internal.core.builder.AjBuildManager.weaveAndGenera eClassFiles(Unknown Source) at org.aspectj.ajdt.internal.core.builder.AjBuildManager.batchBuild(Unk own Source) at org.aspectj.ajdt.ajc.AjdtCommand.runCommand(Unknown Source) at org.aspectj.tools.ajc.Main.run(Unknown Source) at org.aspectj.tools.ajc.Main.runMain(Unknown Source) at org.aspectj.tools.ajc.Main.main(Unknown Source) 1 fail|abort
fixed in cvs tree, test case in tests/bugs/EnsureOverriding.java