From cae2a5e96f714031eab4aca301df4c3d0faa09ce Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Sun, 12 May 2013 15:03:58 +0200 Subject: [PATCH] Computing stack depth depending on the actual number of parameters of methods being called --- .../InterceptionInstrumenter.java | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/compiler/preloader/instrumentation/src/org/jetbrains/jet/preloading/instrumentation/InterceptionInstrumenter.java b/compiler/preloader/instrumentation/src/org/jetbrains/jet/preloading/instrumentation/InterceptionInstrumenter.java index a539293fbe4..700f2db3046 100644 --- a/compiler/preloader/instrumentation/src/org/jetbrains/jet/preloading/instrumentation/InterceptionInstrumenter.java +++ b/compiler/preloader/instrumentation/src/org/jetbrains/jet/preloading/instrumentation/InterceptionInstrumenter.java @@ -271,9 +271,22 @@ public class InterceptionInstrumenter { final List exitData = new ArrayList(); final List enterData = new ArrayList(); + + int maxParamCount = 0; for (MethodInstrumenter instrumenter : applicableInstrumenters) { - enterData.addAll(instrumenter.getEnterData()); - exitData.addAll(instrumenter.getExitData()); + for (MethodData methodData : instrumenter.getEnterData()) { + 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; @@ -282,6 +295,7 @@ public class InterceptionInstrumenter { mv = getDumpingVisitorWrapper(mv, name, desc); } + final int finalMaxParamCount = maxParamCount; return new MethodVisitorWithUniversalHandler(ASM4, mv) { private InstructionAdapter ia = null; @@ -296,8 +310,8 @@ public class InterceptionInstrumenter { @Override public void visitMaxs(int maxStack, int maxLocals) { - int sizes = Type.getArgumentsAndReturnSizes(desc); - super.visitMaxs(Math.max(maxStack, sizes + 1), maxLocals); + int maxInstrumentedStack = finalMaxParamCount + 2; // +1 for receiver +1 for returned value on the stack + super.visitMaxs(Math.max(maxStack, maxInstrumentedStack), maxLocals); } @Override