feat: 改进 CALL 指令的目标函数匹配逻辑
- 增加简名匹配支持,适用于 IR 中生成的 CALL 指令 -保留原有的全名匹配逻辑 - 优化了 patchCallFixes 方法,提高了匹配效率
This commit is contained in:
parent
416f3fdeb1
commit
a57d666241
@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user