--- /dev/null
+/*******************************************************************************
+ * 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();
+ }
+ }
+ }
+}
}
}
- 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];
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.
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
// 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);
0,
munger);
- BcelVar[] adviceVars = munger.getExposedStateAsBcelVars();
+ BcelVar[] adviceVars = munger.getExposedStateAsBcelVars(true);
String closureClassName =
NameMangler.makeClosureClassName(