feat: 改进 CALL 指令的目标函数匹配逻辑

- 增加简名匹配支持,适用于 IR 中生成的 CALL 指令
-保留原有的全名匹配逻辑
- 优化了 patchCallFixes 方法,提高了匹配效率
This commit is contained in:
Luke 2025-08-31 17:02:21 +08:00
parent 416f3fdeb1
commit a57d666241

View File

@ -66,6 +66,10 @@ public final class VMProgramBuilder {
return slotType.getOrDefault(slot, 'I'); return slotType.getOrDefault(slot, 'I');
} }
/* ==========================================================
函数/标签管理
========================================================== */
/** /**
* 标记一个函数或标签的起始位置 * 标记一个函数或标签的起始位置
* <p> * <p>
@ -162,14 +166,26 @@ public final class VMProgramBuilder {
/** /**
* 修补所有等待目标函数 name CALL 指令 * 修补所有等待目标函数 name CALL 指令
* <p> * <p>
* 只支持全名精确修补不做模糊查找或短名回退 * 支持两种匹配
* * <ul>
* @param name 目标函数全名 * <li>全名匹配f.target == name</li>
* <li>简名匹配f.target 不含 '.'且等于 name 的最后一段</li>
* </ul>
* 这样 IR 里生成 CALL getCity 也能绑定到 Address.getCity
*/ */
private void patchCallFixes(String name) { private void patchCallFixes(String name) {
// 当前函数的简名去掉前缀
String simpleName = name.contains(".")
? name.substring(name.lastIndexOf('.') + 1)
: name;
for (Iterator<CallFix> it = callFixes.iterator(); it.hasNext();) { for (Iterator<CallFix> it = callFixes.iterator(); it.hasNext();) {
CallFix f = it.next(); 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); code.set(f.index, VMOpCode.CALL + " " + addr.get(name) + " " + f.nArgs);
it.remove(); it.remove();
} }