aboutsummaryrefslogtreecommitdiffstats
path: root/weaver
diff options
context:
space:
mode:
authorjhugunin <jhugunin>2002-12-23 19:39:22 +0000
committerjhugunin <jhugunin>2002-12-23 19:39:22 +0000
commitedbf43c6841313ebe0e7747407cfed9b11082065 (patch)
treea91ddf528883a0f9a23c94d50cfd8b005e06c9c1 /weaver
parentad22592b03d21deb506d38c86fe9253602b89cd6 (diff)
downloadaspectj-edbf43c6841313ebe0e7747407cfed9b11082065.tar.gz
aspectj-edbf43c6841313ebe0e7747407cfed9b11082065.zip
better errors for issingleton aspects advising own initializers
also correct typing for dynamic checks on parameters to if pcds
Diffstat (limited to 'weaver')
-rw-r--r--weaver/src/org/aspectj/weaver/bcel/BcelRenderer.java7
-rw-r--r--weaver/src/org/aspectj/weaver/patterns/IfPointcut.java9
-rw-r--r--weaver/src/org/aspectj/weaver/patterns/PerSingleton.java12
3 files changed, 21 insertions, 7 deletions
diff --git a/weaver/src/org/aspectj/weaver/bcel/BcelRenderer.java b/weaver/src/org/aspectj/weaver/bcel/BcelRenderer.java
index ab5595916..80b36e255 100644
--- a/weaver/src/org/aspectj/weaver/bcel/BcelRenderer.java
+++ b/weaver/src/org/aspectj/weaver/bcel/BcelRenderer.java
@@ -186,7 +186,12 @@ public class BcelRenderer implements ITestVisitor, IExprVisitor {
// assert method.isStatic()
Expr[] args = call.getArgs();
//System.out.println("args: " + Arrays.asList(args));
- InstructionList callIl = renderExprs(fact, world, args);
+ InstructionList callIl = new InstructionList();
+ for (int i=0, len=args.length; i < len; i++) {
+ //XXX only correct for static method calls
+ Type desiredType = BcelWorld.makeBcelType(method.getParameterTypes()[i]);
+ callIl.append(renderExpr(fact, world, args[i], desiredType));
+ }
//System.out.println("rendered args: " + callIl);
callIl.append(Utility.createInvoke(fact, world, method));
callIl.append(createJumpBasedOnBooleanOnStack());
diff --git a/weaver/src/org/aspectj/weaver/patterns/IfPointcut.java b/weaver/src/org/aspectj/weaver/patterns/IfPointcut.java
index 1f0bac258..051a2b24d 100644
--- a/weaver/src/org/aspectj/weaver/patterns/IfPointcut.java
+++ b/weaver/src/org/aspectj/weaver/patterns/IfPointcut.java
@@ -80,7 +80,9 @@ public class IfPointcut extends Pointcut {
try {
ExposedState myState = new ExposedState(baseArgsCount);
//System.out.println(residueSource);
- residueSource.findResidue(shadow, myState); // don't care about Test
+ //??? some of these tests are preconditions for the if to run correctly
+ // this implementation will duplicate those tests, we should be more careful
+ Test preTest = residueSource.findResidue(shadow, myState); // might need this
//System.out.println(myState);
@@ -101,8 +103,9 @@ public class IfPointcut extends Pointcut {
if ((extraParameterFlags & Advice.ThisEnclosingJoinPointStaticPart) != 0) {
args.add(shadow.getThisEnclosingJoinPointStaticPartVar());
}
-
- return Test.makeCall(testMethod, (Expr[])args.toArray(new Expr[args.size()]));
+ Test myTest = Test.makeCall(testMethod, (Expr[])args.toArray(new Expr[args.size()]));
+ return Test.makeAnd(preTest, myTest);
+
} finally {
findingResidue = false;
}
diff --git a/weaver/src/org/aspectj/weaver/patterns/PerSingleton.java b/weaver/src/org/aspectj/weaver/patterns/PerSingleton.java
index e95065ece..f74d2bc22 100644
--- a/weaver/src/org/aspectj/weaver/patterns/PerSingleton.java
+++ b/weaver/src/org/aspectj/weaver/patterns/PerSingleton.java
@@ -33,9 +33,15 @@ public class PerSingleton extends PerClause {
}
public Test findResidue(Shadow shadow, ExposedState state) {
- state.setAspectInstance(
- Expr.makeFieldGet(AjcMemberMaker.perSingletonField(inAspect), inAspect));
- // XXX we need to think about whether it's null...
+ Expr myInstance =
+ Expr.makeCallExpr(AjcMemberMaker.perSingletonAspectOfMethod(inAspect),
+ Expr.NONE, inAspect);
+
+ state.setAspectInstance(myInstance);
+
+ // we have no test
+ // a NoAspectBoundException will be thrown if we need an instance of this
+ // aspect before we are bound
return Literal.TRUE;
}