From 6ab78ee0e1d49a0e3f882ddf604061dc572cb427 Mon Sep 17 00:00:00 2001 From: aclement Date: Thu, 27 Oct 2005 13:49:34 +0000 Subject: [PATCH] test and fix for pr113447: from Helen. --- tests/bugs150/PR113447.java | 40 +++++++++++++++++++ .../systemtest/ajc150/Ajc150Tests.java | 4 ++ .../org/aspectj/systemtest/ajc150/ajc150.xml | 6 +++ .../weaver/patterns/ThisOrTargetPointcut.java | 22 +++++----- 4 files changed, 62 insertions(+), 10 deletions(-) create mode 100644 tests/bugs150/PR113447.java diff --git a/tests/bugs150/PR113447.java b/tests/bugs150/PR113447.java new file mode 100644 index 000000000..8fd45ed06 --- /dev/null +++ b/tests/bugs150/PR113447.java @@ -0,0 +1,40 @@ +public class PR113447 { + + public static void main(String[] args) { + PR113447 me = new PR113447(); + me.method1(); + me.method3(); + } + + public void method1(){} + + public void method3(){} +} + +aspect Super { + + // second method doesn't exist + pointcut pc1(PR113447 s) : + (this(s) && execution(void method1())) + || (this(s) && execution(void method2())); + + before(PR113447 s) : pc1(s) { + } + + // second method does exist + pointcut pc2(PR113447 s) : + (this(s) && execution(void method1())) + || (this(s) && execution(void method3())); + + before(PR113447 s) : pc2(s) { + } + + // second method doesn't exist + pointcut pc3(PR113447 s) : + (args(s) && execution(void method1())) + || (args(s) && execution(void method2())); + + before(PR113447 s) : pc3(s) { + } + +} diff --git a/tests/src/org/aspectj/systemtest/ajc150/Ajc150Tests.java b/tests/src/org/aspectj/systemtest/ajc150/Ajc150Tests.java index 282154ca7..fc05dad53 100644 --- a/tests/src/org/aspectj/systemtest/ajc150/Ajc150Tests.java +++ b/tests/src/org/aspectj/systemtest/ajc150/Ajc150Tests.java @@ -632,6 +632,10 @@ public class Ajc150Tests extends org.aspectj.testing.XMLBasedAjcTestCase { runTest("weaveinfo message for declare at method on an ITDd method"); } + public void testNoVerifyErrorWithTwoThisPCDs_pr113447() { + runTest("no verify error with two this pcds"); + } + // helper methods..... public SyntheticRepository createRepos(File cpentry) { diff --git a/tests/src/org/aspectj/systemtest/ajc150/ajc150.xml b/tests/src/org/aspectj/systemtest/ajc150/ajc150.xml index 3796ab103..b476f9e39 100644 --- a/tests/src/org/aspectj/systemtest/ajc150/ajc150.xml +++ b/tests/src/org/aspectj/systemtest/ajc150/ajc150.xml @@ -698,6 +698,12 @@ + + + + + + diff --git a/weaver/src/org/aspectj/weaver/patterns/ThisOrTargetPointcut.java b/weaver/src/org/aspectj/weaver/patterns/ThisOrTargetPointcut.java index b458c5d97..da23506ea 100644 --- a/weaver/src/org/aspectj/weaver/patterns/ThisOrTargetPointcut.java +++ b/weaver/src/org/aspectj/weaver/patterns/ThisOrTargetPointcut.java @@ -179,17 +179,19 @@ public class ThisOrTargetPointcut extends NameBindingPointcut { if (type instanceof BindingTypePattern) { BindingTypePattern btp = (BindingTypePattern)type; // Check if we have already bound something to this formal - if ((state.get(btp.getFormalIndex())!=null) && (lastMatchedShadowId != shadow.shadowId)){ -// ISourceLocation pcdSloc = getSourceLocation(); -// ISourceLocation shadowSloc = shadow.getSourceLocation(); -// Message errorMessage = new Message( -// "Cannot use "+(isThis?"this()":"target()")+" to match at this location and bind a formal to type '"+var.getType()+ -// "' - the formal is already bound to type '"+state.get(btp.getFormalIndex()).getType()+"'"+ -// ". The secondary source location points to the problematic "+(isThis?"this()":"target()")+".", -// shadowSloc,true,new ISourceLocation[]{pcdSloc}); -// shadow.getIWorld().getMessageHandler().handleMessage(errorMessage); + Var existingVarInThisSlot = state.get(btp.getFormalIndex()); + + if (existingVarInThisSlot != null ) { + + // Is it already bound to exactly the same thing? + if (existingVarInThisSlot.equals(var)) return Literal.TRUE; + + // If state.get() returned non-null then someone has already bound the variable in that slot at + // the shadow 'shadow.shadowId'. If our 'lastMatchedShadowId' is not the same as 'shadow.shadowId' + // then this pointcut wasn't involved in matching and so shouldn't contribute to binding - so just + // return Literal.TRUE meaning 'no residue' + if (lastMatchedShadowId != shadow.shadowId) return Literal.TRUE; state.setErroneousVar(btp.getFormalIndex()); - //return null; } } return exposeStateForVar(var, type, state, shadow.getIWorld()); -- 2.39.5