aboutsummaryrefslogtreecommitdiffstats
path: root/weaver/src
diff options
context:
space:
mode:
authorjhugunin <jhugunin>2002-12-18 05:08:49 +0000
committerjhugunin <jhugunin>2002-12-18 05:08:49 +0000
commitd38aec6e4f0ffea34a3f46d0148c69a69408e699 (patch)
tree49fa3c9bfe1a4367c749e2adab0a7d5ec95128ac /weaver/src
parent80f6a5625488080cd0eeb32d54d71d4b6c9ef9a8 (diff)
downloadaspectj-d38aec6e4f0ffea34a3f46d0148c69a69408e699.tar.gz
aspectj-d38aec6e4f0ffea34a3f46d0148c69a69408e699.zip
more bug fixes for if and privileged
Diffstat (limited to 'weaver/src')
-rw-r--r--weaver/src/org/aspectj/weaver/CrosscuttingMembers.java6
-rw-r--r--weaver/src/org/aspectj/weaver/bcel/BcelTypeMunger.java11
-rw-r--r--weaver/src/org/aspectj/weaver/bcel/LazyMethodGen.java6
-rw-r--r--weaver/src/org/aspectj/weaver/patterns/IfPointcut.java67
-rw-r--r--weaver/src/org/aspectj/weaver/patterns/TypePatternList.java15
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;
+ }
+
}