Browse Source

fixed Bug 29959: super call in intertype method declaration body causes VerifyError

tags/V_1_1_b5
jhugunin 21 years ago
parent
commit
3e2801ad50

+ 2
- 2
org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/InterTypeConstructorDeclaration.java View File

@@ -110,7 +110,7 @@ public class InterTypeConstructorDeclaration extends InterTypeDeclaration {
if (explicitConstructorCall != null) {
explicitConstructor = explicitConstructorCall.binding;
if (explicitConstructor.alwaysNeedsAccessMethod()) {
explicitConstructor = explicitConstructor.getAccessMethod();
explicitConstructor = explicitConstructor.getAccessMethod(true);
}
}
@@ -226,7 +226,7 @@ public class InterTypeConstructorDeclaration extends InterTypeDeclaration {
if (explicitConstructorCall != null && !(explicitConstructorCall.binding instanceof ProblemMethodBinding)) {
MethodBinding explicitConstructor = explicitConstructorCall.binding;
if (explicitConstructor.alwaysNeedsAccessMethod()) {
explicitConstructor = explicitConstructor.getAccessMethod();
explicitConstructor = explicitConstructor.getAccessMethod(true);
}

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

@@ -16,6 +16,7 @@ package org.aspectj.ajdt.internal.compiler.ast;
import java.util.*;
import java.util.Arrays;

import org.aspectj.ajdt.internal.compiler.lookup.*;
import org.aspectj.ajdt.internal.compiler.lookup.EclipseWorld;
import org.aspectj.weaver.*;
import org.aspectj.weaver.ShadowMunger;
@@ -49,6 +50,17 @@ public class SuperFixerVisitor extends AbstractSyntaxTreeVisitorAdapter {
if (superBinding instanceof ProblemMethodBinding) {
return;
}
// InterTypeMethodBindings are always statically bound, so there's no
// need to treat super calls specially here
if (superBinding instanceof InterTypeMethodBinding) {
return;
// InterTypeMethodBinding m = (InterTypeMethodBinding)superBinding;
// if (m.postDispatchMethod != null) {
// call.binding = m.postDispatchMethod;
// }
// return;
}
char[] accessName;
if (call.isSuperAccess() && !call.binding.isStatic()) {
call.receiver = new ThisReference();

+ 7
- 32
org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/InterTypeMethodBinding.java View File

@@ -18,11 +18,10 @@ import org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration;
import org.eclipse.jdt.internal.compiler.lookup.*;

public class InterTypeMethodBinding extends MethodBinding {
//private ReferenceBinding withinType;
private ReferenceBinding targetType;
private MethodBinding syntheticMethod;
//public MethodBinding introducedMethod;
public MethodBinding postDispatchMethod;
public AbstractMethodDeclaration sourceMethod;
@@ -38,42 +37,17 @@ public class InterTypeMethodBinding extends MethodBinding {
if (signature.getKind() == Member.METHOD) {
syntheticMethod =
world.makeMethodBinding(AjcMemberMaker.interMethodDispatcher(signature, withinType));
postDispatchMethod =
world.makeMethodBinding(AjcMemberMaker.interMethodBody(signature, withinType));
} else {
syntheticMethod = world.makeMethodBinding(
AjcMemberMaker.interConstructor(world.resolve(signature.getDeclaringType()),
signature, withinType));
postDispatchMethod = syntheticMethod;
}

}
//
// this.declaringClass =
//
//
//
// char[] dispatch2Name;
// if (Modifier.isPublic(modifiers)) {
// dispatch2Name = name;
// } else if (Modifier.isPrivate(modifiers)) {
// dispatch2Name =
// AstUtil.makeAjcMangledName("dispatch2".toCharArray(), withinType, selector);
// } else {
// // package visible
// //??? optimize both in same package
// dispatch2Name =
// AstUtil.makeAjcMangledName("dispatch2".toCharArray(),
// withinType.qualifiedPackageName(), selector);
// }
//
// introducedMethod =
// new MethodBinding(AstUtil.makePublic(modifiers), dispatch2Name,
// type, args, exceptions, declaringClass);
//
// this.dispatchMethod =
// new DispatchMethodBinding(introducedMethod, withinType, mangledParams);
// }


//XXX this is identical to InterTypeFieldBinding
public boolean canBeSeenBy(TypeBinding receiverType, InvocationSite invocationSite, Scope scope) {
@@ -127,8 +101,9 @@ public class InterTypeMethodBinding extends MethodBinding {
}


public MethodBinding getAccessMethod() {
return syntheticMethod;
public MethodBinding getAccessMethod(boolean staticReference) {
if (staticReference) return postDispatchMethod;
else return syntheticMethod;
}
public boolean alwaysNeedsAccessMethod() { return true; }

+ 1
- 1
org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/AllocationExpression.java View File

@@ -155,7 +155,7 @@ public class AllocationExpression

public void manageSyntheticAccessIfNecessary(BlockScope currentScope) {
if (binding.alwaysNeedsAccessMethod()) {
syntheticAccessor = binding.getAccessMethod();
syntheticAccessor = binding.getAccessMethod(true);
return;
}

+ 1
- 1
org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ExplicitConstructorCall.java View File

@@ -181,7 +181,7 @@ public class ExplicitConstructorCall

public void manageSyntheticAccessIfNecessary(BlockScope currentScope) {
if (binding.alwaysNeedsAccessMethod()) {
syntheticAccessor = binding.getAccessMethod();
syntheticAccessor = binding.getAccessMethod(true);
return;
}

+ 1
- 1
org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/MessageSend.java View File

@@ -142,7 +142,7 @@ public void manageEnclosingInstanceAccessIfNecessary(BlockScope currentScope) {
}
public void manageSyntheticAccessIfNecessary(BlockScope currentScope){
if (binding.alwaysNeedsAccessMethod()) {
syntheticAccessor = binding.getAccessMethod();
syntheticAccessor = binding.getAccessMethod(isSuperAccess());
return;
}


+ 1
- 1
org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/MethodBinding.java View File

@@ -421,7 +421,7 @@ public final int sourceStart() {
* This will only be called if alwaysNeedsAccessMethod() returns true.
* In that case it should return the access method to be used.
*/
public MethodBinding getAccessMethod() {
public MethodBinding getAccessMethod(boolean staticReference) {
throw new RuntimeException("unimplemented");
}


+ 6
- 0
tests/ajcTests.xml View File

@@ -5560,4 +5560,10 @@
<compile files="AspectStaticInit.java"/>
<run class="AspectStaticInit"/>
</ajc-test>
<ajc-test dir="bugs" pr="29959"
title="super call in intertype method declaration body causes VerifyError">
<compile files="SuperToIntro.java"/>
<run class="SuperToIntro"/>
</ajc-test>
</suite>

+ 7
- 0
tests/ajcTestsFailing.xml View File

@@ -51,4 +51,11 @@
<message kind="warning" line="73"/>
</compile>
</ajc-test>
<ajc-test dir="bugs" pr="29959"
title="super call in intertype method declaration body causes VerifyError">
<compile files="SuperToIntro.java"/>
<run class="SuperToIntro"/>
</ajc-test>

</suite>

+ 27
- 0
tests/bugs/SuperToIntro.java View File

@@ -0,0 +1,27 @@
// from Bug#: 29959
import org.aspectj.testing.Tester;

aspect Foo {
String A.onlyA() { return "onlyA"; }
String A.foo() { return "Afoo"; }
String B.foo() { return super.foo() + ":" + onlyA() + ":" + super.getName(); }
}

class A {
String getName() { return "A"; }
}
class B extends A {
String getName() { return "B"; }
String onB1() { return foo() + ":" + onlyA() + ":" + getName(); }
String onB2() { return super.foo() + ":" + super.onlyA() + ":" + super.getName(); }
}

public class SuperToIntro {
public static void main(String[] args) {
B b = new B();
Tester.checkEqual(b.foo(), "Afoo:onlyA:A");
Tester.checkEqual(b.onB1(), "Afoo:onlyA:A:onlyA:B");
Tester.checkEqual(b.onB2(), "Afoo:onlyA:A");
}
}

+ 4
- 11
tests/jimTests.xml View File

@@ -1,18 +1,11 @@
<!DOCTYPE suite SYSTEM "../tests/ajcTestSuite.dtd">
<suite>
<ajc-test dir="bugs" pr="29691"
title="Static inner aspects cannot reference user defined pointcuts">
<compile files="PcdLookup.java" />
<run class="PcdLookup"/>
</ajc-test>




<!--
<ajc-test dir="new"
title="work nicely with inner class method look-up rules and call-site advice"
keywords="from-resolved_10x">
<compile files="InnerMethods.java"/>
<run class="InnerMethods"/>
</ajc-test>

-->
</suite>

Loading…
Cancel
Save