diff options
-rw-r--r-- | tests/ajcTests.xml | 5 | ||||
-rw-r--r-- | tests/bugs/HandlerSig.java | 42 | ||||
-rw-r--r-- | weaver/src/org/aspectj/weaver/Member.java | 10 | ||||
-rw-r--r-- | weaver/src/org/aspectj/weaver/ResolvedMember.java | 2 | ||||
-rw-r--r-- | weaver/src/org/aspectj/weaver/bcel/BcelShadow.java | 29 |
5 files changed, 80 insertions, 8 deletions
diff --git a/tests/ajcTests.xml b/tests/ajcTests.xml index 8d17bd6fe..e9ade4e18 100644 --- a/tests/ajcTests.xml +++ b/tests/ajcTests.xml @@ -7136,4 +7136,9 @@ <run class="SubtypeConstructorCW"/> </ajc-test> + <ajc-test dir="bugs" pr="50570" + title="CatchClauseSignature has broken operation"> + <compile files="HandlerSig.java"/> + <run class="HandlerSig"/> + </ajc-test> </suite> diff --git a/tests/bugs/HandlerSig.java b/tests/bugs/HandlerSig.java new file mode 100644 index 000000000..8e644815f --- /dev/null +++ b/tests/bugs/HandlerSig.java @@ -0,0 +1,42 @@ +import org.aspectj.testing.Tester; + +import org.aspectj.lang.reflect.*; + +public class HandlerSig { + + public void doSomething() { + // Get around "unreachable code error... + if (true) + { + throw new BusinessException("Surprise!!"); + } + System.out.println("Busy doing something."); + } + + public static void main(String[] args) { + try { + HandlerSig m = new HandlerSig(); + m.doSomething(); + } catch (BusinessException be) { + Tester.checkEqual(be.getMessage(), "Surprise!!"); + } + } +} + +class BusinessException extends RuntimeException { + BusinessException(String message) { + super(message); + } +} + +aspect AppMonitor { + pointcut problemHandling() : handler(Throwable+); + + before() : problemHandling() { + CatchClauseSignature cSig = + (CatchClauseSignature) thisJoinPointStaticPart.getSignature(); + + Tester.checkEqual(cSig.getParameterType(), BusinessException.class); + Tester.checkEqual(cSig.getParameterName(), "be"); + } +} diff --git a/weaver/src/org/aspectj/weaver/Member.java b/weaver/src/org/aspectj/weaver/Member.java index 79cfbadfc..d30a60f8e 100644 --- a/weaver/src/org/aspectj/weaver/Member.java +++ b/weaver/src/org/aspectj/weaver/Member.java @@ -190,8 +190,8 @@ public class Member implements Comparable { paramTys); } - public static Member makeExceptionHandlerSignature(TypeX inType, TypeX catchType) { - return new Member( + public static ResolvedMember makeExceptionHandlerSignature(TypeX inType, TypeX catchType) { + return new ResolvedMember( HANDLER, inType, Modifier.STATIC, @@ -596,11 +596,9 @@ public class Member implements Comparable { buf.append('-'); buf.append(makeString(getParameterTypes()[0])); buf.append('-'); - //XXX we don't actually try to find the handler parameter name - //XXX it probably wouldn't be too hard String pName = "<missing>"; - //String[] pNames = getParameterNames(world); - //if (pNames != null) pName = pNames[0]; + String[] names = getParameterNames(world); + if (names != null) pName = names[0]; buf.append(pName); buf.append('-'); return buf.toString(); diff --git a/weaver/src/org/aspectj/weaver/ResolvedMember.java b/weaver/src/org/aspectj/weaver/ResolvedMember.java index d1a4e9633..ab1cdc90f 100644 --- a/weaver/src/org/aspectj/weaver/ResolvedMember.java +++ b/weaver/src/org/aspectj/weaver/ResolvedMember.java @@ -26,7 +26,7 @@ import org.aspectj.bridge.ISourceLocation; */ public class ResolvedMember extends Member implements IHasPosition { - protected String[] parameterNames = null; + public String[] parameterNames = null; protected TypeX[] checkedExceptions = TypeX.NONE; diff --git a/weaver/src/org/aspectj/weaver/bcel/BcelShadow.java b/weaver/src/org/aspectj/weaver/bcel/BcelShadow.java index fd72970cd..c4ce575bb 100644 --- a/weaver/src/org/aspectj/weaver/bcel/BcelShadow.java +++ b/weaver/src/org/aspectj/weaver/bcel/BcelShadow.java @@ -40,6 +40,7 @@ import org.apache.bcel.generic.NEW; import org.apache.bcel.generic.ObjectType; import org.apache.bcel.generic.ReturnInstruction; import org.apache.bcel.generic.SWAP; +import org.apache.bcel.generic.StoreInstruction; import org.apache.bcel.generic.TargetLostException; import org.apache.bcel.generic.Type; import org.aspectj.bridge.ISourceLocation; @@ -408,11 +409,16 @@ public class BcelShadow extends Shadow { InstructionList body = enclosingMethod.getBody(); TypeX catchType = exceptionRange.getCatchType(); TypeX inType = enclosingMethod.getEnclosingClass().getType(); + + ResolvedMember sig = Member.makeExceptionHandlerSignature(inType, catchType); + + + sig.parameterNames = new String[] {findHandlerParamName(startOfHandler)}; BcelShadow s = new BcelShadow( world, ExceptionHandler, - Member.makeExceptionHandlerSignature(inType, catchType), + sig, enclosingMethod, enclosingShadow); ShadowRange r = new ShadowRange(body); @@ -424,6 +430,27 @@ public class BcelShadow extends Shadow { exceptionRange.updateTarget(startOfHandler, start, body); return s; } + + private static String findHandlerParamName(InstructionHandle startOfHandler) { + if (startOfHandler.getInstruction() instanceof StoreInstruction && + startOfHandler.getNext() != null) + { + int slot = ((StoreInstruction)startOfHandler.getInstruction()).getIndex(); + //System.out.println("got store: " + startOfHandler.getInstruction() + ", " + index); + InstructionTargeter[] targeters = startOfHandler.getNext().getTargeters(); + for (int i=targeters.length-1; i >= 0; i--) { + if (targeters[i] instanceof LocalVariableTag) { + LocalVariableTag t = (LocalVariableTag)targeters[i]; + if (t.getSlot() == slot) { + return t.getName(); + } + //System.out.println("tag: " + targeters[i]); + } + } + } + + return "<missing>"; + } /** create an init join point associated w/ an interface in the body of a constructor */ |