@@ -20,5 +20,4 @@ | |||
L0: INVOKESTATIC Four.aspectOf ()LFour; | |||
INVOKEVIRTUAL Four.ajc$afterReturning$Four$1$c2776aed ()V | |||
RETURN | |||
RETURN | |||
end public void m() |
@@ -20,5 +20,4 @@ | |||
L0: INVOKESTATIC Three.aspectOf ()LThree; | |||
INVOKEVIRTUAL Three.ajc$afterReturning$Three$1$3f09355c ()V | |||
RETURN | |||
RETURN | |||
end public void m3() |
@@ -21,5 +21,4 @@ | |||
INVOKESTATIC Three.aspectOf ()LThree; | |||
INVOKEVIRTUAL Three.ajc$afterReturning$Three$3$b48e4ae1 ()V | |||
RETURN | |||
RETURN | |||
end public void m33() |
@@ -49,6 +49,7 @@ import org.aspectj.apache.bcel.generic.MULTIANEWARRAY; | |||
import org.aspectj.apache.bcel.generic.NEW; | |||
import org.aspectj.apache.bcel.generic.ObjectType; | |||
import org.aspectj.apache.bcel.generic.PUSH; | |||
import org.aspectj.apache.bcel.generic.RETURN; | |||
import org.aspectj.apache.bcel.generic.ReturnInstruction; | |||
import org.aspectj.apache.bcel.generic.SWAP; | |||
import org.aspectj.apache.bcel.generic.StoreInstruction; | |||
@@ -1792,6 +1793,12 @@ public class BcelShadow extends Shadow { | |||
* variable to hold the return value, and load the value from this var before | |||
* returning (see pr148007 for why we do this - it works around a JRockit bug, | |||
* and is also closer to what javac generates) | |||
* | |||
* Sometimes the 'last return' isnt the right one - some rogue code can | |||
* include the real return from the body of a subroutine that exists at the end | |||
* of the method. In this case the last return is RETURN but that may not be | |||
* correct for a method with a non-void return type... pr151673 | |||
* | |||
* @param returns list of all the return instructions in the shadow | |||
* @param returnInstructions instruction list into which the return instructions should | |||
* be generated | |||
@@ -1799,15 +1806,26 @@ public class BcelShadow extends Shadow { | |||
*/ | |||
private BcelVar generateReturnInstructions(List returns, InstructionList returnInstructions) { | |||
BcelVar returnValueVar = null; | |||
InstructionHandle lastReturnHandle = (InstructionHandle)returns.get(returns.size() - 1); | |||
Instruction newReturnInstruction = Utility.copyInstruction(lastReturnHandle.getInstruction()); | |||
if (this.hasANonVoidReturnType()) { | |||
// Find the last *correct* return - this is a method with a non-void return type | |||
// so ignore RETURN | |||
Instruction newReturnInstruction = null; | |||
int i=returns.size()-1; | |||
while (newReturnInstruction == null && i>=0) { | |||
InstructionHandle ih = (InstructionHandle)returns.get(i); | |||
if (!(ih.getInstruction() instanceof RETURN)) { | |||
newReturnInstruction = Utility.copyInstruction(ih.getInstruction()); | |||
} | |||
i--; | |||
} | |||
returnValueVar = genTempVar(this.getReturnType()); | |||
returnValueVar.appendLoad(returnInstructions,getFactory()); | |||
returnInstructions.append(newReturnInstruction); | |||
} else { | |||
InstructionHandle lastReturnHandle = (InstructionHandle)returns.get(returns.size() - 1); | |||
Instruction newReturnInstruction = Utility.copyInstruction(lastReturnHandle.getInstruction()); | |||
returnInstructions.append(newReturnInstruction); | |||
} | |||
returnInstructions.append(newReturnInstruction); | |||
return returnValueVar; | |||
} | |||
@@ -12,7 +12,6 @@ public abstract class FancyHelloWorld extends java.lang.Object: | |||
| ATHROW | |||
| L0: INVOKESTATIC Aspect.ajc_after_constructor_execution ()V | |||
| RETURN | |||
| RETURN | |||
constructor-execution(void FancyHelloWorld.<init>()) | |||
end public void <init>() | |||
@@ -101,7 +100,6 @@ public abstract class FancyHelloWorld extends java.lang.Object: | |||
| ATHROW | |||
| L7: INVOKESTATIC Aspect.ajc_after_method_execution ()V | |||
| RETURN | |||
| RETURN | |||
method-execution(void FancyHelloWorld.main(java.lang.String[])) | |||
end public static void main(String[]) | |||
@@ -12,7 +12,6 @@ public class HelloWorld extends java.lang.Object: | |||
| ATHROW | |||
| L0: INVOKESTATIC Aspect.ajc_after_constructor_execution ()V | |||
| RETURN | |||
| RETURN | |||
constructor-execution(void HelloWorld.<init>()) | |||
end public void <init>() | |||
@@ -54,7 +53,6 @@ public class HelloWorld extends java.lang.Object: | |||
| ATHROW | |||
| L2: INVOKESTATIC Aspect.ajc_after_method_execution ()V | |||
| RETURN | |||
| RETURN | |||
method-execution(void HelloWorld.main(java.lang.String[])) | |||
end public static void main(String[]) | |||
@@ -6,7 +6,6 @@ public abstract class FancyHelloWorld extends java.lang.Object: | |||
| NOP | |||
| INVOKESTATIC Aspect.ajc_afterReturning_constructor_execution ()V | |||
| RETURN | |||
| RETURN | |||
constructor-execution(void FancyHelloWorld.<init>()) | |||
end public void <init>() | |||
@@ -57,7 +56,6 @@ public abstract class FancyHelloWorld extends java.lang.Object: | |||
| L2: NOP (line 17) | |||
| INVOKESTATIC Aspect.ajc_afterReturning_method_execution ()V | |||
| RETURN | |||
| RETURN | |||
method-execution(void FancyHelloWorld.main(java.lang.String[])) | |||
end public static void main(String[]) | |||
@@ -6,7 +6,6 @@ public class HelloWorld extends java.lang.Object: | |||
| NOP | |||
| INVOKESTATIC Aspect.ajc_afterReturning_constructor_execution ()V | |||
| RETURN | |||
| RETURN | |||
constructor-execution(void HelloWorld.<init>()) | |||
end public void <init>() | |||
@@ -26,7 +25,6 @@ public class HelloWorld extends java.lang.Object: | |||
| NOP (line 11) | |||
| INVOKESTATIC Aspect.ajc_afterReturning_method_execution ()V | |||
| RETURN | |||
| RETURN | |||
method-execution(void HelloWorld.main(java.lang.String[])) | |||
end public static void main(String[]) | |||
@@ -62,7 +62,6 @@ public abstract class FancyHelloWorld extends java.lang.Object: | |||
| ALOAD 8 | |||
| INVOKESTATIC Aspect.ajc_afterReturning_method_execution (Ljava/lang/Object;)V | |||
| RETURN | |||
| RETURN | |||
method-execution(void FancyHelloWorld.main(java.lang.String[])) | |||
end public static void main(String[]) | |||
@@ -25,7 +25,6 @@ public class HelloWorld extends java.lang.Object: | |||
| ALOAD_2 | |||
| INVOKESTATIC Aspect.ajc_afterReturning_method_execution (Ljava/lang/Object;)V | |||
| RETURN | |||
| RETURN | |||
method-execution(void HelloWorld.main(java.lang.String[])) | |||
end public static void main(String[]) | |||
@@ -45,7 +45,6 @@ public class HelloWorld extends java.lang.Object: | |||
| L1: ALOAD_3 | |||
| INVOKESTATIC Aspect.ajc_afterReturning_method_execution (Ljava/lang/Object;)V | |||
| RETURN | |||
| RETURN | |||
method-execution(void HelloWorld.main(java.lang.String[])) | |||
end public static void main(String[]) | |||
@@ -53,7 +53,6 @@ public abstract class FancyHelloWorld extends java.lang.Object: | |||
| L4: GETSTATIC Aspect.ajc$perCflowStack Lorg/aspectj/runtime/internal/CFlowStack; | |||
| INVOKEVIRTUAL org.aspectj.runtime.internal.CFlowStack.pop ()V | |||
| RETURN | |||
| RETURN | |||
method-execution(void FancyHelloWorld.main(java.lang.String[])) | |||
end public static void main(String[]) | |||
@@ -30,7 +30,6 @@ public class HelloWorld extends java.lang.Object: | |||
| L1: GETSTATIC Aspect.ajc$perCflowStack Lorg/aspectj/runtime/internal/CFlowStack; | |||
| INVOKEVIRTUAL org.aspectj.runtime.internal.CFlowStack.pop ()V | |||
| RETURN | |||
| RETURN | |||
method-execution(void HelloWorld.main(java.lang.String[])) | |||
end public static void main(String[]) | |||