summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjhugunin <jhugunin>2003-05-01 03:25:43 +0000
committerjhugunin <jhugunin>2003-05-01 03:25:43 +0000
commitea84f573e50bd198f3412acffb7157e9d9b8b544 (patch)
treee9821ceb029efbd9d6f211c9ec243fa80ea9d205
parentabe705ad6b4926e7c02cf49b3ba033c320cf2b60 (diff)
downloadaspectj-ea84f573e50bd198f3412acffb7157e9d9b8b544.tar.gz
aspectj-ea84f573e50bd198f3412acffb7157e9d9b8b544.zip
expanded coverage and fix for bug involving around advice with either
assert or <name>.class in the body the fix for now is just to not inline such advice, but in the future these should be transformed to inlinable constructs
-rw-r--r--org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/AccessForInlineVisitor.java20
-rw-r--r--org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/AdviceDeclaration.java4
-rw-r--r--tests/bugs/interSpecials/p1/C.java1
-rw-r--r--tests/bugs/interSpecials/p2/A1.java6
-rw-r--r--tests/bugs/interSpecials/p2/A2.java6
-rw-r--r--tests/jimTests.xml12
6 files changed, 48 insertions, 1 deletions
diff --git a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/AccessForInlineVisitor.java b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/AccessForInlineVisitor.java
index 637ab0bd1..aa195135e 100644
--- a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/AccessForInlineVisitor.java
+++ b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/AccessForInlineVisitor.java
@@ -23,6 +23,8 @@ import org.aspectj.weaver.AjcMemberMaker;
import org.aspectj.weaver.ResolvedMember;
import org.eclipse.jdt.internal.compiler.AbstractSyntaxTreeVisitorAdapter;
import org.eclipse.jdt.internal.compiler.ast.AllocationExpression;
+import org.eclipse.jdt.internal.compiler.ast.AssertStatement;
+import org.eclipse.jdt.internal.compiler.ast.ClassLiteralAccess;
import org.eclipse.jdt.internal.compiler.ast.FieldReference;
import org.eclipse.jdt.internal.compiler.ast.MessageSend;
import org.eclipse.jdt.internal.compiler.ast.QualifiedNameReference;
@@ -57,6 +59,10 @@ public class AccessForInlineVisitor extends AbstractSyntaxTreeVisitorAdapter {
AspectDeclaration inAspect;
EclipseFactory world; // alias for inAspect.world
+ // set to true for ClassLiteralAccess and AssertStatement
+ // ??? A better answer would be to transform these into inlinable forms
+ public boolean isInlinable = true;
+
public AccessForInlineVisitor(AspectDeclaration inAspect, PrivilegedHandler handler) {
this.inAspect = inAspect;
this.world = inAspect.factory;
@@ -187,4 +193,18 @@ public class AccessForInlineVisitor extends AbstractSyntaxTreeVisitorAdapter {
return;
}
}
+ /* (non-Javadoc)
+ * @see org.eclipse.jdt.internal.compiler.IAbstractSyntaxTreeVisitor#endVisit(org.eclipse.jdt.internal.compiler.ast.AssertStatement, org.eclipse.jdt.internal.compiler.lookup.BlockScope)
+ */
+ public void endVisit(AssertStatement assertStatement, BlockScope scope) {
+ isInlinable = false;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jdt.internal.compiler.IAbstractSyntaxTreeVisitor#endVisit(org.eclipse.jdt.internal.compiler.ast.ClassLiteralAccess, org.eclipse.jdt.internal.compiler.lookup.BlockScope)
+ */
+ public void endVisit(ClassLiteralAccess classLiteral, BlockScope scope) {
+ isInlinable = false;
+ }
+
}
diff --git a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/AdviceDeclaration.java b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/AdviceDeclaration.java
index f23502f75..aabc84624 100644
--- a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/AdviceDeclaration.java
+++ b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/AdviceDeclaration.java
@@ -163,6 +163,10 @@ public class AdviceDeclaration extends MethodDeclaration {
AccessForInlineVisitor v = new AccessForInlineVisitor((AspectDeclaration)upperScope.referenceContext, handler);
this.traverse(v, (ClassScope) null);
+
+ // ??? if we found a construct that we can't inline, set
+ // proceedInInners so that we won't try to inline this body
+ if (!v.isInlinable) proceedInInners = true;
}
}
}
diff --git a/tests/bugs/interSpecials/p1/C.java b/tests/bugs/interSpecials/p1/C.java
index 472afd808..160bb847c 100644
--- a/tests/bugs/interSpecials/p1/C.java
+++ b/tests/bugs/interSpecials/p1/C.java
@@ -1,4 +1,5 @@
package p1;
public class C {
+ public void bar() {}
} \ No newline at end of file
diff --git a/tests/bugs/interSpecials/p2/A1.java b/tests/bugs/interSpecials/p2/A1.java
index 4a84e592d..9b75428bb 100644
--- a/tests/bugs/interSpecials/p2/A1.java
+++ b/tests/bugs/interSpecials/p2/A1.java
@@ -5,6 +5,7 @@ import p1.C;
public class A1 {
public static void main(String[] args) {
new C().foo();
+ new C().bar();
}
}
@@ -12,4 +13,9 @@ aspect InterClass {
void C.foo() {
System.out.println("class: " + C.class);
}
+
+ void around(): execution(void C.bar()) {
+ System.out.println("class: " + C.class);
+ proceed();
+ }
} \ No newline at end of file
diff --git a/tests/bugs/interSpecials/p2/A2.java b/tests/bugs/interSpecials/p2/A2.java
index a29f3d5b9..003e35486 100644
--- a/tests/bugs/interSpecials/p2/A2.java
+++ b/tests/bugs/interSpecials/p2/A2.java
@@ -4,6 +4,7 @@ import p1.C;
public class A2 {
public static void main(String[] args) {
new C().foo();
+ new C().bar();
}
}
@@ -11,4 +12,9 @@ aspect InterClass {
void C.foo() {
assert(C.class != null);
}
+
+ void around(): execution(void C.bar()) {
+ assert(C.class != null);
+ proceed();
+ }
}
diff --git a/tests/jimTests.xml b/tests/jimTests.xml
index 0ebd8cd50..a7b32080d 100644
--- a/tests/jimTests.xml
+++ b/tests/jimTests.xml
@@ -1,7 +1,17 @@
<!DOCTYPE suite SYSTEM "../tests/ajcTestSuite.dtd">
<suite>
-
+ <ajc-test dir="bugs/interSpecials" title="IllegalAccessError while accessing introduced variable / 1.1rc1"
+ pr="36110">
+ <compile files="p1/C.java,p2/A1.java"/>
+ <run class="p2.A1"/>
+ </ajc-test>
+
+ <ajc-test dir="bugs/interSpecials" title="testing that assert works like .class"
+ pr="36110">
+ <compile files="p1/C.java,p2/A2.java" options="-source14"/>
+ <run class="p2.A2" vm="1.4"/>
+ </ajc-test>
<!--