summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tests/bugs/pr62642.java40
-rw-r--r--tests/src/org/aspectj/systemtest/ajc121/Ajc121Tests.java10
-rw-r--r--tests/src/org/aspectj/systemtest/ajc121/ajc121-tests.xml8
-rw-r--r--weaver/src/org/aspectj/weaver/bcel/BcelShadow.java18
4 files changed, 75 insertions, 1 deletions
diff --git a/tests/bugs/pr62642.java b/tests/bugs/pr62642.java
new file mode 100644
index 000000000..30cc50611
--- /dev/null
+++ b/tests/bugs/pr62642.java
@@ -0,0 +1,40 @@
+class C {
+ static int x = 13;
+ int y;
+
+ public C() {
+ y= 14;
+ }
+
+ public static void main(String args[]) {
+
+ C m = new C();
+ m.y = 3;
+ System.out.println("hi");
+ }
+}
+
+public class pr62642 {
+ public static void main(String[] args) {
+ try {
+ C.main(null);
+ } catch (ExceptionInInitializerError eiie) {
+ System.err.println("EIIE="+eiie.toString());
+ System.err.println("CAUSE="+eiie.getCause().toString());
+ }
+ }
+}
+
+
+aspect Aspect {
+
+ before () : within(*) && !within(pr62642) {
+ System.out.println("BEFORE "+ thisJoinPointStaticPart.getKind() +
+ " at " + thisJoinPointStaticPart.getSourceLocation());
+ }
+
+ after () : within(*) && !within(pr62642) {
+ System.out.println("AFTER " + thisJoinPointStaticPart.getKind() +
+ " at " + thisJoinPointStaticPart.getSourceLocation());
+ }
+} \ No newline at end of file
diff --git a/tests/src/org/aspectj/systemtest/ajc121/Ajc121Tests.java b/tests/src/org/aspectj/systemtest/ajc121/Ajc121Tests.java
index 391d5f89f..ec5513053 100644
--- a/tests/src/org/aspectj/systemtest/ajc121/Ajc121Tests.java
+++ b/tests/src/org/aspectj/systemtest/ajc121/Ajc121Tests.java
@@ -225,6 +225,14 @@ public class Ajc121Tests extends org.aspectj.testing.XMLBasedAjcTestCase {
public void test042_ITDaccessingPrivateMethod_pr67578_2() {
runTest("Privileged Aspect Access Problem Across Packages (2)");
}
-
+
+ public void test043_pr62642_ExceptionInInitializerError() {
+ runTest("proper handling of ExceptionInIntializer inside clinit in presence of after throwing advice");
+ String s = getLastRunResult().getStdErr();
+ assertTrue("Output should contain java.lang.ExceptionInInitializerError but is '"+s+"'",
+ s.indexOf("java.lang.ExceptionInInitializerError")!=-1);
+ assertTrue("Output should contain 'CAUSE=org.aspectj.lang.NoAspectBoundException' but is '"+s+"'",
+ s.indexOf("CAUSE=org.aspectj.lang.NoAspectBoundException")!=-1);
+ }
}
diff --git a/tests/src/org/aspectj/systemtest/ajc121/ajc121-tests.xml b/tests/src/org/aspectj/systemtest/ajc121/ajc121-tests.xml
index 4b60da7ac..b687ae762 100644
--- a/tests/src/org/aspectj/systemtest/ajc121/ajc121-tests.xml
+++ b/tests/src/org/aspectj/systemtest/ajc121/ajc121-tests.xml
@@ -329,3 +329,11 @@
<message kind="error" line="7" text="The method returnNothing(Object) from the type ITD is not visible"/>
</compile>
</ajc-test>
+
+ <ajc-test dir="bugs" pr="62642"
+ title="proper handling of ExceptionInIntializer inside clinit in presence of after throwing advice">
+ <compile files="pr62642.java"/>
+ <run class="pr62642">
+ <message kind="error"/>
+ </run>
+ </ajc-test>
diff --git a/weaver/src/org/aspectj/weaver/bcel/BcelShadow.java b/weaver/src/org/aspectj/weaver/bcel/BcelShadow.java
index 743453592..9e6fd0c29 100644
--- a/weaver/src/org/aspectj/weaver/bcel/BcelShadow.java
+++ b/weaver/src/org/aspectj/weaver/bcel/BcelShadow.java
@@ -1201,6 +1201,24 @@ public class BcelShadow extends Shadow {
BcelVar exceptionVar = genTempVar(catchType);
exceptionVar.appendStore(handler, fact);
+ // pr62642
+ // I will now jump through some firey BCEL hoops to generate a trivial bit of code:
+ // if (exc instanceof ExceptionInInitializerError)
+ // throw (ExceptionInInitializerError)exc;
+ if (this.getEnclosingMethod().getName().equals("<clinit>")) {
+ ResolvedTypeX eiieType = world.resolve("java.lang.ExceptionInInitializerError");
+ ObjectType eiieBcelType = (ObjectType)BcelWorld.makeBcelType(eiieType);
+ InstructionList ih = new InstructionList(InstructionConstants.NOP);
+ handler.append(exceptionVar.createLoad(fact));
+ handler.append(fact.createInstanceOf(eiieBcelType));
+ BranchInstruction bi =
+ InstructionFactory.createBranchInstruction(Constants.IFEQ,ih.getStart());
+ handler.append(bi);
+ handler.append(exceptionVar.createLoad(fact));
+ handler.append(fact.createCheckCast(eiieBcelType));
+ handler.append(InstructionConstants.ATHROW);
+ handler.append(ih);
+ }
InstructionList endHandler = new InstructionList(
exceptionVar.createLoad(fact));