From 2233cf023bce0168435795ab5747dae59fbd9a0d Mon Sep 17 00:00:00 2001 From: Andy Clement Date: Thu, 3 Sep 2015 14:19:10 -0700 Subject: [PATCH] 307147: missing joinpoints for itds invoking private methods --- tests/bugs187/307147/ITDAspect.aj | 11 +++++++ tests/bugs187/307147/Test.java | 28 +++++++++++++++++ tests/bugs187/307147/TestAspect.aj | 8 +++++ tests/bugs187/307147_2/ITDAspect.aj | 10 +++++++ tests/bugs187/307147_2/Test.java | 16 ++++++++++ tests/bugs187/307147_2/TestAspect.aj | 9 ++++++ .../systemtest/ajc187/Ajc187Tests.java | 8 +++++ .../org/aspectj/systemtest/ajc187/ajc187.xml | 30 +++++++++++++++++++ .../aspectj/weaver/bcel/BcelClassWeaver.java | 7 +++++ .../aspectj/weaver/bcel/BcelTypeMunger.java | 1 + .../org/aspectj/weaver/bcel/BcelWorld.java | 26 ++++++++++++++++ 11 files changed, 154 insertions(+) create mode 100644 tests/bugs187/307147/ITDAspect.aj create mode 100644 tests/bugs187/307147/Test.java create mode 100644 tests/bugs187/307147/TestAspect.aj create mode 100644 tests/bugs187/307147_2/ITDAspect.aj create mode 100644 tests/bugs187/307147_2/Test.java create mode 100644 tests/bugs187/307147_2/TestAspect.aj 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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 -- 2.39.5