From 979124d0fe6ac23df1dd5ee41838056bbaed6789 Mon Sep 17 00:00:00 2001 From: avasseur Date: Mon, 12 Dec 2005 10:48:46 +0000 Subject: [PATCH] #120351 cflowbelow @AJ and binding --- .../ataspectj/bugs/CflowBelowStackTest.java | 105 ++++++++++++++++++ .../bugs/aop-cflowbelowstacktest.xml | 7 ++ .../ajc150/ataspectj/AtAjLTWTests.java | 4 + .../systemtest/ajc150/ataspectj/ltw.xml | 9 ++ .../org/aspectj/weaver/bcel/BcelAdvice.java | 12 +- .../org/aspectj/weaver/bcel/BcelShadow.java | 8 +- 6 files changed, 136 insertions(+), 9 deletions(-) create mode 100644 tests/java5/ataspectj/ataspectj/bugs/CflowBelowStackTest.java create mode 100644 tests/java5/ataspectj/ataspectj/bugs/aop-cflowbelowstacktest.xml 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 Alexandre Vasseur + */ +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> 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 tests = coverage.get(methodSignature); + if (tests == null) { + tests = new HashMap(); + 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>) ois.readObject(); + ois.close(); + } else { + coverage = new HashMap>(); + } + } 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 @@ + + + + + + + \ 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 @@ /> + + + + + + + \ 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( -- 2.39.5