Community
Participate
Working Groups
My project uses some complex aspectual interactions. My sources work fine under ajc 1.0.6, however, if I compile with 1.1, I get verification errors in the generated bytecodes. My problem is even worse with 1.1.1rc1 because the compiler does not even get to finish. Here are the errors: (cd "c:\Documents and Settings\Macneil Shonle\eclipse\workspace\Nebulous"; rm - f -r bin/edu Nebulous.jar) (cd "c:\Documents and Settings\Macneil Shonle\eclipse\workspace\Nebulous"; /cygdrive/c/aspectj1.1.1rc1/bin/ajc - classpath "c:\Documents and Settings\Macneil Shonle\eclipse\workspace\edu.ucsd.aspectbrowser\aspectbrowser.jar;c:\Documents and Settings\Macneil Shonle\eclipse\workspace\Nebulous\gnu-regexp- 1.1.4.jar;c:\Documents and Settings\Macneil Shonle\eclipse\plugins\org.eclipse.ui_2.1.1\ui.jar;c:\Documents and Settings\Macneil Shonle\eclipse\plugins\org.eclipse.swt.win32_2.1.1\ws\win32 \swt.jar;c:\Documents and Settings\Macneil Shonle\eclipse\plugins\org.eclipse.text_2.1.0\text.jar;c:\Documents and Settings\Macneil Shonle\eclipse\plugins\org.eclipse.jface_2.1.1 \jface.jar;c:\Documents and Settings\Macneil Shonle\eclipse\plugins\org.eclipse.jface.text_2.1.0\jfacetext.jar;c:\Documents and Settings\Macneil Shonle\eclipse\plugins\org.eclipse.ui.workbench_2.1.1 \workbench.jar;c:\Documents and Settings\Macneil Shonle\eclipse\plugins\org.eclipse.ui.workbench.texteditor_2.1.0 \texteditor.jar;c:\Documents and Settings\Macneil Shonle\eclipse\plugins\org.eclipse.ui.editors_2.1.0\editors.jar;c:\Documents and Settings\Macneil Shonle\eclipse\plugins\org.eclipse.core.resources_2.1.1 \resources.jar;c:\Documents and Settings\Macneil Shonle\eclipse\plugins\org.eclipse.core.runtime_2.1.1 \runtime.jar;c:\aspectj1.1.1rc1\lib\aspectjrt.jar" -d bin @default.lst) trouble in: public class edu.ucsd.nebulous.ContainerCaching extends edu.ucsd.nebulous.AbstractCaching implements edu.ucsd.nebulous.ContainerCaching$ajcMightHaveAspect: declares: [declare parents: ExactTypePattern (edu.ucsd.nebulous.ActiveContainer) extends (ExactTypePattern (edu.ucsd.nebulous.AbstractCaching$Value));, declare parents: ExactTypePattern (edu.ucsd.nebulous.ContainerDescriptor) extends (ExactTypePattern (edu.ucsd.nebulous.AbstractCaching$Key));] private edu.ucsd.nebulous.ContainerLoader loader private transient edu.ucsd.nebulous.ContainerCaching ajc$edu_ucsd_nebulous_ContainerCaching$perObjectField public static final org.aspectj.runtime.internal.CFlowStack ajc$cflowStack$0 public static final org.aspectj.runtime.internal.CFlowStack ajc$cflowStack$1 public void <init>(): ALOAD_0 // edu.ucsd.nebulous.ContainerCaching this (line 36) INVOKESPECIAL edu.ucsd.nebulous.AbstractCaching.<init> ()V constructor-execution(void edu.ucsd.nebulous.ContainerCaching.<init>()) | RETURN constructor-execution(void edu.ucsd.nebulous.ContainerCaching.<init>()) end public void <init>() public static int getCacheSize(edu.ucsd.nebulous.ContainerLoader): method-execution(int edu.ucsd.nebulous.ContainerCaching.getCacheSize (edu.ucsd.nebulous.ContainerLoader)) | ALOAD_0 // edu.ucsd.nebulous.ContainerLoader arg0 (line 41) | method-call(edu.ucsd.nebulous.ContainerCaching edu.ucsd.nebulous.ContainerCaching.aspectOf(java.lang.Object)) | | INVOKESTATIC edu.ucsd.nebulous.ContainerCaching.aspectOf (Ljava/lang/Object;)Ledu/ucsd/nebulous/ContainerCaching; | method-call(edu.ucsd.nebulous.ContainerCaching edu.ucsd.nebulous.ContainerCaching.aspectOf(java.lang.Object)) | method-call(int edu.ucsd.nebulous.AbstractCaching.getMaximumCacheSize()) | | INVOKEVIRTUAL edu.ucsd.nebulous.AbstractCaching.getMaximumCacheSize ()I | method-call(int edu.ucsd.nebulous.AbstractCaching.getMaximumCacheSize()) | IRETURN method-execution(int edu.ucsd.nebulous.ContainerCaching.getCacheSize (edu.ucsd.nebulous.ContainerLoader)) end public static int getCacheSize(edu.ucsd.nebulous.ContainerLoader) public static void setCacheSize(edu.ucsd.nebulous.ContainerLoader, int): method-execution(void edu.ucsd.nebulous.ContainerCaching.setCacheSize (edu.ucsd.nebulous.ContainerLoader, int)) | ALOAD_0 // edu.ucsd.nebulous.ContainerLoader arg0 (line 46) | method-call(edu.ucsd.nebulous.ContainerCaching edu.ucsd.nebulous.ContainerCaching.aspectOf(java.lang.Object)) | | INVOKESTATIC edu.ucsd.nebulous.ContainerCaching.aspectOf (Ljava/lang/Object;)Ledu/ucsd/nebulous/ContainerCaching; | method-call(edu.ucsd.nebulous.ContainerCaching edu.ucsd.nebulous.ContainerCaching.aspectOf(java.lang.Object)) | ILOAD_1 // int arg1 | method-call(void edu.ucsd.nebulous.AbstractCaching.setMaximumCacheSize (int)) | | INVOKEVIRTUAL edu.ucsd.nebulous.AbstractCaching.setMaximumCacheSize (I)V | method-call(void edu.ucsd.nebulous.AbstractCaching.setMaximumCacheSize (int)) | RETURN (line 47) method-execution(void edu.ucsd.nebulous.ContainerCaching.setCacheSize (edu.ucsd.nebulous.ContainerLoader, int)) end public static void setCacheSize(edu.ucsd.nebulous.ContainerLoader, int) private void dispatchGenerator(edu.ucsd.nebulous.Generator): method-execution(void edu.ucsd.nebulous.ContainerCaching.dispatchGenerator (edu.ucsd.nebulous.Generator)) | ALOAD_0 // edu.ucsd.nebulous.ContainerCaching this (line 51) | method-call(java.util.Iterator edu.ucsd.nebulous.AbstractCaching.getCachedValues()) | | INVOKEVIRTUAL edu.ucsd.nebulous.AbstractCaching.getCachedValues ()Ljava/util/Iterator; | method-call(java.util.Iterator edu.ucsd.nebulous.AbstractCaching.getCachedValues()) | ASTORE_2 | GOTO L1 (line 52) | L0: ALOAD_2 // java.util.Iterator i (line 54) | method-call(java.lang.Object java.util.Iterator.next()) | | INVOKEINTERFACE java.util.Iterator.next ()Ljava/lang/Object; | method-call(java.lang.Object java.util.Iterator.next()) | CHECKCAST edu.ucsd.nebulous.ActiveContainer | ASTORE_3 | ALOAD_3 // edu.ucsd.nebulous.ActiveContainer container (line 55) | ALOAD_1 // edu.ucsd.nebulous.Generator inGenerator | method-call(void edu.ucsd.nebulous.ActiveContainer.dispatchGenerator (edu.ucsd.nebulous.Generator)) | | INVOKEVIRTUAL edu.ucsd.nebulous.ActiveContainer.dispatchGenerator (Ledu/ucsd/nebulous/Generator;)V | method-call(void edu.ucsd.nebulous.ActiveContainer.dispatchGenerator (edu.ucsd.nebulous.Generator)) | L1: ALOAD_2 // java.util.Iterator i (line 52) | method-call(boolean java.util.Iterator.hasNext()) | | INVOKEINTERFACE java.util.Iterator.hasNext ()Z | method-call(boolean java.util.Iterator.hasNext()) | IFNE L0 | RETURN (line 57) method-execution(void edu.ucsd.nebulous.ContainerCaching.dispatchGenerator (edu.ucsd.nebulous.Generator)) end private void dispatchGenerator(edu.ucsd.nebulous.Generator) private static void debugPrint(edu.ucsd.nebulous.ContainerLoader): ALOAD_0 // edu.ucsd.nebulous.ContainerLoader arg0 (line 60) INVOKESTATIC edu.ucsd.nebulous.ContainerCaching.aspectOf (Ljava/lang/Object;)Ledu/ucsd/nebulous/ContainerCaching; INVOKESPECIAL edu.ucsd.nebulous.ContainerCaching.debugPrint ()V RETURN (line 61) end private static void debugPrint(edu.ucsd.nebulous.ContainerLoader) private void debugPrint(): GETSTATIC java.lang.System.err Ljava/io/PrintStream; (line 65) LDC "Cache Contents {" INVOKEVIRTUAL java.io.PrintStream.println (Ljava/lang/String;)V ALOAD_0 // edu.ucsd.nebulous.ContainerCaching this (line 67) INVOKEVIRTUAL edu.ucsd.nebulous.AbstractCaching.getCachedKeys ()Ljava/util/Iterator; ASTORE_1 GOTO L1 (line 68) L0: ALOAD_1 // java.util.Iterator keys (line 70) INVOKEINTERFACE java.util.Iterator.next ()Ljava/lang/Object; CHECKCAST edu.ucsd.nebulous.ContainerDescriptor ASTORE_2 GETSTATIC java.lang.System.err Ljava/io/PrintStream; (line 71) NEW java.lang.StringBuffer DUP ALOAD_2 // edu.ucsd.nebulous.ContainerDescriptor containerDesc INVOKEVIRTUAL edu.ucsd.nebulous.ContainerDescriptor.getName ()Ljava/lang/String; INVOKESTATIC java.lang.String.valueOf (Ljava/lang/Object;) Ljava/lang/String; INVOKESPECIAL java.lang.StringBuffer.<init> (Ljava/lang/String;)V LDC "; " INVOKEVIRTUAL java.lang.StringBuffer.append (Ljava/lang/String;)Ljava/lang/StringBuffer; INVOKEVIRTUAL java.lang.StringBuffer.toString () Ljava/lang/String; INVOKEVIRTUAL java.io.PrintStream.print (Ljava/lang/String;) V L1: ALOAD_1 // java.util.Iterator keys (line 68) INVOKEINTERFACE java.util.Iterator.hasNext ()Z IFNE L0 GETSTATIC java.lang.System.err Ljava/io/PrintStream; (line 74) LDC "}" INVOKEVIRTUAL java.io.PrintStream.println (Ljava/lang/String;)V RETURN (line 75) end private void debugPrint() protected void unload(edu.ucsd.nebulous.AbstractCaching$Value): ALOAD_1 // edu.ucsd.nebulous.AbstractCaching$Value arg0 (line 82) CHECKCAST edu.ucsd.nebulous.ActiveContainer INVOKEVIRTUAL edu.ucsd.nebulous.ActiveContainer.delete ()V RETURN (line 83) end protected void unload(edu.ucsd.nebulous.AbstractCaching$Value) protected edu.ucsd.nebulous.AbstractCaching$Key getKey (edu.ucsd.nebulous.AbstractCaching$Value): ALOAD_1 // edu.ucsd.nebulous.AbstractCaching$Value arg0 (line 86) CHECKCAST edu.ucsd.nebulous.ActiveContainer INVOKEVIRTUAL edu.ucsd.nebulous.ActiveContainer.getDescriptor () Ledu/ucsd/nebulous/ContainerDescriptor; ARETURN end protected edu.ucsd.nebulous.AbstractCaching$Key getKey (edu.ucsd.nebulous.AbstractCaching$Value) private void dummy(): RETURN (line 101) end private void dummy() public void ajc$after$edu_ucsd_nebulous_ContainerCaching$105a (edu.ucsd.nebulous.ContainerLoader) AdviceAttribute(after, (this (BindingTypePattern(edu.ucsd.nebulous.ContainerLoader, 0)) && execution (ExactTypePattern(edu.ucsd.nebulous.ContainerLoader).new(..))), 0, 4186) : ALOAD_0 // edu.ucsd.nebulous.ContainerCaching this (line 107) ALOAD_1 // edu.ucsd.nebulous.ContainerLoader inLoader PUTFIELD edu.ucsd.nebulous.ContainerCaching.loader Ledu/ucsd/nebulous/ContainerLoader; RETURN (line 108) end public void ajc$after$edu_ucsd_nebulous_ContainerCaching$105a (edu.ucsd.nebulous.ContainerLoader) public void ajc$after$edu_ucsd_nebulous_ContainerCaching$10ea (edu.ucsd.nebulous.ContainerLoader, edu.ucsd.nebulous.Generator) AdviceAttribute(after, edu.ucsd.nebulous.ContainerLoader.generatorDispatches (BindingTypePattern(edu.ucsd.nebulous.ContainerLoader, 0), BindingTypePattern (edu.ucsd.nebulous.Generator, 1)), 0, 4330) : ALOAD_0 // edu.ucsd.nebulous.ContainerCaching this (line 113) ALOAD_2 // edu.ucsd.nebulous.Generator generator INVOKESPECIAL edu.ucsd.nebulous.ContainerCaching.dispatchGenerator (Ledu/ucsd/nebulous/Generator;)V RETURN (line 114) end public void ajc$after$edu_ucsd_nebulous_ContainerCaching$10ea (edu.ucsd.nebulous.ContainerLoader, edu.ucsd.nebulous.Generator) public static edu.ucsd.nebulous.ContainerCaching aspectOf(Object) org.aspectj.weaver.AjAttribute$AjSynthetic@1f489d9 : ALOAD_0 // java.lang.Object arg0 INSTANCEOF edu.ucsd.nebulous.ContainerCaching$ajcMightHaveAspect IFEQ L1 ALOAD_0 // java.lang.Object arg0 CHECKCAST edu.ucsd.nebulous.ContainerCaching$ajcMightHaveAspect INVOKEINTERFACE edu.ucsd.nebulous.ContainerCaching$ajcMightHaveAspect.ajc$edu_ucsd_nebulous_Cont ainerCaching$perObjectGet ()Ledu/ucsd/nebulous/ContainerCaching; DUP IFNULL L0 ARETURN L0: POP L1: NEW org.aspectj.lang.NoAspectBoundException DUP INVOKESPECIAL org.aspectj.lang.NoAspectBoundException.<init> ()V ATHROW end public static edu.ucsd.nebulous.ContainerCaching aspectOf(Object) public static boolean hasAspect(Object) org.aspectj.weaver.AjAttribute$AjSynthetic@18637cc : ALOAD_0 // java.lang.Object arg0 INSTANCEOF edu.ucsd.nebulous.ContainerCaching$ajcMightHaveAspect IFEQ L0 ALOAD_0 // java.lang.Object arg0 CHECKCAST edu.ucsd.nebulous.ContainerCaching$ajcMightHaveAspect INVOKEINTERFACE edu.ucsd.nebulous.ContainerCaching$ajcMightHaveAspect.ajc$edu_ucsd_nebulous_Cont ainerCaching$perObjectGet ()Ledu/ucsd/nebulous/ContainerCaching; IFNULL L0 ICONST_1 IRETURN L0: ICONST_0 IRETURN end public static boolean hasAspect(Object) public static void ajc$perObjectBind(Object) org.aspectj.weaver.AjAttribute$AjSynthetic@b97275 : ALOAD_0 // java.lang.Object arg0 INSTANCEOF edu.ucsd.nebulous.ContainerCaching$ajcMightHaveAspect IFEQ L0 ALOAD_0 // java.lang.Object arg0 CHECKCAST edu.ucsd.nebulous.ContainerCaching$ajcMightHaveAspect INVOKEINTERFACE edu.ucsd.nebulous.ContainerCaching$ajcMightHaveAspect.ajc$edu_ucsd_nebulous_Cont ainerCaching$perObjectGet ()Ledu/ucsd/nebulous/ContainerCaching; IFNONNULL L0 ALOAD_0 // java.lang.Object arg0 CHECKCAST edu.ucsd.nebulous.ContainerCaching$ajcMightHaveAspect NEW edu.ucsd.nebulous.ContainerCaching DUP INVOKESPECIAL edu.ucsd.nebulous.ContainerCaching.<init> ()V INVOKEINTERFACE edu.ucsd.nebulous.ContainerCaching$ajcMightHaveAspect.ajc$edu_ucsd_nebulous_Cont ainerCaching$perObjectSet (Ledu/ucsd/nebulous/ContainerCaching;)V L0: RETURN end public static void ajc$perObjectBind(Object) public edu.ucsd.nebulous.ContainerCaching ajc$edu_ucsd_nebulous_ContainerCaching$perObjectGet(): ALOAD_0 GETFIELD edu.ucsd.nebulous.ContainerCaching.ajc$edu_ucsd_nebulous_ContainerCaching$perObj ectField Ledu/ucsd/nebulous/ContainerCaching; ARETURN end public edu.ucsd.nebulous.ContainerCaching ajc$edu_ucsd_nebulous_ContainerCaching$perObjectGet() public void ajc$edu_ucsd_nebulous_ContainerCaching$perObjectSet (edu.ucsd.nebulous.ContainerCaching): ALOAD_0 ALOAD_1 PUTFIELD edu.ucsd.nebulous.ContainerCaching.ajc$edu_ucsd_nebulous_ContainerCaching$perObj ectField Ledu/ucsd/nebulous/ContainerCaching; RETURN end public void ajc$edu_ucsd_nebulous_ContainerCaching$perObjectSet (edu.ucsd.nebulous.ContainerCaching) static void ajc$preClinit(): NEW org.aspectj.runtime.internal.CFlowStack DUP INVOKESPECIAL org.aspectj.runtime.internal.CFlowStack.<init> ()V PUTSTATIC edu.ucsd.nebulous.ContainerCaching.ajc$cflowStack$1 Lorg/aspectj/runtime/internal/CFlowStack; NEW org.aspectj.runtime.internal.CFlowStack DUP INVOKESPECIAL org.aspectj.runtime.internal.CFlowStack.<init> ()V PUTSTATIC edu.ucsd.nebulous.ContainerCaching.ajc$cflowStack$0 Lorg/aspectj/runtime/internal/CFlowStack; RETURN end static void ajc$preClinit() static void <clinit>(): INVOKESTATIC edu.ucsd.nebulous.ContainerCaching.ajc$preClinit ()V RETURN end static void <clinit>() end public class edu.ucsd.nebulous.ContainerCaching ABORT Exception thrown from AspectJ 1.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.ResolvedTypeX.matches(ResolvedTypeX.java:245) at org.aspectj.weaver.ResolvedTypeX.lookupMemberNoSupers (ResolvedTypeX.java:914) at org.aspectj.weaver.Member.walkUp(Member.java:502) at org.aspectj.weaver.Member.walkUp(Member.java:498) at org.aspectj.weaver.Member.getDeclaringTypes(Member.java:487) at org.aspectj.weaver.patterns.SignaturePattern.declaringTypeMatch (SignaturePattern.java:143) at org.aspectj.weaver.patterns.SignaturePattern.matches (SignaturePattern.java:124) at org.aspectj.weaver.patterns.KindedPointcut.match (KindedPointcut.java:40) at org.aspectj.weaver.patterns.AndPointcut.match(AndPointcut.java:42) at org.aspectj.weaver.patterns.OrPointcut.match(OrPointcut.java:43) at org.aspectj.weaver.patterns.AndPointcut.match(AndPointcut.java:42) at org.aspectj.weaver.ShadowMunger.match(ShadowMunger.java:59) at org.aspectj.weaver.Advice.match(Advice.java:89) at org.aspectj.weaver.bcel.BcelClassWeaver.match (BcelClassWeaver.java:985) at org.aspectj.weaver.bcel.BcelClassWeaver.match (BcelClassWeaver.java:791) at org.aspectj.weaver.bcel.BcelClassWeaver.weave (BcelClassWeaver.java:291) at org.aspectj.weaver.bcel.BcelClassWeaver.weave (BcelClassWeaver.java:77) at org.aspectj.weaver.bcel.BcelWeaver.weave(BcelWeaver.java:417) at org.aspectj.weaver.bcel.BcelWeaver.weave(BcelWeaver.java:390) at org.aspectj.weaver.bcel.BcelWeaver.weave(BcelWeaver.java:316) at org.aspectj.ajdt.internal.core.builder.AjBuildManager.weaveAndGenerateClassFiles (AjBuildManager.java:256) at org.aspectj.ajdt.internal.core.builder.AjBuildManager.doBuild (AjBuildManager.java:156) at org.aspectj.ajdt.internal.core.builder.AjBuildManager.batchBuild (AjBuildManager.java:70) at org.aspectj.ajdt.ajc.AjdtCommand.doCommand(AjdtCommand.java:99) at org.aspectj.ajdt.ajc.AjdtCommand.runCommand(AjdtCommand.java:53) at org.aspectj.tools.ajc.Main.run(Main.java:217) 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 make: *** [neb] Error 255 ************************* The source for my project is available upon request. However, I cannot post it to any site or repository, it can only be emailed (or I could provide a private download link off of my web-site). ************************* From: Jim Hugunin Subject: Re: [aspectj-dev] java.lang.VerifyError Please file this as a bug report. That will make life easier for the developers. It's always best to include a self-contained example, but if that's not possible, it's still good to get this into the bug database for tracking purposes. BTW - This bug appears to be a bad interaction between perthis/target aspects, intertype declarations and method signature matching in pcds -- a classic kind of large system interaction issue. -Jim
This is fixed in the tree and will be fixed in the upcoming 1.1.1 release. The following short-test case (in bugs/InterPerCall.java) reproduces the bug: ---------------------------- public class InterPerCall { public static void main(String[] args) { new D().m(); } } class C { } class D extends C { public void m() { } } aspect A perthis(p1()) { pointcut p1(): execution(void D.m()); pointcut p2(): execution(void C.m()); before(): p2() { System.out.println("hello"); } } -------------------------------------------- The regression was caused by a fix to the method lookup rules for inter-type declarations when matching call joinpoint signatures that interacted badly with the implementation of perthis aspects.