aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoraclement <aclement>2005-04-20 14:32:40 +0000
committeraclement <aclement>2005-04-20 14:32:40 +0000
commit3f942a4c58210535e91c50a037a8d743a0c70e19 (patch)
treececc507db4a72d422a40089d1664a77c2f1dd075
parent78abc76610cfb5fd2a2282086adfb017537ce49c (diff)
downloadaspectj-3f942a4c58210535e91c50a037a8d743a0c70e19.tar.gz
aspectj-3f942a4c58210535e91c50a037a8d743a0c70e19.zip
Fix for pr92053: atargs causes a VerifyError: Unable to pop operand off an empty stack
-rw-r--r--tests/java5/annotations/binding/bugs/Test3.java23
-rw-r--r--tests/src/org/aspectj/systemtest/ajc150/AnnotationBinding.java4
-rw-r--r--tests/src/org/aspectj/systemtest/ajc150/ajc150.xml5
-rw-r--r--weaver/src/org/aspectj/weaver/patterns/ArgsAnnotationPointcut.java28
4 files changed, 43 insertions, 17 deletions
diff --git a/tests/java5/annotations/binding/bugs/Test3.java b/tests/java5/annotations/binding/bugs/Test3.java
new file mode 100644
index 000000000..93b3ebf86
--- /dev/null
+++ b/tests/java5/annotations/binding/bugs/Test3.java
@@ -0,0 +1,23 @@
+import java.lang.annotation.*;
+
+@Target(ElementType.TYPE)
+@Retention(RetentionPolicy.RUNTIME)
+@interface Ann {}
+
+@Ann
+class C{}
+
+public class Test3 {
+
+ public static void main(String[] args) {
+ C a = new C();
+ abc(a);
+ }
+
+ static void abc(C y) {}
+}
+
+
+aspect Annotations {
+ before(Ann ann) : call(* Test3.*(..)) && @args(ann) { }
+}
diff --git a/tests/src/org/aspectj/systemtest/ajc150/AnnotationBinding.java b/tests/src/org/aspectj/systemtest/ajc150/AnnotationBinding.java
index 14cfbc008..ab7940e73 100644
--- a/tests/src/org/aspectj/systemtest/ajc150/AnnotationBinding.java
+++ b/tests/src/org/aspectj/systemtest/ajc150/AnnotationBinding.java
@@ -393,5 +393,9 @@ public class AnnotationBinding extends XMLBasedAjcTestCase {
assertTrue("Should point to line 10 but doesnt: "+tgt,tgt.indexOf("|10|")!=-1);
}
}
+
+ public void testAnnotationBindingArgsVerifyError_pr92053() {
+ runTest("AtArgs causes a VerifyError: Unable to pop operand off an empty stack");
+ }
} \ No newline at end of file
diff --git a/tests/src/org/aspectj/systemtest/ajc150/ajc150.xml b/tests/src/org/aspectj/systemtest/ajc150/ajc150.xml
index b2005b972..8001d474a 100644
--- a/tests/src/org/aspectj/systemtest/ajc150/ajc150.xml
+++ b/tests/src/org/aspectj/systemtest/ajc150/ajc150.xml
@@ -2149,5 +2149,10 @@
<compile files="ITDReturningParameterizedType.aj" options="-1.5"/>
<run class="ITDReturningParameterizedType"/>
</ajc-test>
+
+ <ajc-test dir="java5/annotations/binding/bugs" title="AtArgs causes a VerifyError: Unable to pop operand off an empty stack" vm="1.5">
+ <compile files="Test3.java" options="-1.5"/>
+ <run class="Test3"/>
+ </ajc-test>
</suite> \ No newline at end of file
diff --git a/weaver/src/org/aspectj/weaver/patterns/ArgsAnnotationPointcut.java b/weaver/src/org/aspectj/weaver/patterns/ArgsAnnotationPointcut.java
index dfb97e743..ce9125476 100644
--- a/weaver/src/org/aspectj/weaver/patterns/ArgsAnnotationPointcut.java
+++ b/weaver/src/org/aspectj/weaver/patterns/ArgsAnnotationPointcut.java
@@ -137,24 +137,18 @@ public class ArgsAnnotationPointcut extends NameBindingPointcut {
WeaverMessages.format(WeaverMessages.CANT_FIND_TYPE_ARG_TYPE,argType.getName()),
"",IMessage.ERROR,shadow.getSourceLocation(),null,new ISourceLocation[]{getSourceLocation()});
}
- if (ap.matches(rArgType).alwaysTrue()) { // !!! ASC Can we ever take this branch?
- // !!! AMC - Yes, if annotation is @Inherited
- argsIndex++;
- continue;
- } else {
+
+ ResolvedTypeX rAnnType = ap.annotationType.resolve(shadow.getIWorld());
+ if (ap instanceof BindingAnnotationTypePattern) {
+ BindingAnnotationTypePattern btp = (BindingAnnotationTypePattern)ap;
+ Var annvar = shadow.getArgAnnotationVar(argsIndex,rAnnType);
+ state.set(btp.getFormalIndex(),annvar);
+ }
+ if (!ap.matches(rArgType).alwaysTrue()) {
// we need a test...
- ResolvedTypeX rAnnType = ap.annotationType.resolve(shadow.getIWorld());
- if (ap instanceof BindingAnnotationTypePattern) {
- BindingAnnotationTypePattern btp = (BindingAnnotationTypePattern)ap;
- Var annvar = shadow.getArgAnnotationVar(argsIndex,rAnnType);
- state.set(btp.getFormalIndex(),annvar);
- ret = Test.makeAnd(ret,Test.makeHasAnnotation(shadow.getArgVar(argsIndex),rAnnType));
- argsIndex++;
- } else {
- ret = Test.makeAnd(ret,Test.makeHasAnnotation(shadow.getArgVar(argsIndex),rAnnType));
- argsIndex++;
- }
- }
+ ret = Test.makeAnd(ret,Test.makeHasAnnotation(shadow.getArgVar(argsIndex),rAnnType));
+ }
+ argsIndex++;
}
}
return ret;