From a57d6662412d1bd4667cbe3a5b8671e11d017a28 Mon Sep 17 00:00:00 2001 From: Luke Date: Sun, 31 Aug 2025 17:02:21 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=94=B9=E8=BF=9B=20CALL=20=E6=8C=87?= =?UTF-8?q?=E4=BB=A4=E7=9A=84=E7=9B=AE=E6=A0=87=E5=87=BD=E6=95=B0=E5=8C=B9?= =?UTF-8?q?=E9=85=8D=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 增加简名匹配支持,适用于 IR 中生成的 CALL 指令 -保留原有的全名匹配逻辑 - 优化了 patchCallFixes 方法,提高了匹配效率 --- .../backend/builder/VMProgramBuilder.java | 24 +++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/jcnc/snow/compiler/backend/builder/VMProgramBuilder.java b/src/main/java/org/jcnc/snow/compiler/backend/builder/VMProgramBuilder.java index fab891c..4f5914b 100644 --- a/src/main/java/org/jcnc/snow/compiler/backend/builder/VMProgramBuilder.java +++ b/src/main/java/org/jcnc/snow/compiler/backend/builder/VMProgramBuilder.java @@ -66,6 +66,10 @@ public final class VMProgramBuilder { return slotType.getOrDefault(slot, 'I'); } + /* ========================================================== + 函数/标签管理 + ========================================================== */ + /** * 标记一个函数或标签的起始位置。 *

@@ -162,14 +166,26 @@ public final class VMProgramBuilder { /** * 修补所有等待目标函数 name 的 CALL 指令。 *

- * 只支持全名精确修补,不做模糊查找或短名回退。 - * - * @param name 目标函数全名 + * 支持两种匹配: + *

+ * 这样 IR 里生成 CALL getCity 也能绑定到 Address.getCity。 */ private void patchCallFixes(String name) { + // 当前函数的简名(去掉前缀) + String simpleName = name.contains(".") + ? name.substring(name.lastIndexOf('.') + 1) + : name; + for (Iterator it = callFixes.iterator(); it.hasNext();) { CallFix f = it.next(); - if (f.target.equals(name)) { + + boolean qualifiedMatch = f.target.equals(name); + boolean simpleMatch = !f.target.contains(".") && f.target.equals(simpleName); + + if (qualifiedMatch || simpleMatch) { code.set(f.index, VMOpCode.CALL + " " + addr.get(name) + " " + f.nArgs); it.remove(); }