aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoraclement <aclement>2005-10-27 13:49:34 +0000
committeraclement <aclement>2005-10-27 13:49:34 +0000
commit6ab78ee0e1d49a0e3f882ddf604061dc572cb427 (patch)
tree6be694492a79b00b680c4954c9459ca3f8e789db
parentfa21e62717f87e3f84b74dcedc36d79951ec0751 (diff)
downloadaspectj-6ab78ee0e1d49a0e3f882ddf604061dc572cb427.tar.gz
aspectj-6ab78ee0e1d49a0e3f882ddf604061dc572cb427.zip
test and fix for pr113447: from Helen.
-rw-r--r--tests/bugs150/PR113447.java40
-rw-r--r--tests/src/org/aspectj/systemtest/ajc150/Ajc150Tests.java4
-rw-r--r--tests/src/org/aspectj/systemtest/ajc150/ajc150.xml6
-rw-r--r--weaver/src/org/aspectj/weaver/patterns/ThisOrTargetPointcut.java22
4 files changed, 62 insertions, 10 deletions
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 @@
</compile>
</ajc-test>
+ <ajc-test dir="bugs150" title="no verify error with two this pcds">
+ <compile files="PR113447.java">
+ </compile>
+ <run class="PR113447"/>
+ </ajc-test>
+
<!-- ============================================================================ -->
<!-- ============================================================================ -->
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());