Computing stack depth depending on the actual number of parameters of methods being called
This commit is contained in:
+18
-4
@@ -271,9 +271,22 @@ public class InterceptionInstrumenter {
|
|||||||
|
|
||||||
final List<MethodData> exitData = new ArrayList<MethodData>();
|
final List<MethodData> exitData = new ArrayList<MethodData>();
|
||||||
final List<MethodData> enterData = new ArrayList<MethodData>();
|
final List<MethodData> enterData = new ArrayList<MethodData>();
|
||||||
|
|
||||||
|
int maxParamCount = 0;
|
||||||
for (MethodInstrumenter instrumenter : applicableInstrumenters) {
|
for (MethodInstrumenter instrumenter : applicableInstrumenters) {
|
||||||
enterData.addAll(instrumenter.getEnterData());
|
for (MethodData methodData : instrumenter.getEnterData()) {
|
||||||
exitData.addAll(instrumenter.getExitData());
|
if (maxParamCount < methodData.getParameterCount()) {
|
||||||
|
maxParamCount = methodData.getParameterCount();
|
||||||
|
}
|
||||||
|
enterData.add(methodData);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (MethodData methodData : instrumenter.getExitData()) {
|
||||||
|
if (maxParamCount < methodData.getParameterCount()) {
|
||||||
|
maxParamCount = methodData.getParameterCount();
|
||||||
|
}
|
||||||
|
exitData.add(methodData);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (enterData.isEmpty() && exitData.isEmpty()) return mv;
|
if (enterData.isEmpty() && exitData.isEmpty()) return mv;
|
||||||
@@ -282,6 +295,7 @@ public class InterceptionInstrumenter {
|
|||||||
mv = getDumpingVisitorWrapper(mv, name, desc);
|
mv = getDumpingVisitorWrapper(mv, name, desc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
final int finalMaxParamCount = maxParamCount;
|
||||||
return new MethodVisitorWithUniversalHandler(ASM4, mv) {
|
return new MethodVisitorWithUniversalHandler(ASM4, mv) {
|
||||||
|
|
||||||
private InstructionAdapter ia = null;
|
private InstructionAdapter ia = null;
|
||||||
@@ -296,8 +310,8 @@ public class InterceptionInstrumenter {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visitMaxs(int maxStack, int maxLocals) {
|
public void visitMaxs(int maxStack, int maxLocals) {
|
||||||
int sizes = Type.getArgumentsAndReturnSizes(desc);
|
int maxInstrumentedStack = finalMaxParamCount + 2; // +1 for receiver +1 for returned value on the stack
|
||||||
super.visitMaxs(Math.max(maxStack, sizes + 1), maxLocals);
|
super.visitMaxs(Math.max(maxStack, maxInstrumentedStack), maxLocals);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
Reference in New Issue
Block a user