proper handling of ExceptionInIntializer inside <clinit> in presence of after throwing advice
--- /dev/null
+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
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);
+ }
}
<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>
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));