From b017f384cee4c4444d1019776d029f3a0695559f Mon Sep 17 00:00:00 2001 From: Luke Date: Mon, 1 Sep 2025 17:21:06 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=20syscalls=20?= =?UTF-8?q?=E5=8F=82=E6=95=B0=E7=B1=BB=E5=9E=8B=E5=8A=A0=E8=BD=BD=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 改进参数类型加载逻辑,确保在默认类型非整型时正确处理 - 优化数组读取和写入内置函数的代码结构,提高可读性 - 调整 generateSyscall 方法注释,统一代码风格 --- .../backend/generator/CallGenerator.java | 80 ++++++++++++++----- 1 file changed, 62 insertions(+), 18 deletions(-) diff --git a/src/main/java/org/jcnc/snow/compiler/backend/generator/CallGenerator.java b/src/main/java/org/jcnc/snow/compiler/backend/generator/CallGenerator.java index bd49f24..fbeb2d9 100644 --- a/src/main/java/org/jcnc/snow/compiler/backend/generator/CallGenerator.java +++ b/src/main/java/org/jcnc/snow/compiler/backend/generator/CallGenerator.java @@ -101,20 +101,62 @@ public class CallGenerator implements InstructionGenerator { // 处理数组读取和写入的内置函数 switch (fn) { - case "__index_b" -> { generateIndexInstruction(ins, out, slotMap, 'B'); return; } - case "__index_s" -> { generateIndexInstruction(ins, out, slotMap, 'S'); return; } - case "__index_i" -> { generateIndexInstruction(ins, out, slotMap, 'I'); return; } - case "__index_l" -> { generateIndexInstruction(ins, out, slotMap, 'L'); return; } - case "__index_f" -> { generateIndexInstruction(ins, out, slotMap, 'F'); return; } - case "__index_d" -> { generateIndexInstruction(ins, out, slotMap, 'D'); return; } - case "__index_r" -> { generateIndexInstruction(ins, out, slotMap, 'R'); return; } - case "__setindex_b" -> { generateSetIndexInstruction(ins, out, slotMap, 'B'); return; } - case "__setindex_s" -> { generateSetIndexInstruction(ins, out, slotMap, 'S'); return; } - case "__setindex_i" -> { generateSetIndexInstruction(ins, out, slotMap, 'I'); return; } - case "__setindex_l" -> { generateSetIndexInstruction(ins, out, slotMap, 'L'); return; } - case "__setindex_f" -> { generateSetIndexInstruction(ins, out, slotMap, 'F'); return; } - case "__setindex_d" -> { generateSetIndexInstruction(ins, out, slotMap, 'D'); return; } - case "__setindex_r" -> { generateSetIndexInstruction(ins, out, slotMap, 'R'); return; } + case "__index_b" -> { + generateIndexInstruction(ins, out, slotMap, 'B'); + return; + } + case "__index_s" -> { + generateIndexInstruction(ins, out, slotMap, 'S'); + return; + } + case "__index_i" -> { + generateIndexInstruction(ins, out, slotMap, 'I'); + return; + } + case "__index_l" -> { + generateIndexInstruction(ins, out, slotMap, 'L'); + return; + } + case "__index_f" -> { + generateIndexInstruction(ins, out, slotMap, 'F'); + return; + } + case "__index_d" -> { + generateIndexInstruction(ins, out, slotMap, 'D'); + return; + } + case "__index_r" -> { + generateIndexInstruction(ins, out, slotMap, 'R'); + return; + } + case "__setindex_b" -> { + generateSetIndexInstruction(ins, out, slotMap, 'B'); + return; + } + case "__setindex_s" -> { + generateSetIndexInstruction(ins, out, slotMap, 'S'); + return; + } + case "__setindex_i" -> { + generateSetIndexInstruction(ins, out, slotMap, 'I'); + return; + } + case "__setindex_l" -> { + generateSetIndexInstruction(ins, out, slotMap, 'L'); + return; + } + case "__setindex_f" -> { + generateSetIndexInstruction(ins, out, slotMap, 'F'); + return; + } + case "__setindex_d" -> { + generateSetIndexInstruction(ins, out, slotMap, 'D'); + return; + } + case "__setindex_r" -> { + generateSetIndexInstruction(ins, out, slotMap, 'R'); + return; + } } // 默认:普通函数调用 @@ -190,10 +232,10 @@ public class CallGenerator implements InstructionGenerator { * 首个参数为子命令,支持常量或寄存器引用;其余参数均以引用形式加载。 * 若存在返回寄存器,则将结果存为整数类型。 * - * @param ins syscall 对应的 IR 调用指令 - * @param out VM 指令构建器 + * @param ins syscall 对应的 IR 调用指令 + * @param out VM 指令构建器 * @param slotMap 寄存器到槽位的映射 - * @param fn 函数名("syscall" 或以 ".syscall" 结尾) + * @param fn 函数名("syscall" 或以 ".syscall" 结尾) */ private void generateSyscall(CallInstruction ins, VMProgramBuilder out, @@ -306,7 +348,9 @@ public class CallGenerator implements InstructionGenerator { throw new IllegalStateException("[CallGenerator] 未找到参数槽位"); } char t = out.getSlotType(slot); - if (t == '\0') t = defaultType; + if (t == '\0' || (t == 'I' && defaultType != 'I')) { + t = defaultType; + } out.emit(OpHelper.opcode(t + "_LOAD") + " " + slot); }