Browse Source

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
tags/V1_1_0_RC2
jhugunin 21 years ago
parent
commit
ea84f573e5

+ 20
- 0
org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/AccessForInlineVisitor.java View File

@@ -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;
}

}

+ 4
- 0
org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/AdviceDeclaration.java View File

@@ -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;
}
}
}

+ 1
- 0
tests/bugs/interSpecials/p1/C.java View File

@@ -1,4 +1,5 @@
package p1;

public class C {
public void bar() {}
}

+ 6
- 0
tests/bugs/interSpecials/p2/A1.java View File

@@ -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();
}
}

+ 6
- 0
tests/bugs/interSpecials/p2/A2.java View File

@@ -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();
}
}

+ 11
- 1
tests/jimTests.xml View File

@@ -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>

<!--

Loading…
Cancel
Save