Просмотр исходного кода

more bug fixes for if and privileged

tags/V_1_1_b2
jhugunin 21 лет назад
Родитель
Сommit
d38aec6e4f

+ 5
- 0
org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/IfMethodDeclaration.java Просмотреть файл

@@ -16,6 +16,7 @@ package org.aspectj.ajdt.internal.compiler.ast;
import org.aspectj.ajdt.internal.compiler.lookup.EclipseWorld;
import org.aspectj.weaver.*;
import org.aspectj.weaver.patterns.IfPointcut;
import org.eclipse.jdt.internal.compiler.*;
import org.eclipse.jdt.internal.compiler.CompilationResult;
import org.eclipse.jdt.internal.compiler.ast.*;
import org.eclipse.jdt.internal.compiler.lookup.*;
@@ -36,6 +37,10 @@ public class IfMethodDeclaration extends MethodDeclaration {
// do nothing, we're already fully parsed
}
protected int generateInfoAttributes(ClassFile classFile) {
return classFile.generateMethodInfoAttribute(binding, AstUtil.getAjSyntheticAttribute());
}
public void resolveStatements(ClassScope upperScope) {
super.resolveStatements(upperScope);
if (binding != null) {

+ 1
- 1
org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/InterTypeConstructorDeclaration.java Просмотреть файл

@@ -222,7 +222,7 @@ public class InterTypeConstructorDeclaration extends InterTypeDeclaration {
private AjAttribute makeAttribute(EclipseWorld world) {
if (explicitConstructorCall != null) {
if (explicitConstructorCall != null && !(explicitConstructorCall.binding instanceof ProblemMethodBinding)) {
MethodBinding explicitConstructor = explicitConstructorCall.binding;
if (explicitConstructor.alwaysNeedsAccessMethod()) {
explicitConstructor = explicitConstructor.getAccessMethod();

+ 1
- 1
org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/InterTypeMethodDeclaration.java Просмотреть файл

@@ -98,7 +98,7 @@ public class InterTypeMethodDeclaration extends InterTypeDeclaration {
public void generateCode(ClassScope classScope, ClassFile classFile) {
if (ignoreFurtherInvestigation) {
System.err.println("no code for " + this);
//System.err.println("no code for " + this);
return;
}

+ 3
- 0
org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/SuperFixerVisitor.java Просмотреть файл

@@ -46,6 +46,9 @@ public class SuperFixerVisitor extends AbstractSyntaxTreeVisitorAdapter {
if (call.codegenBinding == null) return;
MethodBinding superBinding = call.codegenBinding;
if (superBinding instanceof ProblemMethodBinding) {
return;
}
char[] accessName;
boolean isSuper;
if (call.isSuperAccess() && !call.binding.isStatic()) {

+ 1
- 1
org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/EclipseWorld.java Просмотреть файл

@@ -141,7 +141,7 @@ public class EclipseWorld extends World {
public static ResolvedMember makeResolvedMember(MethodBinding binding) {
return new ResolvedMember(
Member.METHOD,
binding.isConstructor() ? Member.CONSTRUCTOR : Member.METHOD,
fromBinding(binding.declaringClass),
binding.modifiers,
fromBinding(binding.returnType),

+ 7
- 1
org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/PrivilegedFieldBinding.java Просмотреть файл

@@ -19,6 +19,7 @@ import org.aspectj.ajdt.internal.compiler.ast.*;
import org.aspectj.ajdt.internal.compiler.ast.AstUtil;
import org.aspectj.weaver.*;
import org.aspectj.weaver.NameMangler;
import org.eclipse.jdt.internal.compiler.ast.*;
import org.eclipse.jdt.internal.compiler.ast.FieldDeclaration;
import org.eclipse.jdt.internal.compiler.impl.Constant;
import org.eclipse.jdt.internal.compiler.lookup.*;
@@ -43,6 +44,9 @@ public class PrivilegedFieldBinding extends FieldBinding {
AjcMemberMaker.privilegedAccessMethodForFieldSet(
inAspect.typeX, inAspect.world.makeResolvedMember(baseField)
)));
this.constant = AstNode.NotAConstant;
this.baseField = baseField;
}


@@ -59,8 +63,10 @@ public class PrivilegedFieldBinding extends FieldBinding {
public boolean alwaysNeedsAccessMethod(boolean isReadAccess) { return true; }

public FieldBinding getFieldBindingForLookup() { return baseField; }


public String toString() { return "PrivilegedWrapper(" + baseField + ")"; }
// public ReferenceBinding getTargetType() {
// return introducedField.declaringClass;
// }

+ 8
- 2
org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/PrivilegedHandler.java Просмотреть файл

@@ -40,9 +40,15 @@ public class PrivilegedHandler implements IPrivilegedHandler {
public MethodBinding getPrivilegedAccessMethod(MethodBinding baseMethod) {
ResolvedMember key = inAspect.world.makeResolvedMember(baseMethod);
if (accessors.containsKey(key)) return (MethodBinding)accessors.get(key);
MethodBinding ret = inAspect.world.makeMethodBinding(
MethodBinding ret;
if (baseMethod.isConstructor()) {
ret = baseMethod;
} else {
ret = inAspect.world.makeMethodBinding(
AjcMemberMaker.privilegedAccessMethodForMethod(inAspect.typeX, key)
);
);
}
//new PrivilegedMethodBinding(inAspect, baseMethod);
accessors.put(key, ret);

+ 5
- 1
weaver/src/org/aspectj/weaver/CrosscuttingMembers.java Просмотреть файл

@@ -95,7 +95,11 @@ public class CrosscuttingMembers {
} else if (declare instanceof DeclareDominates) {
declareDominates.add(declare);
} else if (declare instanceof DeclareParents) {
declareParents.add(declare);
DeclareParents dp = (DeclareParents)declare;
for (Iterator i = dp.getParents().collectAccessTypeMungers(world).iterator(); i.hasNext(); ) {
addTypeMunger(world.concreteTypeMunger((PrivilegedAccessMunger)i.next(), inAspect));
}
declareParents.add(dp);
} else if (declare instanceof DeclareSoft) {
DeclareSoft d = (DeclareSoft)declare;
Pointcut concretePointcut = d.getPointcut().concretize(inAspect, 0);

+ 11
- 0
weaver/src/org/aspectj/weaver/bcel/BcelTypeMunger.java Просмотреть файл

@@ -72,6 +72,17 @@ public class BcelTypeMunger extends ConcreteTypeMunger {
addMethodDispatch(gen, member,
AjcMemberMaker.privilegedAccessMethodForMethod(aspectType, member));
return true;
} else if (member.getKind() == Member.CONSTRUCTOR) {
for (Iterator i = gen.getMethodGens().iterator(); i.hasNext(); ) {
LazyMethodGen m = (LazyMethodGen)i.next();
if (m.getMemberView() != null && m.getMemberView().getKind() == Member.CONSTRUCTOR) {
// m.getMemberView().equals(member)) {
m.forcePublic();
//return true;
}
}
return true;
//throw new BCException("no match for " + member + " in " + gen);
} else if (member.getKind() == Member.STATIC_INITIALIZATION) {
gen.forcePublic();
return true;

+ 5
- 1
weaver/src/org/aspectj/weaver/bcel/LazyMethodGen.java Просмотреть файл

@@ -38,7 +38,7 @@ import org.aspectj.weaver.*;
*/

public final class LazyMethodGen {
private final int accessFlags;
private int accessFlags;
private final Type returnType;
private final String name;
private final Type[] argumentTypes;
@@ -1060,4 +1060,8 @@ public final class LazyMethodGen {
return memberView;
}

public void forcePublic() {
accessFlags = Utility.makePublic(accessFlags);
}

}

+ 38
- 29
weaver/src/org/aspectj/weaver/patterns/IfPointcut.java Просмотреть файл

@@ -73,34 +73,39 @@ public class IfPointcut extends Pointcut {
return "if(" + testMethod + ")";
}

private boolean findingResidue = false;
public Test findResidue(Shadow shadow, ExposedState state) {
if (residueSource == null) return Literal.TRUE; //???
ExposedState myState = new ExposedState(baseArgsCount);
//System.out.println(residueSource);
residueSource.findResidue(shadow, myState); // don't care about Test
//System.out.println(myState);
List args = new ArrayList();
for (int i=0; i < baseArgsCount; i++) {
args.add(myState.get(i));
}

// handle thisJoinPoint parameters
if ((extraParameterFlags & Advice.ThisJoinPoint) != 0) {
args.add(shadow.getThisJoinPointVar());
}
if ((extraParameterFlags & Advice.ThisJoinPointStaticPart) != 0) {
args.add(shadow.getThisJoinPointStaticPartVar());
}
if ((extraParameterFlags & Advice.ThisEnclosingJoinPointStaticPart) != 0) {
args.add(shadow.getThisEnclosingJoinPointStaticPartVar());
}

return Test.makeCall(testMethod, (Expr[])args.toArray(new Expr[args.size()]));
if (findingResidue) return Literal.TRUE;
findingResidue = true;
try {
ExposedState myState = new ExposedState(baseArgsCount);
//System.out.println(residueSource);
residueSource.findResidue(shadow, myState); // don't care about Test
//System.out.println(myState);
List args = new ArrayList();
for (int i=0; i < baseArgsCount; i++) {
args.add(myState.get(i));
}
// handle thisJoinPoint parameters
if ((extraParameterFlags & Advice.ThisJoinPoint) != 0) {
args.add(shadow.getThisJoinPointVar());
}
if ((extraParameterFlags & Advice.ThisJoinPointStaticPart) != 0) {
args.add(shadow.getThisJoinPointStaticPartVar());
}
if ((extraParameterFlags & Advice.ThisEnclosingJoinPointStaticPart) != 0) {
args.add(shadow.getThisEnclosingJoinPointStaticPartVar());
}
return Test.makeCall(testMethod, (Expr[])args.toArray(new Expr[args.size()]));
} finally {
findingResidue = false;
}
}
@@ -108,10 +113,14 @@ public class IfPointcut extends Pointcut {
return this.concretize1(inAspect, bindings);
}
private IfPointcut partiallyConcretized = null;
public Pointcut concretize1(ResolvedTypeX inAspect, IntMap bindings) {
//System.err.println("concretize: " + this + " already: " + partiallyConcretized);
if (partiallyConcretized != null) {
return partiallyConcretized;
}
IfPointcut ret = new IfPointcut(testMethod, extraParameterFlags);
if (this.state == CONCRETE) return ret;
this.state = CONCRETE;
partiallyConcretized = ret;
if (bindings.directlyInAdvice()) {
Advice advice = bindings.getEnclosingAdvice();
ret.baseArgsCount = advice.getBaseParameterCount();

+ 15
- 0
weaver/src/org/aspectj/weaver/patterns/TypePatternList.java Просмотреть файл

@@ -14,6 +14,7 @@
package org.aspectj.weaver.patterns;

import java.io.*;
import java.lang.reflect.Modifier;
import java.util.*;

import org.aspectj.weaver.*;
@@ -231,4 +232,18 @@ public class TypePatternList extends PatternNode {
return typePatterns;
}

public Collection collectAccessTypeMungers(World world) {
ArrayList ret = new ArrayList();
for (int i=0; i<typePatterns.length; i++) {
TypeX t = typePatterns[i].getExactType();
ResolvedTypeX rt = t.resolve(world);
if (!Modifier.isPublic(rt.getModifiers())) {
ret.add(new PrivilegedAccessMunger(new ResolvedMember(
Member.STATIC_INITIALIZATION, rt, 0, ResolvedTypeX.VOID, "", TypeX.NONE
)));
}
}
return ret;
}

}

Загрузка…
Отмена
Сохранить