Quellcode durchsuchen

test and fix for pr113447: from Helen.

tags/V1_5_0RC1
aclement vor 18 Jahren
Ursprung
Commit
6ab78ee0e1

+ 40
- 0
tests/bugs150/PR113447.java Datei anzeigen

@@ -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) {
}

}

+ 4
- 0
tests/src/org/aspectj/systemtest/ajc150/Ajc150Tests.java Datei anzeigen

@@ -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) {

+ 6
- 0
tests/src/org/aspectj/systemtest/ajc150/ajc150.xml Datei anzeigen

@@ -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>

<!-- ============================================================================ -->
<!-- ============================================================================ -->

+ 12
- 10
weaver/src/org/aspectj/weaver/patterns/ThisOrTargetPointcut.java Datei anzeigen

@@ -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());

Laden…
Abbrechen
Speichern