feat: 支持跨模块全局常量查找

- 新增 externalConsts 字典用于存放跨模块导入的全局常量
- 修改 getConstValue 方法以支持查找外部常量
- 添加 importExternalConst 方法用于导入外部常量
This commit is contained in:
Luke 2025-08-26 11:37:05 +08:00
parent 1e2b0e4e0d
commit cc66eee75f

View File

@ -15,30 +15,25 @@ import java.util.Map;
* <li>支持变量与虚拟寄存器的重新绑定与查找</li>
* <li>支持变量的类型信息记录与查询</li>
* <li>支持变量的编译期常量值记录与查询便于常量折叠等优化</li>
* <li>支持跨模块全局常量 ModuleA.a查找</li>
* </ul>
*/
final class IRBuilderScope {
/**
* 变量名到虚拟寄存器的映射表
* 用于跟踪所有声明和分配的变量
*/
/** 变量名到虚拟寄存器的映射表(本地变量) */
private final Map<String, IRVirtualRegister> vars = new HashMap<>();
/** 变量名到类型字符串的映射表 */
private final Map<String, String> varTypes = new HashMap<>();
/** 变量名到编译期常量值的映射表(本作用域) */
private final Map<String, Object> varConstValues = new HashMap<>();
/**
* 变量名到类型字符串的映射表
* 用于类型分析与推断
*/
private final Map<String, String> varTypes = new HashMap<>();
/**
* 变量名到编译期常量值的映射表
* 用于常量折叠优化 intstring数组等常量
*/
private final Map<String, Object> varConstValues = new HashMap<>();
/**
* 当前作用域所绑定的 IRFunction 实例
* 用于申请新的虚拟寄存器
* 额外存放跨模块导入的全局常量
* key 形如 "ModuleA.a" value 为其常量值
*/
private final Map<String, Object> externalConsts = new HashMap<>();
/** 当前作用域所绑定的 IRFunction 实例 */
private IRFunction fn;
/**
@ -118,7 +113,7 @@ final class IRBuilderScope {
// ---------------- 编译期常量相关接口 ----------------
/**
* 设置变量的编译期常量值
* 设置变量的编译期常量值本地变量
*
* @param name 变量名称
* @param value 常量值null 表示清除
@ -129,21 +124,38 @@ final class IRBuilderScope {
}
/**
* 获取变量的编译期常量值如没有则返回 null
* 获取变量的编译期常量值本地变量或导入的外部常量
* <br>
* 优先查找本地常量未命中再查外部 "ModuleA.a"
*
* @param name 变量名称
* @param name 变量名称"模块名.常量名"
* @return 编译期常量值 null
*/
Object getConstValue(String name) {
return varConstValues.get(name);
Object v = varConstValues.get(name);
if (v != null) return v;
// 支持跨模块常量/全局变量
return externalConsts.get(name);
}
/**
* 清除变量的编译期常量值绑定
* 清除变量的编译期常量值绑定本地
*
* @param name 变量名称
*/
void clearConstValue(String name) {
varConstValues.remove(name);
}
// ---------------- 跨模块常量导入支持 ----------------
/**
* 导入外部其他模块的全局常量/变量
*
* @param qualifiedName 形如 "ModuleA.a"
* @param value 其常量值
*/
void importExternalConst(String qualifiedName, Object value) {
externalConsts.put(qualifiedName, value);
}
}