diff options
author | Andy Clement <aclement@pivotal.io> | 2015-09-03 14:19:10 -0700 |
---|---|---|
committer | Andy Clement <aclement@pivotal.io> | 2015-09-03 14:19:10 -0700 |
commit | 2233cf023bce0168435795ab5747dae59fbd9a0d (patch) | |
tree | cdaa8d6ef69ef6abd123ab0d70a212d21e993f3c | |
parent | a9ea7010ab7075d934aeb49d48dec33d48b722c4 (diff) | |
download | aspectj-2233cf023bce0168435795ab5747dae59fbd9a0d.tar.gz aspectj-2233cf023bce0168435795ab5747dae59fbd9a0d.zip |
307147: missing joinpoints for itds invoking private methods
-rw-r--r-- | tests/bugs187/307147/ITDAspect.aj | 11 | ||||
-rw-r--r-- | tests/bugs187/307147/Test.java | 28 | ||||
-rw-r--r-- | tests/bugs187/307147/TestAspect.aj | 8 | ||||
-rw-r--r-- | tests/bugs187/307147_2/ITDAspect.aj | 10 | ||||
-rw-r--r-- | tests/bugs187/307147_2/Test.java | 16 | ||||
-rw-r--r-- | tests/bugs187/307147_2/TestAspect.aj | 9 | ||||
-rw-r--r-- | tests/src/org/aspectj/systemtest/ajc187/Ajc187Tests.java | 8 | ||||
-rw-r--r-- | tests/src/org/aspectj/systemtest/ajc187/ajc187.xml | 30 | ||||
-rw-r--r-- | weaver/src/org/aspectj/weaver/bcel/BcelClassWeaver.java | 7 | ||||
-rw-r--r-- | weaver/src/org/aspectj/weaver/bcel/BcelTypeMunger.java | 1 | ||||
-rw-r--r-- | weaver/src/org/aspectj/weaver/bcel/BcelWorld.java | 26 |
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 |