aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndy Clement <aclement@pivotal.io>2015-09-03 14:19:10 -0700
committerAndy Clement <aclement@pivotal.io>2015-09-03 14:19:10 -0700
commit2233cf023bce0168435795ab5747dae59fbd9a0d (patch)
treecdaa8d6ef69ef6abd123ab0d70a212d21e993f3c
parenta9ea7010ab7075d934aeb49d48dec33d48b722c4 (diff)
downloadaspectj-2233cf023bce0168435795ab5747dae59fbd9a0d.tar.gz
aspectj-2233cf023bce0168435795ab5747dae59fbd9a0d.zip
307147: missing joinpoints for itds invoking private methods
-rw-r--r--tests/bugs187/307147/ITDAspect.aj11
-rw-r--r--tests/bugs187/307147/Test.java28
-rw-r--r--tests/bugs187/307147/TestAspect.aj8
-rw-r--r--tests/bugs187/307147_2/ITDAspect.aj10
-rw-r--r--tests/bugs187/307147_2/Test.java16
-rw-r--r--tests/bugs187/307147_2/TestAspect.aj9
-rw-r--r--tests/src/org/aspectj/systemtest/ajc187/Ajc187Tests.java8
-rw-r--r--tests/src/org/aspectj/systemtest/ajc187/ajc187.xml30
-rw-r--r--weaver/src/org/aspectj/weaver/bcel/BcelClassWeaver.java7
-rw-r--r--weaver/src/org/aspectj/weaver/bcel/BcelTypeMunger.java1
-rw-r--r--weaver/src/org/aspectj/weaver/bcel/BcelWorld.java26
11 files changed, 154 insertions, 0 deletions
diff --git a/tests/bugs187/307147/ITDAspect.aj b/tests/bugs187/307147/ITDAspect.aj
new file mode 100644
index 000000000..5442a5825
--- /dev/null
+++ b/tests/bugs187/307147/ITDAspect.aj
@@ -0,0 +1,11 @@
+package test;
+
+import test.Test;
+
+public privileged aspect ITDAspect {
+ public void Test.itdFunction() {
+ System.out.println("ITD function");
+ privateMethod();
+ publicMethod();
+ }
+}
diff --git a/tests/bugs187/307147/Test.java b/tests/bugs187/307147/Test.java
new file mode 100644
index 000000000..25b4eef4d
--- /dev/null
+++ b/tests/bugs187/307147/Test.java
@@ -0,0 +1,28 @@
+package test;
+
+public class Test {
+
+ public Test() {
+ }
+
+ public static void main(String[] args) {
+ Test t = new Test();
+ t.function();
+ t.itdFunction();
+ }
+
+ public void function() {
+ System.out.println("Normal function");
+ privateMethod();
+ publicMethod();
+ }
+
+ private void privateMethod() {
+ System.out.println("private method");
+ }
+
+ public void publicMethod() {
+ System.out.println("public method");
+ }
+
+}
diff --git a/tests/bugs187/307147/TestAspect.aj b/tests/bugs187/307147/TestAspect.aj
new file mode 100644
index 000000000..cf53868e3
--- /dev/null
+++ b/tests/bugs187/307147/TestAspect.aj
@@ -0,0 +1,8 @@
+package test;
+
+public aspect TestAspect {
+ Object around(): call(* Test.*(..)) {
+ System.out.println("Around " + thisJoinPoint.toString());
+ return proceed();
+ }
+}
diff --git a/tests/bugs187/307147_2/ITDAspect.aj b/tests/bugs187/307147_2/ITDAspect.aj
new file mode 100644
index 000000000..c3e22ee7d
--- /dev/null
+++ b/tests/bugs187/307147_2/ITDAspect.aj
@@ -0,0 +1,10 @@
+package test;
+
+import test.Test;
+
+public privileged aspect ITDAspect {
+ public void Test.itdFunction() {
+ System.out.println("ITD function");
+ privateMethod("Foo");
+ }
+}
diff --git a/tests/bugs187/307147_2/Test.java b/tests/bugs187/307147_2/Test.java
new file mode 100644
index 000000000..fe184dfe5
--- /dev/null
+++ b/tests/bugs187/307147_2/Test.java
@@ -0,0 +1,16 @@
+package test;
+
+public class Test {
+
+ public Test() {
+ }
+
+ public static void main(String[] args) {
+ Test t = new Test();
+ t.itdFunction();
+ }
+
+ private void privateMethod(String xxx) {
+ System.out.println("hello "+xxx);
+ }
+}
diff --git a/tests/bugs187/307147_2/TestAspect.aj b/tests/bugs187/307147_2/TestAspect.aj
new file mode 100644
index 000000000..24cef6c79
--- /dev/null
+++ b/tests/bugs187/307147_2/TestAspect.aj
@@ -0,0 +1,9 @@
+package test;
+
+public aspect TestAspect {
+ Object around(String s): call(* Test.*(..)) && args(s) {
+ System.out.println("Around " + thisJoinPoint.toString());
+ System.out.println("Captured "+s);
+ return proceed(s.toUpperCase());
+ }
+}
diff --git a/tests/src/org/aspectj/systemtest/ajc187/Ajc187Tests.java b/tests/src/org/aspectj/systemtest/ajc187/Ajc187Tests.java
index ece3240e0..3fce314bd 100644
--- a/tests/src/org/aspectj/systemtest/ajc187/Ajc187Tests.java
+++ b/tests/src/org/aspectj/systemtest/ajc187/Ajc187Tests.java
@@ -24,6 +24,14 @@ import org.aspectj.testing.XMLBasedAjcTestCase;
*/
public class Ajc187Tests extends org.aspectj.testing.XMLBasedAjcTestCase {
+ public void testMissingJoinpoint_307147() throws Exception {
+ runTest("missing joinpoint");
+ }
+
+ public void testMissingJoinpoint_307147_2() throws Exception {
+ runTest("missing joinpoint 2");
+ }
+
public void testInfiniteLoop_475152() throws Exception {
runTest("infinite loop");
}
diff --git a/tests/src/org/aspectj/systemtest/ajc187/ajc187.xml b/tests/src/org/aspectj/systemtest/ajc187/ajc187.xml
index e6db6d5e5..19706f43a 100644
--- a/tests/src/org/aspectj/systemtest/ajc187/ajc187.xml
+++ b/tests/src/org/aspectj/systemtest/ajc187/ajc187.xml
@@ -2,6 +2,36 @@
<suite>
+<ajc-test dir="bugs187/307147" title="missing joinpoint">
+<compile files="Test.java TestAspect.aj ITDAspect.aj" options="-1.8"/>
+<run class="test.Test">
+<stdout>
+<line text="Around call(void test.Test.function())"/>
+<line text="Normal function"/>
+<line text="Around call(void test.Test.privateMethod())"/>
+<line text="private method"/>
+<line text="Around call(void test.Test.publicMethod())"/>
+<line text="public method"/>
+<line text="Around call(void test.Test.itdFunction())"/>
+<line text="ITD function"/>
+<line text="Around call(void test.Test.privateMethod())"/>
+<line text="private method"/>
+<line text="Around call(void test.Test.publicMethod())"/>
+<line text="public method"/>
+</stdout></run>
+</ajc-test>
+
+<ajc-test dir="bugs187/307147_2" title="missing joinpoint 2">
+<compile files="Test.java TestAspect.aj ITDAspect.aj" options="-1.8"/>
+<run class="test.Test">
+<stdout>
+<line text="ITD function"/>
+<line text="Around call(void test.Test.privateMethod(String))"/>
+<line text="Captured Foo"/>
+<line text="hello FOO"/>
+</stdout></run>
+</ajc-test>
+
<ajc-test dir="bugs187/475152" title="infinite loop">
<compile files="AbstractAspect.aj, BaseAspect.aj, TestClass.java, AjTarget.java, TestAspect.aj" options="-1.8"/>
</ajc-test>
diff --git a/weaver/src/org/aspectj/weaver/bcel/BcelClassWeaver.java b/weaver/src/org/aspectj/weaver/bcel/BcelClassWeaver.java
index 88b1090c2..b4eaa3dd4 100644
--- a/weaver/src/org/aspectj/weaver/bcel/BcelClassWeaver.java
+++ b/weaver/src/org/aspectj/weaver/bcel/BcelClassWeaver.java
@@ -3209,6 +3209,13 @@ class BcelClassWeaver implements IClassWeaver {
if (canMatch(Shadow.FieldGet) || canMatch(Shadow.FieldSet)) {
match(BcelShadow.makeShadowForMethodCall(world, mg, ih, enclosingShadow, kind, declaredSig), shadowAccumulator);
}
+ } else if (!declaredSig.getName().startsWith(NameMangler.PREFIX)) {
+ // 307147 - resolution above may have found the real method directly rather
+ // than needing to go through the effective signature attribute
+ if (canMatch(Shadow.MethodCall)) {
+ match(BcelShadow.makeShadowForMethodCall(world, mg, ih, enclosingShadow, Shadow.MethodCall, declaredSig),
+ shadowAccumulator);
+ }
} else {
AjAttribute.EffectiveSignatureAttribute effectiveSig = declaredSig.getEffectiveSignature();
if (effectiveSig == null) {
diff --git a/weaver/src/org/aspectj/weaver/bcel/BcelTypeMunger.java b/weaver/src/org/aspectj/weaver/bcel/BcelTypeMunger.java
index 9e5b6a210..7a637bb2d 100644
--- a/weaver/src/org/aspectj/weaver/bcel/BcelTypeMunger.java
+++ b/weaver/src/org/aspectj/weaver/bcel/BcelTypeMunger.java
@@ -44,6 +44,7 @@ import org.aspectj.bridge.MessageUtil;
import org.aspectj.bridge.WeaveMessage;
import org.aspectj.bridge.context.CompilationAndWeavingContext;
import org.aspectj.bridge.context.ContextToken;
+import org.aspectj.weaver.AjAttribute;
import org.aspectj.weaver.AjcMemberMaker;
import org.aspectj.weaver.AnnotationAJ;
import org.aspectj.weaver.AnnotationOnTypeMunger;
diff --git a/weaver/src/org/aspectj/weaver/bcel/BcelWorld.java b/weaver/src/org/aspectj/weaver/bcel/BcelWorld.java
index 4f0dfe1bc..de9e29aba 100644
--- a/weaver/src/org/aspectj/weaver/bcel/BcelWorld.java
+++ b/weaver/src/org/aspectj/weaver/bcel/BcelWorld.java
@@ -630,6 +630,32 @@ public class BcelWorld extends World implements Repository {
UnresolvedType declaringType = null;
String signature = ii.getSignature(cpg);
+
+ // 307147
+ if (name.startsWith("ajc$privMethod$")) {
+ // The invoke is on a privileged accessor. These may be created for different
+ // kinds of target, not necessarily just private methods. In bug 307147 it is
+ // for a private method. This code is identifying the particular case in 307147
+ try {
+ declaringType = UnresolvedType.forName(declaring);
+ String typeNameAsFoundInAccessorName = declaringType.getName().replace('.', '_');
+ int indexInAccessorName = name.lastIndexOf(typeNameAsFoundInAccessorName);
+ if (indexInAccessorName != -1) {
+ String methodName = name.substring(indexInAccessorName+typeNameAsFoundInAccessorName.length()+1);
+ ResolvedType resolvedDeclaringType = declaringType.resolve(this);
+ ResolvedMember[] methods = resolvedDeclaringType.getDeclaredMethods();
+ for (ResolvedMember method: methods) {
+ if (method.getName().equals(methodName) && method.getSignature().equals(signature) && Modifier.isPrivate(method.getModifiers())) {
+ return method;
+ }
+ }
+ }
+ } catch (Exception e) {
+ // Remove this once confident above code isn't having unexpected side effects
+ // Added 1.8.7
+ e.printStackTrace();
+ }
+ }
int modifier = (ii instanceof INVOKEINTERFACE) ? Modifier.INTERFACE
: (ii.opcode == Constants.INVOKESTATIC) ? Modifier.STATIC : (ii.opcode == Constants.INVOKESPECIAL && !name