summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoravasseur <avasseur>2005-12-12 10:48:46 +0000
committeravasseur <avasseur>2005-12-12 10:48:46 +0000
commit979124d0fe6ac23df1dd5ee41838056bbaed6789 (patch)
tree6cd8cc92593f67ff29794a49bc35f68d9f25ffec
parent0c8c0a3d21365eade6f53a0484bba71f24637a65 (diff)
downloadaspectj-979124d0fe6ac23df1dd5ee41838056bbaed6789.tar.gz
aspectj-979124d0fe6ac23df1dd5ee41838056bbaed6789.zip
#120351 cflowbelow @AJ and binding
-rw-r--r--tests/java5/ataspectj/ataspectj/bugs/CflowBelowStackTest.java105
-rw-r--r--tests/java5/ataspectj/ataspectj/bugs/aop-cflowbelowstacktest.xml7
-rw-r--r--tests/src/org/aspectj/systemtest/ajc150/ataspectj/AtAjLTWTests.java4
-rw-r--r--tests/src/org/aspectj/systemtest/ajc150/ataspectj/ltw.xml9
-rw-r--r--weaver/src/org/aspectj/weaver/bcel/BcelAdvice.java12
-rw-r--r--weaver/src/org/aspectj/weaver/bcel/BcelShadow.java8
6 files changed, 136 insertions, 9 deletions
diff --git a/tests/java5/ataspectj/ataspectj/bugs/CflowBelowStackTest.java b/tests/java5/ataspectj/ataspectj/bugs/CflowBelowStackTest.java
new file mode 100644
index 000000000..36810f7cd
--- /dev/null
+++ b/tests/java5/ataspectj/ataspectj/bugs/CflowBelowStackTest.java
@@ -0,0 +1,105 @@
+/*******************************************************************************
+ * Copyright (c) 2005 Contributors.
+ * All rights reserved.
+ * This program and the accompanying materials are made available
+ * under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution and is available at
+ * http://eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Alexandre Vasseur initial implementation
+ *******************************************************************************/
+package ataspectj.bugs;
+
+import ataspectj.TestHelper;
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.annotation.After;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Before;
+import org.aspectj.lang.annotation.Pointcut;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author <a href="mailto:alex AT gnilux DOT com">Alexandre Vasseur</a>
+ */
+public class CflowBelowStackTest extends TestCase {
+
+ public void testMe() {
+ assertTrue(true);
+ }
+
+ public static void main(String[] args) {
+ TestHelper.runAndThrowOnFailure(suite());
+ }
+
+ public static Test suite() {
+ return new TestSuite(CflowBelowStackTest.class);
+ }
+
+
+ @Aspect
+ public static class TestAspect {
+
+ @Pointcut("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();
+ }
+ }
+ }
+}
diff --git a/tests/java5/ataspectj/ataspectj/bugs/aop-cflowbelowstacktest.xml b/tests/java5/ataspectj/ataspectj/bugs/aop-cflowbelowstacktest.xml
new file mode 100644
index 000000000..076124118
--- /dev/null
+++ b/tests/java5/ataspectj/ataspectj/bugs/aop-cflowbelowstacktest.xml
@@ -0,0 +1,7 @@
+<aspectj>
+ <weaver options="-1.5 -showWeaveInfo">
+ </weaver>
+ <aspects>
+ <aspect name="ataspectj.bugs.CflowBelowStackTest.TestAspect"/>
+ </aspects>
+</aspectj> \ No newline at end of file
diff --git a/tests/src/org/aspectj/systemtest/ajc150/ataspectj/AtAjLTWTests.java b/tests/src/org/aspectj/systemtest/ajc150/ataspectj/AtAjLTWTests.java
index 2d27cb8e1..7c2e52978 100644
--- a/tests/src/org/aspectj/systemtest/ajc150/ataspectj/AtAjLTWTests.java
+++ b/tests/src/org/aspectj/systemtest/ajc150/ataspectj/AtAjLTWTests.java
@@ -200,6 +200,10 @@ public class AtAjLTWTests extends XMLBasedAjcTestCase {
runTest("AppContainer");
}
+ public void testCflowBelowStack() {
+ runTest("CflowBelowStack");
+ }
+
private static class CountingFilenameFilter implements FilenameFilter {
private int count;
diff --git a/tests/src/org/aspectj/systemtest/ajc150/ataspectj/ltw.xml b/tests/src/org/aspectj/systemtest/ajc150/ataspectj/ltw.xml
index f4ac1a7bb..6b7f35987 100644
--- a/tests/src/org/aspectj/systemtest/ajc150/ataspectj/ltw.xml
+++ b/tests/src/org/aspectj/systemtest/ajc150/ataspectj/ltw.xml
@@ -277,4 +277,13 @@
/>
<ant file="ajc-ant.xml" target="ltw.AppContainer" verbose="true"/>
</ajc-test>
+
+ <ajc-test dir="java5/ataspectj" title="CflowBelowStack">
+ <compile
+ files="ataspectj/bugs/CflowBelowStackTest.java,ataspectj/TestHelper.java"
+ options="-1.5 -verbose "/>
+ <run class="ataspectj.bugs.CflowBelowStackTest" ltw="ataspectj/bugs/aop-cflowbelowstacktest.xml"/>
+ </ajc-test>
+
+
</suite> \ No newline at end of file
diff --git a/weaver/src/org/aspectj/weaver/bcel/BcelAdvice.java b/weaver/src/org/aspectj/weaver/bcel/BcelAdvice.java
index 728b6c128..f18506e25 100644
--- a/weaver/src/org/aspectj/weaver/bcel/BcelAdvice.java
+++ b/weaver/src/org/aspectj/weaver/bcel/BcelAdvice.java
@@ -595,14 +595,16 @@ public class BcelAdvice extends Advice {
}
}
- public BcelVar[] getExposedStateAsBcelVars() {
+ public BcelVar[] getExposedStateAsBcelVars(boolean isAround) {
// ATAJ aspect
- // the closure instantiation has the same mapping as the extracted method from wich it is called
- if (getConcreteAspect()!= null && getConcreteAspect().isAnnotationStyleAspect()) {
- return BcelVar.NONE;
+ if (isAround) {
+ // the closure instantiation has the same mapping as the extracted method from wich it is called
+ if (getConcreteAspect()!= null && getConcreteAspect().isAnnotationStyleAspect()) {
+ return BcelVar.NONE;
+ }
}
- //System.out.println("vars: " + Arrays.asList(exposedState.vars));
+ //System.out.println("vars: " + Arrays.asList(exposedState.vars));
if (exposedState == null) return BcelVar.NONE;
int len = exposedState.vars.length;
BcelVar[] ret = new BcelVar[len];
diff --git a/weaver/src/org/aspectj/weaver/bcel/BcelShadow.java b/weaver/src/org/aspectj/weaver/bcel/BcelShadow.java
index 96fe92f4d..1e8312eb0 100644
--- a/weaver/src/org/aspectj/weaver/bcel/BcelShadow.java
+++ b/weaver/src/org/aspectj/weaver/bcel/BcelShadow.java
@@ -1894,7 +1894,7 @@ public class BcelShadow extends Shadow {
new Type[] { },
Constants.INVOKESTATIC));
} else {
- BcelVar[] cflowStateVars = munger.getExposedStateAsBcelVars();
+ BcelVar[] cflowStateVars = munger.getExposedStateAsBcelVars(false);
if (cflowStateVars.length == 0) {
// This should be getting managed by a counter - lets make sure.
@@ -1958,7 +1958,7 @@ public class BcelShadow extends Shadow {
exitInstructions.append(Utility.createGet(fact, cflowField));
if (munger.getKind() != AdviceKind.PerCflowEntry &&
munger.getKind() != AdviceKind.PerCflowBelowEntry &&
- munger.getExposedStateAsBcelVars().length==0) {
+ munger.getExposedStateAsBcelVars(false).length==0) {
exitInstructions
.append(
fact
@@ -2342,7 +2342,7 @@ public class BcelShadow extends Shadow {
// we have on stack all the arguments for the ADVICE call.
// we have in frame somewhere all the arguments for the non-advice call.
- BcelVar[] adviceVars = munger.getExposedStateAsBcelVars();
+ BcelVar[] adviceVars = munger.getExposedStateAsBcelVars(true);
IntMap proceedMap = makeProceedArgumentMap(adviceVars);
// System.out.println(proceedMap + " for " + this);
@@ -2587,7 +2587,7 @@ public class BcelShadow extends Shadow {
0,
munger);
- BcelVar[] adviceVars = munger.getExposedStateAsBcelVars();
+ BcelVar[] adviceVars = munger.getExposedStateAsBcelVars(true);
String closureClassName =
NameMangler.makeClosureClassName(