diff options
author | jhugunin <jhugunin> | 2002-12-18 05:08:49 +0000 |
---|---|---|
committer | jhugunin <jhugunin> | 2002-12-18 05:08:49 +0000 |
commit | d38aec6e4f0ffea34a3f46d0148c69a69408e699 (patch) | |
tree | 49fa3c9bfe1a4367c749e2adab0a7d5ec95128ac /weaver/src | |
parent | 80f6a5625488080cd0eeb32d54d71d4b6c9ef9a8 (diff) | |
download | aspectj-d38aec6e4f0ffea34a3f46d0148c69a69408e699.tar.gz aspectj-d38aec6e4f0ffea34a3f46d0148c69a69408e699.zip |
more bug fixes for if and privileged
Diffstat (limited to 'weaver/src')
5 files changed, 74 insertions, 31 deletions
diff --git a/weaver/src/org/aspectj/weaver/CrosscuttingMembers.java b/weaver/src/org/aspectj/weaver/CrosscuttingMembers.java index 8635cdaf6..24c21cc6a 100644 --- a/weaver/src/org/aspectj/weaver/CrosscuttingMembers.java +++ b/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); diff --git a/weaver/src/org/aspectj/weaver/bcel/BcelTypeMunger.java b/weaver/src/org/aspectj/weaver/bcel/BcelTypeMunger.java index 63ab93d0c..bee6db29f 100644 --- a/weaver/src/org/aspectj/weaver/bcel/BcelTypeMunger.java +++ b/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; diff --git a/weaver/src/org/aspectj/weaver/bcel/LazyMethodGen.java b/weaver/src/org/aspectj/weaver/bcel/LazyMethodGen.java index 35648dc5f..326f5426b 100644 --- a/weaver/src/org/aspectj/weaver/bcel/LazyMethodGen.java +++ b/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); + } + } diff --git a/weaver/src/org/aspectj/weaver/patterns/IfPointcut.java b/weaver/src/org/aspectj/weaver/patterns/IfPointcut.java index 8a5d54ea9..1f0bac258 100644 --- a/weaver/src/org/aspectj/weaver/patterns/IfPointcut.java +++ b/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(); diff --git a/weaver/src/org/aspectj/weaver/patterns/TypePatternList.java b/weaver/src/org/aspectj/weaver/patterns/TypePatternList.java index c4ccc1bd9..c3a741578 100644 --- a/weaver/src/org/aspectj/weaver/patterns/TypePatternList.java +++ b/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; + } + } |