Bug 120351 - cflowbelow issue when binding, in @AJ
Summary: cflowbelow issue when binding, in @AJ
Status: RESOLVED FIXED
Alias: None
Product: AspectJ
Classification: Tools
Component: Compiler (show other bugs)
Version: DEVELOPMENT   Edit
Hardware: All All
: P3 normal (vote)
Target Milestone: 1.5.0RC1   Edit
Assignee: Alexandre Vasseur CLA
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2005-12-12 05:17 EST by Alexandre Vasseur CLA
Modified: 2005-12-12 05:47 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 Alexandre Vasseur CLA 2005-12-12 05:17:15 EST
Sam wrote:

> I'm trying something and it works from .aj but not from .java.  When
> I try it with annotation based stuff I get a nasty exception:
>
>       [iajc] trouble in:
>       [iajc] public class gsc.repository.IdentifierTest extends
> junit.framework.TestCase:
>       [iajc]   private static final org.aspectj.lang.JoinPoint
> $StaticPart ajc$tjp_0
>       [iajc]   public void <init>():
>       [iajc]                     ALOAD_0
>       [iajc]                     INVOKESPECIAL
> junit.framework.TestCase.<init> ()V
>       [iajc]     constructor-execution(void
> gsc.repository.IdentifierTest.<init>())
>       [iajc]     |               RETURN
>       [iajc]     constructor-execution(void
> gsc.repository.IdentifierTest.<init>())
>       [iajc]   end public void <init>()
>
>       [iajc]   public void testIdentifierExactMatch() throws
> java.security.NoSuchAlgorithmException, java.io.IOException:
>       [iajc]     method-execution(void
> gsc.repository.IdentifierTest.testIdentifierExactMatch())
>       [iajc]     |               NEW java.io.File
>       [iajc]     |               DUP
>       [iajc]     |               LDC "test-repository/ant-test/jars/
> ant-1.6.2.jar"
>       [iajc]     |               INVOKESPECIAL java.io.File.<init>
> (Ljava/lang/String;)V
>       [iajc]     |               INVOKESTATIC
> gsc.repository.Identifier.interrogate (Ljava/io/File;)Ljava/util/List;
>       [iajc]     |               ASTORE_1
>       [iajc]     |               ALOAD_1
>       [iajc]     |               ICONST_0
>       [iajc]     |               INVOKEINTERFACE java.util.List.get
> (I)Ljava/lang/Object;
>       [iajc]     |               CHECKCAST gsc.repository.ejb.Jar
>       [iajc]     |               ASTORE_2
>       [iajc]     |               ALOAD_2
>       [iajc]     |               INVOKEVIRTUAL
> gsc.repository.ejb.Jar.getVersion ()Ljava/lang/String;
>       [iajc]     |               LDC "1.6.2"
>       [iajc]     |               INVOKESTATIC
> gsc.repository.IdentifierTest.assertEquals (Ljava/lang/String;Ljava/
> lang/String;)V
>       [iajc]     |               RETURN
>       [iajc]     method-execution(void
> gsc.repository.IdentifierTest.testIdentifierExactMatch())
>       [iajc]   end public void testIdentifierExactMatch() throws
> java.security.NoSuchAlgorithmException, java.io.IOException
>
>       [iajc]   public void testIdentifierExactSameClasses() throws
> java.security.NoSuchAlgorithmException, java.io.IOException:
>       [iajc]     method-execution(void
> gsc.repository.IdentifierTest.testIdentifierExactSameClasses())
>       [iajc]     |               NEW java.io.File
>       [iajc]     |               DUP
>       [iajc]     |               LDC "test-jars/ant-1.6.2-test.jar"
>       [iajc]     |               INVOKESPECIAL java.io.File.<init>
> (Ljava/lang/String;)V
>       [iajc]     |               INVOKESTATIC
> gsc.repository.Identifier.interrogate (Ljava/io/File;)Ljava/util/List;
>       [iajc]     |               ASTORE_1
>       [iajc]     |               ALOAD_1
>       [iajc]     |               ICONST_0
>       [iajc]     |               INVOKEINTERFACE java.util.List.get
> (I)Ljava/lang/Object;
>       [iajc]     |               CHECKCAST gsc.repository.ejb.Jar
>       [iajc]     |               ASTORE_2
>       [iajc]     |               ALOAD_2
>       [iajc]     |               INVOKEVIRTUAL
> gsc.repository.ejb.Jar.getVersion ()Ljava/lang/String;
>       [iajc]     |               LDC "1.6.2"
>       [iajc]     |               INVOKESTATIC
> gsc.repository.IdentifierTest.assertEquals (Ljava/lang/String;Ljava/
> lang/String;)V
>       [iajc]     |               RETURN
>       [iajc]     method-execution(void
> gsc.repository.IdentifierTest.testIdentifierExactSameClasses())
>       [iajc]   end public void testIdentifierExactSameClasses()
> throws java.security.NoSuchAlgorithmException, java.io.IOException
>
>       [iajc]   public void testIdentifierMixedUp() throws
> java.security.NoSuchAlgorithmException, java.io.IOException:
>       [iajc]     method-execution(void
> gsc.repository.IdentifierTest.testIdentifierMixedUp())
>       [iajc]     |               NEW java.io.File
>       [iajc]     |               DUP
>       [iajc]     |               LDC "test-jars/groovy-1.0-beta-4-and-
> commons-logging-1.0.2.jar"
>       [iajc]     |               INVOKESPECIAL java.io.File.<init>
> (Ljava/lang/String;)V
>       [iajc]     |               INVOKESTATIC
> gsc.repository.Identifier.interrogate (Ljava/io/File;)Ljava/util/List;
>       [iajc]     |               ASTORE_1
>       [iajc]     |               ALOAD_1
>       [iajc]     |               INVOKEINTERFACE java.util.List.size ()I
>       [iajc]     |               ICONST_2
>       [iajc]     |               INVOKESTATIC
> gsc.repository.IdentifierTest.assertEquals (II)V
>       [iajc]     |               ICONST_2
>       [iajc]     |               ISTORE_2
>       [iajc]     |               ALOAD_1
>       [iajc]     |               INVOKEINTERFACE
> java.util.List.iterator ()Ljava/util/Iterator;
>       [iajc]     |               ASTORE_3
>       [iajc]     |           L0: ALOAD_3
>       [iajc]     |               INVOKEINTERFACE
> java.util.Iterator.hasNext ()Z
>       [iajc]     |               IFEQ L3
>       [iajc]     |               ALOAD_3
>       [iajc]     |               INVOKEINTERFACE
> java.util.Iterator.next ()Ljava/lang/Object;
>       [iajc]     |               CHECKCAST gsc.repository.ejb.Jar
>       [iajc]     |               ASTORE 4
>       [iajc]     |               ALOAD 4
>       [iajc]     |               INVOKEVIRTUAL
> gsc.repository.ejb.Jar.getGroupid ()Ljava/lang/String;
>       [iajc]     |               LDC "groovy"
>       [iajc]     |               INVOKEVIRTUAL
> java.lang.String.equals (Ljava/lang/Object;)Z
>       [iajc]     |               IFEQ L1
>       [iajc]     |               ALOAD 4
>       [iajc]     |               INVOKEVIRTUAL
> gsc.repository.ejb.Jar.getGroupid ()Ljava/lang/String;
>       [iajc]     |               LDC "groovy"
>       [iajc]     |               INVOKESTATIC
> gsc.repository.IdentifierTest.assertEquals (Ljava/lang/String;Ljava/
> lang/String;)V
>       [iajc]     |               ALOAD 4
>       [iajc]     |               INVOKEVIRTUAL
> gsc.repository.ejb.Jar.getArtifactid ()Ljava/lang/String;
>       [iajc]     |               LDC "groovy"
>       [iajc]     |               INVOKESTATIC
> gsc.repository.IdentifierTest.assertEquals (Ljava/lang/String;Ljava/
> lang/String;)V
>       [iajc]     |               ALOAD 4
>       [iajc]     |               INVOKEVIRTUAL
> gsc.repository.ejb.Jar.getVersion ()Ljava/lang/String;
>       [iajc]     |               LDC "1.0-beta-4"
>       [iajc]     |               INVOKESTATIC
> gsc.repository.IdentifierTest.assertEquals (Ljava/lang/String;Ljava/
> lang/String;)V
>       [iajc]     |               IINC 2 -1
>       [iajc]     |               GOTO L2
>       [iajc]     |           L1: ALOAD 4
>       [iajc]     |               INVOKEVIRTUAL
> gsc.repository.ejb.Jar.getGroupid ()Ljava/lang/String;
>       [iajc]     |               LDC "commons-logging"
>       [iajc]     |               INVOKESTATIC
> gsc.repository.IdentifierTest.assertEquals (Ljava/lang/String;Ljava/
> lang/String;)V
>       [iajc]     |               ALOAD 4
>       [iajc]     |               INVOKEVIRTUAL
> gsc.repository.ejb.Jar.getArtifactid ()Ljava/lang/String;
>       [iajc]     |               LDC "commons-logging"
>       [iajc]     |               INVOKESTATIC
> gsc.repository.IdentifierTest.assertEquals (Ljava/lang/String;Ljava/
> lang/String;)V
>       [iajc]     |               ALOAD 4
>       [iajc]     |               INVOKEVIRTUAL
> gsc.repository.ejb.Jar.getVersion ()Ljava/lang/String;
>       [iajc]     |               LDC "1.0.2"
>       [iajc]     |               INVOKESTATIC
> gsc.repository.IdentifierTest.assertEquals (Ljava/lang/String;Ljava/
> lang/String;)V
>       [iajc]     |               IINC 2 -1
>       [iajc]     |           L2: GOTO L0
>       [iajc]     |           L3: ILOAD_2
>       [iajc]     |               ICONST_0
>       [iajc]     |               INVOKESTATIC
> gsc.repository.IdentifierTest.assertEquals (II)V
>       [iajc]     |               RETURN
>       [iajc]     method-execution(void
> gsc.repository.IdentifierTest.testIdentifierMixedUp())
>       [iajc]   end public void testIdentifierMixedUp() throws
> java.security.NoSuchAlgorithmException, java.io.IOException
>
>       [iajc] end public class gsc.repository.IdentifierTest
>
>       [iajc]
>       [iajc] Exception thrown from AspectJ 1.5.0M5
>
>       [iajc] This might be logged as a bug already -- find current
> bugs at
>       [iajc]   http://bugs.eclipse.org/bugs/buglist.cgi?
> product=AspectJ&component=Compiler
>
>       [iajc] Bugs for exceptions thrown have titles File:line from
> the top stack,
>       [iajc] e.g., "SomeFile.java:243"
>
>       [iajc] If you don't find the exception below in a bug, please
> add a new bug
>       [iajc] at http://bugs.eclipse.org/bugs/enter_bug.cgi?
> product=AspectJ
>       [iajc] To make the bug a priority, please include a test program
>       [iajc] that can reproduce this exception.
>       [iajc] Incorrectly attempting counter operation on stacked cflow
>
>       [iajc] when implementing on shadow method-execution(void
> gsc.repository.IdentifierTest.testIdentifierExactMatch())
>       [iajc] when weaving type gsc.repository.IdentifierTest
>       [iajc] when weaving classes
>       [iajc] when weaving
>       [iajc] when batch building with classpath: /Users/sam/Library/
> Java/Extensions/jsk-policy.jar:/System/Library/Java/Extensions/
> CoreAudio.jar:/System/Library/Java/Extensions/dns_sd.jar:/System/
> Library/Java/Extensions/j3daudio.jar:/System/Library/Java/Extensions/
> j3dcore.jar:/System/Library/Java/Extensions/j3dutils.jar:/System/
> Library/Java/Extensions/jai_codec.jar:/System/Library/Java/Extensions/
> jai_core.jar:/System/Library/Java/Extensions/mlibwrapper_jai.jar:/
> System/Library/Java/Extensions/MRJToolkit.jar:/System/Library/Java/
> Extensions/QTJava.zip:/System/Library/Java/Extensions/QTJSupport.jar:/
> System/Library/Java/Extensions/vecmath.jar:/System/Library/Frameworks/
> JavaVM.framework/Versions/1.5.0/Home/lib/ext/apple_provider.jar:/
> System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Home/lib/
> ext/dnsns.jar:/System/Library/Frameworks/JavaVM.framework/Versions/
> 1.5.0/Home/lib/ext/localedata.jar:/System/Library/Frameworks/
> JavaVM.framework/Versions/1.5.0/Home/lib/ext/sunjce_provider.jar:/
> Users/sam/gs/squire/jardb/.aspectj-lib/aspectjrt-1.5.0_M5.jar:/Users/
> sam/gs/squire/jardb/.aspectj-lib/aspectjtools-1.5.0_M5.jar:/Users/sam/
> gs/squire/jardb/target/classes:/Users/sam/gs/squire/jardb/target/test-
> classes:/Users/sam/gs/squire/jardb/.lib/antlr-2.7.5.jar:/Users/sam/gs/
> squire/jardb/.lib/asm-1.5.3.jar:/Users/sam/gs/squire/jardb/.lib/
> cglib-2.1_2.jar:/Users/sam/gs/squire/jardb/.lib/commons-
> collections-2.1.1.jar:/Users/sam/gs/squire/jardb/.lib/commons-
> logging-1.0.4.jar:/Users/sam/gs/squire/jardb/.lib/dom4j-1.6.jar:/
> Users/sam/gs/squire/jardb/.lib/ehcache-1.1.jar:/Users/sam/gs/squire/
> jardb/.lib/ejb3-persistence-pr.jar:/Users/sam/gs/squire/jardb/.lib/
> emma-2.0.latest.jar:/Users/sam/gs/squire/jardb/.lib/
> emma_ant-2.0.latest.jar:/Users/sam/gs/squire/jardb/.lib/
> hibernate-3.1alpha1.jar:/Users/sam/gs/squire/jardb/.lib/hibernate-
> annotations-3.1beta3.jar:/Users/sam/gs/squire/jardb/.lib/hibernate-
> entitymanager-3.1beta1.jar:/Users/sam/gs/squire/jardb/.lib/
> jta-1.0.jar:/Users/sam/gs/squire/jardb/.lib/junit-3.8.1.jar:/Users/
> sam/gs/squire/jardb/.lib/postgresql-7.4.1-jdbc3.jar:/Users/sam/gs/
> squire/jardb/.lib/svn-javahl-1.2.0.jar:/Users/sam/gs/squire/jardb/lib/
> testng-4.2-jdk15.jar:/Users/sam/gs/squire/jardb/target/aspects.jar:
>       [iajc] Incorrectly attempting counter operation on stacked cflow
>       [iajc] java.lang.RuntimeException: Incorrectly attempting
> counter operation on stacked cflow
>       [iajc]     at org.aspectj.weaver.bcel.BcelShadow.weaveCflowEntry
> (BcelShadow.java:1890)
>       [iajc]     at org.aspectj.weaver.bcel.BcelAdvice.implementOn
> (BcelAdvice.java:231)
>       [iajc]     at org.aspectj.weaver.Shadow.implementMungers
> (Shadow.java:514)
>       [iajc]     at org.aspectj.weaver.Shadow.implement(Shadow.java:391)
>       [iajc]     at org.aspectj.weaver.bcel.BcelClassWeaver.implement
> (BcelClassWeaver.java:2142)
>       [iajc]     at org.aspectj.weaver.bcel.BcelClassWeaver.weave
> (BcelClassWeaver.java:467)
>       [iajc]     at org.aspectj.weaver.bcel.BcelClassWeaver.weave
> (BcelClassWeaver.java:102)
>       [iajc]     at org.aspectj.weaver.bcel.BcelWeaver.weave
> (BcelWeaver.java:1534)
>       [iajc]     at
> org.aspectj.weaver.bcel.BcelWeaver.weaveWithoutDump(BcelWeaver.java:
> 1485)
>       [iajc]     at org.aspectj.weaver.bcel.BcelWeaver.weaveAndNotify
> (BcelWeaver.java:1266)
>       [iajc]     at org.aspectj.weaver.bcel.BcelWeaver.weave
> (BcelWeaver.java:1088)
>       [iajc]     at
> org.aspectj.ajdt.internal.compiler.AjCompilerAdapter.weave
> (AjCompilerAdapter.java:300)
>       [iajc]     at
> org.aspectj.ajdt.internal.compiler.AjCompilerAdapter.afterCompiling
> (AjCompilerAdapter.java:178)
>       [iajc]     at
> org.aspectj.ajdt.internal.compiler.CompilerAdapter.ajc$afterReturning
> $org_aspectj_ajdt_internal_compiler_CompilerAdapter$2$f9cc9ca0
> (CompilerAdapter.aj:70)
>       [iajc]     at
> org.aspectj.org.eclipse.jdt.internal.compiler.Compiler.compile
> (Compiler.java:367)
>       [iajc]     at
> org.aspectj.ajdt.internal.core.builder.AjBuildManager.performCompilation
> (AjBuildManager.java:809)
>       [iajc]     at
> org.aspectj.ajdt.internal.core.builder.AjBuildManager.doBuild
> (AjBuildManager.java:230)
>       [iajc]     at
> org.aspectj.ajdt.internal.core.builder.AjBuildManager.batchBuild
> (AjBuildManager.java:156)
>       [iajc]     at org.aspectj.ajdt.ajc.AjdtCommand.doCommand
> (AjdtCommand.java:112)
>       [iajc]     at org.aspectj.ajdt.ajc.AjdtCommand.runCommand
> (AjdtCommand.java:60)
>       [iajc]     at org.aspectj.tools.ajc.Main.run(Main.java:326)
>       [iajc]     at org.aspectj.tools.ajc.Main.runMain(Main.java:240)
>       [iajc]     at
> org.aspectj.tools.ant.taskdefs.AjcTask.executeInSameVM(AjcTask.java:
> 1210)
>       [iajc]     at org.aspectj.tools.ant.taskdefs.AjcTask.execute
> (AjcTask.java:1001)
>       [iajc]     at org.apache.tools.ant.UnknownElement.execute
> (UnknownElement.java:275)
>       [iajc]     at org.apache.tools.ant.Task.perform(Task.java:364)
>       [iajc]     at org.apache.tools.ant.taskdefs.Sequential.execute
> (Sequential.java:64)
>       [iajc]     at org.apache.tools.ant.UnknownElement.execute
> (UnknownElement.java:275)
>       [iajc]     at org.apache.tools.ant.Task.perform(Task.java:364)
>       [iajc]     at
> org.apache.tools.ant.taskdefs.MacroInstance.execute
> (MacroInstance.java:378)
>       [iajc]     at org.apache.tools.ant.UnknownElement.execute
> (UnknownElement.java:275)
>       [iajc]     at org.apache.tools.ant.Task.perform(Task.java:364)
>       [iajc]     at org.apache.tools.ant.Target.execute(Target.java:341)
>       [iajc]     at org.apache.tools.ant.Target.performTasks
> (Target.java:369)
>       [iajc]     at org.apache.tools.ant.Project.executeSortedTargets
> (Project.java:1216)
>       [iajc]     at org.apache.tools.ant.Project.executeTarget
> (Project.java:1185)
>       [iajc]     at
> org.apache.tools.ant.helper.DefaultExecutor.executeTargets
> (DefaultExecutor.java:40)
>       [iajc]     at org.apache.tools.ant.Project.executeTargets
> (Project.java:1068)
>       [iajc]     at org.apache.tools.ant.Main.runBuild(Main.java:668)
>       [iajc]     at org.apache.tools.ant.Main.startAnt(Main.java:187)
>       [iajc]     at org.apache.tools.ant.launch.Launcher.run
> (Launcher.java:246)
>       [iajc]     at org.apache.tools.ant.launch.Launcher.main
> (Launcher.java:67)
>
>
> package gsc.aspects.testing;
>
> import junit.framework.*;
> import java.io.*;
> import java.util.*;
>
> import org.aspectj.lang.annotation.Pointcut;
> import org.aspectj.lang.annotation.Before;
> import org.aspectj.lang.annotation.Aspect;
> import org.aspectj.lang.annotation.After;
> import org.aspectj.lang.JoinPoint;
>
> @Aspect
> public class TestMethodMapperAnnotations {
>
>      @Pointcut("this(testCase) && this(TestCase) && execution(void
> test*())")
>      public void inTestClass(TestCase testCase) {
>      }
>
>      private Map<String, Map<String, Integer>> coverage;
>
>      @Before("cflowbelow(inTestClass(testCase)) && execution(* *(..))")
>      public void beforeMethodExecution(JoinPoint thisJoinPoint,
> TestCase testCase) {
>          String testname = testCase.getClass().getName();
>          String methodSignature = thisJoinPoint.getStaticPart
> ().getSignature().toString();
>          Map<String, Integer> tests = coverage.get(methodSignature);
>          if (tests == null) {
>              tests = new HashMap<String, Integer>();
>              coverage.put(methodSignature, tests);
>          }
>          Integer count = tests.get(testname);
>          if (count == null) {
>              count = 1;
>          } else {
>              count++;
>          }
>          tests.put(testname, count);
>      }
>
>      @Before("inTestClass(testCase)")
>      public void beforeExecutingTestMethod(TestCase testCase) {
>          try {
>              File file = new File("results.ser");
>              if (file.exists()) {
>                  ObjectInputStream ois = new ObjectInputStream(new
> FileInputStream(file));
>                  coverage = (Map<String, Map<String, Integer>>)
> ois.readObject();
>                  ois.close();
>              } else {
>                  coverage = new HashMap<String, Map<String, Integer>>();
>              }
>          } catch (Exception e) {
>              e.printStackTrace();
>          }
>      }
>
>      @After("inTestClass(testCase)")
>      public void afterExecutingTestMethod(TestCase testCase) {
>          try {
>              File file = new File("results.ser");
>              ObjectOutputStream oos = new ObjectOutputStream(new
> FileOutputStream(file));
>              oos.writeObject(coverage);
>              oos.close();
>          } catch (Exception e) {
>              e.printStackTrace();
>          }
>      }
>
> }
>
> vs.
>
> package gsc.aspects.testing;
>
> import junit.framework.*;
> import java.io.*;
> import java.util.*;
>
> public aspect TestMethodMapper {
>
>      pointcut inTestClass(TestCase testCase) : this(testCase) && this
> (TestCase) && execution(void test*());
>      private Map<String, Map<String, Integer>> coverage;
>
>      before(TestCase testCase) : cflowbelow(inTestClass(testCase)) &&
> execution(* *(..)) {
>         String testname = testCase.getClass().getName();
>         String methodSignature = thisJoinPointStaticPart.getSignature
> ().toString();
>         Map<String, Integer> tests = coverage.get(methodSignature);
>         if (tests == null) {
>             tests = new HashMap<String, Integer>();
>             coverage.put(methodSignature, tests);
>         }
>         Integer count = tests.get(testname);
>         if (count == null) {
>             count = 1;
>         } else {
>              count++;
>         }
>         tests.put(testname, count);
>      }
>
>      before(TestCase testCase) : inTestClass(testCase) {
>         try {
>             File file = new File("results.ser");
>             if (file.exists()) {
>                 ObjectInputStream ois = new ObjectInputStream(new FileInputStream
> (file));
>                 coverage = (Map<String, Map<String, Integer>>) ois.readObject();
>                 ois.close();
>             } else {
>                 coverage = new HashMap<String, Map<String, Integer>>();
>             }
>         } catch (Exception e) {
>             e.printStackTrace();
>         }
>      }
>
>      after(TestCase testCase) : inTestClass(testCase) {
>         try {
>             File file = new File("results.ser");
>             ObjectOutputStream oos = new ObjectOutputStream(new
> FileOutputStream(file));
>             oos.writeObject(coverage);
>             oos.close();
>         } catch (Exception e) {
>             e.printStackTrace();
>         }
>      }
>
> }
>
>
>
Comment 1 Alexandre Vasseur CLA 2005-12-12 05:18:57 EST
spotted issue in exposed stated
commiting fix

note: Sam, pointcut is not what you want in your sample:

        @Pointcut("this(testCase) && this(TestCase) && execution(void test*())")
                                          ^^^^^^^^^^^
// need FQN in @AJ, and actually don't need it since you use a binding with another this(testCase)

        public void inTestClass(TestCase testCase) {
Comment 2 Alexandre Vasseur CLA 2005-12-12 05:47:51 EST
fix available