错拼 rowptr 改为 rawptr

This commit is contained in:
TermiNexus committed 2026-09-16 11:42:28 +08:00
1 parent 7cba4cbc95
commit 9a191daa8d
70 files changed
+585 -585

No files matched your search

+1 -1
View File
@@ -678,7 +678,7 @@ def _PyiClass(buf: bytes, buf_size: sizet, pos: sizet,
# Args: mb 内存池(保留以符合调用约定,实际未使用);tree AST Module 根节点;rel_path 相对路径(用于模块名,当前未使用);buf 输出缓冲区;buf_size 缓冲区大小
# Returns: 写入的字节数(0 表示失败)
# ============================================================
def _GeneratePyiFromAst(mb: rowptr[memhub.MemBuddy], tree: ast.AST | t.CPtr,
def _GeneratePyiFromAst(mb: rawptr[memhub.MemBuddy], tree: ast.AST | t.CPtr,
rel_path: str, buf: bytes,
buf_size: sizet) -> sizet:
"""从 AST 生成 .vpi 存根文件内容到 buf"""
+32 -32
View File
@@ -699,7 +699,7 @@ def _lookup_vpi_param_annots(src_sha1: str, cls_name: str, method_name: str) ->
# 调用点 declare 停在调用点实参宽度(如 elem_size 字面量 i32 把定义侧 sizet(i64) 固化窄)。本函数按 {sha1}.{base}[T].{method} 形态定位模板条目,
# 把段内独立的类型形参 token 用特化实参(cls_name 的 [...] 内容)替换后再解析;未命中/多参模板(键段含空格被截断)返回 None,不做兜底推断。
# ============================================================
def _resolve_vpi_param_annot_seg_template(pool: rowptr[memhub.MemBuddy],
def _resolve_vpi_param_annot_seg_template(pool: rawptr[memhub.MemBuddy],
src_sha1: str,
cls_name: str,
method_name: str,
@@ -773,7 +773,7 @@ def _resolve_vpi_param_annot_seg_template(pool: rowptr[memhub.MemBuddy],
break
string.strncpy(seg_buf_t, annots_t + seg_start_t, seg_len_t)
seg_buf_t[seg_len_t] = '\0'
# 类型形参 token(如 T)→ 特化实参(如 str / rowptr[AST] / AST|t.CPtr):
# 类型形参 token(如 T)→ 特化实参(如 str / rawptr[AST] / AST|t.CPtr):
# 模板注解按源码原样缓存,不替换则 `item: T` 解析不出类型(None 跳过)
tparam_t: bytes = stdlib.malloc(tplen_t + 1)
if tparam_t is not None:
@@ -802,7 +802,7 @@ def _resolve_vpi_param_annot_seg_template(pool: rowptr[memhub.MemBuddy],
# vpi tree 参数列表被覆盖损坏时(param_count 偏小,尾部默认参数丢失),用 _cache_vpi_param_annots_text 的文本缓存补全:参数位置 p 对应缓存段 p(含首参空串占位)。
# 补全后 declare 参数数与 define 一致,调用点默认参数填充才能生效,避免被调函数读栈垃圾。
# ============================================================
def _repair_declare_params_from_text(pool: rowptr[memhub.MemBuddy],
def _repair_declare_params_from_text(pool: rawptr[memhub.MemBuddy],
func: llvmlite.Function | t.CPtr,
src_sha1: str,
cls_name: str,
@@ -860,7 +860,7 @@ def _repair_declare_params_from_text(pool: rowptr[memhub.MemBuddy],
# 参数类型错会导致调用侧 trunc 传参、callee 按 i64 读栈残留高位 → can=巨值读未写槽位崩溃(SlotsBugTest 根因)。
# 从 @-joined 注解串取第 seg_idx 段(0=self 空段),用 _resolve_vpi_ret_annot_str 解析;空段/未命中返回 None(走 AST 兜底)。
# ============================================================
def _resolve_vpi_param_annot_seg(pool: rowptr[memhub.MemBuddy],
def _resolve_vpi_param_annot_seg(pool: rawptr[memhub.MemBuddy],
src_sha1: str,
cls_name: str,
method_name: str,
@@ -966,7 +966,7 @@ def _ensure_vpi_ret_annot_loaded(src_sha1: str, temp_dir: str) -> int:
vpi_path[td_len + 3] = '/'
string.strcpy(vpi_path + td_len + 4, src_sha1)
string.strcpy(vpi_path + td_len + 4 + sha1_len, ".vpi")
f: rowptr[fileio.File] = fileio.File(vpi_path, fileio.MODE.R)
f: rawptr[fileio.File] = fileio.File(vpi_path, fileio.MODE.R)
if f.closed:
stdlib.free(vpi_path)
return 0
@@ -1025,7 +1025,7 @@ def _ensure_vpi_param_annot_loaded(src_sha1: str, temp_dir: str) -> int:
vpi_path[td_len + 3] = '/'
string.strcpy(vpi_path + td_len + 4, src_sha1)
string.strcpy(vpi_path + td_len + 4 + sha1_len, ".vpi")
f: rowptr[fileio.File] = fileio.File(vpi_path, fileio.MODE.R)
f: rawptr[fileio.File] = fileio.File(vpi_path, fileio.MODE.R)
if f.closed:
stdlib.free(vpi_path)
return 0
@@ -1205,7 +1205,7 @@ def _lookup_vpi_ret_annot(src_sha1: str, cls_name: str, method_name: str) -> str
#
# 纯字符串解析,不构造 AST 节点。
# ============================================================
def _resolve_single_vpi_type_str(pool: rowptr[memhub.MemBuddy],
def _resolve_single_vpi_type_str(pool: rawptr[memhub.MemBuddy],
seg: str) -> llvmlite.LLVMType | t.CPtr:
"""解析单个类型段为 LLVMType,无法识别返回 None"""
if seg is None or pool is None:
@@ -1246,13 +1246,13 @@ def _resolve_single_vpi_type_str(pool: rowptr[memhub.MemBuddy],
# None 与 void 同义,归一到 Void。
if string.strcmp(seg, "None") == 0:
return llvmlite.Void(pool)
# rowptr[T] 内建裸指针(等价 t.CPtr[T] → Ptr(T)):vpi 返回/参数注解按源码
# 原样保留 Subscript 形态(如 tokens.vp `new_token -> rowptr[Token]`)。
# rawptr[T] 内建裸指针(等价 t.CPtr[T] → Ptr(T)):vpi 返回/参数注解按源码
# 原样保留 Subscript 形态(如 tokens.vp `new_token -> rawptr[Token]`)。
# 此前无此分支 → 整个注解解析返回 None → text.ll 尚未生成(合法时序:依赖
# 模块尚未翻译,占位 text.ll 为空)时跨模块调用 fail-fast 误报
# (includes/ast/lexer.vp new_token 根因)。与定义侧 TypeGenResolve
# resolve_annotation_type 的 rowptr 分支同口径:Ptr(resolve(T))。
if string.strncmp(seg, "rowptr[", 7) == 0:
# resolve_annotation_type 的 rawptr 分支同口径:Ptr(resolve(T))。
if string.strncmp(seg, "rawptr[", 7) == 0:
seg_len_rp: sizet = string.strlen(seg)
if seg_len_rp > 8 and seg[seg_len_rp - 1] == ']':
inner_len_rp: sizet = seg_len_rp - 8
@@ -1337,9 +1337,9 @@ def _resolve_single_vpi_type_str(pool: rowptr[memhub.MemBuddy],
#
# 纯字符串解析,避免 _parse_type_string 跨模块构造 ast.Name/ast.BinOp 时节点 kind() 异常(可能退化为裸函数调用)导致 resolve 得到垃圾类型(如 Ptr(i8))。
#
# 支持: "str"/"bytes" → i8*; "int" → i32; "bool" → i1; "char" 等 → map_t_type 映射; "X | t.CPtr" → Ptr(Struct X); "t.CPtr" → i8*; "rowptr[memhub.MemBuddy]" → Ptr(Struct MemBuddy)。
# 支持: "str"/"bytes" → i8*; "int" → i32; "bool" → i1; "char" 等 → map_t_type 映射; "X | t.CPtr" → Ptr(Struct X); "t.CPtr" → i8*; "rawptr[memhub.MemBuddy]" → Ptr(Struct MemBuddy)。
# ============================================================
def _resolve_vpi_ret_annot_str(pool: rowptr[memhub.MemBuddy],
def _resolve_vpi_ret_annot_str(pool: rawptr[memhub.MemBuddy],
ret_annot: str,
i32_ty: llvmlite.LLVMType | t.CPtr,
i8_ptr_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.LLVMType | t.CPtr:
@@ -1596,7 +1596,7 @@ def _extract_sha1_from_path(vpi_path: str) -> str:
# 与 HandlesImports.add_imported_module 逻辑一致,但内联在本模块,
# 避免 VpiReader → HandlesImports → StubMerger → VpiReader 循环依赖。
# ============================================================
def _stub_add_imported(pool: rowptr[memhub.MemBuddy],
def _stub_add_imported(pool: rawptr[memhub.MemBuddy],
cur: str, name: str) -> str:
"""追加模块名到空格分隔列表(pool 分配),返回新列表"""
if name is None:
@@ -1620,7 +1620,7 @@ def _stub_add_imported(pool: rowptr[memhub.MemBuddy],
# ============================================================
# _stub_add_from - 追加 from-import 映射("local:mod[:orig]" 空格分隔)
# ============================================================
def _stub_add_from(pool: rowptr[memhub.MemBuddy],
def _stub_add_from(pool: rawptr[memhub.MemBuddy],
cur: str, local: str, mod: str, orig: str) -> str:
"""追加 from-import 映射(pool 分配),返回新列表
@@ -1716,7 +1716,7 @@ def _vpi_typedef_visited_mark(sha1: str) -> None:
_g_vpi_typedef_visited_count += 1
def _vpi_register_typedef_closure(pool: rowptr[memhub.MemBuddy],
def _vpi_register_typedef_closure(pool: rawptr[memhub.MemBuddy],
import_mods: str,
temp_dir: str,
depth: int) -> int:
@@ -1771,7 +1771,7 @@ def _vpi_register_typedef_closure(pool: rowptr[memhub.MemBuddy],
vpi_path_r[td_len + 3] = '/'
string.strcpy(vpi_path_r + td_len + 4, sha1_r)
string.strcpy(vpi_path_r + td_len + 4 + 16, ".vpi")
f_r: rowptr[fileio.File] = fileio.File(vpi_path_r, fileio.MODE.R)
f_r: rawptr[fileio.File] = fileio.File(vpi_path_r, fileio.MODE.R)
if f_r.closed:
stdlib.free(vpi_path_r)
continue
@@ -1899,7 +1899,7 @@ def _vpi_register_typedef_closure(pool: rowptr[memhub.MemBuddy],
# Args: pool 内存池;mod 当前 LLVM 模块;vpi_path .vpi 文件路径;trans 翻译器对象
# Returns: 1=成功,0=失败
# ============================================================
def ParseVpiIntoModule(pool: rowptr[memhub.MemBuddy],
def ParseVpiIntoModule(pool: rawptr[memhub.MemBuddy],
mod: llvmlite.LLVMModule | t.CPtr,
vpi_path: str,
trans: HT.Translator | t.CPtr) -> int:
@@ -1918,7 +1918,7 @@ def ParseVpiIntoModule(pool: rowptr[memhub.MemBuddy],
return ret
def _ParseVpiIntoModuleImpl(pool: rowptr[memhub.MemBuddy],
def _ParseVpiIntoModuleImpl(pool: rawptr[memhub.MemBuddy],
mod: llvmlite.LLVMModule | t.CPtr,
vpi_path: str,
trans: HT.Translator | t.CPtr) -> int:
@@ -1927,7 +1927,7 @@ def _ParseVpiIntoModuleImpl(pool: rowptr[memhub.MemBuddy],
return 0
# 1. 读取 .vpi 文件
f: rowptr[fileio.File] = fileio.File(vpi_path, fileio.MODE.R)
f: rawptr[fileio.File] = fileio.File(vpi_path, fileio.MODE.R)
if f.closed:
return 0
vpi_buf: bytes = stdlib.malloc(VPI_READ_BUF_SIZE)
@@ -2004,7 +2004,7 @@ def _ParseVpiIntoModuleImpl(pool: rowptr[memhub.MemBuddy],
elif sk == ast.ASTKind.ImportFrom:
sifr: ast.ImportFrom | t.CPtr = (ast.ImportFrom | t.CPtr)(schild)
sifr_mod: str = sifr.module
# 相对导入补包前缀:vpi 里 `from .base import X` 只存 module="base"(前导点记在 level),若按字面 "base" 精确查找则查不到 "ast.base" ⇒ 裸类名(AST 等)解析失败 ⇒ rowptr[AST] 等注解 fail-fast。
# 相对导入补包前缀:vpi 里 `from .base import X` 只存 module="base"(前导点记在 level),若按字面 "base" 精确查找则查不到 "ast.base" ⇒ 裸类名(AST 等)解析失败 ⇒ rawptr[AST] 等注解 fail-fast。
# 故按 stub 自身相对路径还原包名(ast/parser.vp → "ast"),level==1 时拼成完整模块名 "ast.base" 再登记(level>1 保持原样,避免未确认路径形态时做过深上溯)。
sifr_mod_q: str = sifr_mod
if sifr_mod is not None and sifr_mod[0] != '\0' and sifr.level == 1:
@@ -2059,7 +2059,7 @@ def _ParseVpiIntoModuleImpl(pool: rowptr[memhub.MemBuddy],
# [D26 fail-fast] 包 __init__ 的 from-import 解析不出子模块 sha1 时
# **不再静默跳过**:跳过会让该子模块的类一个都注册不上 → 包 stub 里
# 引用这些类的注解在后续解析时落空 → 报错点远离真因(实测:报错指向
# ast/__init__.vpi 的 `parse_expression -> rowptr[Expression]`,而
# ast/__init__.vpi 的 `parse_expression -> rawptr[Expression]`,而
# Expression 定义在 ast.stmts,真因是子模块 sha1 查找/注入失败)。
# 此处直接给出包名与子模块名(含补前缀后的精确名)便于定位。
if is_pkg_init_rt != 0 and sub_sha1_rt is None \
@@ -2311,7 +2311,7 @@ def ResetVpiInjectVisited() -> None:
_vpi_inj_depth = 0
def _ensure_dep_vpi_injected(pool: rowptr[memhub.MemBuddy],
def _ensure_dep_vpi_injected(pool: rawptr[memhub.MemBuddy],
mod: llvmlite.LLVMModule | t.CPtr,
dep_sha1: str,
trans: HT.Translator | t.CPtr) -> int:
@@ -2351,7 +2351,7 @@ def _ensure_dep_vpi_injected(pool: rowptr[memhub.MemBuddy],
viperlib.snprintf(path_i, path_len_i, "%s/%s/%s.vpi", temp_dir, sub_i, dep_sha1)
else:
viperlib.snprintf(path_i, path_len_i, "%s/%s.vpi", temp_dir, dep_sha1)
vf_i: rowptr[fileio.File] = fileio.File(path_i, fileio.MODE.R)
vf_i: rawptr[fileio.File] = fileio.File(path_i, fileio.MODE.R)
if vf_i.closed:
stdlib.free(path_i)
return 0
@@ -2386,7 +2386,7 @@ def _ensure_dep_vpi_injected(pool: rowptr[memhub.MemBuddy],
#
# Args: src_name 子模块中的原类名;local_name 包命名空间中的名字(或 as 别名);sub_sha1 子模块(定义文件)sha1;pkg_sha1 当前包 __init__ 的 sha1;trans 翻译器对象(源 entry 缺失时按需注入子模块 vpi 需要)
# ============================================================
def _inject_reexport_class_declare(pool: rowptr[memhub.MemBuddy],
def _inject_reexport_class_declare(pool: rawptr[memhub.MemBuddy],
mod: llvmlite.LLVMModule | t.CPtr,
src_name: str,
local_name: str,
@@ -2514,7 +2514,7 @@ def _vpi_class_is_renum(class_cd: ast.ClassDef | t.CPtr) -> int:
# 2) 未注册 → 解析字段类型 → 创建命名 StructType("sha1.ClassName") → register_struct + add_visible_struct。
# 字段解析失败不 fatal(不注册该类,留给源模块编译注册,后续裸类名引用由调用侧 fail-fast 暴露)。
# ============================================================
def _inject_class_struct_declare(pool: rowptr[memhub.MemBuddy],
def _inject_class_struct_declare(pool: rawptr[memhub.MemBuddy],
mod: llvmlite.LLVMModule | t.CPtr,
class_cd: ast.ClassDef | t.CPtr,
cls_name: str,
@@ -2655,7 +2655,7 @@ def _inject_class_struct_declare(pool: rowptr[memhub.MemBuddy],
# 指针引用(Ptr(Struct))无需——_scan_type_for_cross_module_refs 的 Ptr 分支添加 opaque 即可。
# ============================================================
def _ensure_full_value_types(mod: llvmlite.LLVMModule | t.CPtr,
pool: rowptr[memhub.MemBuddy],
pool: rawptr[memhub.MemBuddy],
ty: llvmlite.LLVMType | t.CPtr) -> None:
"""递归为值 struct / 数组元素 struct 注册完整定义(递归深度守卫)"""
if mod is None or pool is None or ty is None:
@@ -2693,7 +2693,7 @@ def _ensure_full_value_types(mod: llvmlite.LLVMModule | t.CPtr,
# * TPV 内部函数/方法(存在 define 侧)→ Ptr(struct):与定义侧逐字一致,指针目标只需 opaque 声明(module_ensure_opaque_for_type)。
# ============================================================
def _AggregateParamTy(mod: llvmlite.LLVMModule | t.CPtr,
pool: rowptr[memhub.MemBuddy],
pool: rawptr[memhub.MemBuddy],
ty: llvmlite.LLVMType | t.CPtr,
is_c_abi: int) -> llvmlite.LLVMType | t.CPtr:
"""裸结构体形参类型(C ABI 按值 / 内部 Ptr(struct),见上方注释)"""
@@ -2723,7 +2723,7 @@ def _AggregateParamTy(mod: llvmlite.LLVMModule | t.CPtr,
# vpi 里模块级全局变量(如 tokens.vp 的 _op_head: OpEntry | t.CPtr = None)需在当前模块创建 external global 声明(短名 @name,COFF 按名链接),
# 否则跨模块 from-import 读取全局变量时 find_global_in_module 找不到 → 误杀「跨模块全局变量类型未知(stub 未注入)」。
# ============================================================
def _inject_global_variable_declare(pool: rowptr[memhub.MemBuddy],
def _inject_global_variable_declare(pool: rawptr[memhub.MemBuddy],
mod: llvmlite.LLVMModule | t.CPtr,
aa: ast.AnnAssign | t.CPtr,
trans: HT.Translator | t.CPtr,
@@ -2820,7 +2820,7 @@ def _inject_global_variable_declare(pool: rowptr[memhub.MemBuddy],
# 用 find_func_in_module 去重,创建 declare 并添加参数,
# 注册到函数表。
# ============================================================
def _inject_function_declare(pool: rowptr[memhub.MemBuddy],
def _inject_function_declare(pool: rawptr[memhub.MemBuddy],
mod: llvmlite.LLVMModule | t.CPtr,
fd: ast.FunctionDef | t.CPtr,
trans: HT.Translator | t.CPtr,
@@ -3040,7 +3040,7 @@ def _inject_function_declare(pool: rowptr[memhub.MemBuddy],
# 方法混淆名 {src_sha1}.{ClassName}.{method};参数类型从 vpi 注解解析(self 无注解时默认为 i8*)。
# 注入正确签名可避免调用时 _ensure_method_declare 用实参类型创建错误 declare(如 size: sizet 被写成 i32 而非 i64)。
# ============================================================
def _inject_method_declare(pool: rowptr[memhub.MemBuddy],
def _inject_method_declare(pool: rawptr[memhub.MemBuddy],
mod: llvmlite.LLVMModule | t.CPtr,
m_fd: ast.FunctionDef | t.CPtr,
cls_name: str,
@@ -3246,7 +3246,7 @@ def _inject_method_declare(pool: rowptr[memhub.MemBuddy],
# 提取 NAME: t.CTypedef = Type 中的名称和类型表达式字符串,
# 调用 register_ctypedef 注册到动态 CTypedef 表。
# ============================================================
def _register_ctypedef_from_annassign(pool: rowptr[memhub.MemBuddy],
def _register_ctypedef_from_annassign(pool: rawptr[memhub.MemBuddy],
aa: ast.AnnAssign | t.CPtr) -> None:
"""从 AnnAssign 节点提取并注册 CTypedef"""
if aa is None or pool is None:
+10 -10
View File
@@ -271,7 +271,7 @@ def _LoadAndAppendStub(temp_dir: str, td_len: sizet, dep_sha1: str,
dep_path: str = StubMergerCollect._sliced_path(temp_dir, td_len, dep_sha1, "stub.ll")
if dep_path is None:
return out_pos
df_ls: rowptr[fileio.File] = fileio.File(dep_path, fileio.MODE.R)
df_ls: rawptr[fileio.File] = fileio.File(dep_path, fileio.MODE.R)
if df_ls.closed:
stdlib.free(dep_path)
# 依赖 stub 缺失:includes 映射内的模块缺失属编译错误(fail-fast),
@@ -466,7 +466,7 @@ def _LoadAndAppendTextDeclares(temp_dir: str, td_len: sizet, dep_sha1: str,
text_path: str = StubMergerCollect._sliced_path(temp_dir, td_len, dep_sha1, "text.ll")
if text_path is None:
return out_pos
tf_lt: rowptr[fileio.File] = fileio.File(text_path, fileio.MODE.R)
tf_lt: rawptr[fileio.File] = fileio.File(text_path, fileio.MODE.R)
if tf_lt.closed:
stdlib.free(text_path)
# 依赖 text 缺失:includes 映射内的模块缺失属编译错误(fail-fast),
@@ -764,7 +764,7 @@ def _AppendDepsToWorklist(worklist: bytes, wl_len: sizet,
# Args: mb 内存池;source_dir App 源文件目录(Config.SourceDir);temp_dir 临时目录(deps.txt 所在位置);reachable_set 输出参数,可达 SHA1 集合缓冲区(MAX_INCLUDES_SHA1 * 17 字节);app_deps App 源文件直接依赖模块名(空格分隔),非空则跳过 App 扫描;includes_dirs includes 根目录(空格分隔)
# Returns: 可达 SHA1 数量(>0 成功;0 无 includes 依赖;<0 失败)
# ============================================================
def _BuildReachableSha1Set(mb: rowptr[memhub.MemBuddy], source_dir: str,
def _BuildReachableSha1Set(mb: rawptr[memhub.MemBuddy], source_dir: str,
temp_dir: str,
reachable_set: str,
app_deps: str = None,
@@ -1138,7 +1138,7 @@ def _BuildReachableSha1Set(mb: rowptr[memhub.MemBuddy], source_dir: str,
td_len_w: sizet = string.strlen(temp_dir)
deps_path_w: str = StubMergerCollect._sliced_path(temp_dir, td_len_w, sha1_r2, "deps.txt")
if deps_path_w is not None:
df_w: rowptr[fileio.File] = fileio.File(deps_path_w, fileio.MODE.W)
df_w: rawptr[fileio.File] = fileio.File(deps_path_w, fileio.MODE.W)
if not df_w.closed:
dl_w: sizet = string.strlen(deps_r2)
if dl_w > 0:
@@ -1369,7 +1369,7 @@ def BuildCombinedIR(temp_dir: str, local_sha1: str,
stub_path: str = StubMergerCollect._sliced_path(temp_dir, td_len, local_sha1, "stub.ll")
if stub_path is None:
return 0
sf: rowptr[fileio.File] = fileio.File(stub_path, fileio.MODE.R)
sf: rawptr[fileio.File] = fileio.File(stub_path, fileio.MODE.R)
if sf.closed:
stdlib.free(stub_path)
return 0
@@ -1434,7 +1434,7 @@ def BuildCombinedIR(temp_dir: str, local_sha1: str,
deps_loaded: int = 0
deps_path: str = StubMergerCollect._sliced_path(temp_dir, td_len, local_sha1, "deps.txt")
if deps_path is not None:
df_deps: rowptr[fileio.File] = fileio.File(deps_path, fileio.MODE.R)
df_deps: rawptr[fileio.File] = fileio.File(deps_path, fileio.MODE.R)
if not df_deps.closed:
deps_buf = stdlib.malloc(4096)
if deps_buf is not None:
@@ -1576,7 +1576,7 @@ def BuildCombinedIR(temp_dir: str, local_sha1: str,
# 检查 stub 文件是否存在
chk_path: str = StubMergerCollect._sliced_path(temp_dir, td_len, found_s, "stub.ll")
if chk_path is not None:
chk_f: rowptr[fileio.File] = fileio.File(chk_path, fileio.MODE.R)
chk_f: rawptr[fileio.File] = fileio.File(chk_path, fileio.MODE.R)
if chk_f.closed:
VLogger.error(f"依赖模块 '{mod_nm}' (sha1={found_s}) 的 stub 文件不存在: {chk_path},立即终止编译", "BuildCombinedIR")
chk_f.close()
@@ -1587,7 +1587,7 @@ def BuildCombinedIR(temp_dir: str, local_sha1: str,
text_path: str = StubMergerCollect._sliced_path(temp_dir, td_len, local_sha1, "text.ll")
if text_path is None:
return out_pos
tf: rowptr[fileio.File] = fileio.File(text_path, fileio.MODE.R)
tf: rawptr[fileio.File] = fileio.File(text_path, fileio.MODE.R)
if tf.closed:
# 本地 text.ll 缺失:合并 IR 无法生成定义块,fail-fast 终止
VLogger.error(f"本地 text.ll 缺失: {text_path}", "StubMerger")
@@ -1764,7 +1764,7 @@ def BuildCombinedIR(temp_dir: str, local_sha1: str,
# Args: pool 内存池;mod 当前 LLVM 模块;imported_modules 已导入模块名字符串(空格分隔);from_imports from-import 映射字符串("name:module name:module" 格式);temp_dir temp 目录路径;trans 翻译器对象
# Returns: 成功加载的 .vpi 文件数
# ============================================================
def LoadDepVpiIntoModule(pool: rowptr[memhub.MemBuddy],
def LoadDepVpiIntoModule(pool: rawptr[memhub.MemBuddy],
mod: llvmlite.LLVMModule | t.CPtr,
imported_modules: str,
from_imports: str,
@@ -1829,7 +1829,7 @@ def LoadDepVpiIntoModule(pool: rowptr[memhub.MemBuddy],
vpi_path: str = StubMergerCollect._sliced_path(temp_dir, td_len, sha1_val, "vpi")
if vpi_path is not None:
# 检查 .vpi 文件是否存在(可读)
vf: rowptr[fileio.File] = fileio.File(vpi_path, fileio.MODE.R)
vf: rawptr[fileio.File] = fileio.File(vpi_path, fileio.MODE.R)
if not vf.closed:
vf.close()
# 调用 VpiReader 解析 .vpi 并注入 declare
+6 -6
View File
@@ -96,7 +96,7 @@ def _collect_stub_sha1s(base_dir: str, bd_len: sizet, level: int,
if out_count >= max_count:
return out_count
find_data: rowptr[win32file.WIN32_FIND_DATAA] = stdlib.malloc(win32file.WIN32_FIND_DATAA.__sizeof__())
find_data: rawptr[win32file.WIN32_FIND_DATAA] = stdlib.malloc(win32file.WIN32_FIND_DATAA.__sizeof__())
if find_data is None:
return out_count
string.memset(find_data, 0, win32file.WIN32_FIND_DATAA.__sizeof__())
@@ -166,7 +166,7 @@ def _collect_stub_sha1s(base_dir: str, bd_len: sizet, level: int,
# 数据来源是 PopulateSha1MapStore 填充的全局存储器(不读取 _sha1_map.txt)。
# 用于过滤 stub 文件,避免加载 TransPyV 自身源文件(lib/*)的 stub 导致链接失败。
# ============================================================
def _load_includes_sha1_set(pool: rowptr[memhub.MemBuddy],
def _load_includes_sha1_set(pool: rawptr[memhub.MemBuddy],
temp_dir: str,
sha1_set: str) -> int:
"""从全局内存存储器将 includes 的 SHA1 写入 sha1_set
@@ -205,8 +205,8 @@ def _is_in_sha1_set(sha1: str, sha1_set: str, set_count: int) -> int:
# Args: mb 内存池;temp_dir 临时目录(_sha1_map.txt 写入位置);scan_result IncludesScanner 扫描结果
# Returns: 0 成功,非 0 失败
# ============================================================
def WriteIncludesSha1Map(mb: rowptr[memhub.MemBuddy], temp_dir: str,
scan_result: rowptr[IncludesScanner.ScanResult],
def WriteIncludesSha1Map(mb: rawptr[memhub.MemBuddy], temp_dir: str,
scan_result: rawptr[IncludesScanner.ScanResult],
filter_set: str,
filter_count: int) -> int:
"""将 includes 扫描结果写入 _sha1_map.txt(人类可读输出,程序内部使用内存存储器)
@@ -224,7 +224,7 @@ def WriteIncludesSha1Map(mb: rowptr[memhub.MemBuddy], temp_dir: str,
viperlib.snprintf(map_path, dir_len + 32, "%s/_sha1_map.txt", temp_dir)
# 打开文件写入(CREATE_ALWAYS)
f: rowptr[fileio.File] = fileio.File(map_path, fileio.MODE.W)
f: rawptr[fileio.File] = fileio.File(map_path, fileio.MODE.W)
if f.closed:
return 1
@@ -238,7 +238,7 @@ def WriteIncludesSha1Map(mb: rowptr[memhub.MemBuddy], temp_dir: str,
written_count: int = 0
for i in range(scan_result.Count):
ea_w: uint64 = uint64(scan_result.Entries) + i * entry_size_w
ent_w: rowptr[IncludesScanner.FileEntry] = (rowptr[IncludesScanner.FileEntry])(t.CVoid(ea_w, t.CPtr))
ent_w: rawptr[IncludesScanner.FileEntry] = (rawptr[IncludesScanner.FileEntry])(t.CVoid(ea_w, t.CPtr))
if ent_w is None or ent_w.Sha1 is None or ent_w.RelPath is None:
continue
# 若提供过滤集合,只写入集合中的条目
+1 -1
View File
@@ -27,7 +27,7 @@ import lib.Projectrans.Config as Config
# ============================================================
# 全局 mbuddy 指针
_mbuddy: rowptr[memhub.MemBuddy]
_mbuddy: rawptr[memhub.MemBuddy]
# 最大 includes SHA1 数(用于过滤)
MAX_INCLUDES_SHA1: t.CDefine = 1024