From ec91e93ac09fa9a347a8e8d0f99db3585dd93060 Mon Sep 17 00:00:00 2001 From: Andy Clement Date: Mon, 17 Nov 2014 18:32:25 -0800 Subject: [PATCH] Further 451966: privileged aspect and ITDs --- .../org/aspectj/ajdt/ajc/messages.properties | 2 +- .../lookup/InterTypeMethodBinding.java | 14 ++++++++- tests/bugs185/451966/Code2.java | 31 +++++++++++++++++++ .../systemtest/ajc185/Ajc185Tests.java | 7 ++++- .../org/aspectj/systemtest/ajc185/ajc185.xml | 7 ++++- 5 files changed, 57 insertions(+), 4 deletions(-) create mode 100644 tests/bugs185/451966/Code2.java diff --git a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/ajc/messages.properties b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/ajc/messages.properties index 94637ffc6..94dd63e27 100644 --- a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/ajc/messages.properties +++ b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/ajc/messages.properties @@ -4,7 +4,7 @@ The -Xlintfile:lint.properties allows fine-grained control. In tools.jar, see org/aspectj/weaver/XlintDefault.properties for the default behavior and a template to copy. ### AspectJ-specific messages -compiler.name = AspectJ Compiler 1.8.4 +compiler.name = AspectJ Compiler 1.8.5 compiler.version = Eclipse Compiler BETA_JAVA8_2b07958, 3.11 compiler.copyright = diff --git a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/InterTypeMethodBinding.java b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/InterTypeMethodBinding.java index 5d17dd357..953e7d9ee 100644 --- a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/InterTypeMethodBinding.java +++ b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/InterTypeMethodBinding.java @@ -104,13 +104,25 @@ public class InterTypeMethodBinding extends MethodBinding { // it is a privileged aspect return true; } - + if (isProtected()) { throw new RuntimeException("unimplemented"); } // XXX make sure this walks correctly if (isPrivate()) { + // Possibly the call is made from an inner type within the privileged aspect + // TODO should check the first outer aspect we come across and stop at that point? + if (invocationType.isNestedType()) { + TypeBinding enclosingType = invocationType.enclosingType(); + while (enclosingType != null) { + if ((enclosingType instanceof SourceTypeBinding) && ((SourceTypeBinding)enclosingType).privilegedHandler != null) { + return true; + } + enclosingType = enclosingType.enclosingType(); + } + } + // answer true if the receiverType is the declaringClass // AND the invocationType and the declaringClass have a common enclosingType // if (receiverType != declaringClass) return false; diff --git a/tests/bugs185/451966/Code2.java b/tests/bugs185/451966/Code2.java new file mode 100644 index 000000000..d40211725 --- /dev/null +++ b/tests/bugs185/451966/Code2.java @@ -0,0 +1,31 @@ + +public class Code2 { + public static void main(String []argv) { + new Bar().foo(); + } +} +interface Common { } + +interface Allergies extends Common { + default public void foo() { + } +} + +class Bar implements Allergies { } + +aspect Y { + private boolean Common.instancesInvariant() { + return false; + } +} + +privileged aspect AspectJMLRac_allergies_Allergies { + before(final Allergies object$rac): execution(* Allergies+.*(..)) && this(object$rac) { + Runnable r = new Runnable() { + public void run() { + boolean b = object$rac.instancesInvariant(); + } + }; + boolean b = object$rac.instancesInvariant(); + } +} diff --git a/tests/src/org/aspectj/systemtest/ajc185/Ajc185Tests.java b/tests/src/org/aspectj/systemtest/ajc185/Ajc185Tests.java index 9fefaa5eb..135eb8464 100644 --- a/tests/src/org/aspectj/systemtest/ajc185/Ajc185Tests.java +++ b/tests/src/org/aspectj/systemtest/ajc185/Ajc185Tests.java @@ -24,7 +24,12 @@ public class Ajc185Tests extends org.aspectj.testing.XMLBasedAjcTestCase { public void testITDInterface_451966() throws Exception { runTest("itd interface"); } - + + public void testITDInterface_451966_2() throws Exception { + // call made from inner type + runTest("itd interface - 2"); + } + // --- public static Test suite() { diff --git a/tests/src/org/aspectj/systemtest/ajc185/ajc185.xml b/tests/src/org/aspectj/systemtest/ajc185/ajc185.xml index 5e8f8dc8a..7c30d7bf4 100644 --- a/tests/src/org/aspectj/systemtest/ajc185/ajc185.xml +++ b/tests/src/org/aspectj/systemtest/ajc185/ajc185.xml @@ -2,11 +2,16 @@ - + + + + + + -- 2.39.5