From 2150e97131052e6da62e1cfc7a9b9ecaef1545e8 Mon Sep 17 00:00:00 2001 From: wangxiang Date: Fri, 5 Jul 2024 10:05:39 +0800 Subject: [PATCH] =?UTF-8?q?fix=EF=BC=9A=E6=96=B9=E6=B3=95=E8=B0=83?= =?UTF-8?q?=E7=94=A8=E4=BC=A0=E5=8F=82=E6=97=A0=E6=95=88=20=E7=BC=96?= =?UTF-8?q?=E8=AF=91=E5=99=A8=E5=B0=86=E7=BC=96=E8=AF=91=E5=90=8E=EF=BC=8C?= =?UTF-8?q?class=E6=96=87=E4=BB=B6=E4=B8=8D=E5=AD=98=E5=9C=A8=20LocalVaria?= =?UTF-8?q?bleTable=E3=80=82=20=E4=BB=8E=E8=80=8C=E5=AF=BC=E8=87=B4?= =?UTF-8?q?=E8=B0=83=E7=94=A8=E4=BC=A0=E5=8F=82=E6=AD=A5=E9=AA=A4=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../haidnor/jvm/core/JavaExecutionEngine.java | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/src/main/java/haidnor/jvm/core/JavaExecutionEngine.java b/src/main/java/haidnor/jvm/core/JavaExecutionEngine.java index f34f032..a0c76f0 100644 --- a/src/main/java/haidnor/jvm/core/JavaExecutionEngine.java +++ b/src/main/java/haidnor/jvm/core/JavaExecutionEngine.java @@ -32,8 +32,8 @@ public class JavaExecutionEngine { /** * 执行普通方法 * - * @param lastFrame 方法调用者的栈帧 - * @param method 方法元信息 + * @param lastFrame 方法调用者的栈帧 + * @param method 方法元信息 */ public static void callMethod(Frame lastFrame, JavaMethod method) { JVMThread thread = JVMThreadHolder.get(); @@ -47,19 +47,14 @@ public class JavaExecutionEngine { int argumentSlotSize = argumentTypes.length; if (!method.isStatic()) { + // 非静态方法 argumentSlotSize++ 的原因是第一个 slot 需要存放对象本身的引用 argumentSlotSize++; } // 方法调用传参 (原理: 将顶部栈帧的操作数栈中的数据弹出, 存入新栈帧的局部变量表中) - LocalVariableTable localVariableTable = method.getLocalVariableTable(); - if (localVariableTable != null) { - for (int i = argumentSlotSize - 1; i >= 0; i--) { - LocalVariable[] localVariableArr = localVariableTable.getLocalVariableTable(); - LocalVariable localVariable = localVariableArr[i]; - int slotIndex = localVariable.getIndex(); - StackValue stackValue = lastFrame.pop(); - newFrame.slotSet(slotIndex, stackValue); - } + for (int i = argumentSlotSize - 1; i >= 0; i--) { + StackValue stackValue = lastFrame.pop(); + newFrame.slotSet(i, stackValue); } }