From 84e4e53608871ab3ad0381d19abd8fa2e1bc4533 Mon Sep 17 00:00:00 2001 From: aclement Date: Tue, 17 Aug 2004 14:04:29 +0000 Subject: [PATCH] Test and fix for Bugzilla Bug 62642 proper handling of ExceptionInIntializer inside in presence of after throwing advice --- tests/bugs/pr62642.java | 40 +++++++++++++++++++ .../systemtest/ajc121/Ajc121Tests.java | 10 ++++- .../systemtest/ajc121/ajc121-tests.xml | 8 ++++ .../org/aspectj/weaver/bcel/BcelShadow.java | 18 +++++++++ 4 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 tests/bugs/pr62642.java 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 @@ + + + + + + + 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("")) { + 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)); -- 2.39.5