From 2cdc0275b7c7d66a942708e22c07fdbd0246203a Mon Sep 17 00:00:00 2001 From: shifujun Date: Mon, 11 Dec 2023 17:52:52 +0800 Subject: Fix insertAuxInitializer may cause inconsistent stack height problem Usually, constructor only load super class's constructor's init params into stack. After this() or super() called, stack will be empty. If so, we insertAuxInitializer right after this() or super() can reuse max stack size if it enough. But, there is some weird class out there, their constructors load all in-constructor init field value into stack before this() or super() call. In this case, after this() or super() call, stack is not empty, even maybe full. In summary, insertAuxInitializer should increase MaxStack anyway. --- src/main/javassist/CtClassType.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/javassist/CtClassType.java b/src/main/javassist/CtClassType.java index 22b873a6..f4345e0a 100644 --- a/src/main/javassist/CtClassType.java +++ b/src/main/javassist/CtClassType.java @@ -1763,8 +1763,7 @@ class CtClassType extends CtClass { int pos = it.insertEx(initializer.get()); it.insert(initializer.getExceptionTable(), pos); int maxstack = codeAttr.getMaxStack(); - if (maxstack < stacksize) - codeAttr.setMaxStack(stacksize); + codeAttr.setMaxStack(maxstack + stacksize); } private int makeFieldInitializer(Bytecode code, CtClass[] parameters) -- cgit v1.2.3