错拼 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

+7 -7
View File
@@ -34,7 +34,7 @@ import lib.Stub.StubMerger.StubMergerCollect as StubMergerCollect
# ============================================================ # ============================================================
# 全局 mbuddy 指针 # 全局 mbuddy 指针
_mbuddy: rowptr[memhub.MemBuddy] _mbuddy: rawptr[memhub.MemBuddy]
# ASan 模式(--asan):对 .ll 先 opt -passes=asan 插桩;ASan 运行库由 # ASan 模式(--asan):对 .ll 先 opt -passes=asan 插桩;ASan 运行库由
# project.vpj 的 linker.static_libs / dynamic_libs 显式声明(TPV 不注入) # project.vpj 的 linker.static_libs / dynamic_libs 显式声明(TPV 不注入)
@@ -61,7 +61,7 @@ PYI_BUF_SIZE: sizet = 262144
# Args: mb 内存池;file_path 源文件路径;sha1_val 文件内容的 SHA1 前16字符(用于函数名混淆);current_package 当前文件所属包名(用于解析相对导入),None 表示顶级模块;declare_only 0=全量翻译(默认),1=仅注册 struct/enum/union(不翻译方法体);temp_dir temp 目录路径(非 None 时在翻译前生成 .vpi 存根文件) # Args: mb 内存池;file_path 源文件路径;sha1_val 文件内容的 SHA1 前16字符(用于函数名混淆);current_package 当前文件所属包名(用于解析相对导入),None 表示顶级模块;declare_only 0=全量翻译(默认),1=仅注册 struct/enum/union(不翻译方法体);temp_dir temp 目录路径(非 None 时在翻译前生成 .vpi 存根文件)
# Returns: Translator 对象(None 失败) # Returns: Translator 对象(None 失败)
# ============================================================ # ============================================================
def TranslateFileGetTrans(mb: rowptr[memhub.MemBuddy], file_path: str, def TranslateFileGetTrans(mb: rawptr[memhub.MemBuddy], file_path: str,
sha1_val: str, sha1_val: str,
current_package: str = None, current_package: str = None,
declare_only: int = 0, declare_only: int = 0,
@@ -73,7 +73,7 @@ def TranslateFileGetTrans(mb: rowptr[memhub.MemBuddy], file_path: str,
temp_dir: temp 目录路径(非 None 时在翻译前生成 .vpi 存根文件) temp_dir: temp 目录路径(非 None 时在翻译前生成 .vpi 存根文件)
""" """
if file_path is None: return None if file_path is None: return None
f: rowptr[fileio.File] = fileio.File(file_path, fileio.MODE.R) f: rawptr[fileio.File] = fileio.File(file_path, fileio.MODE.R)
if f.closed: return None if f.closed: return None
# read_all 的容量参数含终止符(最多读 cap-1 字节), 文件更长会被**静默截断**; # read_all 的容量参数含终止符(最多读 cap-1 字节), 文件更长会被**静默截断**;
# 这里先按文件大小拒绝, 否则拿截断后的源码去 parse 只会得到莫名其妙的语法错误 # 这里先按文件大小拒绝, 否则拿截断后的源码去 parse 只会得到莫名其妙的语法错误
@@ -121,7 +121,7 @@ def TranslateFileGetTrans(mb: rowptr[memhub.MemBuddy], file_path: str,
td_len_vpi: sizet = len(temp_dir) td_len_vpi: sizet = len(temp_dir)
pyi_path: str = StubMergerCollect._sliced_path(temp_dir, td_len_vpi, sha1_val, "vpi") pyi_path: str = StubMergerCollect._sliced_path(temp_dir, td_len_vpi, sha1_val, "vpi")
if pyi_path is not None: if pyi_path is not None:
pf: rowptr[fileio.File] = fileio.File(pyi_path, fileio.MODE.W) pf: rawptr[fileio.File] = fileio.File(pyi_path, fileio.MODE.W)
if not pf.closed: if not pf.closed:
pf.write(pyi_buf, pyi_pos) pf.write(pyi_buf, pyi_pos)
pf.close() pf.close()
@@ -135,7 +135,7 @@ def TranslateFileGetTrans(mb: rowptr[memhub.MemBuddy], file_path: str,
tr._declare_only = declare_only tr._declare_only = declare_only
# P2: 复用全局 gen 单例(App/main.vp 创建;HandlesType 等旧模块函数经 # P2: 复用全局 gen 单例(App/main.vp 创建;HandlesType 等旧模块函数经
# 延迟 import 委托到 gen 方法)。单例未注册时兜底创建(防御直接调用路径)。 # 延迟 import 委托到 gen 方法)。单例未注册时兜底创建(防御直接调用路径)。
gen: rowptr[GenGenerator.Generator] = GenGenerator._g_gen gen: rawptr[GenGenerator.Generator] = GenGenerator._g_gen
if gen is None: if gen is None:
gen = mb.alloc(GenGenerator.Generator.__sizeof__()) gen = mb.alloc(GenGenerator.Generator.__sizeof__())
if gen is None: if gen is None:
@@ -282,7 +282,7 @@ def write_ir_to_file(ir_buf: bytes, ir_len: sizet, output_dir: str, module_name:
if path is None: return 1 if path is None: return 1
# 打开文件写入 # 打开文件写入
f: rowptr[fileio.File] = fileio.File(path, fileio.MODE.W) f: rawptr[fileio.File] = fileio.File(path, fileio.MODE.W)
if f.closed: return 1 if f.closed: return 1
written: int64 = f.write(ir_buf, ir_len) written: int64 = f.write(ir_buf, ir_len)
@@ -467,7 +467,7 @@ def _phase2_write_cmd(cmd: str) -> None:
global _phase2_bat_init global _phase2_bat_init
if _phase2_cmd_path is None or cmd is None: if _phase2_cmd_path is None or cmd is None:
return return
f: rowptr[fileio.File] = fileio.File(_phase2_cmd_path, fileio.MODE.A) f: rawptr[fileio.File] = fileio.File(_phase2_cmd_path, fileio.MODE.A)
if f.closed: if f.closed:
VLogger.error("phase2command: bat 打开失败", "phase2cmd") VLogger.error("phase2command: bat 打开失败", "phase2cmd")
return return
+16 -16
View File
@@ -146,7 +146,7 @@ def _RewriteDepsTxt(temp_dir: str, sha1: str, deps_str: str) -> None:
dpath: str = StubMergerCollect._sliced_path(temp_dir, td_len, sha1, "deps.txt") dpath: str = StubMergerCollect._sliced_path(temp_dir, td_len, sha1, "deps.txt")
if dpath is None: if dpath is None:
return return
df: rowptr[fileio.File] = fileio.File(dpath, fileio.MODE.W) df: rawptr[fileio.File] = fileio.File(dpath, fileio.MODE.W)
if not df.closed: if not df.closed:
dl: sizet = string.strlen(deps_str) dl: sizet = string.strlen(deps_str)
if dl > 0: if dl > 0:
@@ -234,7 +234,7 @@ def _BreakContainerCyclesInDeps(temp_dir: str) -> int:
# Args: mb 内存池;includes_dir includes 根目录(仅用于失败诊断,路径以 store 为准) # Args: mb 内存池;includes_dir includes 根目录(仅用于失败诊断,路径以 store 为准)
# Returns: ScanResult 指针(stdlib 分配,调用方负责释放);失败返回 None # Returns: ScanResult 指针(stdlib 分配,调用方负责释放);失败返回 None
# ============================================================ # ============================================================
def _BuildReachableResult(mb: rowptr[memhub.MemBuddy], def _BuildReachableResult(mb: rawptr[memhub.MemBuddy],
includes_dir: str) -> IncludesScanner.ScanResult | t.CPtr: includes_dir: str) -> IncludesScanner.ScanResult | t.CPtr:
"""从 Sha1Store(仅可达 includes + App)构建可达 FileEntry 列表""" """从 Sha1Store(仅可达 includes + App)构建可达 FileEntry 列表"""
if mb is None: if mb is None:
@@ -318,7 +318,7 @@ def _BuildReachableResult(mb: rowptr[memhub.MemBuddy],
# Args: mb 内存池;includes_dir includes 目录路径;temp_dir 临时目录(保存 stub);log 日志器 # Args: mb 内存池;includes_dir includes 目录路径;temp_dir 临时目录(保存 stub);log 日志器
# Returns: 0 成功,非 0 失败 # Returns: 0 成功,非 0 失败
# ============================================================ # ============================================================
def RunPhase1(mb: rowptr[memhub.MemBuddy], includes_dir: str, temp_dir: str, def RunPhase1(mb: rawptr[memhub.MemBuddy], includes_dir: str, temp_dir: str,
log: VLogger.Logger | t.CPtr) -> int: log: VLogger.Logger | t.CPtr) -> int:
"""Phase1: 扫描 includes 目录,按需翻译并生成 stub""" """Phase1: 扫描 includes 目录,按需翻译并生成 stub"""
if includes_dir is None or temp_dir is None: if includes_dir is None or temp_dir is None:
@@ -581,7 +581,7 @@ def RunPhase1(mb: rowptr[memhub.MemBuddy], includes_dir: str, temp_dir: str,
# 读取文件内容 # 读取文件内容
file_path_r: str = entry_r.Path file_path_r: str = entry_r.Path
f_r: rowptr[fileio.File] = fileio.File(file_path_r, fileio.MODE.R) f_r: rawptr[fileio.File] = fileio.File(file_path_r, fileio.MODE.R)
if f_r.closed: if f_r.closed:
p1a_fl += 1 p1a_fl += 1
continue continue
@@ -733,7 +733,7 @@ def RunPhase1(mb: rowptr[memhub.MemBuddy], includes_dir: str, temp_dir: str,
p1bpre_failed += 1 p1bpre_failed += 1
VLogger.error(f"[Phase 1b-pre] {entry_pv.Path} | vpi 路径生成失败", "Phase1") VLogger.error(f"[Phase 1b-pre] {entry_pv.Path} | vpi 路径生成失败", "Phase1")
continue continue
vf_pv: rowptr[fileio.File] = fileio.File(vpi_path_pv, fileio.MODE.R) vf_pv: rawptr[fileio.File] = fileio.File(vpi_path_pv, fileio.MODE.R)
if not vf_pv.closed: if not vf_pv.closed:
vf_pv.close() vf_pv.close()
stdlib.free(vpi_path_pv) stdlib.free(vpi_path_pv)
@@ -741,7 +741,7 @@ def RunPhase1(mb: rowptr[memhub.MemBuddy], includes_dir: str, temp_dir: str,
stdlib.free(vpi_path_pv) stdlib.free(vpi_path_pv)
# 读取文件、解析 AST、生成 vpi # 读取文件、解析 AST、生成 vpi
file_path_pv: str = entry_pv.Path file_path_pv: str = entry_pv.Path
f_pv: rowptr[fileio.File] = fileio.File(file_path_pv, fileio.MODE.R) f_pv: rawptr[fileio.File] = fileio.File(file_path_pv, fileio.MODE.R)
if f_pv.closed: if f_pv.closed:
p1bpre_failed += 1 p1bpre_failed += 1
VLogger.error(f"[Phase 1b-pre] {file_path_pv} | 无法打开源文件", "Phase1") VLogger.error(f"[Phase 1b-pre] {file_path_pv} | 无法打开源文件", "Phase1")
@@ -790,7 +790,7 @@ def RunPhase1(mb: rowptr[memhub.MemBuddy], includes_dir: str, temp_dir: str,
if pyi_pos_pv > 0: if pyi_pos_pv > 0:
pyi_path_pv: str = StubMergerCollect._sliced_path(temp_dir, dir_len_pv, sha1_pv, "vpi") pyi_path_pv: str = StubMergerCollect._sliced_path(temp_dir, dir_len_pv, sha1_pv, "vpi")
if pyi_path_pv is not None: if pyi_path_pv is not None:
pf_pv: rowptr[fileio.File] = fileio.File(pyi_path_pv, fileio.MODE.W) pf_pv: rawptr[fileio.File] = fileio.File(pyi_path_pv, fileio.MODE.W)
if not pf_pv.closed: if not pf_pv.closed:
pf_pv.write(pyi_buf_pv, pyi_pos_pv) pf_pv.write(pyi_buf_pv, pyi_pos_pv)
pf_pv.close() pf_pv.close()
@@ -876,7 +876,7 @@ def RunPhase1(mb: rowptr[memhub.MemBuddy], includes_dir: str, temp_dir: str,
force_translate: int = 0 force_translate: int = 0
vpi_path_1b: str = StubMergerCollect._sliced_path(temp_dir, dir_len, sha1, "vpi") vpi_path_1b: str = StubMergerCollect._sliced_path(temp_dir, dir_len, sha1, "vpi")
if vpi_path_1b is not None: if vpi_path_1b is not None:
vf_1b: rowptr[fileio.File] = fileio.File(vpi_path_1b, fileio.MODE.R) vf_1b: rawptr[fileio.File] = fileio.File(vpi_path_1b, fileio.MODE.R)
if not vf_1b.closed: if not vf_1b.closed:
vbuf_1b: bytes = stdlib.malloc(1048576) vbuf_1b: bytes = stdlib.malloc(1048576)
if vbuf_1b is not None: if vbuf_1b is not None:
@@ -910,13 +910,13 @@ def RunPhase1(mb: rowptr[memhub.MemBuddy], includes_dir: str, temp_dir: str,
VLogger.info(f"含 class 定义,强制翻译: {rp}(sha1={sha1})", "Phase1") VLogger.info(f"含 class 定义,强制翻译: {rp}(sha1={sha1})", "Phase1")
else: else:
# 检查 stub 是否已存在(按需翻译:跳过已存在的) # 检查 stub 是否已存在(按需翻译:跳过已存在的)
sf: rowptr[fileio.File] = fileio.File(stub_path, fileio.MODE.R) sf: rawptr[fileio.File] = fileio.File(stub_path, fileio.MODE.R)
if not sf.closed: if not sf.closed:
sf.close() sf.close()
# 检查 text.ll 是否也存在(虚表扫描需要 text.ll) # 检查 text.ll 是否也存在(虚表扫描需要 text.ll)
text_path: str = StubMergerCollect._sliced_path(temp_dir, dir_len, sha1, "text.ll") text_path: str = StubMergerCollect._sliced_path(temp_dir, dir_len, sha1, "text.ll")
if text_path is not None: if text_path is not None:
tf: rowptr[fileio.File] = fileio.File(text_path, fileio.MODE.R) tf: rawptr[fileio.File] = fileio.File(text_path, fileio.MODE.R)
if not tf.closed: if not tf.closed:
tf.close() tf.close()
stdlib.free(text_path) stdlib.free(text_path)
@@ -938,7 +938,7 @@ def RunPhase1(mb: rowptr[memhub.MemBuddy], includes_dir: str, temp_dir: str,
# 读取文件内容 # 读取文件内容
file_path: str = entry.Path file_path: str = entry.Path
f: rowptr[fileio.File] = fileio.File(file_path, fileio.MODE.R) f: rawptr[fileio.File] = fileio.File(file_path, fileio.MODE.R)
if f is None: if f is None:
VLogger.error(f"无法打开(f=None): {file_path}", "Phase1") VLogger.error(f"无法打开(f=None): {file_path}", "Phase1")
failed += 1 failed += 1
@@ -998,7 +998,7 @@ def RunPhase1(mb: rowptr[memhub.MemBuddy], includes_dir: str, temp_dir: str,
# (消除 1b-pre 与 1b 对同一文件的重复 _GeneratePyiFromAst 工作) # (消除 1b-pre 与 1b 对同一文件的重复 _GeneratePyiFromAst 工作)
vpi_path_1b: str = StubMergerCollect._sliced_path(temp_dir, dir_len, sha1, "vpi") vpi_path_1b: str = StubMergerCollect._sliced_path(temp_dir, dir_len, sha1, "vpi")
if vpi_path_1b is not None: if vpi_path_1b is not None:
vf_1b: rowptr[fileio.File] = fileio.File(vpi_path_1b, fileio.MODE.R) vf_1b: rawptr[fileio.File] = fileio.File(vpi_path_1b, fileio.MODE.R)
vpi_exists_1b: int = 0 vpi_exists_1b: int = 0
if not vf_1b.closed: if not vf_1b.closed:
vf_1b.close() vf_1b.close()
@@ -1009,7 +1009,7 @@ def RunPhase1(mb: rowptr[memhub.MemBuddy], includes_dir: str, temp_dir: str,
pyi_pos: sizet = StubConverter._GeneratePyiFromAst( pyi_pos: sizet = StubConverter._GeneratePyiFromAst(
mb, tree, entry.RelPath, pyi_buf, Phase1.PYI_BUF_SIZE) mb, tree, entry.RelPath, pyi_buf, Phase1.PYI_BUF_SIZE)
if pyi_pos > 0: if pyi_pos > 0:
pf_1b: rowptr[fileio.File] = fileio.File(vpi_path_1b, fileio.MODE.W) pf_1b: rawptr[fileio.File] = fileio.File(vpi_path_1b, fileio.MODE.W)
if not pf_1b.closed: if not pf_1b.closed:
pf_1b.write(pyi_buf, pyi_pos) pf_1b.write(pyi_buf, pyi_pos)
pf_1b.close() pf_1b.close()
@@ -1082,7 +1082,7 @@ def RunPhase1(mb: rowptr[memhub.MemBuddy], includes_dir: str, temp_dir: str,
dir_len_p1: sizet = string.strlen(temp_dir) dir_len_p1: sizet = string.strlen(temp_dir)
stub_path_p1: str = StubMergerCollect._sliced_path(temp_dir, dir_len_p1, sha1, "stub.ll") stub_path_p1: str = StubMergerCollect._sliced_path(temp_dir, dir_len_p1, sha1, "stub.ll")
if stub_path_p1 is not None: if stub_path_p1 is not None:
sf_p1: rowptr[fileio.File] = fileio.File(stub_path_p1, fileio.MODE.W) sf_p1: rawptr[fileio.File] = fileio.File(stub_path_p1, fileio.MODE.W)
if not sf_p1.closed: if not sf_p1.closed:
sf_p1.write(stub_buf, stub_len) sf_p1.write(stub_buf, stub_len)
sf_p1.close() sf_p1.close()
@@ -1105,7 +1105,7 @@ def RunPhase1(mb: rowptr[memhub.MemBuddy], includes_dir: str, temp_dir: str,
# save text.ll # save text.ll
text_path_p1: str = StubMergerCollect._sliced_path(temp_dir, dir_len_p1, sha1, "text.ll") text_path_p1: str = StubMergerCollect._sliced_path(temp_dir, dir_len_p1, sha1, "text.ll")
if text_path_p1 is not None: if text_path_p1 is not None:
tf_p1: rowptr[fileio.File] = fileio.File(text_path_p1, fileio.MODE.W) tf_p1: rawptr[fileio.File] = fileio.File(text_path_p1, fileio.MODE.W)
if not tf_p1.closed: if not tf_p1.closed:
tf_p1.write(text_buf, text_len) tf_p1.write(text_buf, text_len)
tf_p1.close() tf_p1.close()
@@ -1119,7 +1119,7 @@ def RunPhase1(mb: rowptr[memhub.MemBuddy], includes_dir: str, temp_dir: str,
# save dependencies(_imported_modules) for Phase B # save dependencies(_imported_modules) for Phase B
deps_path_p1: str = StubMergerCollect._sliced_path(temp_dir, dir_len_p1, sha1, "deps.txt") deps_path_p1: str = StubMergerCollect._sliced_path(temp_dir, dir_len_p1, sha1, "deps.txt")
if deps_path_p1 is not None: if deps_path_p1 is not None:
df_p1: rowptr[fileio.File] = fileio.File(deps_path_p1, fileio.MODE.W) df_p1: rawptr[fileio.File] = fileio.File(deps_path_p1, fileio.MODE.W)
if not df_p1.closed: if not df_p1.closed:
if tr._imported_modules is not None: if tr._imported_modules is not None:
dl: sizet = string.strlen(tr._imported_modules) dl: sizet = string.strlen(tr._imported_modules)
+5 -5
View File
@@ -53,7 +53,7 @@ import lib.core.Gen.GenApi as GenApi
# parent_names_buf 父类名扁平数组(每个 Phase1.CLASS_NAME_LEN 字节,无父类填 '\0');def_sha1s_buf 定义 SHA1 扁平数组(每个 Phase1.SHA1_LEN 字节) # parent_names_buf 父类名扁平数组(每个 Phase1.CLASS_NAME_LEN 字节,无父类填 '\0');def_sha1s_buf 定义 SHA1 扁平数组(每个 Phase1.SHA1_LEN 字节)
# Returns: 收集到的类数量,-1 失败 # Returns: 收集到的类数量,-1 失败
# ============================================================ # ============================================================
def _ScanClassInheritance(mb: rowptr[memhub.MemBuddy], def _ScanClassInheritance(mb: rawptr[memhub.MemBuddy],
result: IncludesScanner.ScanResult | t.CPtr, result: IncludesScanner.ScanResult | t.CPtr,
reachable_set: str, reachable_count: int, reachable_set: str, reachable_count: int,
use_reachable: int, use_reachable: int,
@@ -97,7 +97,7 @@ def _ScanClassInheritance(mb: rowptr[memhub.MemBuddy],
# 读取文件 # 读取文件
file_path: str = entry.Path file_path: str = entry.Path
f: rowptr[fileio.File] = fileio.File(file_path, fileio.MODE.R) f: rawptr[fileio.File] = fileio.File(file_path, fileio.MODE.R)
if f.closed: if f.closed:
continue continue
@@ -252,12 +252,12 @@ def _BufHasGenericClassMarker(buf: bytes, blen: sizet) -> int:
# _find_generic_template 遍历悬空内存 strcmp 崩溃。本函数先文本扫描(_BufHasGenericClassMarker,不 parse)筛选出含泛型类的文件, # _find_generic_template 遍历悬空内存 strcmp 崩溃。本函数先文本扫描(_BufHasGenericClassMarker,不 parse)筛选出含泛型类的文件,
# 仅对命中文件用**永久池(perm_pool)**解析(模板节点与表直接进 perm_pool,跨 mark 永久存活、不占主 pool);重复注册由 _register_generic_template 内部查重跳过。 # 仅对命中文件用**永久池(perm_pool)**解析(模板节点与表直接进 perm_pool,跨 mark 永久存活、不占主 pool);重复注册由 _register_generic_template 内部查重跳过。
# ============================================================ # ============================================================
def _PreRegisterAllGenericTemplates(mb: rowptr[memhub.MemBuddy], def _PreRegisterAllGenericTemplates(mb: rawptr[memhub.MemBuddy],
result: IncludesScanner.ScanResult | t.CPtr) -> int: result: IncludesScanner.ScanResult | t.CPtr) -> int:
"""预注册全部 includes 文件的泛型类模板,返回处理到的泛型类数量""" """预注册全部 includes 文件的泛型类模板,返回处理到的泛型类数量"""
if result is None or mb is None: if result is None or mb is None:
return 0 return 0
perm: rowptr[memhub.MemBuddy] = CompilerFactory.factory.PermPool perm: rawptr[memhub.MemBuddy] = CompilerFactory.factory.PermPool
if perm is None: if perm is None:
return 0 return 0
p1e_size: sizet = IncludesScanner.FileEntry.__sizeof__() p1e_size: sizet = IncludesScanner.FileEntry.__sizeof__()
@@ -270,7 +270,7 @@ def _PreRegisterAllGenericTemplates(mb: rowptr[memhub.MemBuddy],
continue continue
# 读取文件 # 读取文件
file_path_pg: str = entry_pg.Path file_path_pg: str = entry_pg.Path
f_pg: rowptr[fileio.File] = fileio.File(file_path_pg, fileio.MODE.R) f_pg: rawptr[fileio.File] = fileio.File(file_path_pg, fileio.MODE.R)
if f_pg.closed: if f_pg.closed:
continue continue
# read_all 的容量参数含终止符(最多读 cap-1 字节), 文件更长会被静默截断 # read_all 的容量参数含终止符(最多读 cap-1 字节), 文件更长会被静默截断
+1 -1
View File
@@ -45,7 +45,7 @@ import lib.Phase.Phase1 as Phase1
# class_count 类数量;out_order 输出拓扑顺序的文件索引数组(调用者分配,int 数组);out_count 输出文件数量 # class_count 类数量;out_order 输出拓扑顺序的文件索引数组(调用者分配,int 数组);out_count 输出文件数量
# Returns: 0 成功,-1 失败 # Returns: 0 成功,-1 失败
# ============================================================ # ============================================================
def _TopoSortFiles(mb: rowptr[memhub.MemBuddy], def _TopoSortFiles(mb: rawptr[memhub.MemBuddy],
result: IncludesScanner.ScanResult | t.CPtr, result: IncludesScanner.ScanResult | t.CPtr,
reachable_set: str, reachable_count: int, reachable_set: str, reachable_count: int,
use_reachable: int, use_reachable: int,
+1 -1
View File
@@ -3,7 +3,7 @@ from stdint import *
import memhub import memhub
# 全局 mbuddy 指针 # 全局 mbuddy 指针
_mbuddy: rowptr[memhub.MemBuddy] _mbuddy: rawptr[memhub.MemBuddy]
# 源代码缓冲区大小(1MB) # 源代码缓冲区大小(1MB)
SRC_BUF_SIZE: t.CDefine = 1048576 SRC_BUF_SIZE: t.CDefine = 1048576
+22 -22
View File
@@ -30,7 +30,7 @@ import lib.Stub.StubMerger.StubMergerTopo as StubMergerTopo
import lib.Stub.StubGen.Converter as StubConverter import lib.Stub.StubGen.Converter as StubConverter
# 全局 mbuddy 指针 # 全局 mbuddy 指针
_mbuddy: rowptr[memhub.MemBuddy] _mbuddy: rawptr[memhub.MemBuddy]
# 源代码缓冲区大小(1MB) # 源代码缓冲区大小(1MB)
SRC_BUF_SIZE: t.CDefine = 1048576 SRC_BUF_SIZE: t.CDefine = 1048576
@@ -50,7 +50,7 @@ class SrcFileEntry:
# Args: mb 内存池;dir_path 当前扫描目录;entries SrcFileEntry 数组;entry_size 单个条目大小(SrcFileEntry.__sizeof__());file_count 当前已收集的文件数;max_files 最大文件数 # Args: mb 内存池;dir_path 当前扫描目录;entries SrcFileEntry 数组;entry_size 单个条目大小(SrcFileEntry.__sizeof__());file_count 当前已收集的文件数;max_files 最大文件数
# Returns: 新的 file_count # Returns: 新的 file_count
# ============================================================ # ============================================================
def _ScanDirForPyFiles(mb: rowptr[memhub.MemBuddy], def _ScanDirForPyFiles(mb: rawptr[memhub.MemBuddy],
dir_path: str, dir_path: str,
entries: SrcFileEntry | t.CPtr, entries: SrcFileEntry | t.CPtr,
entry_size: sizet, entry_size: sizet,
@@ -156,7 +156,7 @@ def _ScanDirForPyFiles(mb: rowptr[memhub.MemBuddy],
# Kernel/intr/isr.s 定义 isr0/syscall_entry/_per_cpu 等符号)。 # Kernel/intr/isr.s 定义 isr0/syscall_entry/_per_cpu 等符号)。
# TPV 不对 .s 翻译,直接用 llvm-mc 汇编为 .obj 参与链接。 # TPV 不对 .s 翻译,直接用 llvm-mc 汇编为 .obj 参与链接。
# ============================================================ # ============================================================
def _ScanDirForAsmFiles(mb: rowptr[memhub.MemBuddy], def _ScanDirForAsmFiles(mb: rawptr[memhub.MemBuddy],
dir_path: str, dir_path: str,
entries: SrcFileEntry | t.CPtr, entries: SrcFileEntry | t.CPtr,
entry_size: sizet, entry_size: sizet,
@@ -256,7 +256,7 @@ def _ScanDirForAsmFiles(mb: rowptr[memhub.MemBuddy],
# 才首次注册,reset_to(mark2) 会回收表与节点 → 后续查重/特化遍历悬空内存崩溃;App 文件数量少,mark2 前预注册的 AST 驻留内存可忽略。 # 才首次注册,reset_to(mark2) 会回收表与节点 → 后续查重/特化遍历悬空内存崩溃;App 文件数量少,mark2 前预注册的 AST 驻留内存可忽略。
# 重复注册由 _register_generic_template 查重跳过。 # 重复注册由 _register_generic_template 查重跳过。
# ============================================================ # ============================================================
def _PreRegisterAppGenericTemplates(mb: rowptr[memhub.MemBuddy], def _PreRegisterAppGenericTemplates(mb: rawptr[memhub.MemBuddy],
entries: SrcFileEntry | t.CPtr, entries: SrcFileEntry | t.CPtr,
file_count: int, file_count: int,
entry_size: sizet) -> int: entry_size: sizet) -> int:
@@ -270,7 +270,7 @@ def _PreRegisterAppGenericTemplates(mb: rowptr[memhub.MemBuddy],
if ent_pa is None or ent_pa.Path is None or ent_pa.Sha1 is None: if ent_pa is None or ent_pa.Path is None or ent_pa.Sha1 is None:
continue continue
# 读取文件 # 读取文件
f_pa: rowptr[fileio.File] = fileio.File(ent_pa.Path, fileio.MODE.R) f_pa: rawptr[fileio.File] = fileio.File(ent_pa.Path, fileio.MODE.R)
if f_pa.closed: if f_pa.closed:
continue continue
# read_all 的容量参数含终止符(最多读 cap-1 字节), 文件更长会被静默截断 # read_all 的容量参数含终止符(最多读 cap-1 字节), 文件更长会被静默截断
@@ -290,7 +290,7 @@ def _PreRegisterAppGenericTemplates(mb: rowptr[memhub.MemBuddy],
if bytes_read_pa < SRC_BUF_SIZE: if bytes_read_pa < SRC_BUF_SIZE:
src_buf_pa[bytes_read_pa] = 0 src_buf_pa[bytes_read_pa] = 0
# 解析 AST(只解析,不完整翻译;用永久池使模板节点跨 mark2 reset 存活) # 解析 AST(只解析,不完整翻译;用永久池使模板节点跨 mark2 reset 存活)
perm_pa: rowptr[memhub.MemBuddy] = CompilerFactory.factory.PermPool perm_pa: rawptr[memhub.MemBuddy] = CompilerFactory.factory.PermPool
if perm_pa is None: if perm_pa is None:
perm_pa = mb perm_pa = mb
lx_pa: ast.Lexer | t.CPtr = ast.new_lexer(perm_pa) lx_pa: ast.Lexer | t.CPtr = ast.new_lexer(perm_pa)
@@ -450,7 +450,7 @@ def _PhaseATextLLExists(temp_dir: str, td_len: sizet, sha1: str) -> int:
tpath: str = StubMergerCollect._sliced_path(temp_dir, td_len, sha1, "text.ll") tpath: str = StubMergerCollect._sliced_path(temp_dir, td_len, sha1, "text.ll")
if tpath is None: if tpath is None:
return 0 return 0
tf: rowptr[fileio.File] = fileio.File(tpath, fileio.MODE.R) tf: rawptr[fileio.File] = fileio.File(tpath, fileio.MODE.R)
exists: int = 0 exists: int = 0
if not tf.closed: if not tf.closed:
tf.close() tf.close()
@@ -479,7 +479,7 @@ def _PhaseADumpNode(temp_dir: str, td_len: sizet, sha1: str,
# 回退:读取 {temp_dir}/{前缀}/{sha1}.deps.txt(Phase1 已为 includes 写盘) # 回退:读取 {temp_dir}/{前缀}/{sha1}.deps.txt(Phase1 已为 includes 写盘)
dpath: str = StubMergerCollect._sliced_path(temp_dir, td_len, sha1, "deps.txt") dpath: str = StubMergerCollect._sliced_path(temp_dir, td_len, sha1, "deps.txt")
if dpath is not None: if dpath is not None:
df: rowptr[fileio.File] = fileio.File(dpath, fileio.MODE.R) df: rawptr[fileio.File] = fileio.File(dpath, fileio.MODE.R)
if not df.closed: if not df.closed:
deps = stdlib.malloc(PA_DEPS_MAX_STR) deps = stdlib.malloc(PA_DEPS_MAX_STR)
if deps is not None: if deps is not None:
@@ -608,7 +608,7 @@ def _PhaseADumpFailGraph(temp_dir: str, td_len: sizet, path: str, sha1: str) ->
stdio.fflush(None) stdio.fflush(None)
def RunMultiFileProject(mb: rowptr[memhub.MemBuddy], def RunMultiFileProject(mb: rawptr[memhub.MemBuddy],
source_dir: str, temp_dir: str, output_dir: str, source_dir: str, temp_dir: str, output_dir: str,
cc_cmd: str, cc_flags: str, cc_cmd: str, cc_flags: str,
linker_cmd: str, linker_flags: str, linker_output: str, linker_cmd: str, linker_flags: str, linker_output: str,
@@ -699,7 +699,7 @@ def RunMultiFileProject(mb: rowptr[memhub.MemBuddy],
map_path_am: bytes = stdlib.malloc(td_len_am + 32) map_path_am: bytes = stdlib.malloc(td_len_am + 32)
if map_path_am is not None: if map_path_am is not None:
viperlib.snprintf(map_path_am, td_len_am + 32, "%s/_sha1_map.txt", temp_dir) viperlib.snprintf(map_path_am, td_len_am + 32, "%s/_sha1_map.txt", temp_dir)
mf: rowptr[fileio.File] = fileio.File(map_path_am, fileio.MODE.A) mf: rawptr[fileio.File] = fileio.File(map_path_am, fileio.MODE.A)
line_am: bytes = stdlib.malloc(512) line_am: bytes = stdlib.malloc(512)
# 先遍历一次填充内存存储器(不依赖文件 I/O),再写入 _sha1_map.txt # 先遍历一次填充内存存储器(不依赖文件 I/O),再写入 _sha1_map.txt
app_filled: int = 0 app_filled: int = 0
@@ -758,7 +758,7 @@ def RunMultiFileProject(mb: rowptr[memhub.MemBuddy],
vpi_failed_p2 += 1 vpi_failed_p2 += 1
VLogger.error(f"[Phase A-pre-vpi] {ent_vp2.Path} | vpi 路径生成失败", "PhaseA") VLogger.error(f"[Phase A-pre-vpi] {ent_vp2.Path} | vpi 路径生成失败", "PhaseA")
continue continue
vf_vp2: rowptr[fileio.File] = fileio.File(vpi_path_vp2, fileio.MODE.R) vf_vp2: rawptr[fileio.File] = fileio.File(vpi_path_vp2, fileio.MODE.R)
if not vf_vp2.closed: if not vf_vp2.closed:
vf_vp2.close() vf_vp2.close()
stdlib.free(vpi_path_vp2) stdlib.free(vpi_path_vp2)
@@ -766,7 +766,7 @@ def RunMultiFileProject(mb: rowptr[memhub.MemBuddy],
stdlib.free(vpi_path_vp2) stdlib.free(vpi_path_vp2)
# 读取源文件 → 解析 AST → 生成 vpi # 读取源文件 → 解析 AST → 生成 vpi
# (rel_path 传 None:与 TranslateFileGetTrans 后续覆盖写的内容一致) # (rel_path 传 None:与 TranslateFileGetTrans 后续覆盖写的内容一致)
f_vp2: rowptr[fileio.File] = fileio.File(ent_vp2.Path, fileio.MODE.R) f_vp2: rawptr[fileio.File] = fileio.File(ent_vp2.Path, fileio.MODE.R)
if f_vp2.closed: if f_vp2.closed:
vpi_failed_p2 += 1 vpi_failed_p2 += 1
VLogger.error(f"[Phase A-pre-vpi] {ent_vp2.Path} | 无法打开源文件", "PhaseA") VLogger.error(f"[Phase A-pre-vpi] {ent_vp2.Path} | 无法打开源文件", "PhaseA")
@@ -816,7 +816,7 @@ def RunMultiFileProject(mb: rowptr[memhub.MemBuddy],
if pyi_pos_vp2 > 0: if pyi_pos_vp2 > 0:
pyi_path_vp2: str = StubMergerCollect._sliced_path(temp_dir, td_len_vpa, ent_vp2.Sha1, "vpi") pyi_path_vp2: str = StubMergerCollect._sliced_path(temp_dir, td_len_vpa, ent_vp2.Sha1, "vpi")
if pyi_path_vp2 is not None: if pyi_path_vp2 is not None:
pf_vp2: rowptr[fileio.File] = fileio.File(pyi_path_vp2, fileio.MODE.W) pf_vp2: rawptr[fileio.File] = fileio.File(pyi_path_vp2, fileio.MODE.W)
if not pf_vp2.closed: if not pf_vp2.closed:
pf_vp2.write(pyi_buf_vp2, pyi_pos_vp2) pf_vp2.write(pyi_buf_vp2, pyi_pos_vp2)
pf_vp2.close() pf_vp2.close()
@@ -1052,7 +1052,7 @@ def RunMultiFileProject(mb: rowptr[memhub.MemBuddy],
# save stub.ll (切片路径: temp_dir/{sha1前缀}/{sha1}.stub.ll) # save stub.ll (切片路径: temp_dir/{sha1前缀}/{sha1}.stub.ll)
stub_path_a: str = StubMergerCollect._sliced_path(temp_dir, td_len_pa, ent.Sha1, "stub.ll") stub_path_a: str = StubMergerCollect._sliced_path(temp_dir, td_len_pa, ent.Sha1, "stub.ll")
if stub_path_a is not None: if stub_path_a is not None:
sf_a: rowptr[fileio.File] = fileio.File(stub_path_a, fileio.MODE.W) sf_a: rawptr[fileio.File] = fileio.File(stub_path_a, fileio.MODE.W)
if not sf_a.closed: if not sf_a.closed:
sf_a.write(stub_buf_a, stub_len_a) sf_a.write(stub_buf_a, stub_len_a)
sf_a.close() sf_a.close()
@@ -1069,7 +1069,7 @@ def RunMultiFileProject(mb: rowptr[memhub.MemBuddy],
# save text.ll (切片路径) # save text.ll (切片路径)
text_path_a: str = StubMergerCollect._sliced_path(temp_dir, td_len_pa, ent.Sha1, "text.ll") text_path_a: str = StubMergerCollect._sliced_path(temp_dir, td_len_pa, ent.Sha1, "text.ll")
if text_path_a is not None: if text_path_a is not None:
tf_a: rowptr[fileio.File] = fileio.File(text_path_a, fileio.MODE.W) tf_a: rawptr[fileio.File] = fileio.File(text_path_a, fileio.MODE.W)
if not tf_a.closed: if not tf_a.closed:
tf_a.write(text_buf_a, text_len_a) tf_a.write(text_buf_a, text_len_a)
tf_a.close() tf_a.close()
@@ -1079,7 +1079,7 @@ def RunMultiFileProject(mb: rowptr[memhub.MemBuddy],
# save dependencies (_imported_modules) for Phase B (切片路径) # save dependencies (_imported_modules) for Phase B (切片路径)
deps_path_a: str = StubMergerCollect._sliced_path(temp_dir, td_len_pa, ent.Sha1, "deps.txt") deps_path_a: str = StubMergerCollect._sliced_path(temp_dir, td_len_pa, ent.Sha1, "deps.txt")
if deps_path_a is not None: if deps_path_a is not None:
df_a: rowptr[fileio.File] = fileio.File(deps_path_a, fileio.MODE.W) df_a: rawptr[fileio.File] = fileio.File(deps_path_a, fileio.MODE.W)
if not df_a.closed: if not df_a.closed:
if tr_a._imported_modules is not None: if tr_a._imported_modules is not None:
dl_a: sizet = string.strlen(tr_a._imported_modules) dl_a: sizet = string.strlen(tr_a._imported_modules)
@@ -1429,7 +1429,7 @@ def RunMultiFileProject(mb: rowptr[memhub.MemBuddy],
is_decl_mi: int = -1 is_decl_mi: int = -1
tpath_mi: str = StubMergerCollect._sliced_path(temp_dir, td_len_mi, inc_sha1_mi, "text.ll") tpath_mi: str = StubMergerCollect._sliced_path(temp_dir, td_len_mi, inc_sha1_mi, "text.ll")
if tpath_mi is not None: if tpath_mi is not None:
tf_mi: rowptr[fileio.File] = fileio.File(tpath_mi, fileio.MODE.R) tf_mi: rawptr[fileio.File] = fileio.File(tpath_mi, fileio.MODE.R)
if not tf_mi.closed: if not tf_mi.closed:
is_decl_mi = 1 is_decl_mi = 1
tbuf_mi: bytes = stdlib.malloc(StubMerger.STUB_READ_BUF_SIZE) tbuf_mi: bytes = stdlib.malloc(StubMerger.STUB_READ_BUF_SIZE)
@@ -1495,7 +1495,7 @@ def RunMultiFileProject(mb: rowptr[memhub.MemBuddy],
inc_stub_len: sizet = string.strlen(inc_stub_buf) inc_stub_len: sizet = string.strlen(inc_stub_buf)
inc_stub_path: str = StubMergerCollect._sliced_path(temp_dir, td_len_mi, inc_sha1_mi, "stub.ll") inc_stub_path: str = StubMergerCollect._sliced_path(temp_dir, td_len_mi, inc_sha1_mi, "stub.ll")
if inc_stub_path is not None: if inc_stub_path is not None:
isf: rowptr[fileio.File] = fileio.File(inc_stub_path, fileio.MODE.W) isf: rawptr[fileio.File] = fileio.File(inc_stub_path, fileio.MODE.W)
if not isf.closed: if not isf.closed:
isf.write(inc_stub_buf, inc_stub_len) isf.write(inc_stub_buf, inc_stub_len)
isf.close() isf.close()
@@ -1508,7 +1508,7 @@ def RunMultiFileProject(mb: rowptr[memhub.MemBuddy],
inc_text_len: sizet = string.strlen(inc_text_buf) inc_text_len: sizet = string.strlen(inc_text_buf)
inc_text_path: str = StubMergerCollect._sliced_path(temp_dir, td_len_mi, inc_sha1_mi, "text.ll") inc_text_path: str = StubMergerCollect._sliced_path(temp_dir, td_len_mi, inc_sha1_mi, "text.ll")
if inc_text_path is not None: if inc_text_path is not None:
itf: rowptr[fileio.File] = fileio.File(inc_text_path, fileio.MODE.W) itf: rawptr[fileio.File] = fileio.File(inc_text_path, fileio.MODE.W)
if not itf.closed: if not itf.closed:
itf.write(inc_text_buf, inc_text_len) itf.write(inc_text_buf, inc_text_len)
itf.close() itf.close()
@@ -1527,13 +1527,13 @@ def RunMultiFileProject(mb: rowptr[memhub.MemBuddy],
diag_stub_ex: int = 0 diag_stub_ex: int = 0
diag_text_ex: int = 0 diag_text_ex: int = 0
if diag_stub is not None: if diag_stub is not None:
df_diag_s: rowptr[fileio.File] = fileio.File(diag_stub, fileio.MODE.R) df_diag_s: rawptr[fileio.File] = fileio.File(diag_stub, fileio.MODE.R)
if not df_diag_s.closed: if not df_diag_s.closed:
diag_stub_ex = 1 diag_stub_ex = 1
df_diag_s.close() df_diag_s.close()
stdlib.free(diag_stub) stdlib.free(diag_stub)
if diag_text is not None: if diag_text is not None:
df_diag_t: rowptr[fileio.File] = fileio.File(diag_text, fileio.MODE.R) df_diag_t: rawptr[fileio.File] = fileio.File(diag_text, fileio.MODE.R)
if not df_diag_t.closed: if not df_diag_t.closed:
diag_text_ex = 1 diag_text_ex = 1
df_diag_t.close() df_diag_t.close()
@@ -1663,7 +1663,7 @@ def RunMultiFileProject(mb: rowptr[memhub.MemBuddy],
obj_path_pc: str = StubMergerCollect._sliced_path(includes_binary_dir, ibd_len_pc, rsha1_pc, "obj") obj_path_pc: str = StubMergerCollect._sliced_path(includes_binary_dir, ibd_len_pc, rsha1_pc, "obj")
if obj_path_pc is not None: if obj_path_pc is not None:
# 检查 .obj 文件是否存在 # 检查 .obj 文件是否存在
cf_pc: rowptr[fileio.File] = fileio.File(obj_path_pc, fileio.MODE.R) cf_pc: rawptr[fileio.File] = fileio.File(obj_path_pc, fileio.MODE.R)
if not cf_pc.closed: if not cf_pc.closed:
cf_pc.close() cf_pc.close()
# .obj 存在,追加到 final_obj_paths # .obj 存在,追加到 final_obj_paths
+1 -1
View File
@@ -62,7 +62,7 @@ def Load_project_config(path: str) -> int:
if _mbuddy is None: return 1 if _mbuddy is None: return 1
# 打开文件 # 打开文件
f: rowptr[fileio.File] = fileio.File(path, fileio.MODE.R) f: rawptr[fileio.File] = fileio.File(path, fileio.MODE.R)
if f is None: return 1 if f is None: return 1
if f.closed: return 1 if f.closed: return 1
+4 -4
View File
@@ -15,7 +15,7 @@ import w32.fileio as fileio
# ============================================================ # ============================================================
# 全局 mbuddy 指针 # 全局 mbuddy 指针
_mbuddy: rowptr[memhub.MemBuddy] _mbuddy: rawptr[memhub.MemBuddy]
# ============================================================ # ============================================================
@@ -31,7 +31,7 @@ def nibble_to_hex_char(n: int, uppercase: int) -> char:
# ============================================================ # ============================================================
# bytes_to_hex - 字节序列转十六进制字符串 # bytes_to_hex - 字节序列转十六进制字符串
# ============================================================ # ============================================================
def bytes_to_hex(pool: rowptr[memhub.MemBuddy], def bytes_to_hex(pool: rawptr[memhub.MemBuddy],
digest: bytes, digest: bytes,
nbytes: sizet, nbytes: sizet,
uppercase: int, uppercase: int,
@@ -63,7 +63,7 @@ def bytes_to_hex(pool: rowptr[memhub.MemBuddy],
# ============================================================ # ============================================================
# compute_sha1 - 计算字符串的 SHA1,返回前 16 个十六进制字符(与 Projectrans.py 一致) # compute_sha1 - 计算字符串的 SHA1,返回前 16 个十六进制字符(与 Projectrans.py 一致)
# ============================================================ # ============================================================
def compute_sha1(pool: rowptr[memhub.MemBuddy], content: str) -> str: def compute_sha1(pool: rawptr[memhub.MemBuddy], content: str) -> str:
"""计算字符串的 SHA1,返回前 16 个十六进制字符(用于文件命名)""" """计算字符串的 SHA1,返回前 16 个十六进制字符(用于文件命名)"""
if content is None or pool is None: if content is None or pool is None:
return None return None
@@ -125,7 +125,7 @@ def read_file_to_buf(path: str, buf_size: sizet) -> bytes:
合并自 Phase2/StubMerger/IncludesScanner 的重复"打开+读取+终止"序列。 合并自 Phase2/StubMerger/IncludesScanner 的重复"打开+读取+终止"序列。
""" """
if path is None or buf_size <= 0: return None if path is None or buf_size <= 0: return None
sf: rowptr[fileio.File] = fileio.File(path, fileio.MODE.R) sf: rawptr[fileio.File] = fileio.File(path, fileio.MODE.R)
if sf.closed: return None if sf.closed: return None
buf: bytes = stdlib.malloc(buf_size) buf: bytes = stdlib.malloc(buf_size)
if buf is None: if buf is None:
+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 缓冲区大小 # Args: mb 内存池(保留以符合调用约定,实际未使用);tree AST Module 根节点;rel_path 相对路径(用于模块名,当前未使用);buf 输出缓冲区;buf_size 缓冲区大小
# Returns: 写入的字节数(0 表示失败) # 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, rel_path: str, buf: bytes,
buf_size: sizet) -> sizet: buf_size: sizet) -> sizet:
"""从 AST 生成 .vpi 存根文件内容到 buf""" """从 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} 形态定位模板条目, # 调用点 declare 停在调用点实参宽度(如 elem_size 字面量 i32 把定义侧 sizet(i64) 固化窄)。本函数按 {sha1}.{base}[T].{method} 形态定位模板条目,
# 把段内独立的类型形参 token 用特化实参(cls_name 的 [...] 内容)替换后再解析;未命中/多参模板(键段含空格被截断)返回 None,不做兜底推断。 # 把段内独立的类型形参 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, src_sha1: str,
cls_name: str, cls_name: str,
method_name: str, method_name: str,
@@ -773,7 +773,7 @@ def _resolve_vpi_param_annot_seg_template(pool: rowptr[memhub.MemBuddy],
break break
string.strncpy(seg_buf_t, annots_t + seg_start_t, seg_len_t) string.strncpy(seg_buf_t, annots_t + seg_start_t, seg_len_t)
seg_buf_t[seg_len_t] = '\0' 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 跳过) # 模板注解按源码原样缓存,不替换则 `item: T` 解析不出类型(None 跳过)
tparam_t: bytes = stdlib.malloc(tplen_t + 1) tparam_t: bytes = stdlib.malloc(tplen_t + 1)
if tparam_t is not None: 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(含首参空串占位)。 # vpi tree 参数列表被覆盖损坏时(param_count 偏小,尾部默认参数丢失),用 _cache_vpi_param_annots_text 的文本缓存补全:参数位置 p 对应缓存段 p(含首参空串占位)。
# 补全后 declare 参数数与 define 一致,调用点默认参数填充才能生效,避免被调函数读栈垃圾。 # 补全后 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, func: llvmlite.Function | t.CPtr,
src_sha1: str, src_sha1: str,
cls_name: str, cls_name: str,
@@ -860,7 +860,7 @@ def _repair_declare_params_from_text(pool: rowptr[memhub.MemBuddy],
# 参数类型错会导致调用侧 trunc 传参、callee 按 i64 读栈残留高位 → can=巨值读未写槽位崩溃(SlotsBugTest 根因)。 # 参数类型错会导致调用侧 trunc 传参、callee 按 i64 读栈残留高位 → can=巨值读未写槽位崩溃(SlotsBugTest 根因)。
# 从 @-joined 注解串取第 seg_idx 段(0=self 空段),用 _resolve_vpi_ret_annot_str 解析;空段/未命中返回 None(走 AST 兜底)。 # 从 @-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, src_sha1: str,
cls_name: str, cls_name: str,
method_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] = '/' vpi_path[td_len + 3] = '/'
string.strcpy(vpi_path + td_len + 4, src_sha1) string.strcpy(vpi_path + td_len + 4, src_sha1)
string.strcpy(vpi_path + td_len + 4 + sha1_len, ".vpi") 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: if f.closed:
stdlib.free(vpi_path) stdlib.free(vpi_path)
return 0 return 0
@@ -1025,7 +1025,7 @@ def _ensure_vpi_param_annot_loaded(src_sha1: str, temp_dir: str) -> int:
vpi_path[td_len + 3] = '/' vpi_path[td_len + 3] = '/'
string.strcpy(vpi_path + td_len + 4, src_sha1) string.strcpy(vpi_path + td_len + 4, src_sha1)
string.strcpy(vpi_path + td_len + 4 + sha1_len, ".vpi") 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: if f.closed:
stdlib.free(vpi_path) stdlib.free(vpi_path)
return 0 return 0
@@ -1205,7 +1205,7 @@ def _lookup_vpi_ret_annot(src_sha1: str, cls_name: str, method_name: str) -> str
# #
# 纯字符串解析,不构造 AST 节点。 # 纯字符串解析,不构造 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: seg: str) -> llvmlite.LLVMType | t.CPtr:
"""解析单个类型段为 LLVMType,无法识别返回 None""" """解析单个类型段为 LLVMType,无法识别返回 None"""
if seg is None or pool is 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。 # None 与 void 同义,归一到 Void。
if string.strcmp(seg, "None") == 0: if string.strcmp(seg, "None") == 0:
return llvmlite.Void(pool) return llvmlite.Void(pool)
# rowptr[T] 内建裸指针(等价 t.CPtr[T] → Ptr(T)):vpi 返回/参数注解按源码 # rawptr[T] 内建裸指针(等价 t.CPtr[T] → Ptr(T)):vpi 返回/参数注解按源码
# 原样保留 Subscript 形态(如 tokens.vp `new_token -> rowptr[Token]`)。 # 原样保留 Subscript 形态(如 tokens.vp `new_token -> rawptr[Token]`)。
# 此前无此分支 → 整个注解解析返回 None → text.ll 尚未生成(合法时序:依赖 # 此前无此分支 → 整个注解解析返回 None → text.ll 尚未生成(合法时序:依赖
# 模块尚未翻译,占位 text.ll 为空)时跨模块调用 fail-fast 误报 # 模块尚未翻译,占位 text.ll 为空)时跨模块调用 fail-fast 误报
# (includes/ast/lexer.vp new_token 根因)。与定义侧 TypeGenResolve # (includes/ast/lexer.vp new_token 根因)。与定义侧 TypeGenResolve
# resolve_annotation_type 的 rowptr 分支同口径:Ptr(resolve(T))。 # resolve_annotation_type 的 rawptr 分支同口径:Ptr(resolve(T))。
if string.strncmp(seg, "rowptr[", 7) == 0: if string.strncmp(seg, "rawptr[", 7) == 0:
seg_len_rp: sizet = string.strlen(seg) seg_len_rp: sizet = string.strlen(seg)
if seg_len_rp > 8 and seg[seg_len_rp - 1] == ']': if seg_len_rp > 8 and seg[seg_len_rp - 1] == ']':
inner_len_rp: sizet = seg_len_rp - 8 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))。 # 纯字符串解析,避免 _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, ret_annot: str,
i32_ty: llvmlite.LLVMType | t.CPtr, i32_ty: llvmlite.LLVMType | t.CPtr,
i8_ptr_ty: llvmlite.LLVMType | t.CPtr) -> 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 逻辑一致,但内联在本模块, # 与 HandlesImports.add_imported_module 逻辑一致,但内联在本模块,
# 避免 VpiReader → HandlesImports → StubMerger → VpiReader 循环依赖。 # 避免 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: cur: str, name: str) -> str:
"""追加模块名到空格分隔列表(pool 分配),返回新列表""" """追加模块名到空格分隔列表(pool 分配),返回新列表"""
if name is None: if name is None:
@@ -1620,7 +1620,7 @@ def _stub_add_imported(pool: rowptr[memhub.MemBuddy],
# ============================================================ # ============================================================
# _stub_add_from - 追加 from-import 映射("local:mod[:orig]" 空格分隔) # _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: cur: str, local: str, mod: str, orig: str) -> str:
"""追加 from-import 映射(pool 分配),返回新列表 """追加 from-import 映射(pool 分配),返回新列表
@@ -1716,7 +1716,7 @@ def _vpi_typedef_visited_mark(sha1: str) -> None:
_g_vpi_typedef_visited_count += 1 _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, import_mods: str,
temp_dir: str, temp_dir: str,
depth: int) -> int: depth: int) -> int:
@@ -1771,7 +1771,7 @@ def _vpi_register_typedef_closure(pool: rowptr[memhub.MemBuddy],
vpi_path_r[td_len + 3] = '/' vpi_path_r[td_len + 3] = '/'
string.strcpy(vpi_path_r + td_len + 4, sha1_r) string.strcpy(vpi_path_r + td_len + 4, sha1_r)
string.strcpy(vpi_path_r + td_len + 4 + 16, ".vpi") 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: if f_r.closed:
stdlib.free(vpi_path_r) stdlib.free(vpi_path_r)
continue continue
@@ -1899,7 +1899,7 @@ def _vpi_register_typedef_closure(pool: rowptr[memhub.MemBuddy],
# Args: pool 内存池;mod 当前 LLVM 模块;vpi_path .vpi 文件路径;trans 翻译器对象 # Args: pool 内存池;mod 当前 LLVM 模块;vpi_path .vpi 文件路径;trans 翻译器对象
# Returns: 1=成功,0=失败 # Returns: 1=成功,0=失败
# ============================================================ # ============================================================
def ParseVpiIntoModule(pool: rowptr[memhub.MemBuddy], def ParseVpiIntoModule(pool: rawptr[memhub.MemBuddy],
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
vpi_path: str, vpi_path: str,
trans: HT.Translator | t.CPtr) -> int: trans: HT.Translator | t.CPtr) -> int:
@@ -1918,7 +1918,7 @@ def ParseVpiIntoModule(pool: rowptr[memhub.MemBuddy],
return ret return ret
def _ParseVpiIntoModuleImpl(pool: rowptr[memhub.MemBuddy], def _ParseVpiIntoModuleImpl(pool: rawptr[memhub.MemBuddy],
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
vpi_path: str, vpi_path: str,
trans: HT.Translator | t.CPtr) -> int: trans: HT.Translator | t.CPtr) -> int:
@@ -1927,7 +1927,7 @@ def _ParseVpiIntoModuleImpl(pool: rowptr[memhub.MemBuddy],
return 0 return 0
# 1. 读取 .vpi 文件 # 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: if f.closed:
return 0 return 0
vpi_buf: bytes = stdlib.malloc(VPI_READ_BUF_SIZE) vpi_buf: bytes = stdlib.malloc(VPI_READ_BUF_SIZE)
@@ -2004,7 +2004,7 @@ def _ParseVpiIntoModuleImpl(pool: rowptr[memhub.MemBuddy],
elif sk == ast.ASTKind.ImportFrom: elif sk == ast.ASTKind.ImportFrom:
sifr: ast.ImportFrom | t.CPtr = (ast.ImportFrom | t.CPtr)(schild) sifr: ast.ImportFrom | t.CPtr = (ast.ImportFrom | t.CPtr)(schild)
sifr_mod: str = sifr.module 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 保持原样,避免未确认路径形态时做过深上溯)。 # 故按 stub 自身相对路径还原包名(ast/parser.vp → "ast"),level==1 时拼成完整模块名 "ast.base" 再登记(level>1 保持原样,避免未确认路径形态时做过深上溯)。
sifr_mod_q: str = sifr_mod sifr_mod_q: str = sifr_mod
if sifr_mod is not None and sifr_mod[0] != '\0' and sifr.level == 1: 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 时 # [D26 fail-fast] 包 __init__ 的 from-import 解析不出子模块 sha1 时
# **不再静默跳过**:跳过会让该子模块的类一个都注册不上 → 包 stub 里 # **不再静默跳过**:跳过会让该子模块的类一个都注册不上 → 包 stub 里
# 引用这些类的注解在后续解析时落空 → 报错点远离真因(实测:报错指向 # 引用这些类的注解在后续解析时落空 → 报错点远离真因(实测:报错指向
# ast/__init__.vpi 的 `parse_expression -> rowptr[Expression]`,而 # ast/__init__.vpi 的 `parse_expression -> rawptr[Expression]`,而
# Expression 定义在 ast.stmts,真因是子模块 sha1 查找/注入失败)。 # Expression 定义在 ast.stmts,真因是子模块 sha1 查找/注入失败)。
# 此处直接给出包名与子模块名(含补前缀后的精确名)便于定位。 # 此处直接给出包名与子模块名(含补前缀后的精确名)便于定位。
if is_pkg_init_rt != 0 and sub_sha1_rt is None \ if is_pkg_init_rt != 0 and sub_sha1_rt is None \
@@ -2311,7 +2311,7 @@ def ResetVpiInjectVisited() -> None:
_vpi_inj_depth = 0 _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, mod: llvmlite.LLVMModule | t.CPtr,
dep_sha1: str, dep_sha1: str,
trans: HT.Translator | t.CPtr) -> int: 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) viperlib.snprintf(path_i, path_len_i, "%s/%s/%s.vpi", temp_dir, sub_i, dep_sha1)
else: else:
viperlib.snprintf(path_i, path_len_i, "%s/%s.vpi", temp_dir, dep_sha1) 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: if vf_i.closed:
stdlib.free(path_i) stdlib.free(path_i)
return 0 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 需要) # 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, mod: llvmlite.LLVMModule | t.CPtr,
src_name: str, src_name: str,
local_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。 # 2) 未注册 → 解析字段类型 → 创建命名 StructType("sha1.ClassName") → register_struct + add_visible_struct。
# 字段解析失败不 fatal(不注册该类,留给源模块编译注册,后续裸类名引用由调用侧 fail-fast 暴露)。 # 字段解析失败不 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, mod: llvmlite.LLVMModule | t.CPtr,
class_cd: ast.ClassDef | t.CPtr, class_cd: ast.ClassDef | t.CPtr,
cls_name: str, 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 即可。 # 指针引用(Ptr(Struct))无需——_scan_type_for_cross_module_refs 的 Ptr 分支添加 opaque 即可。
# ============================================================ # ============================================================
def _ensure_full_value_types(mod: llvmlite.LLVMModule | t.CPtr, def _ensure_full_value_types(mod: llvmlite.LLVMModule | t.CPtr,
pool: rowptr[memhub.MemBuddy], pool: rawptr[memhub.MemBuddy],
ty: llvmlite.LLVMType | t.CPtr) -> None: ty: llvmlite.LLVMType | t.CPtr) -> None:
"""递归为值 struct / 数组元素 struct 注册完整定义(递归深度守卫)""" """递归为值 struct / 数组元素 struct 注册完整定义(递归深度守卫)"""
if mod is None or pool is None or ty is None: 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)。 # * TPV 内部函数/方法(存在 define 侧)→ Ptr(struct):与定义侧逐字一致,指针目标只需 opaque 声明(module_ensure_opaque_for_type)。
# ============================================================ # ============================================================
def _AggregateParamTy(mod: llvmlite.LLVMModule | t.CPtr, def _AggregateParamTy(mod: llvmlite.LLVMModule | t.CPtr,
pool: rowptr[memhub.MemBuddy], pool: rawptr[memhub.MemBuddy],
ty: llvmlite.LLVMType | t.CPtr, ty: llvmlite.LLVMType | t.CPtr,
is_c_abi: int) -> llvmlite.LLVMType | t.CPtr: is_c_abi: int) -> llvmlite.LLVMType | t.CPtr:
"""裸结构体形参类型(C ABI 按值 / 内部 Ptr(struct),见上方注释)""" """裸结构体形参类型(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 按名链接), # vpi 里模块级全局变量(如 tokens.vp 的 _op_head: OpEntry | t.CPtr = None)需在当前模块创建 external global 声明(短名 @name,COFF 按名链接),
# 否则跨模块 from-import 读取全局变量时 find_global_in_module 找不到 → 误杀「跨模块全局变量类型未知(stub 未注入)」。 # 否则跨模块 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, mod: llvmlite.LLVMModule | t.CPtr,
aa: ast.AnnAssign | t.CPtr, aa: ast.AnnAssign | t.CPtr,
trans: HT.Translator | 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 并添加参数, # 用 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, mod: llvmlite.LLVMModule | t.CPtr,
fd: ast.FunctionDef | t.CPtr, fd: ast.FunctionDef | t.CPtr,
trans: HT.Translator | 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*)。 # 方法混淆名 {src_sha1}.{ClassName}.{method};参数类型从 vpi 注解解析(self 无注解时默认为 i8*)。
# 注入正确签名可避免调用时 _ensure_method_declare 用实参类型创建错误 declare(如 size: sizet 被写成 i32 而非 i64)。 # 注入正确签名可避免调用时 _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, mod: llvmlite.LLVMModule | t.CPtr,
m_fd: ast.FunctionDef | t.CPtr, m_fd: ast.FunctionDef | t.CPtr,
cls_name: str, cls_name: str,
@@ -3246,7 +3246,7 @@ def _inject_method_declare(pool: rowptr[memhub.MemBuddy],
# 提取 NAME: t.CTypedef = Type 中的名称和类型表达式字符串, # 提取 NAME: t.CTypedef = Type 中的名称和类型表达式字符串,
# 调用 register_ctypedef 注册到动态 CTypedef 表。 # 调用 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: aa: ast.AnnAssign | t.CPtr) -> None:
"""从 AnnAssign 节点提取并注册 CTypedef""" """从 AnnAssign 节点提取并注册 CTypedef"""
if aa is None or pool is None: 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") dep_path: str = StubMergerCollect._sliced_path(temp_dir, td_len, dep_sha1, "stub.ll")
if dep_path is None: if dep_path is None:
return out_pos 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: if df_ls.closed:
stdlib.free(dep_path) stdlib.free(dep_path)
# 依赖 stub 缺失:includes 映射内的模块缺失属编译错误(fail-fast), # 依赖 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") text_path: str = StubMergerCollect._sliced_path(temp_dir, td_len, dep_sha1, "text.ll")
if text_path is None: if text_path is None:
return out_pos 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: if tf_lt.closed:
stdlib.free(text_path) stdlib.free(text_path)
# 依赖 text 缺失:includes 映射内的模块缺失属编译错误(fail-fast), # 依赖 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 根目录(空格分隔) # 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 失败) # 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, temp_dir: str,
reachable_set: str, reachable_set: str,
app_deps: str = None, 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) td_len_w: sizet = string.strlen(temp_dir)
deps_path_w: str = StubMergerCollect._sliced_path(temp_dir, td_len_w, sha1_r2, "deps.txt") deps_path_w: str = StubMergerCollect._sliced_path(temp_dir, td_len_w, sha1_r2, "deps.txt")
if deps_path_w is not None: 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: if not df_w.closed:
dl_w: sizet = string.strlen(deps_r2) dl_w: sizet = string.strlen(deps_r2)
if dl_w > 0: 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") stub_path: str = StubMergerCollect._sliced_path(temp_dir, td_len, local_sha1, "stub.ll")
if stub_path is None: if stub_path is None:
return 0 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: if sf.closed:
stdlib.free(stub_path) stdlib.free(stub_path)
return 0 return 0
@@ -1434,7 +1434,7 @@ def BuildCombinedIR(temp_dir: str, local_sha1: str,
deps_loaded: int = 0 deps_loaded: int = 0
deps_path: str = StubMergerCollect._sliced_path(temp_dir, td_len, local_sha1, "deps.txt") deps_path: str = StubMergerCollect._sliced_path(temp_dir, td_len, local_sha1, "deps.txt")
if deps_path is not None: 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: if not df_deps.closed:
deps_buf = stdlib.malloc(4096) deps_buf = stdlib.malloc(4096)
if deps_buf is not None: if deps_buf is not None:
@@ -1576,7 +1576,7 @@ def BuildCombinedIR(temp_dir: str, local_sha1: str,
# 检查 stub 文件是否存在 # 检查 stub 文件是否存在
chk_path: str = StubMergerCollect._sliced_path(temp_dir, td_len, found_s, "stub.ll") chk_path: str = StubMergerCollect._sliced_path(temp_dir, td_len, found_s, "stub.ll")
if chk_path is not None: 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: if chk_f.closed:
VLogger.error(f"依赖模块 '{mod_nm}' (sha1={found_s}) 的 stub 文件不存在: {chk_path},立即终止编译", "BuildCombinedIR") VLogger.error(f"依赖模块 '{mod_nm}' (sha1={found_s}) 的 stub 文件不存在: {chk_path},立即终止编译", "BuildCombinedIR")
chk_f.close() 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") text_path: str = StubMergerCollect._sliced_path(temp_dir, td_len, local_sha1, "text.ll")
if text_path is None: if text_path is None:
return out_pos 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: if tf.closed:
# 本地 text.ll 缺失:合并 IR 无法生成定义块,fail-fast 终止 # 本地 text.ll 缺失:合并 IR 无法生成定义块,fail-fast 终止
VLogger.error(f"本地 text.ll 缺失: {text_path}", "StubMerger") 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 翻译器对象 # Args: pool 内存池;mod 当前 LLVM 模块;imported_modules 已导入模块名字符串(空格分隔);from_imports from-import 映射字符串("name:module name:module" 格式);temp_dir temp 目录路径;trans 翻译器对象
# Returns: 成功加载的 .vpi 文件数 # Returns: 成功加载的 .vpi 文件数
# ============================================================ # ============================================================
def LoadDepVpiIntoModule(pool: rowptr[memhub.MemBuddy], def LoadDepVpiIntoModule(pool: rawptr[memhub.MemBuddy],
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
imported_modules: str, imported_modules: str,
from_imports: 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") vpi_path: str = StubMergerCollect._sliced_path(temp_dir, td_len, sha1_val, "vpi")
if vpi_path is not None: if vpi_path is not None:
# 检查 .vpi 文件是否存在(可读) # 检查 .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: if not vf.closed:
vf.close() vf.close()
# 调用 VpiReader 解析 .vpi 并注入 declare # 调用 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: if out_count >= max_count:
return out_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: if find_data is None:
return out_count return out_count
string.memset(find_data, 0, win32file.WIN32_FIND_DATAA.__sizeof__()) 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)。 # 数据来源是 PopulateSha1MapStore 填充的全局存储器(不读取 _sha1_map.txt)。
# 用于过滤 stub 文件,避免加载 TransPyV 自身源文件(lib/*)的 stub 导致链接失败。 # 用于过滤 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, temp_dir: str,
sha1_set: str) -> int: sha1_set: str) -> int:
"""从全局内存存储器将 includes 的 SHA1 写入 sha1_set """从全局内存存储器将 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 扫描结果 # Args: mb 内存池;temp_dir 临时目录(_sha1_map.txt 写入位置);scan_result IncludesScanner 扫描结果
# Returns: 0 成功,非 0 失败 # Returns: 0 成功,非 0 失败
# ============================================================ # ============================================================
def WriteIncludesSha1Map(mb: rowptr[memhub.MemBuddy], temp_dir: str, def WriteIncludesSha1Map(mb: rawptr[memhub.MemBuddy], temp_dir: str,
scan_result: rowptr[IncludesScanner.ScanResult], scan_result: rawptr[IncludesScanner.ScanResult],
filter_set: str, filter_set: str,
filter_count: int) -> int: filter_count: int) -> int:
"""将 includes 扫描结果写入 _sha1_map.txt(人类可读输出,程序内部使用内存存储器) """将 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) viperlib.snprintf(map_path, dir_len + 32, "%s/_sha1_map.txt", temp_dir)
# 打开文件写入(CREATE_ALWAYS) # 打开文件写入(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: if f.closed:
return 1 return 1
@@ -238,7 +238,7 @@ def WriteIncludesSha1Map(mb: rowptr[memhub.MemBuddy], temp_dir: str,
written_count: int = 0 written_count: int = 0
for i in range(scan_result.Count): for i in range(scan_result.Count):
ea_w: uint64 = uint64(scan_result.Entries) + i * entry_size_w 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: if ent_w is None or ent_w.Sha1 is None or ent_w.RelPath is None:
continue continue
# 若提供过滤集合,只写入集合中的条目 # 若提供过滤集合,只写入集合中的条目
+1 -1
View File
@@ -27,7 +27,7 @@ import lib.Projectrans.Config as Config
# ============================================================ # ============================================================
# 全局 mbuddy 指针 # 全局 mbuddy 指针
_mbuddy: rowptr[memhub.MemBuddy] _mbuddy: rawptr[memhub.MemBuddy]
# 最大 includes SHA1 数(用于过滤) # 最大 includes SHA1 数(用于过滤)
MAX_INCLUDES_SHA1: t.CDefine = 1024 MAX_INCLUDES_SHA1: t.CDefine = 1024
+1 -1
View File
@@ -10,4 +10,4 @@ import lib.core.VLogger as VLogger
# 全局 mbuddy 内存池指针(由 App/main.vp 初始化后注入) # 全局 mbuddy 内存池指针(由 App/main.vp 初始化后注入)
# 注意: 使用 MemBuddy 类型而非 MemManager,避免虚函数分派不工作时调用父类 alloc 返回 None # 注意: 使用 MemBuddy 类型而非 MemManager,避免虚函数分派不工作时调用父类 alloc 返回 None
_mbuddy: rowptr[memhub.MemBuddy] _mbuddy: rawptr[memhub.MemBuddy]
+4 -4
View File
@@ -8,8 +8,8 @@ import memhub
@t.NoVTable @t.NoVTable
class CompilerFactory: class CompilerFactory:
"""编译器结构体工厂(持有主池/永久池等共享对象)""" """编译器结构体工厂(持有主池/永久池等共享对象)"""
Pool: rowptr[memhub.MemBuddy] # 主内存池(瞬时数据,mark/reset 回收) Pool: rawptr[memhub.MemBuddy] # 主内存池(瞬时数据,mark/reset 回收)
PermPool: rowptr[memhub.MemBuddy] # 永久内存池(持久数据,从不 reset) PermPool: rawptr[memhub.MemBuddy] # 永久内存池(持久数据,从不 reset)
# ---- REnum 变体注册表(编译期单例持有,与 perm_pool 的 struct entry 同寿命)---- # ---- REnum 变体注册表(编译期单例持有,与 perm_pool 的 struct entry 同寿命)----
RenumClassNames: sizet | t.CPtr RenumClassNames: sizet | t.CPtr
@@ -26,10 +26,10 @@ class CompilerFactory:
RenumAliasVariant: sizet | t.CPtr RenumAliasVariant: sizet | t.CPtr
RenumAliasCount: int RenumAliasCount: int
def __init__(self, pool: rowptr[memhub.MemBuddy], perm_pool: rowptr[memhub.MemBuddy]): def __init__(self, pool: rawptr[memhub.MemBuddy], perm_pool: rawptr[memhub.MemBuddy]):
if self is None: return if self is None: return
self.Pool = pool self.Pool = pool
self.PermPool = perm_pool self.PermPool = perm_pool
# 全局工厂单例 # 全局工厂单例
factory: rowptr[CompilerFactory] = None factory: rawptr[CompilerFactory] = None
+20 -20
View File
@@ -156,7 +156,7 @@ class AssignGenMixin:
# register_cdefine_double,否则 translate_value 查表得 0 生成 # register_cdefine_double,否则 translate_value 查表得 0 生成
# ret i32 0(llc 报错 "value doesn't match function result type")。 # ret i32 0(llc 报错 "value doesn't match function result type")。
# ============================================================ # ============================================================
def _register_cdefine_from_value(self, pool: rowptr[memhub.MemBuddy], def _register_cdefine_from_value(self, pool: rawptr[memhub.MemBuddy],
name: str, val_node: ast.AST | t.CPtr) -> None: name: str, val_node: ast.AST | t.CPtr) -> None:
"""注册 CDefine 常量(浮点字面量 → register_cdefine_double,否则整数)""" """注册 CDefine 常量(浮点字面量 → register_cdefine_double,否则整数)"""
if pool is None or name is None: if pool is None or name is None:
@@ -220,7 +220,7 @@ class AssignGenMixin:
fp: str = self.Gen.TypeGenResolve.get_current_file() fp: str = self.Gen.TypeGenResolve.get_current_file()
if fp is None or name is None or out is None: if fp is None or name is None or out is None:
return 0 return 0
f: rowptr[fileio.File] = fileio.File(fp, fileio.MODE.R) f: rawptr[fileio.File] = fileio.File(fp, fileio.MODE.R)
if f.closed: if f.closed:
return 0 return 0
BUF_SZ: sizet = 1048576 BUF_SZ: sizet = 1048576
@@ -418,7 +418,7 @@ class AssignGenMixin:
return 1 return 1
return 0 return 0
def _stg_ty_equal(self, pool: rowptr[memhub.MemBuddy], def _stg_ty_equal(self, pool: rawptr[memhub.MemBuddy],
ta: llvmlite.LLVMType | t.CPtr, ta: llvmlite.LLVMType | t.CPtr,
tb: llvmlite.LLVMType | t.CPtr) -> int: tb: llvmlite.LLVMType | t.CPtr) -> int:
"""类型内容相等比较(storage 绑定判定用)。 """类型内容相等比较(storage 绑定判定用)。
@@ -610,7 +610,7 @@ class AssignGenMixin:
# 0 成功,1 失败 # 0 成功,1 失败
# ============================================================ # ============================================================
def _init_global_array_from_list(self, builder: llvmlite.IRBuilder | t.CPtr, def _init_global_array_from_list(self, builder: llvmlite.IRBuilder | t.CPtr,
pool: rowptr[memhub.MemBuddy], pool: rawptr[memhub.MemBuddy],
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
array_alloca: llvmlite.Value | t.CPtr, array_alloca: llvmlite.Value | t.CPtr,
list_node: ast.AST | t.CPtr, list_node: ast.AST | t.CPtr,
@@ -717,7 +717,7 @@ class AssignGenMixin:
# 支持浮点运算、指针算术: ptr += int / ptr -= int # 支持浮点运算、指针算术: ptr += int / ptr -= int
# 整数运算自动类型提升 # 整数运算自动类型提升
# ============================================================ # ============================================================
def _apply_aug_op(self, pool: rowptr[memhub.MemBuddy], def _apply_aug_op(self, pool: rawptr[memhub.MemBuddy],
builder: llvmlite.IRBuilder | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr,
op: int, op: int,
lhs: llvmlite.Value | t.CPtr, lhs: llvmlite.Value | t.CPtr,
@@ -821,7 +821,7 @@ class AssignGenMixin:
# Attribute 目标: self.field += 1 # Attribute 目标: self.field += 1
# 流程: get_attribute_ptr → load → binop → store # 流程: get_attribute_ptr → load → binop → store
if tk == ast.ASTKind.Attribute: if tk == ast.ASTKind.Attribute:
pool: rowptr[memhub.MemBuddy] = trans.Pool pool: rawptr[memhub.MemBuddy] = trans.Pool
builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder
mod: llvmlite.LLVMModule | t.CPtr = trans.Module mod: llvmlite.LLVMModule | t.CPtr = trans.Module
@@ -870,7 +870,7 @@ class AssignGenMixin:
# Subscript 目标: self.state[i] += x / arr[i] += x # Subscript 目标: self.state[i] += x / arr[i] += x
# 流程: get_subscript_ptr → load → binop → store # 流程: get_subscript_ptr → load → binop → store
if tk == ast.ASTKind.Subscript: if tk == ast.ASTKind.Subscript:
pool: rowptr[memhub.MemBuddy] = trans.Pool pool: rawptr[memhub.MemBuddy] = trans.Pool
builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder
mod: llvmlite.LLVMModule | t.CPtr = trans.Module mod: llvmlite.LLVMModule | t.CPtr = trans.Module
@@ -925,7 +925,7 @@ class AssignGenMixin:
if nm is None or nm.id is None: if nm is None or nm.id is None:
return 0 return 0
pool: rowptr[memhub.MemBuddy] = trans.Pool pool: rawptr[memhub.MemBuddy] = trans.Pool
builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder
mod: llvmlite.LLVMModule | t.CPtr = trans.Module mod: llvmlite.LLVMModule | t.CPtr = trans.Module
@@ -1075,7 +1075,7 @@ class AssignGenMixin:
# 单参 t.CArray[elem_ty] 本解析为 Ptr(elem_ty),RHS 为列表字面量时按 TPC # 单参 t.CArray[elem_ty] 本解析为 Ptr(elem_ty),RHS 为列表字面量时按 TPC
# ParseListAnnotation 语义推断为静态数组(否则误走动态 list 构造 → 链接期 undefined)。 # ParseListAnnotation 语义推断为静态数组(否则误走动态 list 构造 → 链接期 undefined)。
# PreScan 与 Handle 都必须调用:两处 alloca 类型须一致,否则复用旧 alloca 使推断失效。 # PreScan 与 Handle 都必须调用:两处 alloca 类型须一致,否则复用旧 alloca 使推断失效。
def _infer_static_array_ty_from_literal(self, pool: rowptr[memhub.MemBuddy], def _infer_static_array_ty_from_literal(self, pool: rawptr[memhub.MemBuddy],
annot: ast.AST | t.CPtr, annot: ast.AST | t.CPtr,
value: ast.AST | t.CPtr, value: ast.AST | t.CPtr,
resolved_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.LLVMType | t.CPtr: resolved_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.LLVMType | t.CPtr:
@@ -1109,7 +1109,7 @@ class AssignGenMixin:
# 以及 builtins 最后匹配的诊断结果(_lookup_builtins_typedef 记录), # 以及 builtins 最后匹配的诊断结果(_lookup_builtins_typedef 记录),
# 便于直接定位是"注解本身未注册"还是"builtins 扫描未命中/未展开"。 # 便于直接定位是"注解本身未注册"还是"builtins 扫描未命中/未展开"。
# ============================================================ # ============================================================
def _build_ann_fail_msg(self, pool: rowptr[memhub.MemBuddy], def _build_ann_fail_msg(self, pool: rawptr[memhub.MemBuddy],
annot: ast.AST | t.CPtr, nm_id: str) -> str: annot: ast.AST | t.CPtr, nm_id: str) -> str:
"""构建变量类型注解解析失败的详细报错信息 """构建变量类型注解解析失败的详细报错信息
@@ -1166,7 +1166,7 @@ class AssignGenMixin:
# 供后续 t.CArray[elem_ty, NAME] 编译期解析使用 # 供后续 t.CArray[elem_ty, NAME] 编译期解析使用
# 浮点/整数自动识别(与 Handle/handle_module_level_var 路径一致) # 浮点/整数自动识别(与 Handle/handle_module_level_var 路径一致)
if self.is_cdefine_annotation(aa.annotation) != 0: if self.is_cdefine_annotation(aa.annotation) != 0:
pool_ps: rowptr[memhub.MemBuddy] = trans.Pool pool_ps: rawptr[memhub.MemBuddy] = trans.Pool
self._register_cdefine_from_value(pool_ps, nm.id, aa.value) self._register_cdefine_from_value(pool_ps, nm.id, aa.value)
return 0 return 0
@@ -1195,7 +1195,7 @@ class AssignGenMixin:
if existing is not None: if existing is not None:
return 0 return 0
pool: rowptr[memhub.MemBuddy] = trans.Pool pool: rawptr[memhub.MemBuddy] = trans.Pool
builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder
# 从 annotation 推断类型(修复:原硬编码 i32 导致 str 等类型错误) # 从 annotation 推断类型(修复:原硬编码 i32 导致 str 等类型错误)
@@ -1264,7 +1264,7 @@ class AssignGenMixin:
# _specialize_generic_class 幂等,重复调用安全。 # _specialize_generic_class 幂等,重复调用安全。
# 返回 1=执行过特化尝试;0=注解形态不适用(非泛型 Subscript)。 # 返回 1=执行过特化尝试;0=注解形态不适用(非泛型 Subscript)。
def _prespecialize_generic_annotation(self, trans: HT.Translator | t.CPtr, def _prespecialize_generic_annotation(self, trans: HT.Translator | t.CPtr,
pool: rowptr[memhub.MemBuddy], pool: rawptr[memhub.MemBuddy],
annot: ast.AST | t.CPtr) -> int: annot: ast.AST | t.CPtr) -> int:
"""泛型注解预特化(见上方注释),返回 1=已尝试 / 0=不适用""" """泛型注解预特化(见上方注释),返回 1=已尝试 / 0=不适用"""
if annot is None or trans is None: if annot is None or trans is None:
@@ -1384,7 +1384,7 @@ class AssignGenMixin:
# 注册到全局 CDefine 表供 t.CArray[elem_ty, NAME] 解析 # 注册到全局 CDefine 表供 t.CArray[elem_ty, NAME] 解析
# 注: PreScan 已注册过,此处保证即使跳过 PreScan 也能正确注册 # 注: PreScan 已注册过,此处保证即使跳过 PreScan 也能正确注册
if self.is_cdefine_annotation(aa.annotation) != 0: if self.is_cdefine_annotation(aa.annotation) != 0:
pool_cd: rowptr[memhub.MemBuddy] = trans.Pool pool_cd: rawptr[memhub.MemBuddy] = trans.Pool
self._register_cdefine_from_value(pool_cd, nm.id, aa.value) self._register_cdefine_from_value(pool_cd, nm.id, aa.value)
return 0 return 0
@@ -1395,13 +1395,13 @@ class AssignGenMixin:
# 解析查表失败 → NameError: mode_t。仅登记类型表达式,不创建全局/ # 解析查表失败 → NameError: mode_t。仅登记类型表达式,不创建全局/
# 局部存储——否则生成 @mode_t 符号,链接 duplicate symbol warning。 # 局部存储——否则生成 @mode_t 符号,链接 duplicate symbol warning。
if self.is_ctypedef_annotation(aa.annotation) != 0: if self.is_ctypedef_annotation(aa.annotation) != 0:
pool_ct: rowptr[memhub.MemBuddy] = trans.Pool pool_ct: rawptr[memhub.MemBuddy] = trans.Pool
ctd_str: str = self.Gen.TypeGenResolve._get_type_name_from_annotation(pool_ct, aa.value) ctd_str: str = self.Gen.TypeGenResolve._get_type_name_from_annotation(pool_ct, aa.value)
if ctd_str is not None: if ctd_str is not None:
self.Gen.TypeGenCType.register_ctypedef(pool_ct, nm.id, ctd_str) self.Gen.TypeGenCType.register_ctypedef(pool_ct, nm.id, ctd_str)
return 0 return 0
pool: rowptr[memhub.MemBuddy] = trans.Pool pool: rawptr[memhub.MemBuddy] = trans.Pool
builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder
mod: llvmlite.LLVMModule | t.CPtr = trans.Module mod: llvmlite.LLVMModule | t.CPtr = trans.Module
@@ -1917,7 +1917,7 @@ class AssignGenMixin:
return 0 return 0
# 从 trans 取共享状态(替代 11 个参数) # 从 trans 取共享状态(替代 11 个参数)
pool: rowptr[memhub.MemBuddy] = trans.Pool pool: rawptr[memhub.MemBuddy] = trans.Pool
builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder
mod: llvmlite.LLVMModule | t.CPtr = trans.Module mod: llvmlite.LLVMModule | t.CPtr = trans.Module
@@ -2423,7 +2423,7 @@ class AssignGenMixin:
# Attribute → 字段注解类名(委托 Generator 单例 _resolve_attr_field_class) # Attribute → 字段注解类名(委托 Generator 单例 _resolve_attr_field_class)
# 仅当目标为已注册结构体时采用,与"按需过滤,找不到 fast-fail"原则一致。 # 仅当目标为已注册结构体时采用,与"按需过滤,找不到 fast-fail"原则一致。
# ============================================================ # ============================================================
def _infer_rhs_annot(self, pool: rowptr[memhub.MemBuddy], def _infer_rhs_annot(self, pool: rawptr[memhub.MemBuddy],
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
node: ast.AST | t.CPtr, node: ast.AST | t.CPtr,
trans: HT.Translator | t.CPtr, trans: HT.Translator | t.CPtr,
@@ -2545,7 +2545,7 @@ class AssignGenMixin:
# CFloat64T/t.CPtr 等均不注册 struct,天然过滤)。"A | B" 联合 # CFloat64T/t.CPtr 等均不注册 struct,天然过滤)。"A | B" 联合
# 多候选时取首个命中段。 # 多候选时取首个命中段。
# ============================================================ # ============================================================
def _extract_annot_class_name(self, pool: rowptr[memhub.MemBuddy], def _extract_annot_class_name(self, pool: rawptr[memhub.MemBuddy],
annot: str) -> str: annot: str) -> str:
"""从返回注解文本提取已注册结构体类名,无命中返回 None""" """从返回注解文本提取已注册结构体类名,无命中返回 None"""
if pool is None or annot is None: if pool is None or annot is None:
@@ -2621,7 +2621,7 @@ class AssignGenMixin:
# 或跨模块类有 SHA1(stub 中声明)即视为存在。仅在确实存在时 # 或跨模块类有 SHA1(stub 中声明)即视为存在。仅在确实存在时
# 才采用运算符重载推断的类名,避免把原生运算误标为类类型。 # 才采用运算符重载推断的类名,避免把原生运算误标为类类型。
# ============================================================ # ============================================================
def _cls_has_dunder(self, pool: rowptr[memhub.MemBuddy], def _cls_has_dunder(self, pool: rawptr[memhub.MemBuddy],
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
class_name: str, dunder: str) -> int: class_name: str, dunder: str) -> int:
"""类及其 MRO 祖先链中是否存在 dunder 方法,存在返回 1""" """类及其 MRO 祖先链中是否存在 dunder 方法,存在返回 1"""
+27 -27
View File
@@ -68,7 +68,7 @@ class AsyncGenMixin(CallGenBase.CallGenBase):
if fd is None or fd.name is None or trans is None: if fd is None or fd.name is None or trans is None:
return 0 return 0
name: str = fd.name name: str = fd.name
pool: rowptr[memhub.MemBuddy] = trans.Pool pool: rawptr[memhub.MemBuddy] = trans.Pool
mod: llvmlite.LLVMModule | t.CPtr = trans.Module mod: llvmlite.LLVMModule | t.CPtr = trans.Module
if pool is None or mod is None: if pool is None or mod is None:
return 0 return 0
@@ -712,7 +712,7 @@ class AsyncGenMixin(CallGenBase.CallGenBase):
# 帧结构体 %Coro_<name> = { i32 state, i32 done, i32 ret, <局部槽>* } # 帧结构体 %Coro_<name> = { i32 state, i32 done, i32 ret, <局部槽>* }
# 槽索引: 0=state 1=done 2=ret 3..3+nlocals-1=局部变量 # 槽索引: 0=state 1=done 2=ret 3..3+nlocals-1=局部变量
# ============================================================ # ============================================================
def _build_frame_ty(self, pool: rowptr[memhub.MemBuddy], def _build_frame_ty(self, pool: rawptr[memhub.MemBuddy],
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
trans: HT.Translator | t.CPtr, trans: HT.Translator | t.CPtr,
name: str, name: str,
@@ -767,7 +767,7 @@ class AsyncGenMixin(CallGenBase.CallGenBase):
# ============================================================ # ============================================================
# create_<name>() -> %Coro_<name>* # create_<name>() -> %Coro_<name>*
# ============================================================ # ============================================================
def _emit_create(self, pool: rowptr[memhub.MemBuddy], def _emit_create(self, pool: rawptr[memhub.MemBuddy],
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
trans: HT.Translator | t.CPtr, trans: HT.Translator | t.CPtr,
name: str, name: str,
@@ -928,7 +928,7 @@ class AsyncGenMixin(CallGenBase.CallGenBase):
# ============================================================ # ============================================================
# M7:每帧类型的全局 free-list 池头(i64,0 = 空) # M7:每帧类型的全局 free-list 池头(i64,0 = 空)
# ============================================================ # ============================================================
def _get_coro_pool(self, pool: rowptr[memhub.MemBuddy], def _get_coro_pool(self, pool: rawptr[memhub.MemBuddy],
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
trans: HT.Translator | t.CPtr, trans: HT.Translator | t.CPtr,
name: str) -> llvmlite.GlobalVariable | t.CPtr: name: str) -> llvmlite.GlobalVariable | t.CPtr:
@@ -974,7 +974,7 @@ class AsyncGenMixin(CallGenBase.CallGenBase):
# ============================================================ # ============================================================
# resume_<name>(%Coro_<name>*) -> i32 状态机(静态段切分) # resume_<name>(%Coro_<name>*) -> i32 状态机(静态段切分)
# ============================================================ # ============================================================
def _emit_resume(self, pool: rowptr[memhub.MemBuddy], def _emit_resume(self, pool: rawptr[memhub.MemBuddy],
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
trans: HT.Translator | t.CPtr, trans: HT.Translator | t.CPtr,
name: str, name: str,
@@ -1204,7 +1204,7 @@ class AsyncGenMixin(CallGenBase.CallGenBase):
# ============================================================ # ============================================================
def _handle_segment(self, trans: HT.Translator | t.CPtr, def _handle_segment(self, trans: HT.Translator | t.CPtr,
builder: llvmlite.IRBuilder | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr,
pool: rowptr[memhub.MemBuddy], pool: rawptr[memhub.MemBuddy],
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
stmts: list[ast.AST | t.CPtr] | t.CPtr): stmts: list[ast.AST | t.CPtr] | t.CPtr):
"""递归翻译协程体语句。builder 当前块 = 活跃执行块(state0 或某恢复块)。""" """递归翻译协程体语句。builder 当前块 = 活跃执行块(state0 或某恢复块)。"""
@@ -1300,7 +1300,7 @@ class AsyncGenMixin(CallGenBase.CallGenBase):
# ============================================================ # ============================================================
def _handle_coro_if(self, trans: HT.Translator | t.CPtr, def _handle_coro_if(self, trans: HT.Translator | t.CPtr,
builder: llvmlite.IRBuilder | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr,
pool: rowptr[memhub.MemBuddy], pool: rawptr[memhub.MemBuddy],
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
stmt: ast.AST | t.CPtr): stmt: ast.AST | t.CPtr):
ifn: ast.If | t.CPtr = (ast.If | t.CPtr)(stmt) ifn: ast.If | t.CPtr = (ast.If | t.CPtr)(stmt)
@@ -1350,7 +1350,7 @@ class AsyncGenMixin(CallGenBase.CallGenBase):
# ============================================================ # ============================================================
def _handle_coro_while(self, trans: HT.Translator | t.CPtr, def _handle_coro_while(self, trans: HT.Translator | t.CPtr,
builder: llvmlite.IRBuilder | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr,
pool: rowptr[memhub.MemBuddy], pool: rawptr[memhub.MemBuddy],
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
stmt: ast.AST | t.CPtr): stmt: ast.AST | t.CPtr):
whn: ast.While | t.CPtr = (ast.While | t.CPtr)(stmt) whn: ast.While | t.CPtr = (ast.While | t.CPtr)(stmt)
@@ -1400,7 +1400,7 @@ class AsyncGenMixin(CallGenBase.CallGenBase):
# ============================================================ # ============================================================
def _handle_nested_await_stmt(self, trans: HT.Translator | t.CPtr, def _handle_nested_await_stmt(self, trans: HT.Translator | t.CPtr,
builder: llvmlite.IRBuilder | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr,
pool: rowptr[memhub.MemBuddy], pool: rawptr[memhub.MemBuddy],
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
stmt: ast.AST | t.CPtr): stmt: ast.AST | t.CPtr):
"""把语句中所有嵌套 await 提升为顶层临时赋值(与预扫描 DFS 顺序一致)""" """把语句中所有嵌套 await 提升为顶层临时赋值(与预扫描 DFS 顺序一致)"""
@@ -1532,7 +1532,7 @@ class AsyncGenMixin(CallGenBase.CallGenBase):
return self._find_expr_await(sb.slice) return self._find_expr_await(sb.slice)
return None return None
def _replace_await_with_name(self, pool: rowptr[memhub.MemBuddy], def _replace_await_with_name(self, pool: rawptr[memhub.MemBuddy],
stmt: ast.AST | t.CPtr, stmt: ast.AST | t.CPtr,
temp_name: str) -> int: temp_name: str) -> int:
"""把语句树中第一个 Await 替换为 Name(temp_name)(DFS 字段序)""" """把语句树中第一个 Await 替换为 Name(temp_name)(DFS 字段序)"""
@@ -1561,7 +1561,7 @@ class AsyncGenMixin(CallGenBase.CallGenBase):
return 0 return 0
return 0 return 0
def _replace_expr_await(self, pool: rowptr[memhub.MemBuddy], def _replace_expr_await(self, pool: rawptr[memhub.MemBuddy],
node: ast.AST | t.CPtr, node: ast.AST | t.CPtr,
temp_name: str) -> int: temp_name: str) -> int:
"""在表达式树中把第一个 Await 替换为 Name(temp_name, Load)。 """在表达式树中把第一个 Await 替换为 Name(temp_name, Load)。
@@ -1698,7 +1698,7 @@ class AsyncGenMixin(CallGenBase.CallGenBase):
# 条件归一化(i1 直通;其余 icmp ne 0) # 条件归一化(i1 直通;其余 icmp ne 0)
# ============================================================ # ============================================================
def _normalize_cond(self, builder: llvmlite.IRBuilder | t.CPtr, def _normalize_cond(self, builder: llvmlite.IRBuilder | t.CPtr,
pool: rowptr[memhub.MemBuddy], pool: rawptr[memhub.MemBuddy],
cond: llvmlite.Value | t.CPtr) -> llvmlite.Value | t.CPtr: cond: llvmlite.Value | t.CPtr) -> llvmlite.Value | t.CPtr:
if cond is None: if cond is None:
return None return None
@@ -1761,7 +1761,7 @@ class AsyncGenMixin(CallGenBase.CallGenBase):
# M3:await coro_sleep(ms) —— wake 槽挂起(coro_run 轮询续跑) # M3:await coro_sleep(ms) —— wake 槽挂起(coro_run 轮询续跑)
# ============================================================ # ============================================================
def _emit_await_sleep(self, builder: llvmlite.IRBuilder | t.CPtr, def _emit_await_sleep(self, builder: llvmlite.IRBuilder | t.CPtr,
pool: rowptr[memhub.MemBuddy], pool: rawptr[memhub.MemBuddy],
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
trans: HT.Translator | t.CPtr, trans: HT.Translator | t.CPtr,
node: ast.AST | t.CPtr) -> llvmlite.Value | t.CPtr: node: ast.AST | t.CPtr) -> llvmlite.Value | t.CPtr:
@@ -1812,7 +1812,7 @@ class AsyncGenMixin(CallGenBase.CallGenBase):
# M4-M6:协程内 raise(异常类型/值 → 帧 exc 槽) # M4-M6:协程内 raise(异常类型/值 → 帧 exc 槽)
# ============================================================ # ============================================================
def _handle_coro_raise(self, builder: llvmlite.IRBuilder | t.CPtr, def _handle_coro_raise(self, builder: llvmlite.IRBuilder | t.CPtr,
pool: rowptr[memhub.MemBuddy], pool: rawptr[memhub.MemBuddy],
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
trans: HT.Translator | t.CPtr, trans: HT.Translator | t.CPtr,
stmt: ast.AST | t.CPtr): stmt: ast.AST | t.CPtr):
@@ -1849,7 +1849,7 @@ class AsyncGenMixin(CallGenBase.CallGenBase):
llvmlite.build_store(builder, done_r, trans._coro_done_ptr) llvmlite.build_store(builder, done_r, trans._coro_done_ptr)
llvmlite.build_br(builder, trans._coro_exit_bb) llvmlite.build_br(builder, trans._coro_exit_bb)
def _resolve_raise_code(self, pool: rowptr[memhub.MemBuddy], def _resolve_raise_code(self, pool: rawptr[memhub.MemBuddy],
exc_node: ast.AST | t.CPtr) -> int: exc_node: ast.AST | t.CPtr) -> int:
"""解析 raise 目标的异常码(内置/用户异常类名);非异常类返回 0""" """解析 raise 目标的异常码(内置/用户异常类名);非异常类返回 0"""
if exc_node is None: if exc_node is None:
@@ -1871,7 +1871,7 @@ class AsyncGenMixin(CallGenBase.CallGenBase):
return self.Gen.ClassGenBase.lookup_exception_code(name) return self.Gen.ClassGenBase.lookup_exception_code(name)
def _resolve_raise_msg(self, builder: llvmlite.IRBuilder | t.CPtr, def _resolve_raise_msg(self, builder: llvmlite.IRBuilder | t.CPtr,
pool: rowptr[memhub.MemBuddy], pool: rawptr[memhub.MemBuddy],
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
trans: HT.Translator | t.CPtr, trans: HT.Translator | t.CPtr,
exc_node: ast.AST | t.CPtr) -> llvmlite.Value | t.CPtr: exc_node: ast.AST | t.CPtr) -> llvmlite.Value | t.CPtr:
@@ -1889,7 +1889,7 @@ class AsyncGenMixin(CallGenBase.CallGenBase):
# ============================================================ # ============================================================
def _handle_coro_try(self, trans: HT.Translator | t.CPtr, def _handle_coro_try(self, trans: HT.Translator | t.CPtr,
builder: llvmlite.IRBuilder | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr,
pool: rowptr[memhub.MemBuddy], pool: rawptr[memhub.MemBuddy],
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
stmt: ast.AST | t.CPtr): stmt: ast.AST | t.CPtr):
"""协程内 try/except:raise/await 传播异常在 try 栈内改跳 except 处理器; """协程内 try/except:raise/await 传播异常在 try 栈内改跳 except 处理器;
@@ -2027,7 +2027,7 @@ class AsyncGenMixin(CallGenBase.CallGenBase):
llvmlite.build_br(builder, merge_bb) llvmlite.build_br(builder, merge_bb)
llvmlite.position_at_end(builder, merge_bb) llvmlite.position_at_end(builder, merge_bb)
def _exception_type_name(self, pool: rowptr[memhub.MemBuddy], def _exception_type_name(self, pool: rawptr[memhub.MemBuddy],
type_node: ast.AST | t.CPtr) -> str: type_node: ast.AST | t.CPtr) -> str:
"""取 except 类型名(Name/Attribute),未命中返回 None""" """取 except 类型名(Name/Attribute),未命中返回 None"""
if type_node is None: if type_node is None:
@@ -2045,7 +2045,7 @@ class AsyncGenMixin(CallGenBase.CallGenBase):
# ============================================================ # ============================================================
def _handle_coro_try_finally(self, trans: HT.Translator | t.CPtr, def _handle_coro_try_finally(self, trans: HT.Translator | t.CPtr,
builder: llvmlite.IRBuilder | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr,
pool: rowptr[memhub.MemBuddy], pool: rawptr[memhub.MemBuddy],
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
stmt: ast.AST | t.CPtr): stmt: ast.AST | t.CPtr):
"""协程内 try/finally:正常/异常路径都执行 fbody; """协程内 try/finally:正常/异常路径都执行 fbody;
@@ -2099,7 +2099,7 @@ class AsyncGenMixin(CallGenBase.CallGenBase):
# ============================================================ # ============================================================
def _handle_coro_for(self, trans: HT.Translator | t.CPtr, def _handle_coro_for(self, trans: HT.Translator | t.CPtr,
builder: llvmlite.IRBuilder | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr,
pool: rowptr[memhub.MemBuddy], pool: rawptr[memhub.MemBuddy],
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
stmt: ast.AST | t.CPtr): stmt: ast.AST | t.CPtr):
"""range-For(含 await):__f_idx_N = start; __f_len_N = end; """range-For(含 await):__f_idx_N = start; __f_len_N = end;
@@ -2194,7 +2194,7 @@ class AsyncGenMixin(CallGenBase.CallGenBase):
# M3/M4/M7:coro.coro_destroy / coro_exception / coro_exception_msg / coro_gather # M3/M4/M7:coro.coro_destroy / coro_exception / coro_exception_msg / coro_gather
# ============================================================ # ============================================================
def translate_coro_destroy(self, builder: llvmlite.IRBuilder | t.CPtr, def translate_coro_destroy(self, builder: llvmlite.IRBuilder | t.CPtr,
pool: rowptr[memhub.MemBuddy], pool: rawptr[memhub.MemBuddy],
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
cl: ast.Call | t.CPtr, cl: ast.Call | t.CPtr,
trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr:
@@ -2240,7 +2240,7 @@ class AsyncGenMixin(CallGenBase.CallGenBase):
return llvmlite.const_int32(pool, 0) return llvmlite.const_int32(pool, 0)
def translate_coro_exception(self, builder: llvmlite.IRBuilder | t.CPtr, def translate_coro_exception(self, builder: llvmlite.IRBuilder | t.CPtr,
pool: rowptr[memhub.MemBuddy], pool: rawptr[memhub.MemBuddy],
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
cl: ast.Call | t.CPtr, cl: ast.Call | t.CPtr,
trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr:
@@ -2269,7 +2269,7 @@ class AsyncGenMixin(CallGenBase.CallGenBase):
return llvmlite.build_load(builder, i32_ty, exc_ptr) return llvmlite.build_load(builder, i32_ty, exc_ptr)
def translate_coro_exception_msg(self, builder: llvmlite.IRBuilder | t.CPtr, def translate_coro_exception_msg(self, builder: llvmlite.IRBuilder | t.CPtr,
pool: rowptr[memhub.MemBuddy], pool: rawptr[memhub.MemBuddy],
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
cl: ast.Call | t.CPtr, cl: ast.Call | t.CPtr,
trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr:
@@ -2299,7 +2299,7 @@ class AsyncGenMixin(CallGenBase.CallGenBase):
return llvmlite.build_load(builder, i8_ptr_ty, msg_ptr) return llvmlite.build_load(builder, i8_ptr_ty, msg_ptr)
def translate_coro_gather(self, builder: llvmlite.IRBuilder | t.CPtr, def translate_coro_gather(self, builder: llvmlite.IRBuilder | t.CPtr,
pool: rowptr[memhub.MemBuddy], pool: rawptr[memhub.MemBuddy],
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
cl: ast.Call | t.CPtr, cl: ast.Call | t.CPtr,
trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr:
@@ -2366,7 +2366,7 @@ class AsyncGenMixin(CallGenBase.CallGenBase):
# await 表达式翻译(顶层段尾 / translate_value Await 分支共用) # await 表达式翻译(顶层段尾 / translate_value Await 分支共用)
# ============================================================ # ============================================================
def _emit_await(self, builder: llvmlite.IRBuilder | t.CPtr, def _emit_await(self, builder: llvmlite.IRBuilder | t.CPtr,
pool: rowptr[memhub.MemBuddy], pool: rawptr[memhub.MemBuddy],
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
trans: HT.Translator | t.CPtr, trans: HT.Translator | t.CPtr,
node: ast.AST | t.CPtr, node: ast.AST | t.CPtr,
@@ -2501,7 +2501,7 @@ class AsyncGenMixin(CallGenBase.CallGenBase):
# coro.coro_run(帧) 内联翻译 # coro.coro_run(帧) 内联翻译
# ============================================================ # ============================================================
def translate_coro_run(self, builder: llvmlite.IRBuilder | t.CPtr, def translate_coro_run(self, builder: llvmlite.IRBuilder | t.CPtr,
pool: rowptr[memhub.MemBuddy], pool: rawptr[memhub.MemBuddy],
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
cl: ast.Call | t.CPtr, cl: ast.Call | t.CPtr,
trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr:
@@ -2729,7 +2729,7 @@ class AsyncGenMixin(CallGenBase.CallGenBase):
# 段翻译辅助 # 段翻译辅助
# ============================================================ # ============================================================
def _emit_coro_return(self, builder: llvmlite.IRBuilder | t.CPtr, def _emit_coro_return(self, builder: llvmlite.IRBuilder | t.CPtr,
pool: rowptr[memhub.MemBuddy], pool: rawptr[memhub.MemBuddy],
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
trans: HT.Translator | t.CPtr, trans: HT.Translator | t.CPtr,
stmt: ast.AST | t.CPtr) -> None: stmt: ast.AST | t.CPtr) -> None:
+2 -2
View File
@@ -15,7 +15,7 @@ class BaseGenMixin:
# 内存/IR 状态 # 内存/IR 状态
Gen: Generator.Generator | t.CPtr Gen: Generator.Generator | t.CPtr
Pool: rowptr[memhub.MemBuddy] # 内存池 Pool: rawptr[memhub.MemBuddy] # 内存池
Module: llvmlite.LLVMModule | t.CPtr # 当前 LLVM 模块 Module: llvmlite.LLVMModule | t.CPtr # 当前 LLVM 模块
Builder: llvmlite.IRBuilder | t.CPtr # 当前 IRBuilder Builder: llvmlite.IRBuilder | t.CPtr # 当前 IRBuilder
# 符号表/函数表 # 符号表/函数表
@@ -31,7 +31,7 @@ class BaseGenMixin:
CurBuilder: llvmlite.IRBuilder | t.CPtr CurBuilder: llvmlite.IRBuilder | t.CPtr
CurClassName: str CurClassName: str
def InitBaseGen(self, pool: rowptr[memhub.MemBuddy]) -> int: def InitBaseGen(self, pool: rawptr[memhub.MemBuddy]) -> int:
"""初始化生成器状态(默认值;子类构造时调用)""" """初始化生成器状态(默认值;子类构造时调用)"""
if self is None: if self is None:
return 1 return 1
+16 -16
View File
@@ -143,7 +143,7 @@ class CallGenBase:
return StubMergerStore.LookupSha1ByModNameSuffix(mod_suffix) return StubMergerStore.LookupSha1ByModNameSuffix(mod_suffix)
def _module_package_from_sha1(self, pool: rowptr[memhub.MemBuddy], def _module_package_from_sha1(self, pool: rawptr[memhub.MemBuddy],
mod_sha1: str) -> str: mod_sha1: str) -> str:
"""从 SHA1 存储器的 rel_path 计算模块所属包名(目录部分,'/' → '.')""" """从 SHA1 存储器的 rel_path 计算模块所属包名(目录部分,'/' → '.')"""
if pool is None or mod_sha1 is None: if pool is None or mod_sha1 is None:
@@ -178,7 +178,7 @@ class CallGenBase:
return None return None
def _lookup_reexport_from_vpi(self, pool: rowptr[memhub.MemBuddy], def _lookup_reexport_from_vpi(self, pool: rawptr[memhub.MemBuddy],
mod_sha1: str, func_name: str) -> str: mod_sha1: str, func_name: str) -> str:
"""re-export 表未命中时,从模块 .vpi 按需解析 from-import 定位定义模块 """re-export 表未命中时,从模块 .vpi 按需解析 from-import 定位定义模块
@@ -205,7 +205,7 @@ class CallGenBase:
if buf is None: if buf is None:
stdlib.free(vpi_path) stdlib.free(vpi_path)
return None return None
vf: rowptr[fileio.File] = fileio.File(vpi_path, fileio.MODE.R) vf: rawptr[fileio.File] = fileio.File(vpi_path, fileio.MODE.R)
stdlib.free(vpi_path) stdlib.free(vpi_path)
if vf.closed: if vf.closed:
stdlib.free(buf) stdlib.free(buf)
@@ -437,7 +437,7 @@ class CallGenBase:
return 0 return 0
def _is_state_func_from_vpi(self, pool: rowptr[memhub.MemBuddy], def _is_state_func_from_vpi(self, pool: rawptr[memhub.MemBuddy],
sha1: str, func_name: str) -> int: sha1: str, func_name: str) -> int:
"""vpi 返回注解含 t.State → 外部 C 函数(定义端用裸名,跨模块调用无 sha1 头) """vpi 返回注解含 t.State → 外部 C 函数(定义端用裸名,跨模块调用无 sha1 头)
@@ -459,7 +459,7 @@ class CallGenBase:
return 0 return 0
def _lookup_mod_sha1(self, pool: rowptr[memhub.MemBuddy], def _lookup_mod_sha1(self, pool: rawptr[memhub.MemBuddy],
from_imports: str, class_name: str, from_imports: str, class_name: str,
allow_star_fallback: int = 1) -> str: allow_star_fallback: int = 1) -> str:
"""从 from_imports 查找类所属模块的 SHA1,返回 None=未找到 """从 from_imports 查找类所属模块的 SHA1,返回 None=未找到
@@ -473,7 +473,7 @@ class CallGenBase:
return self._lookup_sha1_from_modname_raw(pool, mod_name_raw) return self._lookup_sha1_from_modname_raw(pool, mod_name_raw)
def _lookup_sha1_from_modname_raw(self, pool: rowptr[memhub.MemBuddy], def _lookup_sha1_from_modname_raw(self, pool: rawptr[memhub.MemBuddy],
mod_name_raw: str) -> str: mod_name_raw: str) -> str:
"""从原始模块名查找 SHA1,返回 None=未找到""" """从原始模块名查找 SHA1,返回 None=未找到"""
# 手动找到模块名结束位置(空格、null、或 ':' 别名分隔符),复制到新缓冲区 # 手动找到模块名结束位置(空格、null、或 ':' 别名分隔符),复制到新缓冲区
@@ -578,7 +578,7 @@ class CallGenBase:
# _ensure_method_declare:found_func 为 None(stub 未注入或跨模块调用)时在当前模块创建 declare,避免 llc 报 undefined value # _ensure_method_declare:found_func 为 None(stub 未注入或跨模块调用)时在当前模块创建 declare,避免 llc 报 undefined value
def _ensure_method_declare(self, pool: rowptr[memhub.MemBuddy], def _ensure_method_declare(self, pool: rawptr[memhub.MemBuddy],
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
call_name: str, call_name: str,
ret_ty: llvmlite.LLVMType | t.CPtr, ret_ty: llvmlite.LLVMType | t.CPtr,
@@ -721,7 +721,7 @@ class CallGenBase:
# _lookup_method_ret_ty_via_vpi:按 模块SHA1 + 类名 + 方法名 查 vpi 返回注解缓存并解析为 LLVMType,未命中返回 None(不硬编码白名单,类型始终来自定义处) # _lookup_method_ret_ty_via_vpi:按 模块SHA1 + 类名 + 方法名 查 vpi 返回注解缓存并解析为 LLVMType,未命中返回 None(不硬编码白名单,类型始终来自定义处)
# ============================================================ # ============================================================
def _lookup_method_ret_ty_via_vpi(self, pool: rowptr[memhub.MemBuddy], def _lookup_method_ret_ty_via_vpi(self, pool: rawptr[memhub.MemBuddy],
cls_sha1: str, cls_sha1: str,
cls_name: str, cls_name: str,
method_name: str) -> llvmlite.LLVMType | t.CPtr: method_name: str) -> llvmlite.LLVMType | t.CPtr:
@@ -741,7 +741,7 @@ class CallGenBase:
return VpiReader._resolve_vpi_ret_annot_str(pool, annot, i32_ty, i8_ptr_ty) return VpiReader._resolve_vpi_ret_annot_str(pool, annot, i32_ty, i8_ptr_ty)
# _vpi_method_param_annot:按需加载并查询 vpi 参数注解串('@' 分隔,含首参 self 空串占位),供调用方补全 declare/call 缺失参数;未命中返回 None # _vpi_method_param_annot:按需加载并查询 vpi 参数注解串('@' 分隔,含首参 self 空串占位),供调用方补全 declare/call 缺失参数;未命中返回 None
def _vpi_method_param_annot(self, pool: rowptr[memhub.MemBuddy], def _vpi_method_param_annot(self, pool: rawptr[memhub.MemBuddy],
cls_sha1: str, cls_sha1: str,
cls_name: str, cls_name: str,
method_name: str) -> str: method_name: str) -> str:
@@ -754,7 +754,7 @@ class CallGenBase:
return VpiReader._lookup_vpi_param_annots(cls_sha1, cls_name, method_name) return VpiReader._lookup_vpi_param_annots(cls_sha1, cls_name, method_name)
# _vpi_resolve_param_annot_ty:解析 vpi 参数注解段为 LLVMType,失败返回 None(调用方以 i8* 兜底) # _vpi_resolve_param_annot_ty:解析 vpi 参数注解段为 LLVMType,失败返回 None(调用方以 i8* 兜底)
def _vpi_resolve_param_annot_ty(self, pool: rowptr[memhub.MemBuddy], def _vpi_resolve_param_annot_ty(self, pool: rawptr[memhub.MemBuddy],
seg: str) -> llvmlite.LLVMType | t.CPtr: seg: str) -> llvmlite.LLVMType | t.CPtr:
"""解析单个 vpi 参数注解段为 LLVMType,失败返回 None""" """解析单个 vpi 参数注解段为 LLVMType,失败返回 None"""
if pool is None or seg is None: if pool is None or seg is None:
@@ -766,7 +766,7 @@ class CallGenBase:
# _special_method_ret_ty:编译器内置特殊方法的固定返回类型——__before_init__/__init__ → void,__new__ → Ptr(StructTy),非特殊返回 None(vpi 无条目,固定即可避免 fail-fast 误报) # _special_method_ret_ty:编译器内置特殊方法的固定返回类型——__before_init__/__init__ → void,__new__ → Ptr(StructTy),非特殊返回 None(vpi 无条目,固定即可避免 fail-fast 误报)
# ============================================================ # ============================================================
def _special_method_ret_ty(self, pool: rowptr[memhub.MemBuddy], def _special_method_ret_ty(self, pool: rawptr[memhub.MemBuddy],
class_name: str, class_name: str,
method_name: str) -> llvmlite.LLVMType | t.CPtr: method_name: str) -> llvmlite.LLVMType | t.CPtr:
"""编译器内置特殊方法的固定返回类型;非特殊返回 None""" """编译器内置特殊方法的固定返回类型;非特殊返回 None"""
@@ -818,7 +818,7 @@ class CallGenBase:
# _ParseLLVMRetTyStr:把 LLVM IR 返回类型字符串(define 与 @ 之间)转为 LLVMType——void / iN / double / float,含 * 者返回通用 Ptr(Int8);无法解析返回 None # _ParseLLVMRetTyStr:把 LLVM IR 返回类型字符串(define 与 @ 之间)转为 LLVMType——void / iN / double / float,含 * 者返回通用 Ptr(Int8);无法解析返回 None
# ============================================================ # ============================================================
def _ParseLLVMRetTyStr(self, pool: rowptr[memhub.MemBuddy], def _ParseLLVMRetTyStr(self, pool: rawptr[memhub.MemBuddy],
buf: bytes, buf: bytes,
start: sizet, start: sizet,
end: sizet) -> llvmlite.LLVMType | t.CPtr: end: sizet) -> llvmlite.LLVMType | t.CPtr:
@@ -969,7 +969,7 @@ class CallGenBase:
"""登记 text.ll 全部 define 行到持久缓存(建表/分配失败即不缓存,回退原扫描)""" """登记 text.ll 全部 define 行到持久缓存(建表/分配失败即不缓存,回退原扫描)"""
if self.Gen is None or class_sha1 is None or text_buf is None or text_len == 0: if self.Gen is None or class_sha1 is None or text_buf is None or text_len == 0:
return return
perm: rowptr[memhub.MemBuddy] = CompilerFactory.factory.PermPool perm: rawptr[memhub.MemBuddy] = CompilerFactory.factory.PermPool
if perm is None: if perm is None:
return return
ht: hashtable.HashTable | t.CPtr = self.Gen.CallGenBase.MethodRetTyMap ht: hashtable.HashTable | t.CPtr = self.Gen.CallGenBase.MethodRetTyMap
@@ -1039,7 +1039,7 @@ class CallGenBase:
# _LookupMethodRetTyFromTextLL:读取 {temp_dir}/{sha1[0:2]}/{sha1}.text.ll (level=1),按 "{sha1}.{class_name}.{method_name}" 搜索 define 行并解析返回类型;未找到/文件不存在返回 None # _LookupMethodRetTyFromTextLL:读取 {temp_dir}/{sha1[0:2]}/{sha1}.text.ll (level=1),按 "{sha1}.{class_name}.{method_name}" 搜索 define 行并解析返回类型;未找到/文件不存在返回 None
# ============================================================ # ============================================================
def _LookupMethodRetTyFromTextLL(self, pool: rowptr[memhub.MemBuddy], def _LookupMethodRetTyFromTextLL(self, pool: rawptr[memhub.MemBuddy],
class_sha1: str, class_sha1: str,
class_name: str, class_name: str,
method_name: str, method_name: str,
@@ -1082,7 +1082,7 @@ class CallGenBase:
stdlib.free(subdir_buf) stdlib.free(subdir_buf)
# 按文件实际大小读取 text.ll(固定缓冲区会截断大模块导致末尾定义查不到);64MB 上限防御异常超大文件 # 按文件实际大小读取 text.ll(固定缓冲区会截断大模块导致末尾定义查不到);64MB 上限防御异常超大文件
tf: rowptr[fileio.File] = fileio.File(path_buf, fileio.MODE.R) tf: rawptr[fileio.File] = fileio.File(path_buf, fileio.MODE.R)
if tf.closed: if tf.closed:
stdlib.free(path_buf) stdlib.free(path_buf)
return None return None
@@ -1179,7 +1179,7 @@ class CallGenBase:
# _dep_text_ll_exists:探测 {temp_dir}/{sha1[0:2]}/{sha1}.text.ll 是否存在(1=存在),用于区分「依赖已编译但函数缺失」与「依赖模块尚未翻译」 # _dep_text_ll_exists:探测 {temp_dir}/{sha1[0:2]}/{sha1}.text.ll 是否存在(1=存在),用于区分「依赖已编译但函数缺失」与「依赖模块尚未翻译」
# ============================================================ # ============================================================
def _dep_text_ll_exists(self, pool: rowptr[memhub.MemBuddy], def _dep_text_ll_exists(self, pool: rawptr[memhub.MemBuddy],
sha1: str) -> int: sha1: str) -> int:
"""探测 {temp_dir}/{sha1[0:2]}/{sha1}.text.ll 是否存在,1=存在""" """探测 {temp_dir}/{sha1[0:2]}/{sha1}.text.ll 是否存在,1=存在"""
if self.Gen.CallGenBase.TempDir is None or self.Gen.CallGenBase.TempDirLen == 0 or sha1 is None: if self.Gen.CallGenBase.TempDir is None or self.Gen.CallGenBase.TempDirLen == 0 or sha1 is None:
+10 -10
View File
@@ -82,7 +82,7 @@ class CallGenCBuiltin(CallGenBase.CallGenBase):
"""c.* 内建 + 内联汇编 + LLVMIR 翻译(继承 Base)""" """c.* 内建 + 内联汇编 + LLVMIR 翻译(继承 Base)"""
def translate_c_deref(self, pool: rowptr[memhub.MemBuddy], def translate_c_deref(self, pool: rawptr[memhub.MemBuddy],
builder: llvmlite.IRBuilder | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr,
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
cl: ast.Call | t.CPtr, cl: ast.Call | t.CPtr,
@@ -151,7 +151,7 @@ class CallGenCBuiltin(CallGenBase.CallGenBase):
return None return None
def translate_c_derefas(self, pool: rowptr[memhub.MemBuddy], def translate_c_derefas(self, pool: rawptr[memhub.MemBuddy],
builder: llvmlite.IRBuilder | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr,
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
cl: ast.Call | t.CPtr, cl: ast.Call | t.CPtr,
@@ -213,7 +213,7 @@ class CallGenCBuiltin(CallGenBase.CallGenBase):
return val return val
def translate_c_set(self, pool: rowptr[memhub.MemBuddy], def translate_c_set(self, pool: rawptr[memhub.MemBuddy],
builder: llvmlite.IRBuilder | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr,
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
cl: ast.Call | t.CPtr, cl: ast.Call | t.CPtr,
@@ -337,7 +337,7 @@ class CallGenCBuiltin(CallGenBase.CallGenBase):
return b_val return b_val
def translate_c_addr(self, pool: rowptr[memhub.MemBuddy], def translate_c_addr(self, pool: rawptr[memhub.MemBuddy],
builder: llvmlite.IRBuilder | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr,
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
cl: ast.Call | t.CPtr, cl: ast.Call | t.CPtr,
@@ -640,7 +640,7 @@ class CallGenCBuiltin(CallGenBase.CallGenBase):
return None return None
def translate_c_load(self, pool: rowptr[memhub.MemBuddy], def translate_c_load(self, pool: rawptr[memhub.MemBuddy],
builder: llvmlite.IRBuilder | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr,
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
cl: ast.Call | t.CPtr, cl: ast.Call | t.CPtr,
@@ -702,7 +702,7 @@ class CallGenCBuiltin(CallGenBase.CallGenBase):
dst[dlen + i] = '\0' dst[dlen + i] = '\0'
def _asm_mangle_global_symbols(self, pool: rowptr[memhub.MemBuddy], def _asm_mangle_global_symbols(self, pool: rawptr[memhub.MemBuddy],
asm_text: str, asm_size: sizet, asm_text: str, asm_size: sizet,
mod: llvmlite.LLVMModule | t.CPtr) -> str: mod: llvmlite.LLVMModule | t.CPtr) -> str:
"""asm 模板中裸符号引用模块全局的检查(fail-fast) """asm 模板中裸符号引用模块全局的检查(fail-fast)
@@ -774,7 +774,7 @@ class CallGenCBuiltin(CallGenBase.CallGenBase):
return out return out
def _asm_escape_for_ir(self, pool: rowptr[memhub.MemBuddy], def _asm_escape_for_ir(self, pool: rawptr[memhub.MemBuddy],
src: str) -> str: src: str) -> str:
"""转义汇编文本用于 LLVM IR 字符串字面量""" """转义汇编文本用于 LLVM IR 字符串字面量"""
if src is None: if src is None:
@@ -909,7 +909,7 @@ class CallGenCBuiltin(CallGenBase.CallGenBase):
return "" return ""
def _resolve_asm_descr(self, pool: rowptr[memhub.MemBuddy], def _resolve_asm_descr(self, pool: rawptr[memhub.MemBuddy],
node: ast.AST | t.CPtr) -> str: node: ast.AST | t.CPtr) -> str:
"""递归解析约束表达式,返回约束字符串""" """递归解析约束表达式,返回约束字符串"""
if node is None: if node is None:
@@ -1054,7 +1054,7 @@ class CallGenCBuiltin(CallGenBase.CallGenBase):
return count + 1 return count + 1
def translate_c_asm(self, pool: rowptr[memhub.MemBuddy], def translate_c_asm(self, pool: rawptr[memhub.MemBuddy],
builder: llvmlite.IRBuilder | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr,
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
cl: ast.Call | t.CPtr, cl: ast.Call | t.CPtr,
@@ -1684,7 +1684,7 @@ class CallGenCBuiltin(CallGenBase.CallGenBase):
return None return None
def translate_c_llvmir(self, pool: rowptr[memhub.MemBuddy], def translate_c_llvmir(self, pool: rawptr[memhub.MemBuddy],
builder: llvmlite.IRBuilder | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr,
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
cl: ast.Call | t.CPtr, cl: ast.Call | t.CPtr,
+8 -8
View File
@@ -39,7 +39,7 @@ class CallGenCall(CallGenBase.CallGenBase):
# ============================================================ # ============================================================
# ============================================================ # ============================================================
def _do_virtual_call(self, pool: rowptr[memhub.MemBuddy], def _do_virtual_call(self, pool: rawptr[memhub.MemBuddy],
builder: llvmlite.IRBuilder | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr,
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
class_name: str, class_name: str,
@@ -212,7 +212,7 @@ class CallGenCall(CallGenBase.CallGenBase):
# ============================================================ # ============================================================
# ============================================================ # ============================================================
def _call_method_on_ptr(self, pool: rowptr[memhub.MemBuddy], def _call_method_on_ptr(self, pool: rawptr[memhub.MemBuddy],
builder: llvmlite.IRBuilder | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr,
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
class_name: str, class_name: str,
@@ -673,7 +673,7 @@ class CallGenCall(CallGenBase.CallGenBase):
# ============================================================ # ============================================================
# ============================================================ # ============================================================
def _translate_method_call(self, pool: rowptr[memhub.MemBuddy], def _translate_method_call(self, pool: rawptr[memhub.MemBuddy],
builder: llvmlite.IRBuilder | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr,
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
class_name: str, class_name: str,
@@ -709,7 +709,7 @@ class CallGenCall(CallGenBase.CallGenBase):
# 真实 list 命中不变;非容器不命中;实际类型不可得回退 lb_cls。 # 真实 list 命中不变;非容器不命中;实际类型不可得回退 lb_cls。
if self.Gen.CallGenProp._is_list_builtin_receiver( if self.Gen.CallGenProp._is_list_builtin_receiver(
pool, obj_ptr, lb_cls, method_name, cl) != 0: pool, obj_ptr, lb_cls, method_name, cl) != 0:
# 双指针槽形态(rowptr[list[...]] 局部变量 alloca Ptr(Ptr(Struct)) # 双指针槽形态(rawptr[list[...]] 局部变量 alloca Ptr(Ptr(Struct))
# 直接传入时先 load 一层得到对象指针 Ptr(Struct),与分派方 # 直接传入时先 load 一层得到对象指针 Ptr(Struct),与分派方
# _translate_method_call 调用点的 obj_ptr 语义一致)。 # _translate_method_call 调用点的 obj_ptr 语义一致)。
lb_obj: llvmlite.Value | t.CPtr = obj_ptr lb_obj: llvmlite.Value | t.CPtr = obj_ptr
@@ -772,7 +772,7 @@ class CallGenCall(CallGenBase.CallGenBase):
# 构造方法查找名: ClassName.method_name # 构造方法查找名: ClassName.method_name
# [D6·截断纪律] 缓冲按精确长度分配(class_name 现可能取实际特化名,长度不定): # [D6·截断纪律] 缓冲按精确长度分配(class_name 现可能取实际特化名,长度不定):
# 固定 128 会在嵌套泛型名(如 list[rowptr[sha.AST]])下静默截断 → 查错/漏查。 # 固定 128 会在嵌套泛型名(如 list[rawptr[sha.AST]])下静默截断 → 查错/漏查。
lk_cap: sizet = string.strlen(class_name) + string.strlen(method_name) + 2 lk_cap: sizet = string.strlen(class_name) + string.strlen(method_name) + 2
lookup_name: str = pool.alloc(lk_cap) lookup_name: str = pool.alloc(lk_cap)
if lookup_name is None: if lookup_name is None:
@@ -1683,7 +1683,7 @@ class CallGenCall(CallGenBase.CallGenBase):
# 翻译,绝不生成对 list 方法函数的跨模块调用(list 方法无对应 C 函数)。 # 翻译,绝不生成对 list 方法函数的跨模块调用(list 方法无对应 C 函数)。
# lm_obj 必须是已 load 的 list 对象指针 Ptr(list-struct)。 # lm_obj 必须是已 load 的 list 对象指针 Ptr(list-struct)。
# ============================================================ # ============================================================
def _translate_list_builtin_call(self, pool: rowptr[memhub.MemBuddy], def _translate_list_builtin_call(self, pool: rawptr[memhub.MemBuddy],
builder: llvmlite.IRBuilder | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr,
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
cl: ast.Call | t.CPtr, cl: ast.Call | t.CPtr,
@@ -1903,7 +1903,7 @@ class CallGenCall(CallGenBase.CallGenBase):
# ============================================================ # ============================================================
# ============================================================ # ============================================================
def _translate_super_call(self, pool: rowptr[memhub.MemBuddy], def _translate_super_call(self, pool: rawptr[memhub.MemBuddy],
builder: llvmlite.IRBuilder | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr,
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
cl: ast.Call | t.CPtr, cl: ast.Call | t.CPtr,
@@ -2127,7 +2127,7 @@ class CallGenCall(CallGenBase.CallGenBase):
# ============================================================ # ============================================================
# ============================================================ # ============================================================
def _field_byte_offset(self, pool: rowptr[memhub.MemBuddy], def _field_byte_offset(self, pool: rawptr[memhub.MemBuddy],
entry: GenTypes.StructEntry | t.CPtr, entry: GenTypes.StructEntry | t.CPtr,
field_index: int) -> int: field_index: int) -> int:
"""计算字段在结构体中的字节偏移(含对齐 padding),无法计算返回 0""" """计算字段在结构体中的字节偏移(含对齐 padding),无法计算返回 0"""
+9 -9
View File
@@ -32,7 +32,7 @@ class CallGenCtor(CallGenBase.CallGenBase):
# 遍历所有字段,对有默认值的字段翻译并 store # 遍历所有字段,对有默认值的字段翻译并 store
# 显式参数(位置/关键字)后续会覆盖默认值 # 显式参数(位置/关键字)后续会覆盖默认值
# ============================================================ # ============================================================
def _apply_struct_defaults(self, pool: rowptr[memhub.MemBuddy], def _apply_struct_defaults(self, pool: rawptr[memhub.MemBuddy],
builder: llvmlite.IRBuilder | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr,
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
struct_ty: llvmlite.LLVMType | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr,
@@ -106,7 +106,7 @@ class CallGenCtor(CallGenBase.CallGenBase):
# ============================================================ # ============================================================
# ============================================================ # ============================================================
def _translate_struct_ctor(self, pool: rowptr[memhub.MemBuddy], def _translate_struct_ctor(self, pool: rawptr[memhub.MemBuddy],
builder: llvmlite.IRBuilder | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr,
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
struct_ty: llvmlite.LLVMType | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr,
@@ -355,7 +355,7 @@ class CallGenCtor(CallGenBase.CallGenBase):
# ============================================================ # ============================================================
# ============================================================ # ============================================================
def _translate_renum_construct(self, pool: rowptr[memhub.MemBuddy], def _translate_renum_construct(self, pool: rawptr[memhub.MemBuddy],
builder: llvmlite.IRBuilder | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr,
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
class_name: str, class_name: str,
@@ -457,7 +457,7 @@ class CallGenCtor(CallGenBase.CallGenBase):
# ============================================================ # ============================================================
# ============================================================ # ============================================================
def _translate_struct_ctor_kw(self, pool: rowptr[memhub.MemBuddy], def _translate_struct_ctor_kw(self, pool: rawptr[memhub.MemBuddy],
builder: llvmlite.IRBuilder | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr,
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
struct_ty: llvmlite.LLVMType | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr,
@@ -690,7 +690,7 @@ class CallGenCtor(CallGenBase.CallGenBase):
# ============================================================ # ============================================================
# ============================================================ # ============================================================
def _translate_t_type_cast(self, pool: rowptr[memhub.MemBuddy], def _translate_t_type_cast(self, pool: rawptr[memhub.MemBuddy],
builder: llvmlite.IRBuilder | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr,
val: llvmlite.Value | t.CPtr, val: llvmlite.Value | t.CPtr,
target_ty: llvmlite.LLVMType | t.CPtr, target_ty: llvmlite.LLVMType | t.CPtr,
@@ -768,7 +768,7 @@ class CallGenCtor(CallGenBase.CallGenBase):
# _get_type_name_from_annotation 已移至 HandlesType.py(支持 BinOp/Attribute) # _get_type_name_from_annotation 已移至 HandlesType.py(支持 BinOp/Attribute)
# HandlesExprCall 通过 HandlesType._get_type_name_from_annotation 调用 # HandlesExprCall 通过 HandlesType._get_type_name_from_annotation 调用
def _extract_type_args_from_slice(self, pool: rowptr[memhub.MemBuddy], def _extract_type_args_from_slice(self, pool: rawptr[memhub.MemBuddy],
slice_node: ast.AST | t.CPtr, slice_node: ast.AST | t.CPtr,
from_imports: str = None) -> list[str] | t.CPtr: from_imports: str = None) -> list[str] | t.CPtr:
"""从 Subscript.slice 提取类型实参名列表 """从 Subscript.slice 提取类型实参名列表
@@ -810,7 +810,7 @@ class CallGenCtor(CallGenBase.CallGenBase):
# 泛型类构造调用辅助 list[str](pool, 8):复用 translate_list_literal 的构造逻辑——alloca tmp → 翻译 cl.args 为参数指针数组 → __new__(tmp,*args) → __before_init__ → __init__ → 返回 storage_ptr。必须独立于 translate_call 普通函数路径:spec_name 是类名不是函数名,走裸名会被 _lookup_mod_sha1 的 star import 回退误导 # 泛型类构造调用辅助 list[str](pool, 8):复用 translate_list_literal 的构造逻辑——alloca tmp → 翻译 cl.args 为参数指针数组 → __new__(tmp,*args) → __before_init__ → __init__ → 返回 storage_ptr。必须独立于 translate_call 普通函数路径:spec_name 是类名不是函数名,走裸名会被 _lookup_mod_sha1 的 star import 回退误导
# ============================================================ # ============================================================
def _infer_generic_ctor_type_arg(self, pool: rowptr[memhub.MemBuddy], def _infer_generic_ctor_type_arg(self, pool: rawptr[memhub.MemBuddy],
arg_node: ast.AST | t.CPtr, arg_node: ast.AST | t.CPtr,
class_name: str, class_name: str,
trans: HT.Translator | t.CPtr) -> str: trans: HT.Translator | t.CPtr) -> str:
@@ -1069,7 +1069,7 @@ class CallGenCtor(CallGenBase.CallGenBase):
return int(ki_kw) return int(ki_kw)
return -1 return -1
def _infer_ctor_type_args_from_ctx(self, pool: rowptr[memhub.MemBuddy], def _infer_ctor_type_args_from_ctx(self, pool: rawptr[memhub.MemBuddy],
trans: HT.Translator | t.CPtr, trans: HT.Translator | t.CPtr,
class_name: str, class_name: str,
tp_count: int, tp_count: int,
@@ -1133,7 +1133,7 @@ class CallGenCtor(CallGenBase.CallGenBase):
return None return None
return type_args_ctx return type_args_ctx
def _translate_generic_ctor_call(self, pool: rowptr[memhub.MemBuddy], def _translate_generic_ctor_call(self, pool: rawptr[memhub.MemBuddy],
builder: llvmlite.IRBuilder | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr,
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
spec_name: str, spec_name: str,
+13 -13
View File
@@ -33,7 +33,7 @@ import lib.core.Gen.GenApi as GenApi
class CallGenDispatch(CallGenBase.CallGenBase): class CallGenDispatch(CallGenBase.CallGenBase):
"""translate_call 前置检测 helper(继承 Base)""" """translate_call 前置检测 helper(继承 Base)"""
def _tc_h1_super_ctraits(self, pool: rowptr[memhub.MemBuddy], def _tc_h1_super_ctraits(self, pool: rawptr[memhub.MemBuddy],
builder: llvmlite.IRBuilder | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr,
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
cl: ast.Call | t.CPtr, cl: ast.Call | t.CPtr,
@@ -89,7 +89,7 @@ class CallGenDispatch(CallGenBase.CallGenBase):
return llvmlite.const_int32(pool, 0) return llvmlite.const_int32(pool, 0)
return None return None
def _tc_h2_c_special(self, pool: rowptr[memhub.MemBuddy], def _tc_h2_c_special(self, pool: rawptr[memhub.MemBuddy],
builder: llvmlite.IRBuilder | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr,
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
cl: ast.Call | t.CPtr, cl: ast.Call | t.CPtr,
@@ -193,7 +193,7 @@ class CallGenDispatch(CallGenBase.CallGenBase):
builder, pool, mod, cl, trans) builder, pool, mod, cl, trans)
return None return None
def _tc_h3_stdarg_cast(self, pool: rowptr[memhub.MemBuddy], def _tc_h3_stdarg_cast(self, pool: rawptr[memhub.MemBuddy],
builder: llvmlite.IRBuilder | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr,
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
cl: ast.Call | t.CPtr, cl: ast.Call | t.CPtr,
@@ -282,7 +282,7 @@ class CallGenDispatch(CallGenBase.CallGenBase):
return None return None
return None return None
def _tc_h4_type_casts(self, pool: rowptr[memhub.MemBuddy], def _tc_h4_type_casts(self, pool: rawptr[memhub.MemBuddy],
builder: llvmlite.IRBuilder | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr,
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
cl: ast.Call | t.CPtr, cl: ast.Call | t.CPtr,
@@ -550,7 +550,7 @@ class CallGenDispatch(CallGenBase.CallGenBase):
return None return None
def _tc_h5_sizeof_len_isinst(self, pool: rowptr[memhub.MemBuddy], def _tc_h5_sizeof_len_isinst(self, pool: rawptr[memhub.MemBuddy],
builder: llvmlite.IRBuilder | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr,
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
cl: ast.Call | t.CPtr, cl: ast.Call | t.CPtr,
@@ -625,14 +625,14 @@ class CallGenDispatch(CallGenBase.CallGenBase):
break break
sz_resolved_name = sz_cls_name sz_resolved_name = sz_cls_name
# 指针包装类型检查必须在 dot-strip 之前:类型实参可能带 sha1 # 指针包装类型检查必须在 dot-strip 之前:类型实参可能带 sha1
# 前缀内嵌点号(rowptr[7565e081d88517ac.AST]、f4679...AST|t.CPtr), # 前缀内嵌点号(rawptr[7565e081d88517ac.AST]、f4679...AST|t.CPtr),
# strrchr('.') 会把括号内 ".AST"/".CPtr" 剥掉 → "AST]"/"CPtr", # strrchr('.') 会把括号内 ".AST"/".CPtr" 剥掉 → "AST]"/"CPtr",
# 前缀/联合判断永远失配 → 落回把接收者 Name(T) 当实例翻译 → # 前缀/联合判断永远失配 → 落回把接收者 Name(T) 当实例翻译 →
# NameError: 未定义名称 'T'(SlotsBugTest rowptr[list[rowptr[AST]]] 根因)。 # NameError: 未定义名称 'T'(SlotsBugTest rawptr[list[rawptr[AST]]] 根因)。
# 联合类型(X | t.CPtr)与新一代指针包装 rowptr[X] 均按指针大小 8。 # 联合类型(X | t.CPtr)与新一代指针包装 rawptr[X] 均按指针大小 8。
if string.strstr(sz_cls_name, "|") is not None: if string.strstr(sz_cls_name, "|") is not None:
return llvmlite.const_int64(pool, 8) return llvmlite.const_int64(pool, 8)
if string.strncmp(sz_cls_name, "rowptr[", 7) == 0: if string.strncmp(sz_cls_name, "rawptr[", 7) == 0:
return llvmlite.const_int64(pool, 8) return llvmlite.const_int64(pool, 8)
# 保存完整名(含模块前缀)供模块归属精确匹配:去前缀后 # 保存完整名(含模块前缀)供模块归属精确匹配:去前缀后
# get_struct_type 裸名全局匹配会误命中跨模块同名类 # get_struct_type 裸名全局匹配会误命中跨模块同名类
@@ -1002,7 +1002,7 @@ class CallGenDispatch(CallGenBase.CallGenBase):
return None return None
def _tc_h6_method_dispatch(self, pool: rowptr[memhub.MemBuddy], def _tc_h6_method_dispatch(self, pool: rawptr[memhub.MemBuddy],
builder: llvmlite.IRBuilder | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr,
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
cl: ast.Call | t.CPtr, cl: ast.Call | t.CPtr,
@@ -1226,14 +1226,14 @@ class CallGenDispatch(CallGenBase.CallGenBase):
obj_var: llvmlite.Value | t.CPtr = self.Gen.VarGen.lookup_var( obj_var: llvmlite.Value | t.CPtr = self.Gen.VarGen.lookup_var(
trans.SymTab, method_obj_nm.id) trans.SymTab, method_obj_nm.id)
if obj_var is not None and obj_var.Ty is not None: if obj_var is not None and obj_var.Ty is not None:
# list 泛型容器注解先行识别(早期拦截,供下方各 class 分支共用):rowptr[list[rowptr[AST]]] 的 LLVM 形态为 Ptr(Ptr(Struct('list[sha.AST]'))),而 list 特化 struct 不注册为普通类,get_class_name_by_type 或返回 None、或后缀误命中内层元素类 ⇒ 下方两个 Ptr 分支的 list 内置拦截落空/错判。此处再兜底剥一次最外层 rowptr,内层以 'list' 开头且方法属 list 内置集合时置位 is_list_annot_builtin,交给本方法尾部 list 内置分支(内联 GEP)翻译 # list 泛型容器注解先行识别(早期拦截,供下方各 class 分支共用):rawptr[list[rawptr[AST]]] 的 LLVM 形态为 Ptr(Ptr(Struct('list[sha.AST]'))),而 list 特化 struct 不注册为普通类,get_class_name_by_type 或返回 None、或后缀误命中内层元素类 ⇒ 下方两个 Ptr 分支的 list 内置拦截落空/错判。此处再兜底剥一次最外层 rawptr,内层以 'list' 开头且方法属 list 内置集合时置位 is_list_annot_builtin,交给本方法尾部 list 内置分支(内联 GEP)翻译
var_entry: GenTypes.VarEntry | t.CPtr = self.Gen.VarGen.lookup_var_entry( var_entry: GenTypes.VarEntry | t.CPtr = self.Gen.VarGen.lookup_var_entry(
trans.SymTab, method_obj_nm.id) trans.SymTab, method_obj_nm.id)
is_list_annot_builtin: int = 0 is_list_annot_builtin: int = 0
la_buf: str = self.Gen.VarGen.var_annot_class_name(var_entry) la_buf: str = self.Gen.VarGen.var_annot_class_name(var_entry)
if la_buf is not None: if la_buf is not None:
la_tail: str = la_buf la_tail: str = la_buf
if string.strncmp(la_buf, "rowptr[", 7) == 0: if string.strncmp(la_buf, "rawptr[", 7) == 0:
la_tail = la_buf + 7 la_tail = la_buf + 7
if string.strncmp(la_tail, "list", 4) == 0: if string.strncmp(la_tail, "list", 4) == 0:
if self.Gen.CallGenProp._is_list_builtin_receiver( if self.Gen.CallGenProp._is_list_builtin_receiver(
@@ -1298,7 +1298,7 @@ class CallGenDispatch(CallGenBase.CallGenBase):
# list 注解识别处查得,同一变量表项)。 # list 注解识别处查得,同一变量表项)。
# list 容器注解命中(is_list_annot_builtin=1)时跳过本回退: # list 容器注解命中(is_list_annot_builtin=1)时跳过本回退:
# 本回退的"剥模块前缀"会按内层元素 '.'(如 # 本回退的"剥模块前缀"会按内层元素 '.'(如
# list[rowptr[sha.AST]])把类名错切为 'AST]]' 垃圾 → 下方 # list[rawptr[sha.AST]])把类名错切为 'AST]]' 垃圾 → 下方
# _is_list_builtin_method 前缀匹配不中 → 误走 FakeDuck/sha1 # _is_list_builtin_method 前缀匹配不中 → 误走 FakeDuck/sha1
# 方法构造 → _translate_method_call MRO fatal。list 调用由 # 方法构造 → _translate_method_call MRO fatal。list 调用由
# 尾部 list 内置分支统一翻译。 # 尾部 list 内置分支统一翻译。
+4 -4
View File
@@ -26,7 +26,7 @@ class CallGenFd(CallGenBase.CallGenBase):
# _translate_fakeduck_call:FakeDuck str 变量方法调用 → 扩展类 _Type/_str(对齐 TPC HandlesExprCall.py L2841-2880)。对象是 Name 且有影子({var}__meta__)时 self=影子;否则在入口创建临时影子(__data__=obj 值、__mbuddy__=NULL)后作 self,避免 bitcast i8* → _str* 读垃圾指针 # _translate_fakeduck_call:FakeDuck str 变量方法调用 → 扩展类 _Type/_str(对齐 TPC HandlesExprCall.py L2841-2880)。对象是 Name 且有影子({var}__meta__)时 self=影子;否则在入口创建临时影子(__data__=obj 值、__mbuddy__=NULL)后作 self,避免 bitcast i8* → _str* 读垃圾指针
# ============================================================ # ============================================================
def _translate_fakeduck_call(self, pool: rowptr[memhub.MemBuddy], def _translate_fakeduck_call(self, pool: rawptr[memhub.MemBuddy],
builder: llvmlite.IRBuilder | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr,
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
cls_name: str, cls_name: str,
@@ -189,7 +189,7 @@ class CallGenFd(CallGenBase.CallGenBase):
# ============================================================ # ============================================================
def _inject_requires_fields(self, trans: HT.Translator | t.CPtr, def _inject_requires_fields(self, trans: HT.Translator | t.CPtr,
pool: rowptr[memhub.MemBuddy], pool: rawptr[memhub.MemBuddy],
builder: llvmlite.IRBuilder | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr,
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
meta_ptr: llvmlite.Value | t.CPtr, meta_ptr: llvmlite.Value | t.CPtr,
@@ -300,7 +300,7 @@ class CallGenFd(CallGenBase.CallGenBase):
# ============================================================ # ============================================================
def _emit_provider_push(self, trans: HT.Translator | t.CPtr, def _emit_provider_push(self, trans: HT.Translator | t.CPtr,
pool: rowptr[memhub.MemBuddy], pool: rawptr[memhub.MemBuddy],
builder: llvmlite.IRBuilder | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr,
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
cls_name: str, cls_name: str,
@@ -353,7 +353,7 @@ class CallGenFd(CallGenBase.CallGenBase):
llvmlite.build_call(builder, fd_pfn, fd_fstr, 2, ret_i32_p, 0) llvmlite.build_call(builder, fd_pfn, fd_fstr, 2, ret_i32_p, 0)
return fd_pc return fd_pc
def _emit_provider_pop(self, trans: HT.Translator | t.CPtr, def _emit_provider_pop(self, trans: HT.Translator | t.CPtr,
pool: rowptr[memhub.MemBuddy], pool: rawptr[memhub.MemBuddy],
builder: llvmlite.IRBuilder | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr,
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
cls_name: str) -> int: cls_name: str) -> int:
+15 -15
View File
@@ -169,7 +169,7 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin):
# ============================================================ # ============================================================
def _emit_eh_guarded_call(self, builder: llvmlite.IRBuilder | t.CPtr, def _emit_eh_guarded_call(self, builder: llvmlite.IRBuilder | t.CPtr,
pool: rowptr[memhub.MemBuddy], pool: rawptr[memhub.MemBuddy],
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
trans: HT.Translator | t.CPtr, trans: HT.Translator | t.CPtr,
func: llvmlite.Function | t.CPtr, func: llvmlite.Function | t.CPtr,
@@ -293,7 +293,7 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin):
def _translate_isinstance(self, pool: rowptr[memhub.MemBuddy], def _translate_isinstance(self, pool: rawptr[memhub.MemBuddy],
builder: llvmlite.IRBuilder | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr,
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
obj_node: ast.AST | t.CPtr, obj_node: ast.AST | t.CPtr,
@@ -378,7 +378,7 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin):
return res return res
def _extract_isinstance_class_names(self, pool: rowptr[memhub.MemBuddy], def _extract_isinstance_class_names(self, pool: rawptr[memhub.MemBuddy],
node: ast.AST | t.CPtr) -> sizet | t.CPtr: node: ast.AST | t.CPtr) -> sizet | t.CPtr:
"""从 isinstance 第二参数提取类名数组(Name→id / Attribute→attr / Tuple→遍历)""" """从 isinstance 第二参数提取类名数组(Name→id / Attribute→attr / Tuple→遍历)"""
arr: sizet | t.CPtr = pool.alloc(8 * 16) arr: sizet | t.CPtr = pool.alloc(8 * 16)
@@ -426,7 +426,7 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin):
return arr return arr
def _collect_subclass_vtable_classes(self, pool: rowptr[memhub.MemBuddy], def _collect_subclass_vtable_classes(self, pool: rawptr[memhub.MemBuddy],
class_name: str) -> sizet | t.CPtr: class_name: str) -> sizet | t.CPtr:
"""反向 BFS 收集目标类及全部子类(含自身,仅 HasVTable==1),返回 0 结尾数组""" """反向 BFS 收集目标类及全部子类(含自身,仅 HasVTable==1),返回 0 结尾数组"""
if class_name is None: if class_name is None:
@@ -491,7 +491,7 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin):
return names return names
def _make_vtable_ref_i8(self, pool: rowptr[memhub.MemBuddy], def _make_vtable_ref_i8(self, pool: rawptr[memhub.MemBuddy],
builder: llvmlite.IRBuilder | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr,
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
class_name: str, class_name: str,
@@ -538,7 +538,7 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin):
return llvmlite.build_bitcast(builder, ref, i8_ptr_ty) return llvmlite.build_bitcast(builder, ref, i8_ptr_ty)
def _isinstance_compile_time(self, pool: rowptr[memhub.MemBuddy], def _isinstance_compile_time(self, pool: rawptr[memhub.MemBuddy],
obj_ptr: llvmlite.Value | t.CPtr, obj_ptr: llvmlite.Value | t.CPtr,
class_name: str) -> int: class_name: str) -> int:
"""编译时静态判断:obj 静态类型 == class_name 或 class_name 在其 MRO 中""" """编译时静态判断:obj 静态类型 == class_name 或 class_name 在其 MRO 中"""
@@ -570,7 +570,7 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin):
def translate_closure_call(self, pool: rowptr[memhub.MemBuddy], def translate_closure_call(self, pool: rawptr[memhub.MemBuddy],
builder: llvmlite.IRBuilder | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr,
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
closure_alloca: llvmlite.Value | t.CPtr, closure_alloca: llvmlite.Value | t.CPtr,
@@ -739,7 +739,7 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin):
return None return None
def _translate_func_ptr_call(self, pool: rowptr[memhub.MemBuddy], def _translate_func_ptr_call(self, pool: rawptr[memhub.MemBuddy],
builder: llvmlite.IRBuilder | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr,
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
fp_alloca: llvmlite.Value | t.CPtr, fp_alloca: llvmlite.Value | t.CPtr,
@@ -814,7 +814,7 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin):
return llvmlite.build_call_indirect(builder, fn_typed, head, arg_count, ret_ty) return llvmlite.build_call_indirect(builder, fn_typed, head, arg_count, ret_ty)
def translate_printf_call(self, pool: rowptr[memhub.MemBuddy], def translate_printf_call(self, pool: rawptr[memhub.MemBuddy],
builder: llvmlite.IRBuilder | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr,
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
cl: ast.Call | t.CPtr, cl: ast.Call | t.CPtr,
@@ -875,7 +875,7 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin):
llvmlite.build_call(builder, "printf", fmt_ptr, can, i32_ty, 1) llvmlite.build_call(builder, "printf", fmt_ptr, can, i32_ty, 1)
def translate_print_call(self, pool: rowptr[memhub.MemBuddy], def translate_print_call(self, pool: rawptr[memhub.MemBuddy],
builder: llvmlite.IRBuilder | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr,
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
cl: ast.Call | t.CPtr, cl: ast.Call | t.CPtr,
@@ -1008,7 +1008,7 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin):
llvmlite.build_call(builder, "printf", fmt_ptr, arg_count, i32_ty, 1) llvmlite.build_call(builder, "printf", fmt_ptr, arg_count, i32_ty, 1)
def init_func_table(self, pool: rowptr[memhub.MemBuddy], def init_func_table(self, pool: rawptr[memhub.MemBuddy],
max_count: int) -> GenTypes.FuncEntry | t.CPtr: max_count: int) -> GenTypes.FuncEntry | t.CPtr:
"""分配并清零函数表数组""" """分配并清零函数表数组"""
size: sizet = max_count * GenTypes.FuncEntry.__sizeof__() size: sizet = max_count * GenTypes.FuncEntry.__sizeof__()
@@ -1085,7 +1085,7 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin):
defaults: t.CPtr = None, defaults: t.CPtr = None,
default_count: int = 0, default_count: int = 0,
param_count: int = 0, param_count: int = 0,
pool: rowptr[memhub.MemBuddy] = None, pool: rawptr[memhub.MemBuddy] = None,
def_sha1: str = None) -> int: def_sha1: str = None) -> int:
"""添加函数到函数表,返回 0 成功 """添加函数到函数表,返回 0 成功
@@ -1144,7 +1144,7 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin):
def _register_global_func(self, name: str, func: llvmlite.Function | t.CPtr, def _register_global_func(self, name: str, func: llvmlite.Function | t.CPtr,
pool: rowptr[memhub.MemBuddy] = None) -> int: pool: rawptr[memhub.MemBuddy] = None) -> int:
"""注册函数到全局表(已存在则跳过),返回 0 成功 """注册函数到全局表(已存在则跳过),返回 0 成功
直接操作全局表,不调用 add_func_to_table,避免递归。 直接操作全局表,不调用 add_func_to_table,避免递归。
@@ -1442,7 +1442,7 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin):
return None return None
def _build_const_from_snapshot(self, pool: rowptr[memhub.MemBuddy], def _build_const_from_snapshot(self, pool: rawptr[memhub.MemBuddy],
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
gd_entry: GenTypes.FuncDefaultsEntry | t.CPtr, gd_entry: GenTypes.FuncDefaultsEntry | t.CPtr,
di: int, di: int,
@@ -1527,7 +1527,7 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin):
return None return None
def NewExprCallHandle(self, pool: rowptr[memhub.MemBuddy], def NewExprCallHandle(self, pool: rawptr[memhub.MemBuddy],
trans: HT.Translator | t.CPtr) -> ExprCallHandle | t.CPtr: trans: HT.Translator | t.CPtr) -> ExprCallHandle | t.CPtr:
h: ExprCallHandle | t.CPtr = pool.alloc(ExprCallHandle.__sizeof__()) h: ExprCallHandle | t.CPtr = pool.alloc(ExprCallHandle.__sizeof__())
if h is None: if h is None:
+8 -8
View File
@@ -24,7 +24,7 @@ from . import CallGenBase
class CallGenLib(CallGenBase.CallGenBase): class CallGenLib(CallGenBase.CallGenBase):
"""C 库声明 / 返回类型推断 / kwargs 调用辅助(继承 Base)""" """C 库声明 / 返回类型推断 / kwargs 调用辅助(继承 Base)"""
def _ensure_c_lib_declare(self, pool: rowptr[memhub.MemBuddy], def _ensure_c_lib_declare(self, pool: rawptr[memhub.MemBuddy],
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
name: str) -> llvmlite.Function | t.CPtr: name: str) -> llvmlite.Function | t.CPtr:
"""为已知的 C 库函数创建 declare 声明""" """为已知的 C 库函数创建 declare 声明"""
@@ -113,7 +113,7 @@ class CallGenLib(CallGenBase.CallGenBase):
llvmlite.add_param(pool, fn, i64_ty, "n") llvmlite.add_param(pool, fn, i64_ty, "n")
return fn return fn
def _promote_clib_call_args(self, pool: rowptr[memhub.MemBuddy], def _promote_clib_call_args(self, pool: rawptr[memhub.MemBuddy],
builder: llvmlite.IRBuilder | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr,
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
call_name: str, call_name: str,
@@ -188,7 +188,7 @@ class CallGenLib(CallGenBase.CallGenBase):
return new_head return new_head
# _coerce_args_to_def_params:按 vpi 定义侧形参注解把跨模块调用实参 coerce 到目标类型并重建实参链,使 call/declare/define 宽度一致;支持 {sha1}.{func} 与 {sha1}.{cls}.{method} 两形态(段下标与实参下标一一对应),裸名 C 库走 _promote_clib_call_args/_ensure_c_lib_declare,未命中原样保留 # _coerce_args_to_def_params:按 vpi 定义侧形参注解把跨模块调用实参 coerce 到目标类型并重建实参链,使 call/declare/define 宽度一致;支持 {sha1}.{func} 与 {sha1}.{cls}.{method} 两形态(段下标与实参下标一一对应),裸名 C 库走 _promote_clib_call_args/_ensure_c_lib_declare,未命中原样保留
def _coerce_args_to_def_params(self, pool: rowptr[memhub.MemBuddy], def _coerce_args_to_def_params(self, pool: rawptr[memhub.MemBuddy],
builder: llvmlite.IRBuilder | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr,
call_name: str, call_name: str,
head: llvmlite.Value | t.CPtr, head: llvmlite.Value | t.CPtr,
@@ -285,7 +285,7 @@ class CallGenLib(CallGenBase.CallGenBase):
return new_head return new_head
# _coerce_arg_value_to_ty:单个实参 Value 转换到目标形参类型——整型同宽原样、窄化 trunc/按宽度重建常量、扩宽按源符号性 zext/sext;指针 i8* 性不同则 bitcast;其余原样返回(不可转换亦不改型) # _coerce_arg_value_to_ty:单个实参 Value 转换到目标形参类型——整型同宽原样、窄化 trunc/按宽度重建常量、扩宽按源符号性 zext/sext;指针 i8* 性不同则 bitcast;其余原样返回(不可转换亦不改型)
def _coerce_arg_value_to_ty(self, pool: rowptr[memhub.MemBuddy], def _coerce_arg_value_to_ty(self, pool: rawptr[memhub.MemBuddy],
builder: llvmlite.IRBuilder | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr,
val: llvmlite.Value | t.CPtr, val: llvmlite.Value | t.CPtr,
tgt_ty: llvmlite.LLVMType | t.CPtr, tgt_ty: llvmlite.LLVMType | t.CPtr,
@@ -387,7 +387,7 @@ class CallGenLib(CallGenBase.CallGenBase):
pass pass
return val return val
def _infer_external_func_ret_ty(self, pool: rowptr[memhub.MemBuddy], def _infer_external_func_ret_ty(self, pool: rawptr[memhub.MemBuddy],
func_name: str, func_name: str,
node: ast.AST | t.CPtr, node: ast.AST | t.CPtr,
fatal_if_unknown: int) -> llvmlite.LLVMType | t.CPtr: fatal_if_unknown: int) -> llvmlite.LLVMType | t.CPtr:
@@ -584,7 +584,7 @@ class CallGenLib(CallGenBase.CallGenBase):
f"外部函数返回类型未登记且无法收敛推断(默认 i32 会截断指针/i64,需提供 stub 声明或加入白名单): {func_name}", f"外部函数返回类型未登记且无法收敛推断(默认 i32 会截断指针/i64,需提供 stub 声明或加入白名单): {func_name}",
"TypeError") "TypeError")
return llvmlite.Int32(pool) return llvmlite.Int32(pool)
def _get_external_func_param_ty(self, pool: rowptr[memhub.MemBuddy], def _get_external_func_param_ty(self, pool: rawptr[memhub.MemBuddy],
func_name: str, func_name: str,
param_idx: int) -> llvmlite.LLVMType | t.CPtr: param_idx: int) -> llvmlite.LLVMType | t.CPtr:
"""获取外部函数第 param_idx 个参数的期望类型,None 表示用字面量原类型 """获取外部函数第 param_idx 个参数的期望类型,None 表示用字面量原类型
@@ -644,7 +644,7 @@ class CallGenLib(CallGenBase.CallGenBase):
if GenApi.sha1_prefix_len(call_name) != 0: if GenApi.sha1_prefix_len(call_name) != 0:
return 1 return 1
return 0 return 0
def _emit_llvm_memcpy_intrinsic(self, pool: rowptr[memhub.MemBuddy], def _emit_llvm_memcpy_intrinsic(self, pool: rawptr[memhub.MemBuddy],
builder: llvmlite.IRBuilder | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr,
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
dst_val: llvmlite.Value | t.CPtr, dst_val: llvmlite.Value | t.CPtr,
@@ -733,7 +733,7 @@ class CallGenLib(CallGenBase.CallGenBase):
# _translate_call_with_kwargs:带关键字参数的函数调用,按 found_func.Params 顺序构建实参链表(位置参数优先,否则按参数名匹配关键字) # _translate_call_with_kwargs:带关键字参数的函数调用,按 found_func.Params 顺序构建实参链表(位置参数优先,否则按参数名匹配关键字)
# ============================================================ # ============================================================
def _translate_call_with_kwargs(self, pool: rowptr[memhub.MemBuddy], def _translate_call_with_kwargs(self, pool: rawptr[memhub.MemBuddy],
builder: llvmlite.IRBuilder | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr,
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
func_name: str, func_name: str,
+3 -3
View File
@@ -61,7 +61,7 @@ class CallGenMixin(CallGenBase.CallGenBase):
# ============================================================ # ============================================================
# 翻译函数调用 Call(func, args) — 模块级版本 # 翻译函数调用 Call(func, args) — 模块级版本
# ============================================================ # ============================================================
def translate_call(self, pool: rowptr[memhub.MemBuddy], def translate_call(self, pool: rawptr[memhub.MemBuddy],
builder: llvmlite.IRBuilder | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr,
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
node: ast.AST | t.CPtr, node: ast.AST | t.CPtr,
@@ -132,8 +132,8 @@ class CallGenMixin(CallGenBase.CallGenBase):
if self.find_func_in_module(mod, gen_class_name) is not None: if self.find_func_in_module(mod, gen_class_name) is not None:
func_name = gen_class_name func_name = gen_class_name
else: else:
# 内建指针/类型下标 cast:(rowptr[list[int]])(lst)、 # 内建指针/类型下标 cast:(rawptr[list[int]])(lst)、
# (t.CPtr[T])(x)、(t.CArray[i8, N])(x) —— rowptr/CPtr/ # (t.CPtr[T])(x)、(t.CArray[i8, N])(x) —— rawptr/CPtr/
# CArray 不是泛型类模板,是类型注解下标。先按注解解析出 # CArray 不是泛型类模板,是类型注解下标。先按注解解析出
# 类型再单参转换(ast/base.vp L392 ops_list 行根因)。 # 类型再单参转换(ast/base.vp L392 ops_list 行根因)。
if cl.args is not None and len(cl.args) == 1: if cl.args is not None and len(cl.args) == 1:
+8 -8
View File
@@ -49,7 +49,7 @@ class CallGenProp(CallGenBase.CallGenBase):
# #
# call_head/call_count: 已构建好的参数链表(如 getter 只有 obj 一个参数) # call_head/call_count: 已构建好的参数链表(如 getter 只有 obj 一个参数)
# ============================================================ # ============================================================
def _translate_property_call(self, pool: rowptr[memhub.MemBuddy], def _translate_property_call(self, pool: rawptr[memhub.MemBuddy],
builder: llvmlite.IRBuilder | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr,
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
class_name: str, class_name: str,
@@ -158,7 +158,7 @@ class CallGenProp(CallGenBase.CallGenBase):
# ============================================================ # ============================================================
# ============================================================ # ============================================================
def _resolve_obj_class_name(self, pool: rowptr[memhub.MemBuddy], def _resolve_obj_class_name(self, pool: rawptr[memhub.MemBuddy],
trans: HT.Translator | t.CPtr, trans: HT.Translator | t.CPtr,
obj_node: ast.AST | t.CPtr) -> str: obj_node: ast.AST | t.CPtr) -> str:
"""解析对象表达式的类名(短名),失败返回 None""" """解析对象表达式的类名(短名),失败返回 None"""
@@ -201,7 +201,7 @@ class CallGenProp(CallGenBase.CallGenBase):
# ============================================================ # ============================================================
# ============================================================ # ============================================================
def _try_property_getter_attr(self, pool: rowptr[memhub.MemBuddy], def _try_property_getter_attr(self, pool: rawptr[memhub.MemBuddy],
builder: llvmlite.IRBuilder | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr,
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
at_node: ast.Attribute | t.CPtr, at_node: ast.Attribute | t.CPtr,
@@ -234,7 +234,7 @@ class CallGenProp(CallGenBase.CallGenBase):
# ============================================================ # ============================================================
# ============================================================ # ============================================================
def _try_property_setter(self, pool: rowptr[memhub.MemBuddy], def _try_property_setter(self, pool: rawptr[memhub.MemBuddy],
builder: llvmlite.IRBuilder | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr,
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
target_attr: ast.Attribute | t.CPtr, target_attr: ast.Attribute | t.CPtr,
@@ -276,7 +276,7 @@ class CallGenProp(CallGenBase.CallGenBase):
# ============================================================ # ============================================================
# ============================================================ # ============================================================
def _try_property_deleter(self, pool: rowptr[memhub.MemBuddy], def _try_property_deleter(self, pool: rawptr[memhub.MemBuddy],
builder: llvmlite.IRBuilder | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr,
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
target_attr: ast.Attribute | t.CPtr, target_attr: ast.Attribute | t.CPtr,
@@ -314,7 +314,7 @@ class CallGenProp(CallGenBase.CallGenBase):
# ============================================================ # ============================================================
# ============================================================ # ============================================================
def _translate_static_class_call(self, pool: rowptr[memhub.MemBuddy], def _translate_static_class_call(self, pool: rawptr[memhub.MemBuddy],
builder: llvmlite.IRBuilder | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr,
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
class_name: str, class_name: str,
@@ -431,7 +431,7 @@ class CallGenProp(CallGenBase.CallGenBase):
return name + pfx if pfx != 0 else name return name + pfx if pfx != 0 else name
# _resolve_generic_receiver_name:解析接收者实际泛型特化名(IR 真值)——接收者实际 LLVM 结构体类型名比可能退化的注解/注册名可靠,故泛型判定以此为准:去 sha1 前缀取 '[' 前基名,基名是已注册泛型模板时含类型实参 ⇒ 返回实际特化名,无类型实参 ⇒ fail-fast(D25);基名非泛型模板或实际类型不可得 ⇒ 返回 None(调用方各自回退)。与 CallGenCall._translate_method_call 的 D25 分派修复共用本函数(唯一口径) # _resolve_generic_receiver_name:解析接收者实际泛型特化名(IR 真值)——接收者实际 LLVM 结构体类型名比可能退化的注解/注册名可靠,故泛型判定以此为准:去 sha1 前缀取 '[' 前基名,基名是已注册泛型模板时含类型实参 ⇒ 返回实际特化名,无类型实参 ⇒ fail-fast(D25);基名非泛型模板或实际类型不可得 ⇒ 返回 None(调用方各自回退)。与 CallGenCall._translate_method_call 的 D25 分派修复共用本函数(唯一口径)
def _resolve_generic_receiver_name(self, pool: rowptr[memhub.MemBuddy], def _resolve_generic_receiver_name(self, pool: rawptr[memhub.MemBuddy],
struct_ty: llvmlite.LLVMType | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr,
method_name: str, method_name: str,
cl: ast.Call | t.CPtr) -> str: cl: ast.Call | t.CPtr) -> str:
@@ -471,7 +471,7 @@ class CallGenProp(CallGenBase.CallGenBase):
return None return None
# _is_list_builtin_receiver:基于接收者实际类型判定 list 内建方法,判据与 _resolve_generic_receiver_name 同源——优先采用接收者实际 LLVM 结构体类型名(去 sha1 判基名),不可得时回退注解名/注册名判定。返回 1=list 内置方法 / 0=非 # _is_list_builtin_receiver:基于接收者实际类型判定 list 内建方法,判据与 _resolve_generic_receiver_name 同源——优先采用接收者实际 LLVM 结构体类型名(去 sha1 判基名),不可得时回退注解名/注册名判定。返回 1=list 内置方法 / 0=非
def _is_list_builtin_receiver(self, pool: rowptr[memhub.MemBuddy], def _is_list_builtin_receiver(self, pool: rawptr[memhub.MemBuddy],
recv_val: llvmlite.Value | t.CPtr, recv_val: llvmlite.Value | t.CPtr,
fallback_name: str, fallback_name: str,
method_name: str, method_name: str,
+8 -8
View File
@@ -27,7 +27,7 @@ class CallGenVa(CallGenBase.CallGenBase):
# _translate_method 在含 raise 的函数签名末尾注入(main 除外)。 # _translate_method 在含 raise 的函数签名末尾注入(main 除外)。
# ============================================================ # ============================================================
def _va_arg_get_alloca_ptr(self, pool: rowptr[memhub.MemBuddy], def _va_arg_get_alloca_ptr(self, pool: rawptr[memhub.MemBuddy],
builder: llvmlite.IRBuilder | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr,
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
arg_node: ast.AST | t.CPtr, arg_node: ast.AST | t.CPtr,
@@ -51,7 +51,7 @@ class CallGenVa(CallGenBase.CallGenBase):
return alloca return alloca
# 回退:translate_value(可能返回 load 后的值,仅适用于已是指针的情况) # 回退:translate_value(可能返回 load 后的值,仅适用于已是指针的情况)
return self.Gen.ExprGen.translate_value(builder, pool, mod, arg_node, funcs_ptr, func_count, trans) return self.Gen.ExprGen.translate_value(builder, pool, mod, arg_node, funcs_ptr, func_count, trans)
def _resolve_va_arg_type(self, pool: rowptr[memhub.MemBuddy], def _resolve_va_arg_type(self, pool: rawptr[memhub.MemBuddy],
type_node: ast.AST | t.CPtr, type_node: ast.AST | t.CPtr,
trans: HT.Translator | t.CPtr) -> llvmlite.LLVMType | t.CPtr: trans: HT.Translator | t.CPtr) -> llvmlite.LLVMType | t.CPtr:
"""解析 va_arg/arg 的类型参数为 LLVMType """解析 va_arg/arg 的类型参数为 LLVMType
@@ -74,7 +74,7 @@ class CallGenVa(CallGenBase.CallGenBase):
# 类型节点存在但解析失败:fail-fast,绝不回退 i32(会按错宽度读变参槽位) # 类型节点存在但解析失败:fail-fast,绝不回退 i32(会按错宽度读变参槽位)
self.Gen.TypeGenErr.fatal_error(type_node, "va_arg 类型解析失败", "TypeError") self.Gen.TypeGenErr.fatal_error(type_node, "va_arg 类型解析失败", "TypeError")
return llvmlite.Int32(pool) return llvmlite.Int32(pool)
def _translate_va_arg_sugar(self, pool: rowptr[memhub.MemBuddy], def _translate_va_arg_sugar(self, pool: rawptr[memhub.MemBuddy],
builder: llvmlite.IRBuilder | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr,
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
cl: ast.Call | t.CPtr, cl: ast.Call | t.CPtr,
@@ -122,7 +122,7 @@ class CallGenVa(CallGenBase.CallGenBase):
# 生成 va_arg 指令 # 生成 va_arg 指令
return llvmlite.build_va_arg(builder, ap_ptr, read_ty) return llvmlite.build_va_arg(builder, ap_ptr, read_ty)
def _translate_arg_sugar(self, pool: rowptr[memhub.MemBuddy], def _translate_arg_sugar(self, pool: rawptr[memhub.MemBuddy],
builder: llvmlite.IRBuilder | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr,
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
cl: ast.Call | t.CPtr, cl: ast.Call | t.CPtr,
@@ -158,7 +158,7 @@ class CallGenVa(CallGenBase.CallGenBase):
# 生成 va_arg 指令(使用 trans._va_list_ptr 作为 va_list 地址) # 生成 va_arg 指令(使用 trans._va_list_ptr 作为 va_list 地址)
return llvmlite.build_va_arg(builder, trans._va_list_ptr, read_ty) return llvmlite.build_va_arg(builder, trans._va_list_ptr, read_ty)
def _translate_va_start_sugar(self, pool: rowptr[memhub.MemBuddy], def _translate_va_start_sugar(self, pool: rawptr[memhub.MemBuddy],
builder: llvmlite.IRBuilder | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr,
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
cargs: list[ast.AST | t.CPtr] | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr,
@@ -190,7 +190,7 @@ class CallGenVa(CallGenBase.CallGenBase):
void_ty_vs: llvmlite.LLVMType | t.CPtr = llvmlite.Void(pool) void_ty_vs: llvmlite.LLVMType | t.CPtr = llvmlite.Void(pool)
llvmlite.build_call(builder, "llvm.va_start", ap_i8, 1, void_ty_vs, 0) llvmlite.build_call(builder, "llvm.va_start", ap_i8, 1, void_ty_vs, 0)
return llvmlite.const_int32(pool, 0) return llvmlite.const_int32(pool, 0)
def _translate_va_end_sugar(self, pool: rowptr[memhub.MemBuddy], def _translate_va_end_sugar(self, pool: rawptr[memhub.MemBuddy],
builder: llvmlite.IRBuilder | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr,
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
cargs: list[ast.AST | t.CPtr] | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr,
@@ -250,7 +250,7 @@ class CallGenVa(CallGenBase.CallGenBase):
return 2 return 2
return -1 return -1
def _get_known_vararg_cfunc_param_ty(self, pool: rowptr[memhub.MemBuddy], def _get_known_vararg_cfunc_param_ty(self, pool: rawptr[memhub.MemBuddy],
name: str, idx: int) -> llvmlite.LLVMType | t.CPtr: name: str, idx: int) -> llvmlite.LLVMType | t.CPtr:
"""已知变参 C 库函数第 idx 个固定参数类型(变参位置/未知返回 None) """已知变参 C 库函数第 idx 个固定参数类型(变参位置/未知返回 None)
@@ -276,7 +276,7 @@ class CallGenVa(CallGenBase.CallGenBase):
return i8_ptr_kv return i8_ptr_kv
return None return None
return None return None
def _check_and_promote_variadic_call(self, pool: rowptr[memhub.MemBuddy], def _check_and_promote_variadic_call(self, pool: rawptr[memhub.MemBuddy],
builder: llvmlite.IRBuilder | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr,
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
call_name: str, call_name: str,
+2 -2
View File
@@ -25,7 +25,7 @@ class CallGenVt(CallGenBase.CallGenBase):
# _write_vtable_slot / _write_vtable_attr:把模块级函数指针写入对象 vtable 的方法槽位(devfs 驱动注册模式,对齐 TPC HandlesAssign.py L905-949 写时复制)——vtable 方法不是数据字段,get_attribute_ptr 查不到;对象 vtable 仍指向类默认 vtable 时先复制一份(internal 全局 + llvm.memcpy)并让对象指向副本,再 GEP method_index 槽位 store i8*。多次写入互不覆盖 # _write_vtable_slot / _write_vtable_attr:把模块级函数指针写入对象 vtable 的方法槽位(devfs 驱动注册模式,对齐 TPC HandlesAssign.py L905-949 写时复制)——vtable 方法不是数据字段,get_attribute_ptr 查不到;对象 vtable 仍指向类默认 vtable 时先复制一份(internal 全局 + llvm.memcpy)并让对象指向副本,再 GEP method_index 槽位 store i8*。多次写入互不覆盖
# ============================================================ # ============================================================
def _write_vtable_slot(self, pool: rowptr[memhub.MemBuddy], def _write_vtable_slot(self, pool: rawptr[memhub.MemBuddy],
builder: llvmlite.IRBuilder | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr,
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
obj_ptr: llvmlite.Value | t.CPtr, obj_ptr: llvmlite.Value | t.CPtr,
@@ -162,7 +162,7 @@ class CallGenVt(CallGenBase.CallGenBase):
llvmlite.build_store(builder, fptr_i8, vt_slotp) llvmlite.build_store(builder, fptr_i8, vt_slotp)
return 1 return 1
def _write_vtable_attr(self, builder: llvmlite.IRBuilder | t.CPtr, def _write_vtable_attr(self, builder: llvmlite.IRBuilder | t.CPtr,
pool: rowptr[memhub.MemBuddy], pool: rawptr[memhub.MemBuddy],
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
node: ast.AST | t.CPtr, node: ast.AST | t.CPtr,
rhs_val: llvmlite.Value | t.CPtr, rhs_val: llvmlite.Value | t.CPtr,
+8 -8
View File
@@ -492,7 +492,7 @@ class ClassGenBase:
elif string.strcmp(at.attr, "deleter") == 0: elif string.strcmp(at.attr, "deleter") == 0:
meta |= GenTypes.META_PROP_DELETER meta |= GenTypes.META_PROP_DELETER
return meta return meta
def register_class_meta(self, pool: rowptr[memhub.MemBuddy], def register_class_meta(self, pool: rawptr[memhub.MemBuddy],
kind: int, cls: str, field: str) -> int: kind: int, cls: str, field: str) -> int:
"""注册类编译期元数据字段(__provides__/__requires__/__require_must__,幂等)""" """注册类编译期元数据字段(__provides__/__requires__/__require_must__,幂等)"""
if pool is None or cls is None or field is None: if pool is None or cls is None or field is None:
@@ -545,7 +545,7 @@ class ClassGenBase:
return self.ClassMetaFields + i * 64 return self.ClassMetaFields + i * 64
n_cm2 += 1 n_cm2 += 1
return None return None
def register_decorator(self, pool: rowptr[memhub.MemBuddy], def register_decorator(self, pool: rawptr[memhub.MemBuddy],
func_name: str, wrapper_name: str, func_name: str, wrapper_name: str,
arg0: int64) -> int: arg0: int64) -> int:
"""注册自定义装饰器函数(@log/@skip/@repeat(3) → __decor_wrap_{name}) """注册自定义装饰器函数(@log/@skip/@repeat(3) → __decor_wrap_{name})
@@ -606,7 +606,7 @@ class ClassGenBase:
"""懒初始化异常表(perm_pool),返回 0 成功""" """懒初始化异常表(perm_pool),返回 0 成功"""
if self.ExceptionNames is not None: if self.ExceptionNames is not None:
return 0 return 0
pp_e: rowptr[memhub.MemBuddy] = CompilerFactory.factory.PermPool pp_e: rawptr[memhub.MemBuddy] = CompilerFactory.factory.PermPool
if pp_e is None: if pp_e is None:
return -1 return -1
self.ExceptionNames = pp_e.alloc(EXCEPTION_MAX * EXCEPTION_NAME_LEN) self.ExceptionNames = pp_e.alloc(EXCEPTION_MAX * EXCEPTION_NAME_LEN)
@@ -785,7 +785,7 @@ class ClassGenBase:
parent_e: str = self._get_exception_parent_name(cd) parent_e: str = self._get_exception_parent_name(cd)
self.register_exception(cd.name, parent_e) self.register_exception(cd.name, parent_e)
return 0 return 0
def _register_class_meta_list(self, pool: rowptr[memhub.MemBuddy], def _register_class_meta_list(self, pool: rawptr[memhub.MemBuddy],
kind: int, cls: str, value_node: ast.AST | t.CPtr) -> None: kind: int, cls: str, value_node: ast.AST | t.CPtr) -> None:
"""解析类体 __provides__/__requires__ 的 list[str] 字面量并注册""" """解析类体 __provides__/__requires__ 的 list[str] 字面量并注册"""
if value_node is None or cls is None: if value_node is None or cls is None:
@@ -903,7 +903,7 @@ class ClassGenBase:
return 1 return 1
return 0 return 0
def _get_base_name(self, base_node: ast.AST | t.CPtr, def _get_base_name(self, base_node: ast.AST | t.CPtr,
pool: rowptr[memhub.MemBuddy] = None) -> str: pool: rawptr[memhub.MemBuddy] = None) -> str:
"""从 base AST 节点提取基类名,返回 None=失败 """从 base AST 节点提取基类名,返回 None=失败
对于 Subscript 节点,需要 pool 分配内存拼接特化名; 对于 Subscript 节点,需要 pool 分配内存拼接特化名;
@@ -960,7 +960,7 @@ class ClassGenBase:
"""获取 ClassDef 的真实父类名,返回 None=无真实父类""" """获取 ClassDef 的真实父类名,返回 None=无真实父类"""
if cd is None or cd.bases is None: if cd is None or cd.bases is None:
return None return None
pool: rowptr[memhub.MemBuddy] = None pool: rawptr[memhub.MemBuddy] = None
if trans is not None: if trans is not None:
pool = trans.Pool pool = trans.Pool
bases: list[ast.AST | t.CPtr] | t.CPtr = cd.bases bases: list[ast.AST | t.CPtr] | t.CPtr = cd.bases
@@ -1007,7 +1007,7 @@ class ClassGenBase:
og_buf[og_len] = '\0' og_buf[og_len] = '\0'
return og_buf return og_buf
return base_name return base_name
def _collect_parents(self, pool: rowptr[memhub.MemBuddy], def _collect_parents(self, pool: rawptr[memhub.MemBuddy],
cd: ast.ClassDef | t.CPtr, cd: ast.ClassDef | t.CPtr,
parents_buf: sizet | t.CPtr, parents_buf: sizet | t.CPtr,
max_parents: int, max_parents: int,
@@ -1061,7 +1061,7 @@ class ClassGenBase:
"""触发 base 中 Subscript 的泛型特化(如 GSListNode[Value])""" """触发 base 中 Subscript 的泛型特化(如 GSListNode[Value])"""
if trans is None or cd is None or cd.bases is None: if trans is None or cd is None or cd.bases is None:
return return
pool: rowptr[memhub.MemBuddy] = trans.Pool pool: rawptr[memhub.MemBuddy] = trans.Pool
bases: list[ast.AST | t.CPtr] | t.CPtr = cd.bases bases: list[ast.AST | t.CPtr] | t.CPtr = cd.bases
bn: sizet = len(bases) bn: sizet = len(bases)
if bn == 0: if bn == 0:
+1 -1
View File
@@ -38,7 +38,7 @@ class ClassGenDef(ClassGenBase.ClassGenBase):
if cd is None or cd.name is None: if cd is None or cd.name is None:
return 0 return 0
pool: rowptr[memhub.MemBuddy] = trans.Pool pool: rawptr[memhub.MemBuddy] = trans.Pool
class_name: str = cd.name class_name: str = cd.name
if trans.ModuleSha1 is None: if trans.ModuleSha1 is None:
+14 -14
View File
@@ -34,7 +34,7 @@ RENUM_ALIAS_MAX: t.CDefine = 512
class ClassGenEnum(ClassGenBase.ClassGenBase): class ClassGenEnum(ClassGenBase.ClassGenBase):
"""enum/union/renum 定义与变体表""" """enum/union/renum 定义与变体表"""
def _resolve_enum_member_type(self, pool: rowptr[memhub.MemBuddy], def _resolve_enum_member_type(self, pool: rawptr[memhub.MemBuddy],
ann_node: ast.AST | t.CPtr, ann_node: ast.AST | t.CPtr,
imported_modules: str, imported_modules: str,
from_imports: str) -> llvmlite.LLVMType | t.CPtr: from_imports: str) -> llvmlite.LLVMType | t.CPtr:
@@ -151,7 +151,7 @@ class ClassGenEnum(ClassGenBase.ClassGenBase):
if cd is None or cd.name is None or trans is None: if cd is None or cd.name is None or trans is None:
return 0 return 0
pool: rowptr[memhub.MemBuddy] = trans.Pool pool: rawptr[memhub.MemBuddy] = trans.Pool
class_name: str = cd.name class_name: str = cd.name
# 不按全局同名跳过:跨模块可能同名枚举(includes/w32/fileio.vp 的 # 不按全局同名跳过:跨模块可能同名枚举(includes/w32/fileio.vp 的
@@ -398,7 +398,7 @@ class ClassGenEnum(ClassGenBase.ClassGenBase):
if cd is None or cd.name is None or trans is None: if cd is None or cd.name is None or trans is None:
return 0 return 0
pool: rowptr[memhub.MemBuddy] = trans.Pool pool: rawptr[memhub.MemBuddy] = trans.Pool
class_name: str = cd.name class_name: str = cd.name
# 命名空间隔离:标记为当前文件可见(必须在 existing 检查之前) # 命名空间隔离:标记为当前文件可见(必须在 existing 检查之前)
@@ -552,7 +552,7 @@ class ClassGenEnum(ClassGenBase.ClassGenBase):
VLogger.info(f"registered {class_name} with {field_count} fields, max_size={max_size}", "UNION") VLogger.info(f"registered {class_name} with {field_count} fields, max_size={max_size}", "UNION")
return 0 return 0
def _get_annotation_field_size(self, pool: rowptr[memhub.MemBuddy], def _get_annotation_field_size(self, pool: rawptr[memhub.MemBuddy],
annotation: ast.AST | t.CPtr) -> int: annotation: ast.AST | t.CPtr) -> int:
"""计算注解类型的字节大小,用于 REnum 布局计算""" """计算注解类型的字节大小,用于 REnum 布局计算"""
if annotation is None: if annotation is None:
@@ -622,7 +622,7 @@ class ClassGenEnum(ClassGenBase.ClassGenBase):
if cd is None or cd.name is None or trans is None: if cd is None or cd.name is None or trans is None:
return 0 return 0
pool: rowptr[memhub.MemBuddy] = trans.Pool pool: rawptr[memhub.MemBuddy] = trans.Pool
class_name: str = cd.name class_name: str = cd.name
# 命名空间隔离:标记为当前文件可见 # 命名空间隔离:标记为当前文件可见
@@ -643,7 +643,7 @@ class ClassGenEnum(ClassGenBase.ClassGenBase):
return 0 return 0
# 变体表缺失:中和旧 entry(对齐 ClassGenDef needs_rereg 先例),使 # 变体表缺失:中和旧 entry(对齐 ClassGenDef needs_rereg 先例),使
# find_struct_by_module 不再命中(按 Name 精确匹配),走下方完整注册路径 # find_struct_by_module 不再命中(按 Name 精确匹配),走下方完整注册路径
# 以同时修正 struct 布局 + 变体表。 # 以同时修正 struct 布局 + 变体表。
if existing.Name is not None: if existing.Name is not None:
existing.Name[0] = '\0' existing.Name[0] = '\0'
existing.Ty = None existing.Ty = None
@@ -859,7 +859,7 @@ class ClassGenEnum(ClassGenBase.ClassGenBase):
# 注册变体字段名别名已在变体遍历时直接完成(避免 CSizeT→str 转换问题)。 # 注册变体字段名别名已在变体遍历时直接完成(避免 CSizeT→str 转换问题)。
# 注意:遍历发生在 register_struct 之前,注解引用本类自身(如 # 注意:遍历发生在 register_struct 之前,注解引用本类自身(如
# LLVMType.Ptr.Pointee: rowptr[LLVMType])时类尚未注册 → 别名表类型槽 # LLVMType.Ptr.Pointee: rawptr[LLVMType])时类尚未注册 → 别名表类型槽
# 为 0 → match 绑定回退槽位 i64 把指针字段读成整数。此处类已注册, # 为 0 → match 绑定回退槽位 i64 把指针字段读成整数。此处类已注册,
# 补一遍字段类型解析回填 0 槽(详见 _refill_renum_field_types)。 # 补一遍字段类型解析回填 0 槽(详见 _refill_renum_field_types)。
self._refill_renum_field_types(trans, pool, class_name, cd) self._refill_renum_field_types(trans, pool, class_name, cd)
@@ -867,18 +867,18 @@ class ClassGenEnum(ClassGenBase.ClassGenBase):
VLogger.info(f"registered {class_name} with {variant_count} variants, {total_positions} positions", "RENUM") VLogger.info(f"registered {class_name} with {variant_count} variants, {total_positions} positions", "RENUM")
return 0 return 0
def _refill_renum_field_types(self, trans: HT.Translator | t.CPtr, def _refill_renum_field_types(self, trans: HT.Translator | t.CPtr,
pool: rowptr[memhub.MemBuddy], pool: rawptr[memhub.MemBuddy],
class_name: str, class_name: str,
cd: ast.ClassDef | t.CPtr): cd: ast.ClassDef | t.CPtr):
"""REnum 注册完成后补解析变体字段类型(仅回填类型槽为 0 的别名记录) """REnum 注册完成后补解析变体字段类型(仅回填类型槽为 0 的别名记录)
第一遍变体字段遍历发生在 register_struct 之前:字段注解引用本 REnum 类 第一遍变体字段遍历发生在 register_struct 之前:字段注解引用本 REnum 类
自身(如 LLVMType.Ptr.Pointee: rowptr[LLVMType]、Array.ElemTy: 自身(如 LLVMType.Ptr.Pointee: rawptr[LLVMType]、Array.ElemTy:
rowptr[LLVMType]、Func.Ret: rowptr[LLVMType])时,find_struct 查不到 rawptr[LLVMType]、Func.Ret: rawptr[LLVMType])时,find_struct 查不到
正在注册的类 → resolve_annotation_type 返回 None → _register_renum_field_alias 正在注册的类 → resolve_annotation_type 返回 None → _register_renum_field_alias
类型槽(RenumAliasTy)落 0。match 绑定时 _lookup_renum_member_ty 查不到 类型槽(RenumAliasTy)落 0。match 绑定时 _lookup_renum_member_ty 查不到
成员类型 → 绑定变量按 payload 槽位(i64)读取,把指针字段读成整数 → 成员类型 → 绑定变量按 payload 槽位(i64)读取,把指针字段读成整数 →
递归传参/赋值给 rowptr[LLVMType] 形参被 int→ptr 显式拦截误报 CastError 递归传参/赋值给 rawptr[LLVMType] 形参被 int→ptr 显式拦截误报 CastError
(llvmlite __types.vp L448 根因)。 (llvmlite __types.vp L448 根因)。
本方法在 register_struct 完成(自身类已可查)后按与第一遍相同的位置 本方法在 register_struct 完成(自身类已可查)后按与第一遍相同的位置
@@ -932,7 +932,7 @@ class ClassGenEnum(ClassGenBase.ClassGenBase):
pool, class_name, vnm.id, field_idx + 1, pool, class_name, vnm.id, field_idx + 1,
mem_ty_l, variant_cd.name) mem_ty_l, variant_cd.name)
field_idx += 1 field_idx += 1
def _register_renum_variants(self, pool: rowptr[memhub.MemBuddy], def _register_renum_variants(self, pool: rawptr[memhub.MemBuddy],
class_name: str, class_name: str,
cd: ast.ClassDef | t.CPtr, cd: ast.ClassDef | t.CPtr,
variant_count: int): variant_count: int):
@@ -1175,7 +1175,7 @@ class ClassGenEnum(ClassGenBase.ClassGenBase):
return self.RenumVariantTags[name_offset] return self.RenumVariantTags[name_offset]
return -1 return -1
return -1 return -1
def _register_renum_field_alias(self, pool: rowptr[memhub.MemBuddy], def _register_renum_field_alias(self, pool: rawptr[memhub.MemBuddy],
class_name: str, class_name: str,
field_name: str, field_name: str,
payload_idx: int, payload_idx: int,
@@ -1194,7 +1194,7 @@ class ClassGenEnum(ClassGenBase.ClassGenBase):
# 懒初始化表(perm_pool:1a 每文件 reset 后表本体不被回收) # 懒初始化表(perm_pool:1a 每文件 reset 后表本体不被回收)
if self.RenumAliasClass is None: if self.RenumAliasClass is None:
alias_pool_rfa: rowptr[memhub.MemBuddy] = CompilerFactory.factory.PermPool alias_pool_rfa: rawptr[memhub.MemBuddy] = CompilerFactory.factory.PermPool
self.RenumAliasClass = alias_pool_rfa.alloc(8 * RENUM_ALIAS_MAX) self.RenumAliasClass = alias_pool_rfa.alloc(8 * RENUM_ALIAS_MAX)
self.RenumAliasField = alias_pool_rfa.alloc(8 * RENUM_ALIAS_MAX) self.RenumAliasField = alias_pool_rfa.alloc(8 * RENUM_ALIAS_MAX)
self.RenumAliasIndex = alias_pool_rfa.alloc(8 * RENUM_ALIAS_MAX) self.RenumAliasIndex = alias_pool_rfa.alloc(8 * RENUM_ALIAS_MAX)
+9 -9
View File
@@ -52,7 +52,7 @@ class ClassGenGeneric(ClassGenBase.ClassGenBase):
if tp is None: if tp is None:
return 0 return 0
return 1 return 1
def _register_generic_template(self, pool: rowptr[memhub.MemBuddy], def _register_generic_template(self, pool: rawptr[memhub.MemBuddy],
cd: ast.ClassDef | t.CPtr, cd: ast.ClassDef | t.CPtr,
module_sha1: str) -> None: module_sha1: str) -> None:
"""注册泛型类模板(类名 + ClassDef 节点 + 来源模块 SHA1)""" """注册泛型类模板(类名 + ClassDef 节点 + 来源模块 SHA1)"""
@@ -115,7 +115,7 @@ class ClassGenGeneric(ClassGenBase.ClassGenBase):
string.strcat(buf, " ") string.strcat(buf, " ")
string.strcat(buf, tp_name) string.strcat(buf, tp_name)
return buf return buf
def _find_generic_template_tp_params(self, pool: rowptr[memhub.MemBuddy], def _find_generic_template_tp_params(self, pool: rawptr[memhub.MemBuddy],
class_name: str) -> list[str] | t.CPtr: class_name: str) -> list[str] | t.CPtr:
"""查找泛型类模板的类型参数名列表,未找到返回 None """查找泛型类模板的类型参数名列表,未找到返回 None
@@ -209,7 +209,7 @@ class ClassGenGeneric(ClassGenBase.ClassGenBase):
f_val: str = files_local.get(i) f_val: str = files_local.get(i)
return f_val return f_val
return None return None
def _mangle_generic_class_name(self, pool: rowptr[memhub.MemBuddy], def _mangle_generic_class_name(self, pool: rawptr[memhub.MemBuddy],
class_name: str, class_name: str,
type_args: list[str] | t.CPtr) -> str: type_args: list[str] | t.CPtr) -> str:
"""生成特化类名: list + [int] -> list[int] """生成特化类名: list + [int] -> list[int]
@@ -246,7 +246,7 @@ class ClassGenGeneric(ClassGenBase.ClassGenBase):
string.strcat(mangled, ta) string.strcat(mangled, ta)
string.strcat(mangled, "]") string.strcat(mangled, "]")
return mangled return mangled
def _clone_annotation(self, pool: rowptr[memhub.MemBuddy], def _clone_annotation(self, pool: rawptr[memhub.MemBuddy],
node: ast.AST | t.CPtr, node: ast.AST | t.CPtr,
tp_names: list[str] | t.CPtr, tp_names: list[str] | t.CPtr,
type_args: list[str] | t.CPtr) -> ast.AST | t.CPtr: type_args: list[str] | t.CPtr) -> ast.AST | t.CPtr:
@@ -318,7 +318,7 @@ class ClassGenGeneric(ClassGenBase.ClassGenBase):
# 其他: 直接引用(不拷贝) # 其他: 直接引用(不拷贝)
return node return node
def _clone_arguments(self, pool: rowptr[memhub.MemBuddy], def _clone_arguments(self, pool: rawptr[memhub.MemBuddy],
args: ast.AST | t.CPtr, args: ast.AST | t.CPtr,
tp_names: list[str] | t.CPtr, tp_names: list[str] | t.CPtr,
type_args: list[str] | t.CPtr) -> ast.AST | t.CPtr: type_args: list[str] | t.CPtr) -> ast.AST | t.CPtr:
@@ -347,7 +347,7 @@ class ClassGenGeneric(ClassGenBase.ClassGenBase):
new_arg_list.append(arg_node) new_arg_list.append(arg_node)
return ast.Arguments(pool, new_arg_list, old_args.vararg, old_args.kwarg, return ast.Arguments(pool, new_arg_list, old_args.vararg, old_args.kwarg,
old_args.defaults, old_args.kw_defaults) old_args.defaults, old_args.kw_defaults)
def _clone_classdef_for_spec(self, pool: rowptr[memhub.MemBuddy], def _clone_classdef_for_spec(self, pool: rawptr[memhub.MemBuddy],
cd: ast.ClassDef | t.CPtr, cd: ast.ClassDef | t.CPtr,
spec_name: str, spec_name: str,
tp_names: list[str] | t.CPtr, tp_names: list[str] | t.CPtr,
@@ -416,7 +416,7 @@ class ClassGenGeneric(ClassGenBase.ClassGenBase):
if name_addr != 0: if name_addr != 0:
return (str | t.CPtr)(t.CVoid(name_addr, t.CPtr)) return (str | t.CPtr)(t.CVoid(name_addr, t.CPtr))
return None return None
def _cache_spec(self, pool: rowptr[memhub.MemBuddy], spec_key: str, spec_name: str): def _cache_spec(self, pool: rawptr[memhub.MemBuddy], spec_key: str, spec_name: str):
"""缓存特化结果(stdlib 深拷贝存储,跨文件安全)""" """缓存特化结果(stdlib 深拷贝存储,跨文件安全)"""
if spec_key is None or spec_name is None: if spec_key is None or spec_name is None:
return return
@@ -463,7 +463,7 @@ class ClassGenGeneric(ClassGenBase.ClassGenBase):
merged[cur_len] = ' ' merged[cur_len] = ' '
string.strcpy(merged + cur_len + 1, tdeps) string.strcpy(merged + cur_len + 1, tdeps)
trans._imported_modules = merged trans._imported_modules = merged
def _record_spec_trigger(self, pool: rowptr[memhub.MemBuddy], def _record_spec_trigger(self, pool: rawptr[memhub.MemBuddy],
spec_name: str, trigger_sha1: str) -> int: spec_name: str, trigger_sha1: str) -> int:
"""记录泛型特化类的触发文件 sha1(StructEntry.SpecTriggerSha1) """记录泛型特化类的触发文件 sha1(StructEntry.SpecTriggerSha1)
@@ -528,7 +528,7 @@ class ClassGenGeneric(ClassGenBase.ClassGenBase):
if ta_rsv_g is not None and string.strcmp(ta_raw_g, ta_rsv_g) != 0: if ta_rsv_g is not None and string.strcmp(ta_raw_g, ta_rsv_g) != 0:
type_args.set(ta_i_g, ta_rsv_g) type_args.set(ta_i_g, ta_rsv_g)
pool: rowptr[memhub.MemBuddy] = trans.Pool pool: rawptr[memhub.MemBuddy] = trans.Pool
# 1. 查找泛型模板 # 1. 查找泛型模板
template_cd: ast.ClassDef | t.CPtr = self._find_generic_template(class_name) template_cd: ast.ClassDef | t.CPtr = self._find_generic_template(class_name)
+4 -4
View File
@@ -84,7 +84,7 @@ class ClassGenVTable(ClassGenBase.ClassGenBase):
if trans is None or cd is None or class_name is None: if trans is None or cd is None or class_name is None:
return 0 return 0
pool: rowptr[memhub.MemBuddy] = trans.Pool pool: rawptr[memhub.MemBuddy] = trans.Pool
mod: llvmlite.LLVMModule | t.CPtr = trans.Module mod: llvmlite.LLVMModule | t.CPtr = trans.Module
children: list[ast.AST | t.CPtr] | t.CPtr = cd.children children: list[ast.AST | t.CPtr] | t.CPtr = cd.children
@@ -296,7 +296,7 @@ class ClassGenVTable(ClassGenBase.ClassGenBase):
return 0 return 0
pool: rowptr[memhub.MemBuddy] = trans.Pool pool: rawptr[memhub.MemBuddy] = trans.Pool
mod: llvmlite.LLVMModule | t.CPtr = trans.Module mod: llvmlite.LLVMModule | t.CPtr = trans.Module
# 收集虚方法信息(继承父类 + 自身,结果存 self.VtFullNames 等暂存区) # 收集虚方法信息(继承父类 + 自身,结果存 self.VtFullNames 等暂存区)
@@ -579,7 +579,7 @@ class ClassGenVTable(ClassGenBase.ClassGenBase):
return 0 return 0
pool: rowptr[memhub.MemBuddy] = trans.Pool pool: rawptr[memhub.MemBuddy] = trans.Pool
mod: llvmlite.LLVMModule | t.CPtr = trans.Module mod: llvmlite.LLVMModule | t.CPtr = trans.Module
imported_modules: str = trans._imported_modules imported_modules: str = trans._imported_modules
from_imports: str = trans._from_imports from_imports: str = trans._from_imports
@@ -1086,7 +1086,7 @@ class ClassGenVTable(ClassGenBase.ClassGenBase):
return 0 return 0
pool: rowptr[memhub.MemBuddy] = trans.Pool pool: rawptr[memhub.MemBuddy] = trans.Pool
mod: llvmlite.LLVMModule | t.CPtr = trans.Module mod: llvmlite.LLVMModule | t.CPtr = trans.Module
funcs_ptr: GenTypes.FuncEntry | t.CPtr = trans._funcs funcs_ptr: GenTypes.FuncEntry | t.CPtr = trans._funcs
func_count: int = trans._func_count func_count: int = trans._func_count
+7 -7
View File
@@ -71,7 +71,7 @@ class ExprGenAttr(ExprGenBase.ExprGenBase):
# 用于跨模块全局变量访问: stub 未注入时,翻译阶段生成 @name 引用, # 用于跨模块全局变量访问: stub 未注入时,翻译阶段生成 @name 引用,
# 链接时由 stub 提供 external global 声明。 # 链接时由 stub 提供 external global 声明。
# ============================================================ # ============================================================
def make_global_ref(self, pool: rowptr[memhub.MemBuddy], def make_global_ref(self, pool: rawptr[memhub.MemBuddy],
name: str, name: str,
ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr:
"""创建全局变量引用 (类型为 ty*,名称为 @name)""" """创建全局变量引用 (类型为 ty*,名称为 @name)"""
@@ -185,7 +185,7 @@ class ExprGenAttr(ExprGenBase.ExprGenBase):
if string.strcmp(name, "CAutoPtr") == 0: if string.strcmp(name, "CAutoPtr") == 0:
return 1 return 1
return 0 return 0
def _attr_module_path_str(self, pool: rowptr[memhub.MemBuddy], def _attr_module_path_str(self, pool: rawptr[memhub.MemBuddy],
node: ast.AST | t.CPtr) -> str: node: ast.AST | t.CPtr) -> str:
"""把模块引用 AST 转成模块路径字符串(递归拼接 Attribute 链): """把模块引用 AST 转成模块路径字符串(递归拼接 Attribute 链):
Name('sys') → "sys";Attribute(Attribute(Name('os'),'_win32')) → "os._win32"。 Name('sys') → "sys";Attribute(Attribute(Name('os'),'_win32')) → "os._win32"。
@@ -213,7 +213,7 @@ class ExprGenAttr(ExprGenBase.ExprGenBase):
viperlib.snprintf(buf_m, blen + alen + 2, "%s.%s", base_m, at_m.attr) viperlib.snprintf(buf_m, blen + alen + 2, "%s.%s", base_m, at_m.attr)
return buf_m return buf_m
return None return None
def _resolve_module_attribute_global(self, pool: rowptr[memhub.MemBuddy], def _resolve_module_attribute_global(self, pool: rawptr[memhub.MemBuddy],
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
trans: HT.Translator | t.CPtr, trans: HT.Translator | t.CPtr,
at: ast.Attribute | t.CPtr, at: ast.Attribute | t.CPtr,
@@ -343,7 +343,7 @@ class ExprGenAttr(ExprGenBase.ExprGenBase):
# 非 c.Deref 模式返回 None # 非 c.Deref 模式返回 None
# ============================================================ # ============================================================
def _get_cderef_attr_base(self, builder: llvmlite.IRBuilder | t.CPtr, def _get_cderef_attr_base(self, builder: llvmlite.IRBuilder | t.CPtr,
pool: rowptr[memhub.MemBuddy], pool: rawptr[memhub.MemBuddy],
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
at_value: ast.AST | t.CPtr, at_value: ast.AST | t.CPtr,
trans: HT.Translator | t.CPtr = None) -> llvmlite.Value | t.CPtr: trans: HT.Translator | t.CPtr = None) -> llvmlite.Value | t.CPtr:
@@ -369,7 +369,7 @@ class ExprGenAttr(ExprGenBase.ExprGenBase):
return inner_cd return inner_cd
return None return None
def translate_attribute(self, builder: llvmlite.IRBuilder | t.CPtr, def translate_attribute(self, builder: llvmlite.IRBuilder | t.CPtr,
pool: rowptr[memhub.MemBuddy], pool: rawptr[memhub.MemBuddy],
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
node: ast.AST | t.CPtr, node: ast.AST | t.CPtr,
trans: HT.Translator | t.CPtr = None) -> llvmlite.Value | t.CPtr: trans: HT.Translator | t.CPtr = None) -> llvmlite.Value | t.CPtr:
@@ -1015,7 +1015,7 @@ class ExprGenAttr(ExprGenBase.ExprGenBase):
# 获取属性访问的字段指针(不加载值,用于赋值) # 获取属性访问的字段指针(不加载值,用于赋值)
# 对于 Name 类型的 obj,直接使用 alloca 指针(不 load 结构体) # 对于 Name 类型的 obj,直接使用 alloca 指针(不 load 结构体)
# ============================================================ # ============================================================
def _resolve_attr_field_class(self, pool: rowptr[memhub.MemBuddy], def _resolve_attr_field_class(self, pool: rawptr[memhub.MemBuddy],
trans: HT.Translator | t.CPtr, trans: HT.Translator | t.CPtr,
attr_node: ast.AST | t.CPtr) -> str: attr_node: ast.AST | t.CPtr) -> str:
"""解析属性链(a.b.c)中 c 字段的注解类名。 """解析属性链(a.b.c)中 c 字段的注解类名。
@@ -1064,7 +1064,7 @@ class ExprGenAttr(ExprGenBase.ExprGenBase):
return None return None
return self.Gen.StructGen.get_field_annot_class_name(fe) return self.Gen.StructGen.get_field_annot_class_name(fe)
def get_attribute_ptr(self, builder: llvmlite.IRBuilder | t.CPtr, def get_attribute_ptr(self, builder: llvmlite.IRBuilder | t.CPtr,
pool: rowptr[memhub.MemBuddy], pool: rawptr[memhub.MemBuddy],
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
node: ast.AST | t.CPtr, node: ast.AST | t.CPtr,
trans: HT.Translator | t.CPtr = None) -> llvmlite.Value | t.CPtr: trans: HT.Translator | t.CPtr = None) -> llvmlite.Value | t.CPtr:
+7 -7
View File
@@ -57,7 +57,7 @@ class ExprGenBase:
# ============================================================ # ============================================================
# 转义 LLVM IR 字符串字面量 # 转义 LLVM IR 字符串字面量
# ============================================================ # ============================================================
def escape_llvm_string(self, pool: rowptr[memhub.MemBuddy], def escape_llvm_string(self, pool: rawptr[memhub.MemBuddy],
src: str) -> str: src: str) -> str:
"""将字符串转换为 LLVM IR 字符串字面量 c"...\\00" """ """将字符串转换为 LLVM IR 字符串字面量 c"...\\00" """
if src is None: if src is None:
@@ -218,7 +218,7 @@ class ExprGenBase:
# 返回类名字符串或 None。用于 subscript 操作中判断是否需要 # 返回类名字符串或 None。用于 subscript 操作中判断是否需要
# 转发到 __getitem__/__setitem__ 而非生成 GEP。 # 转发到 __getitem__/__setitem__ 而非生成 GEP。
# ============================================================ # ============================================================
def _get_custom_struct_cls_nm(self, pool: rowptr[memhub.MemBuddy], def _get_custom_struct_cls_nm(self, pool: rawptr[memhub.MemBuddy],
ty: llvmlite.LLVMType | t.CPtr) -> str: ty: llvmlite.LLVMType | t.CPtr) -> str:
"""检查 ty 或 ty 的 pointee 是否是已注册的自定义结构体,返回类名或 None""" """检查 ty 或 ty 的 pointee 是否是已注册的自定义结构体,返回类名或 None"""
if ty is None: if ty is None:
@@ -241,7 +241,7 @@ class ExprGenBase:
# - 普通结构体指针数组(如 pts: Point | t.CPtr):get_subscript_ptr 返回元素地址 # - 普通结构体指针数组(如 pts: Point | t.CPtr):get_subscript_ptr 返回元素地址
# 路由错误会让 list[T] 被当作结构体数组 GEP,访问错位崩溃。 # 路由错误会让 list[T] 被当作结构体数组 GEP,访问错位崩溃。
# ============================================================ # ============================================================
def _is_list_subscript_base(self, pool: rowptr[memhub.MemBuddy], def _is_list_subscript_base(self, pool: rawptr[memhub.MemBuddy],
trans: HT.Translator | t.CPtr, trans: HT.Translator | t.CPtr,
sub_node: ast.AST | t.CPtr) -> int: sub_node: ast.AST | t.CPtr) -> int:
"""判断下标基座是否为 list[T] 变量(1=是)""" """判断下标基座是否为 list[T] 变量(1=是)"""
@@ -277,7 +277,7 @@ class ExprGenBase:
# ============================================================ # ============================================================
# _sub_base_class_name - 解析下标基座变量的结构体类名 # _sub_base_class_name - 解析下标基座变量的结构体类名
# ============================================================ # ============================================================
def _sub_base_class_name(self, pool: rowptr[memhub.MemBuddy], def _sub_base_class_name(self, pool: rawptr[memhub.MemBuddy],
trans: HT.Translator | t.CPtr, trans: HT.Translator | t.CPtr,
sub_node: ast.AST | t.CPtr) -> str: sub_node: ast.AST | t.CPtr) -> str:
"""解析下标基座变量的结构体类名(无则 None)""" """解析下标基座变量的结构体类名(无则 None)"""
@@ -311,7 +311,7 @@ class ExprGenBase:
# - 普通结构体指针数组(如 pts: Point | t.CPtr)→ get_subscript_ptr # - 普通结构体指针数组(如 pts: Point | t.CPtr)→ get_subscript_ptr
# (GEP 元素地址,避免结构体值 base=非指针 报错) # (GEP 元素地址,避免结构体值 base=非指针 报错)
# ============================================================ # ============================================================
def _sub_base_uses_getitem(self, pool: rowptr[memhub.MemBuddy], def _sub_base_uses_getitem(self, pool: rawptr[memhub.MemBuddy],
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
trans: HT.Translator | t.CPtr, trans: HT.Translator | t.CPtr,
sub_node: ast.AST | t.CPtr) -> int: sub_node: ast.AST | t.CPtr) -> int:
@@ -489,7 +489,7 @@ class ExprGenBase:
return llvmlite.build_bitcast(builder, val, target_ty) return llvmlite.build_bitcast(builder, val, target_ty)
return val return val
def _zext_or_sext_val(self, pool: rowptr[memhub.MemBuddy], def _zext_or_sext_val(self, pool: rawptr[memhub.MemBuddy],
val: llvmlite.Value | t.CPtr, val: llvmlite.Value | t.CPtr,
node: ast.AST | t.CPtr = None, node: ast.AST | t.CPtr = None,
trans: HT.Translator | t.CPtr = None) -> int: trans: HT.Translator | t.CPtr = None) -> int:
@@ -509,7 +509,7 @@ class ExprGenBase:
return self.Gen.ExprGenOps.should_zext_widen(pool, val, None, node, trans) return self.Gen.ExprGenOps.should_zext_widen(pool, val, None, node, trans)
# translate_ptr_arith:指针算术 ptr±int,用 getelementptr(按 pointee 元素大小缩放索引,对齐 TPC ExprGen.emit_binary_op / HandlesAugAssign.py);数组 pointee([N x ty]*)先 decay 为元素指针(GEP 0,0),避免以整个数组为步长 # translate_ptr_arith:指针算术 ptr±int,用 getelementptr(按 pointee 元素大小缩放索引,对齐 TPC ExprGen.emit_binary_op / HandlesAugAssign.py);数组 pointee([N x ty]*)先 decay 为元素指针(GEP 0,0),避免以整个数组为步长
def translate_ptr_arith(self, pool: rowptr[memhub.MemBuddy], def translate_ptr_arith(self, pool: rawptr[memhub.MemBuddy],
builder: llvmlite.IRBuilder | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr,
ptr_val: llvmlite.Value | t.CPtr, ptr_val: llvmlite.Value | t.CPtr,
int_val: llvmlite.Value | t.CPtr, int_val: llvmlite.Value | t.CPtr,
+5 -5
View File
@@ -93,7 +93,7 @@ class ExprGenCdef(ExprGenBase.ExprGenBase):
return None return None
viperlib.snprintf(buf, path_len, "%s/%s", base_dir, rel_used) viperlib.snprintf(buf, path_len, "%s/%s", base_dir, rel_used)
# 存在性检查:SourceDir 下不存在且 IncludesDir 不同 → 重试 IncludesDir # 存在性检查:SourceDir 下不存在且 IncludesDir 不同 → 重试 IncludesDir
pf_chk: rowptr[fileio.File] = fileio.File(buf, fileio.MODE.R) pf_chk: rawptr[fileio.File] = fileio.File(buf, fileio.MODE.R)
if pf_chk.closed: if pf_chk.closed:
pf_chk.close() pf_chk.close()
if Config.IncludesDir is not None and base_dir != Config.IncludesDir: if Config.IncludesDir is not None and base_dir != Config.IncludesDir:
@@ -104,7 +104,7 @@ class ExprGenCdef(ExprGenBase.ExprGenBase):
if buf is None: if buf is None:
return None return None
viperlib.snprintf(buf, path_len2, "%s/%s", Config.IncludesDir, rel_used) viperlib.snprintf(buf, path_len2, "%s/%s", Config.IncludesDir, rel_used)
pf_chk2: rowptr[fileio.File] = fileio.File(buf, fileio.MODE.R) pf_chk2: rawptr[fileio.File] = fileio.File(buf, fileio.MODE.R)
if pf_chk2.closed: if pf_chk2.closed:
pf_chk2.close() pf_chk2.close()
stdlib.free(buf) stdlib.free(buf)
@@ -125,7 +125,7 @@ class ExprGenCdef(ExprGenBase.ExprGenBase):
# #
# pyi 文件格式: "NAME: t.CDefine = value" # pyi 文件格式: "NAME: t.CDefine = value"
# ============================================================ # ============================================================
def _lookup_cross_module_cdefine(self, pool: rowptr[memhub.MemBuddy], def _lookup_cross_module_cdefine(self, pool: rawptr[memhub.MemBuddy],
name: str, name: str,
from_imports: str, from_imports: str,
imported_modules: str = None, imported_modules: str = None,
@@ -289,7 +289,7 @@ class ExprGenCdef(ExprGenBase.ExprGenBase):
if pyi_buf is None: if pyi_buf is None:
stdlib.free(pyi_path) stdlib.free(pyi_path)
return -1 return -1
pf: rowptr[fileio.File] = fileio.File(pyi_path, fileio.MODE.R) pf: rawptr[fileio.File] = fileio.File(pyi_path, fileio.MODE.R)
need_py_fallback: int = 0 need_py_fallback: int = 0
bytes_read: LONG = 0 bytes_read: LONG = 0
if pf.closed: if pf.closed:
@@ -1069,7 +1069,7 @@ class ExprGenCdef(ExprGenBase.ExprGenBase):
# ============================================================ # ============================================================
# 翻译变量引用(Name 节点)→ load # 翻译变量引用(Name 节点)→ load
# ============================================================ # ============================================================
def _const_int_for_cdefine(self, pool: rowptr[memhub.MemBuddy], def _const_int_for_cdefine(self, pool: rawptr[memhub.MemBuddy],
value: int64) -> llvmlite.Value | t.CPtr: value: int64) -> llvmlite.Value | t.CPtr:
"""CDefine 整数常量 → LLVM 常量(对齐 TPC TypeConvert 的 64 位升级) """CDefine 整数常量 → LLVM 常量(对齐 TPC TypeConvert 的 64 位升级)
+3 -3
View File
@@ -299,7 +299,7 @@ class ExprGenCls(ExprGenBase.ExprGenBase):
# Attribute → 字段注解类名(_resolve_attr_field_class) # Attribute → 字段注解类名(_resolve_attr_field_class)
# 仅采用已注册结构体;无法精确推断返回 None(fail-fast 由调用方暴露)。 # 仅采用已注册结构体;无法精确推断返回 None(fail-fast 由调用方暴露)。
# ============================================================ # ============================================================
def infer_expr_class(self, pool: rowptr[memhub.MemBuddy], def infer_expr_class(self, pool: rawptr[memhub.MemBuddy],
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
node: ast.AST | t.CPtr, node: ast.AST | t.CPtr,
trans: HT.Translator | t.CPtr) -> str: trans: HT.Translator | t.CPtr) -> str:
@@ -420,7 +420,7 @@ class ExprGenCls(ExprGenBase.ExprGenBase):
# SHA1(stub 中声明)即视为存在。仅在确实存在时采用推断类名, # SHA1(stub 中声明)即视为存在。仅在确实存在时采用推断类名,
# 避免把原生运算误标为类类型。 # 避免把原生运算误标为类类型。
# ============================================================ # ============================================================
def _cls_has_dunder(self, pool: rowptr[memhub.MemBuddy], def _cls_has_dunder(self, pool: rawptr[memhub.MemBuddy],
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
class_name: str, dunder: str) -> int: class_name: str, dunder: str) -> int:
"""类及其 MRO 祖先链中是否存在 dunder 方法,存在返回 1""" """类及其 MRO 祖先链中是否存在 dunder 方法,存在返回 1"""
@@ -456,7 +456,7 @@ class ExprGenCls(ExprGenBase.ExprGenBase):
# CFloat64T/t.CPtr 等均不注册 struct,天然过滤)。"A | B" 联合 # CFloat64T/t.CPtr 等均不注册 struct,天然过滤)。"A | B" 联合
# 多候选时取首个命中段。 # 多候选时取首个命中段。
# ============================================================ # ============================================================
def _extract_annot_class_name(self, pool: rowptr[memhub.MemBuddy], def _extract_annot_class_name(self, pool: rawptr[memhub.MemBuddy],
annot: str) -> str: annot: str) -> str:
"""从返回注解文本提取已注册结构体类名,无命中返回 None""" """从返回注解文本提取已注册结构体类名,无命中返回 None"""
if pool is None or annot is None: if pool is None or annot is None:
+5 -5
View File
@@ -28,7 +28,7 @@ class ExprGenConst(ExprGenBase.ExprGenBase):
# 创建全局字符串常量 # 创建全局字符串常量
# ============================================================ # ============================================================
def create_global_string(self, builder: llvmlite.IRBuilder | t.CPtr, def create_global_string(self, builder: llvmlite.IRBuilder | t.CPtr,
pool: rowptr[memhub.MemBuddy], pool: rawptr[memhub.MemBuddy],
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
str_val: str, str_val: str,
trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr:
@@ -83,7 +83,7 @@ class ExprGenConst(ExprGenBase.ExprGenBase):
# 翻译常量表达式 # 翻译常量表达式
# ============================================================ # ============================================================
def translate_constant(self, builder: llvmlite.IRBuilder | t.CPtr, def translate_constant(self, builder: llvmlite.IRBuilder | t.CPtr,
pool: rowptr[memhub.MemBuddy], pool: rawptr[memhub.MemBuddy],
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
node: ast.AST | t.CPtr, node: ast.AST | t.CPtr,
trans: HT.Translator | t.CPtr = None, trans: HT.Translator | t.CPtr = None,
@@ -152,7 +152,7 @@ class ExprGenConst(ExprGenBase.ExprGenBase):
# #
# 用于 list 字面量 [a, b, c] 的元素类型推断 # 用于 list 字面量 [a, b, c] 的元素类型推断
# ============================================================ # ============================================================
def _infer_elem_type_from_value(self, pool: rowptr[memhub.MemBuddy], def _infer_elem_type_from_value(self, pool: rawptr[memhub.MemBuddy],
value: llvmlite.Value | t.CPtr) -> str: value: llvmlite.Value | t.CPtr) -> str:
"""从 LLVM Value 的类型推断 list 元素类型名 """从 LLVM Value 的类型推断 list 元素类型名
@@ -216,7 +216,7 @@ class ExprGenConst(ExprGenBase.ExprGenBase):
# 链接器合并同模板重复特化定义,zeroinitializer 保证编译链接通过。 # 链接器合并同模板重复特化定义,zeroinitializer 保证编译链接通过。
# 运行时若该模块未在入口 main 赋值 _mbuddy(null pool 上动态建 list), # 运行时若该模块未在入口 main 赋值 _mbuddy(null pool 上动态建 list),
# 由真实崩溃暴露(fail-fast 哲学,不掩盖上游未初始化)。 # 由真实崩溃暴露(fail-fast 哲学,不掩盖上游未初始化)。
pool: rowptr[memhub.MemBuddy] = trans.Pool pool: rawptr[memhub.MemBuddy] = trans.Pool
if pool is None or trans.Module is None or trans.SymTab is None: if pool is None or trans.Module is None or trans.SymTab is None:
return None return None
# 先检查是否已注册到模块作用域(避免重复创建全局变量) # 先检查是否已注册到模块作用域(避免重复创建全局变量)
@@ -249,7 +249,7 @@ class ExprGenConst(ExprGenBase.ExprGenBase):
return gv_ref_fb return gv_ref_fb
# translate_list_literal:把 list 字面量 [a, b, c] 翻译为 list[T](pool) 构造 + append 调用序列。elem_type_name 为元素类型名(如 "str"/"int"),None 表示从元素推断。返回 list 对象指针(Ptr(list[T] struct)),失败返回 None # translate_list_literal:把 list 字面量 [a, b, c] 翻译为 list[T](pool) 构造 + append 调用序列。elem_type_name 为元素类型名(如 "str"/"int"),None 表示从元素推断。返回 list 对象指针(Ptr(list[T] struct)),失败返回 None
def translate_list_literal(self, builder: llvmlite.IRBuilder | t.CPtr, def translate_list_literal(self, builder: llvmlite.IRBuilder | t.CPtr,
pool: rowptr[memhub.MemBuddy], pool: rawptr[memhub.MemBuddy],
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
node: ast.AST | t.CPtr, node: ast.AST | t.CPtr,
elem_type_name: str, elem_type_name: str,
+6 -6
View File
@@ -36,7 +36,7 @@ class ExprGenFstr(ExprGenBase.ExprGenBase):
# ("(null)"输出 + printf("%s", 垃圾) 崩溃 0xC0000005)。 # ("(null)"输出 + printf("%s", 垃圾) 崩溃 0xC0000005)。
# ============================================================ # ============================================================
def translate_joined_str(self, builder: llvmlite.IRBuilder | t.CPtr, def translate_joined_str(self, builder: llvmlite.IRBuilder | t.CPtr,
pool: rowptr[memhub.MemBuddy], pool: rawptr[memhub.MemBuddy],
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
node: ast.AST | t.CPtr, node: ast.AST | t.CPtr,
trans: HT.Translator | t.CPtr = None) -> llvmlite.Value | t.CPtr: trans: HT.Translator | t.CPtr = None) -> llvmlite.Value | t.CPtr:
@@ -108,7 +108,7 @@ class ExprGenFstr(ExprGenBase.ExprGenBase):
return self._fstr_finalize(builder, pool, mod, fmt_buf, arg_head, arg_tail, arg_count, trans) return self._fstr_finalize(builder, pool, mod, fmt_buf, arg_head, arg_tail, arg_count, trans)
def translate_formatted_value(self, builder: llvmlite.IRBuilder | t.CPtr, def translate_formatted_value(self, builder: llvmlite.IRBuilder | t.CPtr,
pool: rowptr[memhub.MemBuddy], pool: rawptr[memhub.MemBuddy],
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
node: ast.AST | t.CPtr, node: ast.AST | t.CPtr,
trans: HT.Translator | t.CPtr = None) -> llvmlite.Value | t.CPtr: trans: HT.Translator | t.CPtr = None) -> llvmlite.Value | t.CPtr:
@@ -152,7 +152,7 @@ class ExprGenFstr(ExprGenBase.ExprGenBase):
arg_count = 1 arg_count = 1
return self._fstr_finalize(builder, pool, mod, fmt_buf, arg_head, arg_tail, arg_count, trans) return self._fstr_finalize(builder, pool, mod, fmt_buf, arg_head, arg_tail, arg_count, trans)
def _fstr_finalize(self, builder: llvmlite.IRBuilder | t.CPtr, def _fstr_finalize(self, builder: llvmlite.IRBuilder | t.CPtr,
pool: rowptr[memhub.MemBuddy], pool: rawptr[memhub.MemBuddy],
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
fmt_buf: str, fmt_buf: str,
arg_head: llvmlite.Value | t.CPtr, arg_head: llvmlite.Value | t.CPtr,
@@ -223,7 +223,7 @@ class ExprGenFstr(ExprGenBase.ExprGenBase):
src_len: sizet = string.strlen(s) src_len: sizet = string.strlen(s)
if cur_len + src_len < FSTR_BUF_SIZE: if cur_len + src_len < FSTR_BUF_SIZE:
string.strcpy(fmt_buf + cur_len, s) string.strcpy(fmt_buf + cur_len, s)
def _fstr_parse_format_spec(self, pool: rowptr[memhub.MemBuddy], def _fstr_parse_format_spec(self, pool: rawptr[memhub.MemBuddy],
spec_node: ast.AST | t.CPtr, spec_node: ast.AST | t.CPtr,
val: llvmlite.Value | t.CPtr, val: llvmlite.Value | t.CPtr,
arg_node: ast.AST | t.CPtr) -> str: arg_node: ast.AST | t.CPtr) -> str:
@@ -406,7 +406,7 @@ class ExprGenFstr(ExprGenBase.ExprGenBase):
else: else:
return None return None
return out return out
def _fstr_infer_c_fmt(self, pool: rowptr[memhub.MemBuddy], def _fstr_infer_c_fmt(self, pool: rawptr[memhub.MemBuddy],
val: llvmlite.Value | t.CPtr, val: llvmlite.Value | t.CPtr,
arg_node: ast.AST | t.CPtr, arg_node: ast.AST | t.CPtr,
trans: HT.Translator | t.CPtr) -> str: trans: HT.Translator | t.CPtr) -> str:
@@ -443,7 +443,7 @@ class ExprGenFstr(ExprGenBase.ExprGenBase):
self.Gen.TypeGenErr.fatal_error(arg_node, "f-string 格式无法推断(值类型缺失)", "TypeError") self.Gen.TypeGenErr.fatal_error(arg_node, "f-string 格式无法推断(值类型缺失)", "TypeError")
return None return None
def _fstr_cast_value(self, builder: llvmlite.IRBuilder | t.CPtr, def _fstr_cast_value(self, builder: llvmlite.IRBuilder | t.CPtr,
pool: rowptr[memhub.MemBuddy], pool: rawptr[memhub.MemBuddy],
val: llvmlite.Value | t.CPtr, val: llvmlite.Value | t.CPtr,
c_fmt: str, c_fmt: str,
arg_node: ast.AST | t.CPtr, arg_node: ast.AST | t.CPtr,
+2 -2
View File
@@ -61,7 +61,7 @@ class ExprGenMixin(ExprGenBase.ExprGenBase):
# 翻译值表达式(RHS 分派)— 模块级版本 # 翻译值表达式(RHS 分派)— 模块级版本
# ============================================================ # ============================================================
def translate_value(self, builder: llvmlite.IRBuilder | t.CPtr, def translate_value(self, builder: llvmlite.IRBuilder | t.CPtr,
pool: rowptr[memhub.MemBuddy], pool: rawptr[memhub.MemBuddy],
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
node: ast.AST | t.CPtr, node: ast.AST | t.CPtr,
funcs_ptr: t.CPtr = None, funcs_ptr: t.CPtr = None,
@@ -85,7 +85,7 @@ class ExprGenMixin(ExprGenBase.ExprGenBase):
return rv return rv
def _translate_value_impl(self, builder: llvmlite.IRBuilder | t.CPtr, def _translate_value_impl(self, builder: llvmlite.IRBuilder | t.CPtr,
pool: rowptr[memhub.MemBuddy], pool: rawptr[memhub.MemBuddy],
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
node: ast.AST | t.CPtr, node: ast.AST | t.CPtr,
funcs_ptr: t.CPtr = None, funcs_ptr: t.CPtr = None,
+14 -14
View File
@@ -25,7 +25,7 @@ import lib.core.Gen.GenApi as GenApi
class ExprGenName(ExprGenBase.ExprGenBase): class ExprGenName(ExprGenBase.ExprGenBase):
"""Name/Subscript/下标访问""" """Name/Subscript/下标访问"""
def _cut_from_import_mod(self, pool: rowptr[memhub.MemBuddy], def _cut_from_import_mod(self, pool: rawptr[memhub.MemBuddy],
raw: str) -> str: raw: str) -> str:
"""截断 lookup_from_import 返回的模块名到独立缓冲 """截断 lookup_from_import 返回的模块名到独立缓冲
@@ -51,7 +51,7 @@ class ExprGenName(ExprGenBase.ExprGenBase):
return buf_c return buf_c
def translate_name_value(self, builder: llvmlite.IRBuilder | t.CPtr, def translate_name_value(self, builder: llvmlite.IRBuilder | t.CPtr,
pool: rowptr[memhub.MemBuddy], pool: rawptr[memhub.MemBuddy],
node: ast.AST | t.CPtr, node: ast.AST | t.CPtr,
trans: HT.Translator | t.CPtr = None) -> llvmlite.Value | t.CPtr: trans: HT.Translator | t.CPtr = None) -> llvmlite.Value | t.CPtr:
"""翻译变量引用(Name 节点)→ load""" """翻译变量引用(Name 节点)→ load"""
@@ -363,7 +363,7 @@ class ExprGenName(ExprGenBase.ExprGenBase):
# 返回元素地址 (i8*),调用方根据元素类型 load 正确的值 # 返回元素地址 (i8*),调用方根据元素类型 load 正确的值
# ============================================================ # ============================================================
def list_getitem_inline(self, builder: llvmlite.IRBuilder | t.CPtr, def list_getitem_inline(self, builder: llvmlite.IRBuilder | t.CPtr,
pool: rowptr[memhub.MemBuddy], pool: rawptr[memhub.MemBuddy],
lm_obj: llvmlite.Value | t.CPtr, lm_obj: llvmlite.Value | t.CPtr,
idx_val: llvmlite.Value | t.CPtr, idx_val: llvmlite.Value | t.CPtr,
node: ast.AST | t.CPtr = None) -> llvmlite.Value | t.CPtr: node: ast.AST | t.CPtr = None) -> llvmlite.Value | t.CPtr:
@@ -403,7 +403,7 @@ class ExprGenName(ExprGenBase.ExprGenBase):
# 支持: list[int]→i32, list[str]/list[bytes]→i8*, list[CInt]→i32 等 # 支持: list[int]→i32, list[str]/list[bytes]→i8*, list[CInt]→i32 等
# 默认: i32 # 默认: i32
# ============================================================ # ============================================================
def _list_elem_type_from_name(self, pool: rowptr[memhub.MemBuddy], def _list_elem_type_from_name(self, pool: rawptr[memhub.MemBuddy],
struct_name: str) -> llvmlite.LLVMType | t.CPtr: struct_name: str) -> llvmlite.LLVMType | t.CPtr:
"""从 list 类型名提取元素 LLVM 类型""" """从 list 类型名提取元素 LLVM 类型"""
if pool is None or struct_name is None: if pool is None or struct_name is None:
@@ -438,7 +438,7 @@ class ExprGenName(ExprGenBase.ExprGenBase):
if string.strstr(struct_name, "list[CPtr]") is not None: if string.strstr(struct_name, "list[CPtr]") is not None:
return llvmlite.Ptr(pool, i8_ty_d) return llvmlite.Ptr(pool, i8_ty_d)
# 未知 list[T] 元素类型(自定义结构体元素,如 # 未知 list[T] 元素类型(自定义结构体元素,如
# list[rowptr[7565e081d88517ac.AST]] / list[sha1.Foo|t.CPtr]): # list[rawptr[7565e081d88517ac.AST]] / list[sha1.Foo|t.CPtr]):
# 元素槽存对象指针(8 字节)。从元素类型文本还原对象指针 LLVM 类型 # 元素槽存对象指针(8 字节)。从元素类型文本还原对象指针 LLVM 类型
# Ptr(%Struct),使 list.get/__getitem__/pop 内联返回值的 LLVM 类型 # Ptr(%Struct),使 list.get/__getitem__/pop 内联返回值的 LLVM 类型
# 携带元素原型类——链式方法调用(mod.children.get(0).kind())的接收者 # 携带元素原型类——链式方法调用(mod.children.get(0).kind())的接收者
@@ -456,15 +456,15 @@ class ExprGenName(ExprGenBase.ExprGenBase):
# ============================================================ # ============================================================
# _list_elem_obj_ty_from_struct_name — 从 list 特化类型名还原元素对象指针类型 # _list_elem_obj_ty_from_struct_name — 从 list 特化类型名还原元素对象指针类型
# #
# struct_name 形如 "{_list_sha1}.list[rowptr[{sha1}.AST]]" 或 # struct_name 形如 "{_list_sha1}.list[rawptr[{sha1}.AST]]" 或
# "{_list_sha1}.list[{sha1}.AST|t.CPtr]"(联合元素)。取 '[' 与最后 ']' # "{_list_sha1}.list[{sha1}.AST|t.CPtr]"(联合元素)。取 '[' 与最后 ']'
# 之间的元素描述文本:剥 rowptr[...] 包装、按 '|' 联合分段、去首尾空白, # 之间的元素描述文本:剥 rawptr[...] 包装、按 '|' 联合分段、去首尾空白,
# 逐段按已注册结构体还原(元素类带模块 SHA1 前缀时 find_struct 走 # 逐段按已注册结构体还原(元素类带模块 SHA1 前缀时 find_struct 走
# find_struct_by_module 精确匹配,规避跨模块同名歧义);命中返回 # find_struct_by_module 精确匹配,规避跨模块同名歧义);命中返回
# llvmlite.Ptr(entry.Ty)(list 元素槽 8 字节存对象指针)。全部未命中 # llvmlite.Ptr(entry.Ty)(list 元素槽 8 字节存对象指针)。全部未命中
# 返回 None(调用方回退 Ptr(i8) 旧行为,不影响已支持的内置元素)。 # 返回 None(调用方回退 Ptr(i8) 旧行为,不影响已支持的内置元素)。
# ============================================================ # ============================================================
def _list_elem_obj_ty_from_struct_name(self, pool: rowptr[memhub.MemBuddy], def _list_elem_obj_ty_from_struct_name(self, pool: rawptr[memhub.MemBuddy],
struct_name: str) -> llvmlite.LLVMType | t.CPtr: struct_name: str) -> llvmlite.LLVMType | t.CPtr:
"""从 list 特化类型名还原元素对象指针 LLVM 类型,失败返回 None""" """从 list 特化类型名还原元素对象指针 LLVM 类型,失败返回 None"""
if pool is None or struct_name is None: if pool is None or struct_name is None:
@@ -483,9 +483,9 @@ class ExprGenName(ExprGenBase.ExprGenBase):
return None return None
string.strncpy(elem_buf_e, lb_e + 1, elen_e) string.strncpy(elem_buf_e, lb_e + 1, elen_e)
elem_buf_e[elen_e] = '\0' elem_buf_e[elen_e] = '\0'
# 剥 rowptr[...] 包装(元素声明为对象指针,如 rowptr[sha1.AST]) # 剥 rawptr[...] 包装(元素声明为对象指针,如 rawptr[sha1.AST])
cur_e: str = elem_buf_e cur_e: str = elem_buf_e
if string.strncmp(cur_e, "rowptr[", 7) == 0: if string.strncmp(cur_e, "rawptr[", 7) == 0:
cur_e = cur_e + 7 cur_e = cur_e + 7
# 按 '|' 联合分段(A|B),段内去首尾空白/尾部 ']'/引号;段文本直接 # 按 '|' 联合分段(A|B),段内去首尾空白/尾部 ']'/引号;段文本直接
# 交给 find_struct(内置名 CPtr/str/int 等不注册 struct → 天然返回 # 交给 find_struct(内置名 CPtr/str/int 等不注册 struct → 天然返回
@@ -532,7 +532,7 @@ class ExprGenName(ExprGenBase.ExprGenBase):
# 直接存储 rhs_val 到元素地址 (coerce 为 i8* 后 store) # 直接存储 rhs_val 到元素地址 (coerce 为 i8* 后 store)
# ============================================================ # ============================================================
def list_setitem_inline(self, builder: llvmlite.IRBuilder | t.CPtr, def list_setitem_inline(self, builder: llvmlite.IRBuilder | t.CPtr,
pool: rowptr[memhub.MemBuddy], pool: rawptr[memhub.MemBuddy],
lm_obj: llvmlite.Value | t.CPtr, lm_obj: llvmlite.Value | t.CPtr,
idx_val: llvmlite.Value | t.CPtr, idx_val: llvmlite.Value | t.CPtr,
rhs_val: llvmlite.Value | t.CPtr, rhs_val: llvmlite.Value | t.CPtr,
@@ -637,7 +637,7 @@ class ExprGenName(ExprGenBase.ExprGenBase):
return llvmlite.build_load(builder, pointee, alloca) return llvmlite.build_load(builder, pointee, alloca)
# _nonlocal_subscript_ptr:nonlocal 数组/指针的下标元素指针——嵌套(提升)函数体内访问 nonlocal 变量时,其实际存储是运行时共享堆(env[ni] 存堆地址),不能 lookup_var 找外层函数 alloca(其 SSA 编号属外层函数,当前函数引用会错乱崩溃)。正确路径:从 env 读堆地址(_load_raw_var_ptr)→ bitcast → GEP # _nonlocal_subscript_ptr:nonlocal 数组/指针的下标元素指针——嵌套(提升)函数体内访问 nonlocal 变量时,其实际存储是运行时共享堆(env[ni] 存堆地址),不能 lookup_var 找外层函数 alloca(其 SSA 编号属外层函数,当前函数引用会错乱崩溃)。正确路径:从 env 读堆地址(_load_raw_var_ptr)→ bitcast → GEP
def _nonlocal_subscript_ptr(self, builder: llvmlite.IRBuilder | t.CPtr, def _nonlocal_subscript_ptr(self, builder: llvmlite.IRBuilder | t.CPtr,
pool: rowptr[memhub.MemBuddy], pool: rawptr[memhub.MemBuddy],
trans: HT.Translator | t.CPtr, trans: HT.Translator | t.CPtr,
nm_id: str, nm_id: str,
idx_val: llvmlite.Value | t.CPtr) -> llvmlite.Value | t.CPtr: idx_val: llvmlite.Value | t.CPtr) -> llvmlite.Value | t.CPtr:
@@ -680,7 +680,7 @@ class ExprGenName(ExprGenBase.ExprGenBase):
# list[T]: 泛型类不注册 struct,subscript 走 __getitem__ 内联路径 # list[T]: 泛型类不注册 struct,subscript 走 __getitem__ 内联路径
# ============================================================ # ============================================================
def translate_subscript(self, builder: llvmlite.IRBuilder | t.CPtr, def translate_subscript(self, builder: llvmlite.IRBuilder | t.CPtr,
pool: rowptr[memhub.MemBuddy], pool: rawptr[memhub.MemBuddy],
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
node: ast.AST | t.CPtr, node: ast.AST | t.CPtr,
trans: HT.Translator | t.CPtr = None) -> llvmlite.Value | t.CPtr: trans: HT.Translator | t.CPtr = None) -> llvmlite.Value | t.CPtr:
@@ -1063,7 +1063,7 @@ class ExprGenName(ExprGenBase.ExprGenBase):
return 0 return 0
def get_subscript_ptr(self, builder: llvmlite.IRBuilder | t.CPtr, def get_subscript_ptr(self, builder: llvmlite.IRBuilder | t.CPtr,
pool: rowptr[memhub.MemBuddy], pool: rawptr[memhub.MemBuddy],
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
node: ast.AST | t.CPtr, node: ast.AST | t.CPtr,
trans: HT.Translator | t.CPtr = None) -> llvmlite.Value | t.CPtr: trans: HT.Translator | t.CPtr = None) -> llvmlite.Value | t.CPtr:
+10 -10
View File
@@ -32,7 +32,7 @@ class ExprGenOps(ExprGenBase.ExprGenBase):
# merge_blk: phi [body_val, then_blk], [orelse_val, else_blk] # merge_blk: phi [body_val, then_blk], [orelse_val, else_blk]
# ============================================================ # ============================================================
def translate_ifexp(self, builder: llvmlite.IRBuilder | t.CPtr, def translate_ifexp(self, builder: llvmlite.IRBuilder | t.CPtr,
pool: rowptr[memhub.MemBuddy], pool: rawptr[memhub.MemBuddy],
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
node: ast.AST | t.CPtr, node: ast.AST | t.CPtr,
trans: HT.Translator | t.CPtr = None) -> llvmlite.Value | t.CPtr: trans: HT.Translator | t.CPtr = None) -> llvmlite.Value | t.CPtr:
@@ -172,7 +172,7 @@ class ExprGenOps(ExprGenBase.ExprGenBase):
# ============================================================ # ============================================================
# 翻译比较表达式 Compare(left, ops, comparators) # 翻译比较表达式 Compare(left, ops, comparators)
# ============================================================ # ============================================================
def should_zext_widen(self, pool: rowptr[memhub.MemBuddy], def should_zext_widen(self, pool: rawptr[memhub.MemBuddy],
narrow_val: llvmlite.Value | t.CPtr, narrow_val: llvmlite.Value | t.CPtr,
wide_val: llvmlite.Value | t.CPtr, wide_val: llvmlite.Value | t.CPtr,
narrow_node: ast.AST | t.CPtr = None, narrow_node: ast.AST | t.CPtr = None,
@@ -240,7 +240,7 @@ class ExprGenOps(ExprGenBase.ExprGenBase):
if cdv_zw > 0x7FFFFFFF: if cdv_zw > 0x7FFFFFFF:
return 1 return 1
return 0 return 0
def _node_type_unsigned(self, pool: rowptr[memhub.MemBuddy], def _node_type_unsigned(self, pool: rawptr[memhub.MemBuddy],
node: ast.AST | t.CPtr, node: ast.AST | t.CPtr,
trans: HT.Translator | t.CPtr = None) -> int: trans: HT.Translator | t.CPtr = None) -> int:
"""轻量判断 AST 节点是否解析为无符号整数类型(1=是,0=否/未知) """轻量判断 AST 节点是否解析为无符号整数类型(1=是,0=否/未知)
@@ -352,7 +352,7 @@ class ExprGenOps(ExprGenBase.ExprGenBase):
fi_u += 1 fi_u += 1
return 0 return 0
return 0 return 0
def _node_type_signed(self, pool: rowptr[memhub.MemBuddy], def _node_type_signed(self, pool: rawptr[memhub.MemBuddy],
node: ast.AST | t.CPtr, node: ast.AST | t.CPtr,
trans: HT.Translator | t.CPtr = None) -> int: trans: HT.Translator | t.CPtr = None) -> int:
"""源节点是否**明确有符号**整数(独立真源的 SIGNED 分支;未知返回 0) """源节点是否**明确有符号**整数(独立真源的 SIGNED 分支;未知返回 0)
@@ -465,7 +465,7 @@ class ExprGenOps(ExprGenBase.ExprGenBase):
return 1 return 1
return 0 return 0
def translate_compare(self, builder: llvmlite.IRBuilder | t.CPtr, def translate_compare(self, builder: llvmlite.IRBuilder | t.CPtr,
pool: rowptr[memhub.MemBuddy], pool: rawptr[memhub.MemBuddy],
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
node: ast.AST | t.CPtr, node: ast.AST | t.CPtr,
trans: HT.Translator | t.CPtr = None) -> llvmlite.Value | t.CPtr: trans: HT.Translator | t.CPtr = None) -> llvmlite.Value | t.CPtr:
@@ -780,7 +780,7 @@ class ExprGenOps(ExprGenBase.ExprGenBase):
# 翻译一元运算表达式 UnaryOp(op, operand) # 翻译一元运算表达式 UnaryOp(op, operand)
# ============================================================ # ============================================================
def translate_unaryop(self, builder: llvmlite.IRBuilder | t.CPtr, def translate_unaryop(self, builder: llvmlite.IRBuilder | t.CPtr,
pool: rowptr[memhub.MemBuddy], pool: rawptr[memhub.MemBuddy],
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
node: ast.AST | t.CPtr, node: ast.AST | t.CPtr,
trans: HT.Translator | t.CPtr = None) -> llvmlite.Value | t.CPtr: trans: HT.Translator | t.CPtr = None) -> llvmlite.Value | t.CPtr:
@@ -954,7 +954,7 @@ class ExprGenOps(ExprGenBase.ExprGenBase):
# merge 块用 phi 合并所有入边的 i1 # merge 块用 phi 合并所有入边的 i1
# ============================================================ # ============================================================
def translate_boolop(self, builder: llvmlite.IRBuilder | t.CPtr, def translate_boolop(self, builder: llvmlite.IRBuilder | t.CPtr,
pool: rowptr[memhub.MemBuddy], pool: rawptr[memhub.MemBuddy],
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
node: ast.AST | t.CPtr, node: ast.AST | t.CPtr,
funcs_ptr: t.CPtr = None, funcs_ptr: t.CPtr = None,
@@ -1121,7 +1121,7 @@ class ExprGenOps(ExprGenBase.ExprGenBase):
# dunder 方法。找到则生成方法调用 lhs.__dunder__(rhs),返回 # dunder 方法。找到则生成方法调用 lhs.__dunder__(rhs),返回
# 调用结果;未找到返回 None,调用方回退到原生运算。 # 调用结果;未找到返回 None,调用方回退到原生运算。
# ============================================================ # ============================================================
def try_operator_overload(self, pool: rowptr[memhub.MemBuddy], def try_operator_overload(self, pool: rawptr[memhub.MemBuddy],
builder: llvmlite.IRBuilder | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr,
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
lhs: llvmlite.Value | t.CPtr, lhs: llvmlite.Value | t.CPtr,
@@ -1230,7 +1230,7 @@ class ExprGenOps(ExprGenBase.ExprGenBase):
# dunder 方法(__neg__/__pos__/__invert__)。找到则生成方法调用 # dunder 方法(__neg__/__pos__/__invert__)。找到则生成方法调用
# operand.__dunder__(),返回调用结果;未找到返回 None,调用方回退到原生运算。 # operand.__dunder__(),返回调用结果;未找到返回 None,调用方回退到原生运算。
# ============================================================ # ============================================================
def try_unary_operator_overload(self, pool: rowptr[memhub.MemBuddy], def try_unary_operator_overload(self, pool: rawptr[memhub.MemBuddy],
builder: llvmlite.IRBuilder | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr,
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
operand: llvmlite.Value | t.CPtr, operand: llvmlite.Value | t.CPtr,
@@ -1311,7 +1311,7 @@ class ExprGenOps(ExprGenBase.ExprGenBase):
# ============================================================ # ============================================================
# 翻译二元运算(自动类型提升) # 翻译二元运算(自动类型提升)
# ============================================================ # ============================================================
def translate_binop(self, pool: rowptr[memhub.MemBuddy], def translate_binop(self, pool: rawptr[memhub.MemBuddy],
builder: llvmlite.IRBuilder | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr,
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
node: ast.AST | t.CPtr, node: ast.AST | t.CPtr,
+4 -4
View File
@@ -31,7 +31,7 @@ class FuncGenBase(CallGenBase.CallGenBase):
# #
# 返回 LLVM IR 属性字符串(如 "alwaysinline nounwind"),无属性返回 None # 返回 LLVM IR 属性字符串(如 "alwaysinline nounwind"),无属性返回 None
# ============================================================ # ============================================================
def extract_func_attrs(self, pool: rowptr[memhub.MemBuddy], def extract_func_attrs(self, pool: rawptr[memhub.MemBuddy],
decorator_list: list[ast.AST | t.CPtr] | t.CPtr, decorator_list: list[ast.AST | t.CPtr] | t.CPtr,
imported_modules: str) -> str: imported_modules: str) -> str:
"""从 decorator_list 提取 c.Attribute 属性,返回 LLVM IR 属性字符串""" """从 decorator_list 提取 c.Attribute 属性,返回 LLVM IR 属性字符串"""
@@ -107,7 +107,7 @@ class FuncGenBase(CallGenBase.CallGenBase):
if found_any == 0: if found_any == 0:
return None return None
return attrs_buf return attrs_buf
def extract_func_section(self, pool: rowptr[memhub.MemBuddy], def extract_func_section(self, pool: rawptr[memhub.MemBuddy],
decorator_list: list[ast.AST | t.CPtr] | t.CPtr, decorator_list: list[ast.AST | t.CPtr] | t.CPtr,
imported_modules: str) -> str: imported_modules: str) -> str:
"""提取 @c.Attribute(t.attr.section("xxx")) 为属性组文本 '"section"="xxx"'。 """提取 @c.Attribute(t.attr.section("xxx")) 为属性组文本 '"section"="xxx"'。
@@ -366,7 +366,7 @@ class FuncGenBase(CallGenBase.CallGenBase):
# 两阶段必须一致,否则 declare i32 + define {i64,i64,i64} → llc # 两阶段必须一致,否则 declare i32 + define {i64,i64,i64} → llc
# "ret doesn't match function result type"。 # "ret doesn't match function result type"。
# ============================================================ # ============================================================
def _resolve_creturn_ret_ty(self, pool: rowptr[memhub.MemBuddy], def _resolve_creturn_ret_ty(self, pool: rawptr[memhub.MemBuddy],
fd: ast.FunctionDef | t.CPtr, fd: ast.FunctionDef | t.CPtr,
imported_modules: str, imported_modules: str,
from_imports: str, from_imports: str,
@@ -411,7 +411,7 @@ class FuncGenBase(CallGenBase.CallGenBase):
# ============================================================ # ============================================================
# 创建 LLVM 函数(简单版本,仅声明) # 创建 LLVM 函数(简单版本,仅声明)
# ============================================================ # ============================================================
def create_function(self, pool: rowptr[memhub.MemBuddy], def create_function(self, pool: rawptr[memhub.MemBuddy],
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
name: str, name: str,
args_node: ast.AST | t.CPtr, args_node: ast.AST | t.CPtr,
+3 -3
View File
@@ -36,7 +36,7 @@ class FuncGenDef(CallGenBase.CallGenBase):
"""预扫描所有顶层 FunctionDef,创建前向声明""" """预扫描所有顶层 FunctionDef,创建前向声明"""
if trans is None or tree is None: if trans is None or tree is None:
return 0 return 0
pool: rowptr[memhub.MemBuddy] = trans.Pool pool: rawptr[memhub.MemBuddy] = trans.Pool
mod: llvmlite.LLVMModule | t.CPtr = trans.Module mod: llvmlite.LLVMModule | t.CPtr = trans.Module
if pool is None or mod is None: if pool is None or mod is None:
return 0 return 0
@@ -319,7 +319,7 @@ class FuncGenDef(CallGenBase.CallGenBase):
if fd.flags is not None and (fd.flags & 1) != 0: if fd.flags is not None and (fd.flags & 1) != 0:
return self.Gen.AsyncGen.translate_async_function(trans, node) return self.Gen.AsyncGen.translate_async_function(trans, node)
pool: rowptr[memhub.MemBuddy] = trans.Pool pool: rawptr[memhub.MemBuddy] = trans.Pool
mod: llvmlite.LLVMModule | t.CPtr = trans.Module mod: llvmlite.LLVMModule | t.CPtr = trans.Module
imported_modules: str = trans._imported_modules imported_modules: str = trans._imported_modules
from_imports: str = trans._from_imports from_imports: str = trans._from_imports
@@ -1102,7 +1102,7 @@ class FuncGenDef(CallGenBase.CallGenBase):
# 前置返回:0=跳过原函数,1=调用一次,N=循环 N 次 # 前置返回:0=跳过原函数,1=调用一次,N=循环 N 次
# ============================================================ # ============================================================
def _gen_decor_wrapper(self, trans: HT.Translator | t.CPtr, def _gen_decor_wrapper(self, trans: HT.Translator | t.CPtr,
pool: rowptr[memhub.MemBuddy], pool: rawptr[memhub.MemBuddy],
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
func: llvmlite.Function | t.CPtr, func: llvmlite.Function | t.CPtr,
func_name: str, func_name: str,
+6 -6
View File
@@ -81,7 +81,7 @@ class FuncGenMixin(CallGenBase.CallGenBase):
if fd is None or fd.name is None: if fd is None or fd.name is None:
return 0 return 0
pool: rowptr[memhub.MemBuddy] = trans.Pool pool: rawptr[memhub.MemBuddy] = trans.Pool
mod: llvmlite.LLVMModule | t.CPtr = trans.Module mod: llvmlite.LLVMModule | t.CPtr = trans.Module
func_name: str = fd.name func_name: str = fd.name
@@ -854,7 +854,7 @@ class FuncGenMixin(CallGenBase.CallGenBase):
# 注:`case _`(Void/Struct/Func 等)仍返回 8——不是静默兜底,而是**算不出** # 注:`case _`(Void/Struct/Func 等)仍返回 8——不是静默兜底,而是**算不出**
# (结构体尺寸需查布局表,本函数只做 LLVMType 递归);改 fatal 会拒绝 # (结构体尺寸需查布局表,本函数只做 LLVMType 递归);改 fatal 会拒绝
# "nonlocal 结构体"这一合法用法,需先补布局查询能力。 # "nonlocal 结构体"这一合法用法,需先补布局查询能力。
def _type_byte_size(self, pool: rowptr[memhub.MemBuddy], def _type_byte_size(self, pool: rawptr[memhub.MemBuddy],
ty: llvmlite.LLVMType | t.CPtr) -> int: ty: llvmlite.LLVMType | t.CPtr) -> int:
"""计算 LLVM 类型占用的字节大小(递归)""" """计算 LLVM 类型占用的字节大小(递归)"""
if ty is None: if ty is None:
@@ -888,7 +888,7 @@ class FuncGenMixin(CallGenBase.CallGenBase):
# 变量名: nlheap_{sha1}.{name}(全局变量,跨函数可见;SSA 编号是函数 # 变量名: nlheap_{sha1}.{name}(全局变量,跨函数可见;SSA 编号是函数
# 局部的,跨函数传递堆地址只能经全局变量/模块级映射)。 # 局部的,跨函数传递堆地址只能经全局变量/模块级映射)。
# ============================================================ # ============================================================
def _nl_heap_global_name(self, pool: rowptr[memhub.MemBuddy], def _nl_heap_global_name(self, pool: rawptr[memhub.MemBuddy],
trans: HT.Translator | t.CPtr, trans: HT.Translator | t.CPtr,
name: str) -> str: name: str) -> str:
"""构造 nonlocal 堆地址全局映射变量名 nlheap_{sha1}.{name}""" """构造 nonlocal 堆地址全局映射变量名 nlheap_{sha1}.{name}"""
@@ -903,7 +903,7 @@ class FuncGenMixin(CallGenBase.CallGenBase):
# ============================================================ # ============================================================
# _nl_heap_global_ref - 全局映射变量引用 Value(i8**) # _nl_heap_global_ref - 全局映射变量引用 Value(i8**)
# ============================================================ # ============================================================
def _nl_heap_global_ref(self, pool: rowptr[memhub.MemBuddy], def _nl_heap_global_ref(self, pool: rawptr[memhub.MemBuddy],
trans: HT.Translator | t.CPtr, trans: HT.Translator | t.CPtr,
name: str) -> llvmlite.Value | t.CPtr: name: str) -> llvmlite.Value | t.CPtr:
"""获取 nonlocal 堆地址全局映射变量的引用(@"..." 引号包裹)""" """获取 nonlocal 堆地址全局映射变量的引用(@"..." 引号包裹)"""
@@ -997,7 +997,7 @@ class FuncGenMixin(CallGenBase.CallGenBase):
# ============================================================ # ============================================================
def _prepare_chain_nonlocals(self, trans: HT.Translator | t.CPtr, def _prepare_chain_nonlocals(self, trans: HT.Translator | t.CPtr,
node: ast.AST | t.CPtr, node: ast.AST | t.CPtr,
pool: rowptr[memhub.MemBuddy], pool: rawptr[memhub.MemBuddy],
builder: llvmlite.IRBuilder | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr,
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
i8_ty: llvmlite.LLVMType | t.CPtr, i8_ty: llvmlite.LLVMType | t.CPtr,
@@ -1096,7 +1096,7 @@ class FuncGenMixin(CallGenBase.CallGenBase):
# 赋值语句据此创建 i8** alloca,调用走 translate_closure_call # 赋值语句据此创建 i8** alloca,调用走 translate_closure_call
# ============================================================ # ============================================================
def translate_lambda(self, builder: llvmlite.IRBuilder | t.CPtr, def translate_lambda(self, builder: llvmlite.IRBuilder | t.CPtr,
pool: rowptr[memhub.MemBuddy], pool: rawptr[memhub.MemBuddy],
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
node: ast.AST | t.CPtr, node: ast.AST | t.CPtr,
trans: HT.Translator | t.CPtr = None) -> llvmlite.Value | t.CPtr: trans: HT.Translator | t.CPtr = None) -> llvmlite.Value | t.CPtr:
+24 -24
View File
@@ -18,7 +18,7 @@ import lib.core.Gen.Generator as Generator
# 全局 gen 单例(main/BuildPipeline 创建 gen 后注入) # 全局 gen 单例(main/BuildPipeline 创建 gen 后注入)
_g_gen: rowptr[Generator.Generator] = None _g_gen: rawptr[Generator.Generator] = None
# ---------------- set_temp_dir(委托 TypeGenBase.set_temp_dir) ---------------- # ---------------- set_temp_dir(委托 TypeGenBase.set_temp_dir) ----------------
@@ -71,7 +71,7 @@ def clear_ctypedefs() -> None:
# ---------------- RegisterCTypedefFromSource(委托 TypeGenCType.register_ctypedef_from_source) ---------------- # ---------------- RegisterCTypedefFromSource(委托 TypeGenCType.register_ctypedef_from_source) ----------------
def RegisterCTypedefFromSource(pool: rowptr[memhub.MemBuddy], src: str) -> int: def RegisterCTypedefFromSource(pool: rawptr[memhub.MemBuddy], src: str) -> int:
"""委托到 gen.register_ctypedef_from_source(原 Handles 壳)""" """委托到 gen.register_ctypedef_from_source(原 Handles 壳)"""
if _g_gen is not None: if _g_gen is not None:
_g_gen.TypeGenCType.register_ctypedef_from_source(pool, src) _g_gen.TypeGenCType.register_ctypedef_from_source(pool, src)
@@ -106,7 +106,7 @@ def fatal_error(node: ast.AST | t.CPtr, msg: str,
# ---------------- map_t_type(委托 TypeGenResolve.map_t_type) ---------------- # ---------------- map_t_type(委托 TypeGenResolve.map_t_type) ----------------
def map_t_type(pool: rowptr[memhub.MemBuddy], type_name: str) -> llvmlite.LLVMType | t.CPtr: def map_t_type(pool: rawptr[memhub.MemBuddy], type_name: str) -> llvmlite.LLVMType | t.CPtr:
"""委托到 gen.map_t_type(原 Handles 壳)""" """委托到 gen.map_t_type(原 Handles 壳)"""
if _g_gen is not None: if _g_gen is not None:
_g_gen.TypeGenResolve.map_t_type(pool, type_name) _g_gen.TypeGenResolve.map_t_type(pool, type_name)
@@ -114,7 +114,7 @@ def map_t_type(pool: rowptr[memhub.MemBuddy], type_name: str) -> llvmlite.LLVMTy
# ---------------- resolve_typedef_or_map(委托 TypeGenResolve.resolve_typedef_or_map) ---------------- # ---------------- resolve_typedef_or_map(委托 TypeGenResolve.resolve_typedef_or_map) ----------------
def resolve_typedef_or_map(pool: rowptr[memhub.MemBuddy], def resolve_typedef_or_map(pool: rawptr[memhub.MemBuddy],
name: str, name: str,
imported_modules: str, imported_modules: str,
from_imports: str, from_imports: str,
@@ -126,7 +126,7 @@ def resolve_typedef_or_map(pool: rowptr[memhub.MemBuddy],
# ---------------- infer_external_func_ret_ty(委托 CallGenLib._infer_external_func_ret_ty) ---------------- # ---------------- infer_external_func_ret_ty(委托 CallGenLib._infer_external_func_ret_ty) ----------------
def infer_external_func_ret_ty(pool: rowptr[memhub.MemBuddy], def infer_external_func_ret_ty(pool: rawptr[memhub.MemBuddy],
func_name: str) -> llvmlite.LLVMType | t.CPtr: func_name: str) -> llvmlite.LLVMType | t.CPtr:
"""委托到 gen.CallGenLib._infer_external_func_ret_ty(外部函数返回类型白名单) """委托到 gen.CallGenLib._infer_external_func_ret_ty(外部函数返回类型白名单)
@@ -158,7 +158,7 @@ def _is_ctypedef_annotation(annotation: ast.AST | t.CPtr) -> int:
# ---------------- resolve_annotation_type(委托 TypeGenResolve.resolve_annotation_type) ---------------- # ---------------- resolve_annotation_type(委托 TypeGenResolve.resolve_annotation_type) ----------------
def resolve_annotation_type(pool: rowptr[memhub.MemBuddy], node: ast.AST | t.CPtr, imported_modules: str, from_imports: str, trans: HT.Translator | t.CPtr = None, depth: int = 0) -> llvmlite.LLVMType | t.CPtr: def resolve_annotation_type(pool: rawptr[memhub.MemBuddy], node: ast.AST | t.CPtr, imported_modules: str, from_imports: str, trans: HT.Translator | t.CPtr = None, depth: int = 0) -> llvmlite.LLVMType | t.CPtr:
"""委托到 gen.resolve_annotation_type(原 Handles 壳)""" """委托到 gen.resolve_annotation_type(原 Handles 壳)"""
if _g_gen is not None: if _g_gen is not None:
return _g_gen.TypeGenResolve.resolve_annotation_type(pool, node, imported_modules, from_imports, trans, depth) return _g_gen.TypeGenResolve.resolve_annotation_type(pool, node, imported_modules, from_imports, trans, depth)
@@ -175,7 +175,7 @@ def has_decorator_marker(node: ast.AST | t.CPtr, marker_name: str,
# ---------------- _get_type_name_from_annotation(委托 TypeGenResolve._get_type_name_from_annotation) ---------------- # ---------------- _get_type_name_from_annotation(委托 TypeGenResolve._get_type_name_from_annotation) ----------------
def _get_type_name_from_annotation(pool: rowptr[memhub.MemBuddy], node: ast.AST | t.CPtr) -> str: def _get_type_name_from_annotation(pool: rawptr[memhub.MemBuddy], node: ast.AST | t.CPtr) -> str:
"""委托到 gen._get_type_name_from_annotation(原 Handles 壳)""" """委托到 gen._get_type_name_from_annotation(原 Handles 壳)"""
if _g_gen is not None: if _g_gen is not None:
return _g_gen.TypeGenResolve._get_type_name_from_annotation(pool, node) return _g_gen.TypeGenResolve._get_type_name_from_annotation(pool, node)
@@ -183,7 +183,7 @@ def _get_type_name_from_annotation(pool: rowptr[memhub.MemBuddy], node: ast.AST
# ---------------- register_ctypedef(委托 TypeGenCType.register_ctypedef) ---------------- # ---------------- register_ctypedef(委托 TypeGenCType.register_ctypedef) ----------------
def register_ctypedef(pool: rowptr[memhub.MemBuddy], name: str, type_str: str): def register_ctypedef(pool: rawptr[memhub.MemBuddy], name: str, type_str: str):
"""委托到 gen.register_ctypedef(原 Handles 壳)""" """委托到 gen.register_ctypedef(原 Handles 壳)"""
if _g_gen is not None: if _g_gen is not None:
_g_gen.TypeGenCType.register_ctypedef(pool, name, type_str) _g_gen.TypeGenCType.register_ctypedef(pool, name, type_str)
@@ -206,7 +206,7 @@ def is_cdefine_found() -> int:
# ---------------- register_cdefine_constant(委托 TypeGenCDef.register_cdefine_constant) ---------------- # ---------------- register_cdefine_constant(委托 TypeGenCDef.register_cdefine_constant) ----------------
def register_cdefine_constant(pool: rowptr[memhub.MemBuddy], def register_cdefine_constant(pool: rawptr[memhub.MemBuddy],
name: str, value: int64): name: str, value: int64):
"""委托到 gen.register_cdefine_constant(原 Handles 壳)""" """委托到 gen.register_cdefine_constant(原 Handles 壳)"""
if _g_gen is not None: if _g_gen is not None:
@@ -214,7 +214,7 @@ def register_cdefine_constant(pool: rowptr[memhub.MemBuddy],
# ---------------- register_cdefine_double(委托 TypeGenCDef.register_cdefine_double) ---------------- # ---------------- register_cdefine_double(委托 TypeGenCDef.register_cdefine_double) ----------------
def register_cdefine_double(pool: rowptr[memhub.MemBuddy], def register_cdefine_double(pool: rawptr[memhub.MemBuddy],
name: str, value: double): name: str, value: double):
"""委托到 gen.register_cdefine_double(原 Handles 壳)""" """委托到 gen.register_cdefine_double(原 Handles 壳)"""
if _g_gen is not None: if _g_gen is not None:
@@ -260,7 +260,7 @@ def get_temp_dir() -> str:
# ---------------- reset_visible_structs(委托 StructGenMixin.reset_visible_structs) ---------------- # ---------------- reset_visible_structs(委托 StructGenMixin.reset_visible_structs) ----------------
def reset_visible_structs(pool: rowptr[memhub.MemBuddy], strict: int): def reset_visible_structs(pool: rawptr[memhub.MemBuddy], strict: int):
"""委托到 gen.reset_visible_structs(原 Handles 壳)""" """委托到 gen.reset_visible_structs(原 Handles 壳)"""
if _g_gen is not None: if _g_gen is not None:
_g_gen.StructGen.reset_visible_structs(pool, strict) _g_gen.StructGen.reset_visible_structs(pool, strict)
@@ -312,7 +312,7 @@ def get_enum_base_type(enum_name: str) -> llvmlite.LLVMType | t.CPtr:
# ---------------- add_visible_struct(委托 StructGenMixin.add_visible_struct) ---------------- # ---------------- add_visible_struct(委托 StructGenMixin.add_visible_struct) ----------------
def add_visible_struct(pool: rowptr[memhub.MemBuddy], name: str): def add_visible_struct(pool: rawptr[memhub.MemBuddy], name: str):
"""委托到 gen.add_visible_struct(原 Handles 壳)""" """委托到 gen.add_visible_struct(原 Handles 壳)"""
if _g_gen is not None: if _g_gen is not None:
_g_gen.StructGen.add_visible_struct(pool, name) _g_gen.StructGen.add_visible_struct(pool, name)
@@ -335,7 +335,7 @@ def find_struct_by_type(struct_ty: llvmlite.LLVMType | t.CPtr) -> GenTypes.Struc
# ---------------- register_struct(委托 StructGenMixin.register_struct) ---------------- # ---------------- register_struct(委托 StructGenMixin.register_struct) ----------------
def register_struct(pool: rowptr[memhub.MemBuddy], def register_struct(pool: rawptr[memhub.MemBuddy],
name: str, name: str,
struct_ty: llvmlite.LLVMType | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr,
sha1: str = None) -> GenTypes.StructEntry | t.CPtr: sha1: str = None) -> GenTypes.StructEntry | t.CPtr:
@@ -346,7 +346,7 @@ def register_struct(pool: rowptr[memhub.MemBuddy],
# ---------------- add_field(委托 StructGenMixin.add_field) ---------------- # ---------------- add_field(委托 StructGenMixin.add_field) ----------------
def add_field(pool: rowptr[memhub.MemBuddy], def add_field(pool: rawptr[memhub.MemBuddy],
struct_entry: GenTypes.StructEntry | t.CPtr, struct_entry: GenTypes.StructEntry | t.CPtr,
field_name: str, field_name: str,
field_ty: llvmlite.LLVMType | t.CPtr) -> int: field_ty: llvmlite.LLVMType | t.CPtr) -> int:
@@ -357,7 +357,7 @@ def add_field(pool: rowptr[memhub.MemBuddy],
# ---------------- register_struct_alias(委托 StructGenMixin.register_struct_alias) ---------------- # ---------------- register_struct_alias(委托 StructGenMixin.register_struct_alias) ----------------
def register_struct_alias(pool: rowptr[memhub.MemBuddy], def register_struct_alias(pool: rawptr[memhub.MemBuddy],
name: str, name: str,
sha1: str, sha1: str,
src_entry: GenTypes.StructEntry | t.CPtr) -> GenTypes.StructEntry | t.CPtr: src_entry: GenTypes.StructEntry | t.CPtr) -> GenTypes.StructEntry | t.CPtr:
@@ -377,7 +377,7 @@ def get_stdlib_alloc() -> int:
# ---------------- compute_package_from_relpath(委托 ImportsGenMixin.compute_package_from_relpath) ---------------- # ---------------- compute_package_from_relpath(委托 ImportsGenMixin.compute_package_from_relpath) ----------------
def compute_package_from_relpath(pool: rowptr[memhub.MemBuddy], rel_path: str) -> str: def compute_package_from_relpath(pool: rawptr[memhub.MemBuddy], rel_path: str) -> str:
"""委托到 gen.compute_package_from_relpath(原 Handles 壳)""" """委托到 gen.compute_package_from_relpath(原 Handles 壳)"""
if _g_gen is not None: if _g_gen is not None:
return _g_gen.ImportsGen.compute_package_from_relpath(pool, rel_path) return _g_gen.ImportsGen.compute_package_from_relpath(pool, rel_path)
@@ -435,7 +435,7 @@ def is_sha1_hex16(seg: str) -> int:
# ---------------- add_imported_module(委托 ImportsGenMixin.add_imported_module) ---------------- # ---------------- add_imported_module(委托 ImportsGenMixin.add_imported_module) ----------------
def add_imported_module(pool: rowptr[memhub.MemBuddy], imported_modules: str, name: str) -> str: def add_imported_module(pool: rawptr[memhub.MemBuddy], imported_modules: str, name: str) -> str:
"""委托到 gen.add_imported_module(原 Handles 壳)""" """委托到 gen.add_imported_module(原 Handles 壳)"""
if _g_gen is not None: if _g_gen is not None:
return _g_gen.ImportsGen.add_imported_module(pool, imported_modules, name) return _g_gen.ImportsGen.add_imported_module(pool, imported_modules, name)
@@ -475,7 +475,7 @@ def _get_parent_class(cd: ast.ClassDef | t.CPtr, trans: HT.Translator | t.CPtr =
# ---------------- _register_generic_template(委托 ClassGenGeneric._register_generic_template) ---------------- # ---------------- _register_generic_template(委托 ClassGenGeneric._register_generic_template) ----------------
def _register_generic_template(pool: rowptr[memhub.MemBuddy], cd: ast.ClassDef | t.CPtr, module_sha1: str): def _register_generic_template(pool: rawptr[memhub.MemBuddy], cd: ast.ClassDef | t.CPtr, module_sha1: str):
"""委托到 gen._register_generic_template(原 Handles 壳)""" """委托到 gen._register_generic_template(原 Handles 壳)"""
if _g_gen is not None: if _g_gen is not None:
_g_gen.ClassGenGeneric._register_generic_template(pool, cd, module_sha1) _g_gen.ClassGenGeneric._register_generic_template(pool, cd, module_sha1)
@@ -522,7 +522,7 @@ def translate_children(trans: HT.Translator | t.CPtr, tree: ast.AST | t.CPtr) ->
# ---------------- init_symbol_table(委托 VarGenMixin.init_symbol_table) ---------------- # ---------------- init_symbol_table(委托 VarGenMixin.init_symbol_table) ----------------
def init_symbol_table(pool: rowptr[memhub.MemBuddy]) -> GenTypes.SymbolTable | t.CPtr: def init_symbol_table(pool: rawptr[memhub.MemBuddy]) -> GenTypes.SymbolTable | t.CPtr:
"""委托到 gen.init_symbol_table(原 Handles 壳)""" """委托到 gen.init_symbol_table(原 Handles 壳)"""
if _g_gen is not None: if _g_gen is not None:
return _g_gen.VarGen.init_symbol_table(pool) return _g_gen.VarGen.init_symbol_table(pool)
@@ -545,7 +545,7 @@ def find_func_in_module(mod: llvmlite.LLVMModule | t.CPtr, name: str) -> llvmlit
# ---------------- add_func_to_table(委托 CallGenLeafKit.add_func_to_table) ---------------- # ---------------- add_func_to_table(委托 CallGenLeafKit.add_func_to_table) ----------------
def add_func_to_table(funcs: GenTypes.FuncEntry | t.CPtr, func_count: int, name: str, func: llvmlite.Function | t.CPtr, max_count: int, defaults: t.CPtr = None, default_count: int = 0, param_count: int = 0, pool: rowptr[memhub.MemBuddy] = None, def_sha1: str = None) -> int: def add_func_to_table(funcs: GenTypes.FuncEntry | t.CPtr, func_count: int, name: str, func: llvmlite.Function | t.CPtr, max_count: int, defaults: t.CPtr = None, default_count: int = 0, param_count: int = 0, pool: rawptr[memhub.MemBuddy] = None, def_sha1: str = None) -> int:
"""委托到 gen.add_func_to_table(原 Handles 壳) """委托到 gen.add_func_to_table(原 Handles 壳)
def_sha1:定义该函数的模块 SHA1(依赖注入路径必须传,避免默认值被挂到导入方名下) def_sha1:定义该函数的模块 SHA1(依赖注入路径必须传,避免默认值被挂到导入方名下)
@@ -556,7 +556,7 @@ def add_func_to_table(funcs: GenTypes.FuncEntry | t.CPtr, func_count: int, name:
# ---------------- init_func_table(委托 CallGenLeafKit.init_func_table) ---------------- # ---------------- init_func_table(委托 CallGenLeafKit.init_func_table) ----------------
def init_func_table(pool: rowptr[memhub.MemBuddy], max_count: int) -> GenTypes.FuncEntry | t.CPtr: def init_func_table(pool: rawptr[memhub.MemBuddy], max_count: int) -> GenTypes.FuncEntry | t.CPtr:
"""委托到 gen.init_func_table(原 Handles 壳)""" """委托到 gen.init_func_table(原 Handles 壳)"""
if _g_gen is not None: if _g_gen is not None:
return _g_gen.CallGenLeafKit.init_func_table(pool, max_count) return _g_gen.CallGenLeafKit.init_func_table(pool, max_count)
@@ -564,7 +564,7 @@ def init_func_table(pool: rowptr[memhub.MemBuddy], max_count: int) -> GenTypes.F
# ---------------- translate_call(委托 CallGenMixin.translate_call) ---------------- # ---------------- translate_call(委托 CallGenMixin.translate_call) ----------------
def translate_call(pool: rowptr[memhub.MemBuddy], builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, funcs_ptr: t.CPtr, func_count: int, trans: HT.Translator | t.CPtr = None) -> llvmlite.Value | t.CPtr: def translate_call(pool: rawptr[memhub.MemBuddy], builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, funcs_ptr: t.CPtr, func_count: int, trans: HT.Translator | t.CPtr = None) -> llvmlite.Value | t.CPtr:
"""委托到 gen.translate_call(原 Handles 壳)""" """委托到 gen.translate_call(原 Handles 壳)"""
if _g_gen is not None: if _g_gen is not None:
return _g_gen.CallGen.translate_call(pool, builder, mod, node, funcs_ptr, func_count, trans) return _g_gen.CallGen.translate_call(pool, builder, mod, node, funcs_ptr, func_count, trans)
@@ -572,14 +572,14 @@ def translate_call(pool: rowptr[memhub.MemBuddy], builder: llvmlite.IRBuilder |
# ---------------- translate_printf_call(委托 CallGenLeafKit.translate_printf_call) ---------------- # ---------------- translate_printf_call(委托 CallGenLeafKit.translate_printf_call) ----------------
def translate_printf_call(pool: rowptr[memhub.MemBuddy], builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr = None): def translate_printf_call(pool: rawptr[memhub.MemBuddy], builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr = None):
"""委托到 gen.translate_printf_call(原 Handles 壳)""" """委托到 gen.translate_printf_call(原 Handles 壳)"""
if _g_gen is not None: if _g_gen is not None:
_g_gen.CallGenLeafKit.translate_printf_call(pool, builder, mod, cl, trans) _g_gen.CallGenLeafKit.translate_printf_call(pool, builder, mod, cl, trans)
# ---------------- translate_print_call(委托 CallGenLeafKit.translate_print_call) ---------------- # ---------------- translate_print_call(委托 CallGenLeafKit.translate_print_call) ----------------
def translate_print_call(pool: rowptr[memhub.MemBuddy], builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr = None): def translate_print_call(pool: rawptr[memhub.MemBuddy], builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr = None):
"""委托到 gen.translate_print_call(原 Handles 壳)""" """委托到 gen.translate_print_call(原 Handles 壳)"""
if _g_gen is not None: if _g_gen is not None:
_g_gen.CallGenLeafKit.translate_print_call(pool, builder, mod, cl, trans) _g_gen.CallGenLeafKit.translate_print_call(pool, builder, mod, cl, trans)
+1 -1
View File
@@ -92,7 +92,7 @@ class Scope:
@t.NoVTable @t.NoVTable
class SymbolTable: class SymbolTable:
"""嵌套作用域符号表""" """嵌套作用域符号表"""
Pool: rowptr[memhub.MemBuddy] Pool: rawptr[memhub.MemBuddy]
Root: Scope | t.CPtr Root: Scope | t.CPtr
Current: Scope | t.CPtr Current: Scope | t.CPtr
+1 -1
View File
@@ -116,7 +116,7 @@ class Generator:
VarGen: VarGenMixin.VarGenMixin | t.CPtr VarGen: VarGenMixin.VarGenMixin | t.CPtr
TranslatorGen: TranslatorGenMixin.TranslatorGenMixin | t.CPtr TranslatorGen: TranslatorGenMixin.TranslatorGenMixin | t.CPtr
def __init__(self, pool: rowptr[memhub.MemBuddy]): def __init__(self, pool: rawptr[memhub.MemBuddy]):
if self is None: if self is None:
return return
# ---- alloc 46 个子对象 + 回指(永久池,fail-fast) ---- # ---- alloc 46 个子对象 + 回指(永久池,fail-fast) ----
+9 -9
View File
@@ -73,7 +73,7 @@ class ImportsGenMixin:
"""增量更新 imported_modules 索引(复用旧索引或新建,失败则解除绑定)""" """增量更新 imported_modules 索引(复用旧索引或新建,失败则解除绑定)"""
if new_ptr is None or name_ptr is None: if new_ptr is None or name_ptr is None:
return return
perm: rowptr[memhub.MemBuddy] = CompilerFactory.factory.PermPool perm: rawptr[memhub.MemBuddy] = CompilerFactory.factory.PermPool
if perm is None: if perm is None:
return return
idx: hashtable.HashTable | t.CPtr = None idx: hashtable.HashTable | t.CPtr = None
@@ -109,7 +109,7 @@ class ImportsGenMixin:
"""增量更新 from_imports 索引(复用旧索引或新建,失败则解除绑定)""" """增量更新 from_imports 索引(复用旧索引或新建,失败则解除绑定)"""
if new_ptr is None or local_name is None or module_name is None: if new_ptr is None or local_name is None or module_name is None:
return return
perm: rowptr[memhub.MemBuddy] = CompilerFactory.factory.PermPool perm: rawptr[memhub.MemBuddy] = CompilerFactory.factory.PermPool
if perm is None: if perm is None:
return return
idx_m: hashtable.HashTable | t.CPtr = None idx_m: hashtable.HashTable | t.CPtr = None
@@ -167,7 +167,7 @@ class ImportsGenMixin:
# ============================================================ # ============================================================
# 添加已导入模块名 # 添加已导入模块名
# ============================================================ # ============================================================
def add_imported_module(self, pool: rowptr[memhub.MemBuddy], def add_imported_module(self, pool: rawptr[memhub.MemBuddy],
imported_modules: str, imported_modules: str,
name: str) -> str: name: str) -> str:
"""记录已导入的模块名,返回新的 imported_modules 字符串指针""" """记录已导入的模块名,返回新的 imported_modules 字符串指针"""
@@ -276,7 +276,7 @@ class ImportsGenMixin:
# ============================================================ # ============================================================
# 添加 from-import 名称映射 # 添加 from-import 名称映射
# ============================================================ # ============================================================
def add_from_import(self, pool: rowptr[memhub.MemBuddy], def add_from_import(self, pool: rawptr[memhub.MemBuddy],
from_imports: str, from_imports: str,
local_name: str, local_name: str,
module_name: str, module_name: str,
@@ -563,7 +563,7 @@ class ImportsGenMixin:
# 解析后的完整模块名;绝对导入(level<=0)直接返回 module; # 解析后的完整模块名;绝对导入(level<=0)直接返回 module;
# 无法解析时返回 module(回退到原始值) # 无法解析时返回 module(回退到原始值)
# ============================================================ # ============================================================
def _resolve_relative_module(self, pool: rowptr[memhub.MemBuddy], def _resolve_relative_module(self, pool: rawptr[memhub.MemBuddy],
current_package: str, current_package: str,
level: int, level: int,
module: str) -> str: module: str) -> str:
@@ -636,7 +636,7 @@ class ImportsGenMixin:
# "ast/parser.vp" → "ast" # "ast/parser.vp" → "ast"
# "ast.vp" → None(顶级文件) # "ast.vp" → None(顶级文件)
# ============================================================ # ============================================================
def compute_package_from_relpath(self, pool: rowptr[memhub.MemBuddy], def compute_package_from_relpath(self, pool: rawptr[memhub.MemBuddy],
rel_path: str) -> str: rel_path: str) -> str:
"""从相对路径计算包名(目录部分,分隔符替换为 .)""" """从相对路径计算包名(目录部分,分隔符替换为 .)"""
if rel_path is None: if rel_path is None:
@@ -711,7 +711,7 @@ class ImportsGenMixin:
stdio.printf(' File "%s", line %d\n', file_name, lineno) stdio.printf(' File "%s", line %d\n', file_name, lineno)
# 显示行内内容(读源文件第 lineno 行的实际代码,便于快速定位) # 显示行内内容(读源文件第 lineno 行的实际代码,便于快速定位)
if lineno > 0 and file_name is not None: if lineno > 0 and file_name is not None:
f_err: rowptr[fileio.File] = fileio.File(file_name, fileio.MODE.R) f_err: rawptr[fileio.File] = fileio.File(file_name, fileio.MODE.R)
if not f_err.closed: if not f_err.closed:
line_buf_err: bytes = stdlib.malloc(512) line_buf_err: bytes = stdlib.malloc(512)
if line_buf_err is not None: if line_buf_err is not None:
@@ -764,7 +764,7 @@ class ImportsGenMixin:
path_buf[sep_pos] = '\0' path_buf[sep_pos] = '\0'
string.strcat(path_buf, mod_name) string.strcat(path_buf, mod_name)
string.strcat(path_buf, ".vp") string.strcat(path_buf, ".vp")
fex: rowptr[fileio.File] = fileio.File(path_buf, fileio.MODE.R) fex: rawptr[fileio.File] = fileio.File(path_buf, fileio.MODE.R)
if not fex.closed: if not fex.closed:
fex.close() fex.close()
stdlib.free(path_buf) stdlib.free(path_buf)
@@ -831,7 +831,7 @@ class ImportsGenMixin:
# 尚未包含后续才追加的模块(如 App 源文件),检查会造成误报。 # 尚未包含后续才追加的模块(如 App 源文件),检查会造成误报。
if trans._declare_only == 0: if trans._declare_only == 0:
self._check_import_sha1(node, alias.name) self._check_import_sha1(node, alias.name)
pool_val: rowptr[memhub.MemBuddy] = trans.Pool pool_val: rawptr[memhub.MemBuddy] = trans.Pool
im_val: str = trans._imported_modules im_val: str = trans._imported_modules
trans._imported_modules = self.add_imported_module( trans._imported_modules = self.add_imported_module(
pool_val, im_val, alias.name) pool_val, im_val, alias.name)
+6 -6
View File
@@ -79,7 +79,7 @@ class MatchGenMixin:
node: ast.AST | t.CPtr) -> int: node: ast.AST | t.CPtr) -> int:
if node is None: if node is None:
return 0 return 0
pool: rowptr[memhub.MemBuddy] = trans.Pool pool: rawptr[memhub.MemBuddy] = trans.Pool
builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder
func: llvmlite.Function | t.CPtr = trans._cur_func func: llvmlite.Function | t.CPtr = trans._cur_func
if builder is None or func is None: if builder is None or func is None:
@@ -267,7 +267,7 @@ class MatchGenMixin:
node: ast.Match | t.CPtr, node: ast.Match | t.CPtr,
renum_name: str, renum_name: str,
subject_ptr: llvmlite.Value | t.CPtr) -> int: subject_ptr: llvmlite.Value | t.CPtr) -> int:
pool: rowptr[memhub.MemBuddy] = trans.Pool pool: rawptr[memhub.MemBuddy] = trans.Pool
builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder
func: llvmlite.Function | t.CPtr = trans._cur_func func: llvmlite.Function | t.CPtr = trans._cur_func
# 局部记录本 renum match 是否有 br 进入 end_bb,收尾时覆盖 # 局部记录本 renum match 是否有 br 进入 end_bb,收尾时覆盖
@@ -666,7 +666,7 @@ class MatchGenMixin:
renum_ty: llvmlite.LLVMType | t.CPtr, renum_ty: llvmlite.LLVMType | t.CPtr,
subject_ptr: llvmlite.Value | t.CPtr, subject_ptr: llvmlite.Value | t.CPtr,
trans: HT.Translator | t.CPtr, trans: HT.Translator | t.CPtr,
pool: rowptr[memhub.MemBuddy], pool: rawptr[memhub.MemBuddy],
builder: llvmlite.IRBuilder | t.CPtr): builder: llvmlite.IRBuilder | t.CPtr):
if pat is None or renum_entry is None or renum_ty is None: if pat is None or renum_entry is None or renum_ty is None:
return return
@@ -771,7 +771,7 @@ class MatchGenMixin:
"""对齐 lhs/rhs 后生成 icmp eq(指针统一 ptrtoint i64)""" """对齐 lhs/rhs 后生成 icmp eq(指针统一 ptrtoint i64)"""
if lhs is None or rhs is None or builder is None: if lhs is None or rhs is None or builder is None:
return None return None
pool: rowptr[memhub.MemBuddy] = trans.Pool pool: rawptr[memhub.MemBuddy] = trans.Pool
if self.Gen.ExprGenBase.is_ptr_type(lhs.Ty) != 0 \ if self.Gen.ExprGenBase.is_ptr_type(lhs.Ty) != 0 \
or self.Gen.ExprGenBase.is_ptr_type(rhs.Ty) != 0: or self.Gen.ExprGenBase.is_ptr_type(rhs.Ty) != 0:
i64_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int64(pool) i64_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int64(pool)
@@ -812,7 +812,7 @@ class MatchGenMixin:
def _handle_sequence_match(self, trans: HT.Translator | t.CPtr, def _handle_sequence_match(self, trans: HT.Translator | t.CPtr,
node: ast.Match | t.CPtr, node: ast.Match | t.CPtr,
subject_node: ast.AST | t.CPtr) -> int: subject_node: ast.AST | t.CPtr) -> int:
pool: rowptr[memhub.MemBuddy] = trans.Pool pool: rawptr[memhub.MemBuddy] = trans.Pool
builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder
func: llvmlite.Function | t.CPtr = trans._cur_func func: llvmlite.Function | t.CPtr = trans._cur_func
if builder is None or func is None: if builder is None or func is None:
@@ -1157,7 +1157,7 @@ class MatchGenMixin:
def _handle_simple_match(self, trans: HT.Translator | t.CPtr, def _handle_simple_match(self, trans: HT.Translator | t.CPtr,
node: ast.Match | t.CPtr, node: ast.Match | t.CPtr,
subject_val: llvmlite.Value | t.CPtr) -> int: subject_val: llvmlite.Value | t.CPtr) -> int:
pool: rowptr[memhub.MemBuddy] = trans.Pool pool: rawptr[memhub.MemBuddy] = trans.Pool
builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder
func: llvmlite.Function | t.CPtr = trans._cur_func func: llvmlite.Function | t.CPtr = trans._cur_func
# 同主路径:局部记录本 simple match 的 br end_bb,收尾覆盖 # 同主路径:局部记录本 simple match 的 br end_bb,收尾覆盖
+16 -16
View File
@@ -121,7 +121,7 @@ class StmtGenCifMixin:
if string.strcmp(name, "NDEBUG") == 0: self.CifEvalOk = 1; return 0 if string.strcmp(name, "NDEBUG") == 0: self.CifEvalOk = 1; return 0
return 0 return 0
def _cif_name_value(self, pool: rowptr[memhub.MemBuddy], def _cif_name_value(self, pool: rawptr[memhub.MemBuddy],
trans: HT.Translator | t.CPtr, trans: HT.Translator | t.CPtr,
name: str) -> int: name: str) -> int:
"""查宏名值: 本地 CDefine → 跨模块 CDefine → 平台宏。 """查宏名值: 本地 CDefine → 跨模块 CDefine → 平台宏。
@@ -145,7 +145,7 @@ class StmtGenCifMixin:
return pv return pv
return 0 return 0
def _cif_attr_value(self, pool: rowptr[memhub.MemBuddy], def _cif_attr_value(self, pool: rawptr[memhub.MemBuddy],
trans: HT.Translator | t.CPtr, trans: HT.Translator | t.CPtr,
at: ast.Attribute | t.CPtr) -> int: at: ast.Attribute | t.CPtr) -> int:
"""Attribute 宏值: platmacro.IS_WINDOWS → 本地 CDefine(attr) → 跨模块 CDefine。 """Attribute 宏值: platmacro.IS_WINDOWS → 本地 CDefine(attr) → 跨模块 CDefine。
@@ -190,7 +190,7 @@ class StmtGenCifMixin:
return v2 return v2
return 0 return 0
def _cif_eval_node(self, pool: rowptr[memhub.MemBuddy], def _cif_eval_node(self, pool: rawptr[memhub.MemBuddy],
trans: HT.Translator | t.CPtr, trans: HT.Translator | t.CPtr,
node: ast.AST | t.CPtr) -> int: node: ast.AST | t.CPtr) -> int:
"""递归常量求值 CIf 表达式。 """递归常量求值 CIf 表达式。
@@ -347,7 +347,7 @@ class StmtGenCifMixin:
return 1 return 1
return 0 return 0
def _cif_eval_call(self, pool: rowptr[memhub.MemBuddy], def _cif_eval_call(self, pool: rawptr[memhub.MemBuddy],
trans: HT.Translator | t.CPtr, trans: HT.Translator | t.CPtr,
node: ast.AST | t.CPtr) -> int: node: ast.AST | t.CPtr) -> int:
"""编译期函数调用求值:ctraits.isptr(x)。 """编译期函数调用求值:ctraits.isptr(x)。
@@ -392,7 +392,7 @@ class StmtGenCifMixin:
self.CifEvalOk = 1 self.CifEvalOk = 1
return r return r
def _evaluate_cif_test(self, pool: rowptr[memhub.MemBuddy], def _evaluate_cif_test(self, pool: rawptr[memhub.MemBuddy],
trans: HT.Translator | t.CPtr, trans: HT.Translator | t.CPtr,
test: ast.AST | t.CPtr) -> int: test: ast.AST | t.CPtr) -> int:
"""求值 CIf 调用(test 必须是 c.CIf 系调用)。 """求值 CIf 调用(test 必须是 c.CIf 系调用)。
@@ -464,7 +464,7 @@ class StmtGenCifMixin:
if rt is None: if rt is None:
return 0 return 0
pool: rowptr[memhub.MemBuddy] = trans.Pool pool: rawptr[memhub.MemBuddy] = trans.Pool
builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder
mod: llvmlite.LLVMModule | t.CPtr = trans.Module mod: llvmlite.LLVMModule | t.CPtr = trans.Module
@@ -700,7 +700,7 @@ class StmtGenCifMixin:
if node is None: if node is None:
return 0 return 0
pool: rowptr[memhub.MemBuddy] = trans.Pool pool: rawptr[memhub.MemBuddy] = trans.Pool
builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder
func: llvmlite.Function | t.CPtr = trans._cur_func func: llvmlite.Function | t.CPtr = trans._cur_func
@@ -872,7 +872,7 @@ class StmtGenCifMixin:
if node is None: if node is None:
return 0 return 0
pool: rowptr[memhub.MemBuddy] = trans.Pool pool: rawptr[memhub.MemBuddy] = trans.Pool
builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder
func: llvmlite.Function | t.CPtr = trans._cur_func func: llvmlite.Function | t.CPtr = trans._cur_func
@@ -1043,7 +1043,7 @@ class StmtGenCifMixin:
if node is None: if node is None:
return 0 return 0
pool: rowptr[memhub.MemBuddy] = trans.Pool pool: rawptr[memhub.MemBuddy] = trans.Pool
builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder
func: llvmlite.Function | t.CPtr = trans._cur_func func: llvmlite.Function | t.CPtr = trans._cur_func
@@ -1540,7 +1540,7 @@ class StmtGenCifMixin:
循环变量 alloca 自动创建或复用;元素类型由源类型决定 循环变量 alloca 自动创建或复用;元素类型由源类型决定
(RANGE→i32, STR→i8, LIST→i8*)。索引内部统一 i64。 (RANGE→i32, STR→i8, LIST→i8*)。索引内部统一 i64。
""" """
pool: rowptr[memhub.MemBuddy] = trans.Pool pool: rawptr[memhub.MemBuddy] = trans.Pool
builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder
func: llvmlite.Function | t.CPtr = trans._cur_func func: llvmlite.Function | t.CPtr = trans._cur_func
@@ -1865,7 +1865,7 @@ class StmtGenCifMixin:
for_node: ast.For | t.CPtr, for_node: ast.For | t.CPtr,
var_name: str) -> int: var_name: str) -> int:
"""指针迭代: for x in ptr: 直到解引用为空""" """指针迭代: for x in ptr: 直到解引用为空"""
pool: rowptr[memhub.MemBuddy] = trans.Pool pool: rawptr[memhub.MemBuddy] = trans.Pool
builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder
func: llvmlite.Function | t.CPtr = trans._cur_func func: llvmlite.Function | t.CPtr = trans._cur_func
@@ -2030,7 +2030,7 @@ class StmtGenCifMixin:
var_name: str, var_name: str,
array_val: llvmlite.Value | t.CPtr) -> int: array_val: llvmlite.Value | t.CPtr) -> int:
"""数组迭代: for x in arr: 按数组长度迭代""" """数组迭代: for x in arr: 按数组长度迭代"""
pool: rowptr[memhub.MemBuddy] = trans.Pool pool: rawptr[memhub.MemBuddy] = trans.Pool
builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder
func: llvmlite.Function | t.CPtr = trans._cur_func func: llvmlite.Function | t.CPtr = trans._cur_func
@@ -2176,7 +2176,7 @@ class StmtGenCifMixin:
var_name: str, var_name: str,
list_node: ast.AST | t.CPtr) -> int: list_node: ast.AST | t.CPtr) -> int:
"""列表字面量迭代: for x in [a, b, c]: 按元素顺序迭代""" """列表字面量迭代: for x in [a, b, c]: 按元素顺序迭代"""
pool: rowptr[memhub.MemBuddy] = trans.Pool pool: rawptr[memhub.MemBuddy] = trans.Pool
builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder
lst: ast.List | t.CPtr = (ast.List | t.CPtr)(list_node) lst: ast.List | t.CPtr = (ast.List | t.CPtr)(list_node)
@@ -2261,7 +2261,7 @@ class StmtGenCifMixin:
var_name: str, var_name: str,
list_val: llvmlite.Value | t.CPtr) -> int: list_val: llvmlite.Value | t.CPtr) -> int:
"""list[T] 容器迭代: for v in lst: 按 __count__ 动态长度迭代""" """list[T] 容器迭代: for v in lst: 按 __count__ 动态长度迭代"""
pool: rowptr[memhub.MemBuddy] = trans.Pool pool: rawptr[memhub.MemBuddy] = trans.Pool
builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder
func: llvmlite.Function | t.CPtr = trans._cur_func func: llvmlite.Function | t.CPtr = trans._cur_func
@@ -2374,7 +2374,7 @@ class StmtGenCifMixin:
__iter__ 协议(__iter__ 重置 iter_index + __next__ 取 key)内联为 __iter__ 协议(__iter__ 重置 iter_index + __next__ 取 key)内联为
循环:iter_idx < __count__ → key = __keys__[iter_idx]。 循环:iter_idx < __count__ → key = __keys__[iter_idx]。
""" """
pool: rowptr[memhub.MemBuddy] = trans.Pool pool: rawptr[memhub.MemBuddy] = trans.Pool
builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder
func: llvmlite.Function | t.CPtr = trans._cur_func func: llvmlite.Function | t.CPtr = trans._cur_func
@@ -2506,7 +2506,7 @@ class StmtGenCifMixin:
class_name: str, class_name: str,
obj_val: llvmlite.Value | t.CPtr) -> int: obj_val: llvmlite.Value | t.CPtr) -> int:
"""OOP iter 协议: for x in obj: 调用 __iter__/__next__ 迭代""" """OOP iter 协议: for x in obj: 调用 __iter__/__next__ 迭代"""
pool: rowptr[memhub.MemBuddy] = trans.Pool pool: rawptr[memhub.MemBuddy] = trans.Pool
builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder
func: llvmlite.Function | t.CPtr = trans._cur_func func: llvmlite.Function | t.CPtr = trans._cur_func
mod: llvmlite.LLVMModule | t.CPtr = trans.Module mod: llvmlite.LLVMModule | t.CPtr = trans.Module
+9 -9
View File
@@ -244,7 +244,7 @@ class StmtGenDeclMixin(StmtGenCifMixin.StmtGenCifMixin):
"""翻译 break 语句:跳转到循环 end 块""" """翻译 break 语句:跳转到循环 end 块"""
builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder
func: llvmlite.Function | t.CPtr = trans._cur_func func: llvmlite.Function | t.CPtr = trans._cur_func
pool: rowptr[memhub.MemBuddy] = trans.Pool pool: rawptr[memhub.MemBuddy] = trans.Pool
if builder is None or func is None: if builder is None or func is None:
return 0 return 0
@@ -267,7 +267,7 @@ class StmtGenDeclMixin(StmtGenCifMixin.StmtGenCifMixin):
"""翻译 continue 语句:跳转到循环 cond/incr 块""" """翻译 continue 语句:跳转到循环 cond/incr 块"""
builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder
func: llvmlite.Function | t.CPtr = trans._cur_func func: llvmlite.Function | t.CPtr = trans._cur_func
pool: rowptr[memhub.MemBuddy] = trans.Pool pool: rawptr[memhub.MemBuddy] = trans.Pool
if builder is None or func is None: if builder is None or func is None:
return 0 return 0
@@ -313,7 +313,7 @@ class StmtGenDeclMixin(StmtGenCifMixin.StmtGenCifMixin):
if env_var is not None: if env_var is not None:
return env_var return env_var
# 创建 alloca 存储 env # 创建 alloca 存储 env
pool: rowptr[memhub.MemBuddy] = trans.Pool pool: rawptr[memhub.MemBuddy] = trans.Pool
builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder
i8_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int8(pool) i8_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int8(pool)
i8_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, i8_ty) i8_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, i8_ty)
@@ -333,7 +333,7 @@ class StmtGenDeclMixin(StmtGenCifMixin.StmtGenCifMixin):
if idx < 0: if idx < 0:
return None return None
pool: rowptr[memhub.MemBuddy] = trans.Pool pool: rawptr[memhub.MemBuddy] = trans.Pool
builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder
i8_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int8(pool) i8_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int8(pool)
i8_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, i8_ty) i8_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, i8_ty)
@@ -369,7 +369,7 @@ class StmtGenDeclMixin(StmtGenCifMixin.StmtGenCifMixin):
if raw_ptr is None: if raw_ptr is None:
return None return None
pool: rowptr[memhub.MemBuddy] = trans.Pool pool: rawptr[memhub.MemBuddy] = trans.Pool
builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder
# 获取变量类型(从注册时存储的类型信息) # 获取变量类型(从注册时存储的类型信息)
@@ -395,7 +395,7 @@ class StmtGenDeclMixin(StmtGenCifMixin.StmtGenCifMixin):
if raw_ptr is None: if raw_ptr is None:
return None return None
pool: rowptr[memhub.MemBuddy] = trans.Pool pool: rawptr[memhub.MemBuddy] = trans.Pool
builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder
# 获取变量类型 # 获取变量类型
@@ -412,7 +412,7 @@ class StmtGenDeclMixin(StmtGenCifMixin.StmtGenCifMixin):
# 簇 E:枚举注册表(迁移自 HandlesEnum.vp) # 簇 E:枚举注册表(迁移自 HandlesEnum.vp)
# ============================================================ # ============================================================
def init_enum_table(self, pool: rowptr[memhub.MemBuddy]) -> int: def init_enum_table(self, pool: rawptr[memhub.MemBuddy]) -> int:
"""初始化枚举注册表,返回 1 成功 """初始化枚举注册表,返回 1 成功
表用 stdlib 分配(跨 Phase1 1b 的 mark/reset_to 存活——枚举表是 表用 stdlib 分配(跨 Phase1 1b 的 mark/reset_to 存活——枚举表是
@@ -447,7 +447,7 @@ class StmtGenDeclMixin(StmtGenCifMixin.StmtGenCifMixin):
addr: uint64 = uint64(enum_entry.Members) + i * member_size addr: uint64 = uint64(enum_entry.Members) + i * member_size
return (GenTypes.EnumMember | t.CPtr)(t.CVoid(addr, t.CPtr)) return (GenTypes.EnumMember | t.CPtr)(t.CVoid(addr, t.CPtr))
def register_enum(self, pool: rowptr[memhub.MemBuddy], def register_enum(self, pool: rawptr[memhub.MemBuddy],
name: str, name: str,
base_ty: llvmlite.LLVMType | t.CPtr) -> GenTypes.EnumEntry | t.CPtr: base_ty: llvmlite.LLVMType | t.CPtr) -> GenTypes.EnumEntry | t.CPtr:
"""注册枚举类型,返回 EnumEntry 指针""" """注册枚举类型,返回 EnumEntry 指针"""
@@ -500,7 +500,7 @@ class StmtGenDeclMixin(StmtGenCifMixin.StmtGenCifMixin):
self.EnumCount += 1 self.EnumCount += 1
return entry return entry
def add_enum_member(self, pool: rowptr[memhub.MemBuddy], def add_enum_member(self, pool: rawptr[memhub.MemBuddy],
enum_entry: GenTypes.EnumEntry | t.CPtr, enum_entry: GenTypes.EnumEntry | t.CPtr,
member_name: str, member_name: str,
member_val: int64, member_val: int64,
+6 -6
View File
@@ -115,7 +115,7 @@ class StmtGenMixin(StmtGenDeclMixin.StmtGenDeclMixin):
dnode: ast.Delete | t.CPtr = (ast.Delete | t.CPtr)(node) dnode: ast.Delete | t.CPtr = (ast.Delete | t.CPtr)(node)
if dnode is None or dnode.targets is None: if dnode is None or dnode.targets is None:
return 0 return 0
pool: rowptr[memhub.MemBuddy] = trans.Pool pool: rawptr[memhub.MemBuddy] = trans.Pool
mod: llvmlite.LLVMModule | t.CPtr = trans.Module mod: llvmlite.LLVMModule | t.CPtr = trans.Module
builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder
if pool is None or mod is None or builder is None: if pool is None or mod is None or builder is None:
@@ -193,7 +193,7 @@ class StmtGenMixin(StmtGenDeclMixin.StmtGenDeclMixin):
tr: ast.Try | t.CPtr = (ast.Try | t.CPtr)(node) tr: ast.Try | t.CPtr = (ast.Try | t.CPtr)(node)
if tr is None: if tr is None:
return 0 return 0
pool: rowptr[memhub.MemBuddy] = trans.Pool pool: rawptr[memhub.MemBuddy] = trans.Pool
builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder
func: llvmlite.Function | t.CPtr = trans._cur_func func: llvmlite.Function | t.CPtr = trans._cur_func
if pool is None or builder is None or func is None: if pool is None or builder is None or func is None:
@@ -438,7 +438,7 @@ class StmtGenMixin(StmtGenDeclMixin.StmtGenDeclMixin):
""" """
if trans is None or node is None: if trans is None or node is None:
return 0 return 0
pool: rowptr[memhub.MemBuddy] = trans.Pool pool: rawptr[memhub.MemBuddy] = trans.Pool
builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder
mod: llvmlite.LLVMModule | t.CPtr = trans.Module mod: llvmlite.LLVMModule | t.CPtr = trans.Module
if pool is None or builder is None or mod is None: if pool is None or builder is None or mod is None:
@@ -538,7 +538,7 @@ class StmtGenMixin(StmtGenDeclMixin.StmtGenDeclMixin):
# 终结(前一条是 raise/return)时跳过,避免在终止块后插指令。 # 终结(前一条是 raise/return)时跳过,避免在终止块后插指令。
# ============================================================ # ============================================================
def _eh_ret_default(self, trans: HT.Translator | t.CPtr, def _eh_ret_default(self, trans: HT.Translator | t.CPtr,
pool: rowptr[memhub.MemBuddy], pool: rawptr[memhub.MemBuddy],
builder: llvmlite.IRBuilder | t.CPtr) -> int: builder: llvmlite.IRBuilder | t.CPtr) -> int:
"""异常路径返回当前函数默认零值,返回 0""" """异常路径返回当前函数默认零值,返回 0"""
if trans is None or builder is None: if trans is None or builder is None:
@@ -592,7 +592,7 @@ class StmtGenMixin(StmtGenDeclMixin.StmtGenDeclMixin):
wt: ast.With | t.CPtr = (ast.With | t.CPtr)(node) wt: ast.With | t.CPtr = (ast.With | t.CPtr)(node)
if wt is None: if wt is None:
return 0 return 0
pool: rowptr[memhub.MemBuddy] = trans.Pool pool: rawptr[memhub.MemBuddy] = trans.Pool
builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder
mod: llvmlite.LLVMModule | t.CPtr = trans.Module mod: llvmlite.LLVMModule | t.CPtr = trans.Module
if pool is None or builder is None or mod is None: if pool is None or builder is None or mod is None:
@@ -732,7 +732,7 @@ class StmtGenMixin(StmtGenDeclMixin.StmtGenDeclMixin):
return 0 return 0
def _with_ctx_call(self, trans: HT.Translator | t.CPtr, def _with_ctx_call(self, trans: HT.Translator | t.CPtr,
pool: rowptr[memhub.MemBuddy], pool: rawptr[memhub.MemBuddy],
builder: llvmlite.IRBuilder | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr,
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
method_name: str) -> llvmlite.Value | t.CPtr: method_name: str) -> llvmlite.Value | t.CPtr:
+22 -22
View File
@@ -131,7 +131,7 @@ class StructGenMixin:
避免跨 Mixin 直接读 self.StdlibAlloc——Mixin 方法体按自身块内索引编译)""" 避免跨 Mixin 直接读 self.StdlibAlloc——Mixin 方法体按自身块内索引编译)"""
return self.StdlibAlloc return self.StdlibAlloc
def reset_visible_structs(self, pool: rowptr[memhub.MemBuddy], strict: int) -> None: def reset_visible_structs(self, pool: rawptr[memhub.MemBuddy], strict: int) -> None:
"""重置可见性状态(每个文件翻译前调用) """重置可见性状态(每个文件翻译前调用)
pool: 内存分配器(严格模式下创建 HashTable) pool: 内存分配器(严格模式下创建 HashTable)
@@ -145,7 +145,7 @@ class StructGenMixin:
# 宽松模式:全部可见,不需要 HashTable # 宽松模式:全部可见,不需要 HashTable
self.VisibleStructs = None self.VisibleStructs = None
def add_visible_struct(self, pool: rowptr[memhub.MemBuddy], name: str) -> None: def add_visible_struct(self, pool: rawptr[memhub.MemBuddy], name: str) -> None:
"""添加可见结构体名(类定义时和 from-import 时调用)""" """添加可见结构体名(类定义时和 from-import 时调用)"""
if name is None: if name is None:
return return
@@ -167,7 +167,7 @@ class StructGenMixin:
return 0 return 0
return self.VisibleStructs.__contains__(name) return self.VisibleStructs.__contains__(name)
def init_struct_table(self, pool: rowptr[memhub.MemBuddy]) -> int: def init_struct_table(self, pool: rawptr[memhub.MemBuddy]) -> int:
"""初始化结构体注册表,返回 1 成功 """初始化结构体注册表,返回 1 成功
StdlibAlloc=1 时表体分配在 perm_pool:1a 每文件 reset 后表本体 StdlibAlloc=1 时表体分配在 perm_pool:1a 每文件 reset 后表本体
@@ -178,7 +178,7 @@ class StructGenMixin:
return 1 return 1
entry_size: sizet = GenTypes.StructEntry.__sizeof__() entry_size: sizet = GenTypes.StructEntry.__sizeof__()
table_pool: rowptr[memhub.MemBuddy] = pool table_pool: rawptr[memhub.MemBuddy] = pool
if self.StdlibAlloc != 0: if self.StdlibAlloc != 0:
table_pool = CompilerFactory.factory.PermPool table_pool = CompilerFactory.factory.PermPool
if table_pool is None: if table_pool is None:
@@ -367,7 +367,7 @@ class StructGenMixin:
addr: uint64 = uint64(struct_entry.Fields) + i * field_size addr: uint64 = uint64(struct_entry.Fields) + i * field_size
return (GenTypes.FieldEntry | t.CPtr)(t.CVoid(addr, t.CPtr)) return (GenTypes.FieldEntry | t.CPtr)(t.CVoid(addr, t.CPtr))
def register_struct(self, pool: rowptr[memhub.MemBuddy], def register_struct(self, pool: rawptr[memhub.MemBuddy],
name: str, name: str,
struct_ty: llvmlite.LLVMType | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr,
sha1: str = None) -> GenTypes.StructEntry | t.CPtr: sha1: str = None) -> GenTypes.StructEntry | t.CPtr:
@@ -399,7 +399,7 @@ class StructGenMixin:
# 分配字段数组(1b 阶段用永久池,避免 reset 回收后 Fields 悬空) # 分配字段数组(1b 阶段用永久池,避免 reset 回收后 Fields 悬空)
field_size: sizet = GenTypes.FieldEntry.__sizeof__() field_size: sizet = GenTypes.FieldEntry.__sizeof__()
if self.StdlibAlloc != 0: if self.StdlibAlloc != 0:
perm_sg: rowptr[memhub.MemBuddy] = CompilerFactory.factory.PermPool perm_sg: rawptr[memhub.MemBuddy] = CompilerFactory.factory.PermPool
if perm_sg is None: if perm_sg is None:
perm_sg = pool perm_sg = pool
entry.Fields = perm_sg.alloc(field_size * FIELD_MAX) entry.Fields = perm_sg.alloc(field_size * FIELD_MAX)
@@ -411,7 +411,7 @@ class StructGenMixin:
# 复制类名(1b/Phase2(StdlibAlloc=1)用永久池跨 reset 存活;1a 用主 pool, # 复制类名(1b/Phase2(StdlibAlloc=1)用永久池跨 reset 存活;1a 用主 pool,
# mark1 前不回收同样存活)。不复制则 find_struct_by_module 的 strcmp 读悬空 Name。 # mark1 前不回收同样存活)。不复制则 find_struct_by_module 的 strcmp 读悬空 Name。
name_pool: rowptr[memhub.MemBuddy] = pool name_pool: rawptr[memhub.MemBuddy] = pool
if self.StdlibAlloc != 0: if self.StdlibAlloc != 0:
name_pool = CompilerFactory.factory.PermPool name_pool = CompilerFactory.factory.PermPool
if name_pool is None: if name_pool is None:
@@ -439,7 +439,7 @@ class StructGenMixin:
self._struct_idx_add(self.StructCount - 1, entry) self._struct_idx_add(self.StructCount - 1, entry)
return entry return entry
def register_struct_alias(self, pool: rowptr[memhub.MemBuddy], def register_struct_alias(self, pool: rawptr[memhub.MemBuddy],
name: str, name: str,
sha1: str, sha1: str,
src_entry: GenTypes.StructEntry | t.CPtr) -> GenTypes.StructEntry | t.CPtr: src_entry: GenTypes.StructEntry | t.CPtr) -> GenTypes.StructEntry | t.CPtr:
@@ -469,7 +469,7 @@ class StructGenMixin:
if entry is None: if entry is None:
return None return None
# 复制类名与 SHA1(别名注册同样按 StdlibAlloc 选分配源,跨 1a/1b reset 存活) # 复制类名与 SHA1(别名注册同样按 StdlibAlloc 选分配源,跨 1a/1b reset 存活)
alias_pool: rowptr[memhub.MemBuddy] = pool alias_pool: rawptr[memhub.MemBuddy] = pool
if self.StdlibAlloc != 0: if self.StdlibAlloc != 0:
alias_pool = CompilerFactory.factory.PermPool alias_pool = CompilerFactory.factory.PermPool
if alias_pool is None: if alias_pool is None:
@@ -509,7 +509,7 @@ class StructGenMixin:
self._struct_idx_add(self.StructCount - 1, entry) self._struct_idx_add(self.StructCount - 1, entry)
return entry return entry
def set_struct_sha1(self, pool: rowptr[memhub.MemBuddy], def set_struct_sha1(self, pool: rawptr[memhub.MemBuddy],
class_name: str, sha1: str) -> int: class_name: str, sha1: str) -> int:
"""设置结构体所属模块的 SHA1,返回 1=成功 / 0=失败""" """设置结构体所属模块的 SHA1,返回 1=成功 / 0=失败"""
if class_name is None or sha1 is None: if class_name is None or sha1 is None:
@@ -519,7 +519,7 @@ class StructGenMixin:
return 0 return 0
# 复制 SHA1 字符串(StdlibAlloc=1 用永久池,跨 1a/1b 存活防 strcmp 悬空) # 复制 SHA1 字符串(StdlibAlloc=1 用永久池,跨 1a/1b 存活防 strcmp 悬空)
sha1_len: sizet = string.strlen(sha1) sha1_len: sizet = string.strlen(sha1)
sha1_pool: rowptr[memhub.MemBuddy] = pool sha1_pool: rawptr[memhub.MemBuddy] = pool
if self.StdlibAlloc != 0: if self.StdlibAlloc != 0:
sha1_pool = CompilerFactory.factory.PermPool sha1_pool = CompilerFactory.factory.PermPool
if sha1_pool is None: if sha1_pool is None:
@@ -540,7 +540,7 @@ class StructGenMixin:
return None return None
return entry.ModuleSha1 return entry.ModuleSha1
def add_field(self, pool: rowptr[memhub.MemBuddy], def add_field(self, pool: rawptr[memhub.MemBuddy],
struct_entry: GenTypes.StructEntry | t.CPtr, struct_entry: GenTypes.StructEntry | t.CPtr,
field_name: str, field_name: str,
field_ty: llvmlite.LLVMType | t.CPtr, field_ty: llvmlite.LLVMType | t.CPtr,
@@ -565,7 +565,7 @@ class StructGenMixin:
# 复制字段名(StdlibAlloc=1 用永久池跨 reset 存活);否则 lookup_field 的 # 复制字段名(StdlibAlloc=1 用永久池跨 reset 存活);否则 lookup_field 的
# strcmp(fe.Name, ...) 读悬空越界。 # strcmp(fe.Name, ...) 读悬空越界。
fname_pool: rowptr[memhub.MemBuddy] = pool fname_pool: rawptr[memhub.MemBuddy] = pool
if self.StdlibAlloc != 0: if self.StdlibAlloc != 0:
fname_pool = CompilerFactory.factory.PermPool fname_pool = CompilerFactory.factory.PermPool
if fname_pool is None: if fname_pool is None:
@@ -583,7 +583,7 @@ class StructGenMixin:
# 悬空内存。 # 悬空内存。
# 注:注解类名已并入 Spec.SourceName,Spec 一律 PermPool 分配 ⇒ 天然跨 reset 存活。 # 注:注解类名已并入 Spec.SourceName,Spec 一律 PermPool 分配 ⇒ 天然跨 reset 存活。
if self.StdlibAlloc != 0: if self.StdlibAlloc != 0:
dp_pool_sg: rowptr[memhub.MemBuddy] = CompilerFactory.factory.PermPool dp_pool_sg: rawptr[memhub.MemBuddy] = CompilerFactory.factory.PermPool
if dp_pool_sg is None: if dp_pool_sg is None:
dp_pool_sg = pool dp_pool_sg = pool
ty_copy: llvmlite.LLVMType | t.CPtr = llvmlite.DeepCopyType(dp_pool_sg, field_ty) ty_copy: llvmlite.LLVMType | t.CPtr = llvmlite.DeepCopyType(dp_pool_sg, field_ty)
@@ -620,7 +620,7 @@ class StructGenMixin:
struct_entry.FieldCount = idx + 1 struct_entry.FieldCount = idx + 1
return idx return idx
def _deep_copy_default_ast(self, pool: rowptr[memhub.MemBuddy], def _deep_copy_default_ast(self, pool: rawptr[memhub.MemBuddy],
default_val: ast.AST | t.CPtr) -> ast.AST | t.CPtr: default_val: ast.AST | t.CPtr) -> ast.AST | t.CPtr:
"""深拷贝字段默认值 AST 到永久池(仅常量节点),跨 1b reset 存活。 """深拷贝字段默认值 AST 到永久池(仅常量节点),跨 1b reset 存活。
@@ -665,7 +665,7 @@ class StructGenMixin:
dst_c.str_val = s_copy dst_c.str_val = s_copy
return (ast.AST | t.CPtr)(dst_c) return (ast.AST | t.CPtr)(dst_c)
def _deep_copy_list_ast(self, pool: rowptr[memhub.MemBuddy], def _deep_copy_list_ast(self, pool: rawptr[memhub.MemBuddy],
default_val: ast.AST | t.CPtr) -> ast.AST | t.CPtr: default_val: ast.AST | t.CPtr) -> ast.AST | t.CPtr:
"""深拷贝 List 节点(列表字面量默认值)到永久池,跨 1b reset 存活。 """深拷贝 List 节点(列表字面量默认值)到永久池,跨 1b reset 存活。
@@ -1468,7 +1468,7 @@ class StructGenMixin:
return 0 return 0
return entry.HasNew return entry.HasNew
def get_class_name_by_type(self, pool: rowptr[memhub.MemBuddy], def get_class_name_by_type(self, pool: rawptr[memhub.MemBuddy],
struct_ty: llvmlite.LLVMType | t.CPtr) -> str: struct_ty: llvmlite.LLVMType | t.CPtr) -> str:
"""按类型指针查找类名,返回类名字符串或 None""" """按类型指针查找类名,返回类名字符串或 None"""
if struct_ty is None or self.StructTable is None: if struct_ty is None or self.StructTable is None:
@@ -1574,7 +1574,7 @@ class StructGenMixin:
entry.ParentName = parent_name entry.ParentName = parent_name
return 1 return 1
def set_parent_names(self, pool: rowptr[memhub.MemBuddy], def set_parent_names(self, pool: rawptr[memhub.MemBuddy],
name: str, names_ptr: sizet | t.CPtr, name: str, names_ptr: sizet | t.CPtr,
count: int) -> int: count: int) -> int:
"""设置结构体的父类名数组(永久池深拷贝,跨文件永久存活)""" """设置结构体的父类名数组(永久池深拷贝,跨文件永久存活)"""
@@ -1589,7 +1589,7 @@ class StructGenMixin:
return 1 return 1
if count > PARENT_MAX: if count > PARENT_MAX:
count = PARENT_MAX count = PARENT_MAX
pn_pool: rowptr[memhub.MemBuddy] = pool pn_pool: rawptr[memhub.MemBuddy] = pool
if self.StdlibAlloc != 0: if self.StdlibAlloc != 0:
pn_pool = CompilerFactory.factory.PermPool pn_pool = CompilerFactory.factory.PermPool
if pn_pool is None: if pn_pool is None:
@@ -1636,7 +1636,7 @@ class StructGenMixin:
return None return None
return (str | t.CPtr)(t.CVoid(addr, t.CPtr)) return (str | t.CPtr)(t.CVoid(addr, t.CPtr))
def get_mro_chain(self, pool: rowptr[memhub.MemBuddy], def get_mro_chain(self, pool: rawptr[memhub.MemBuddy],
name: str) -> sizet | t.CPtr: name: str) -> sizet | t.CPtr:
"""MRO 线性化类名数组(深度优先 + 声明顺序 + 去重,含自身)""" """MRO 线性化类名数组(深度优先 + 声明顺序 + 去重,含自身)"""
if pool is None or name is None: if pool is None or name is None:
@@ -1766,7 +1766,7 @@ class StructGenMixin:
return -1 return -1
return entry.FieldCount return entry.FieldCount
def ensure_struct_def_in_module(self, pool: rowptr[memhub.MemBuddy], def ensure_struct_def_in_module(self, pool: rawptr[memhub.MemBuddy],
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
ty: llvmlite.LLVMType | t.CPtr): ty: llvmlite.LLVMType | t.CPtr):
"""确保跨模块结构体的完整定义在当前模块中可用(供 alloca 使用) """确保跨模块结构体的完整定义在当前模块中可用(供 alloca 使用)
@@ -1837,7 +1837,7 @@ class StructGenMixin:
# 也有完整定义。指针类型字段只需 opaque 声明(已由 module_ensure_opaque_for_type 处理)。 # 也有完整定义。指针类型字段只需 opaque 声明(已由 module_ensure_opaque_for_type 处理)。
self._ensure_field_types_in_module(pool, mod, entry.Ty) self._ensure_field_types_in_module(pool, mod, entry.Ty)
def _ensure_field_types_in_module(self, pool: rowptr[memhub.MemBuddy], def _ensure_field_types_in_module(self, pool: rawptr[memhub.MemBuddy],
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
ty: llvmlite.LLVMType | t.CPtr): ty: llvmlite.LLVMType | t.CPtr):
"""递归扫描类型树,确保值类型子结构体有完整定义""" """递归扫描类型树,确保值类型子结构体有完整定义"""
+8 -8
View File
@@ -72,7 +72,7 @@ class Translator:
# LLVM 上下文(共享状态) # LLVM 上下文(共享状态)
Module: llvmlite.LLVMModule | t.CPtr Module: llvmlite.LLVMModule | t.CPtr
Pool: rowptr[memhub.MemBuddy] Pool: rawptr[memhub.MemBuddy]
# 函数表 # 函数表
_funcs: GenTypes.FuncEntry | t.CPtr _funcs: GenTypes.FuncEntry | t.CPtr
@@ -337,7 +337,7 @@ class Translator:
# ============================================================ # ============================================================
# 状态初始化 # 状态初始化
# ============================================================ # ============================================================
def _init_state(self, pool: rowptr[memhub.MemBuddy]): def _init_state(self, pool: rawptr[memhub.MemBuddy]):
"""初始化变量表、函数表和子 Handle""" """初始化变量表、函数表和子 Handle"""
self.Pool = pool self.Pool = pool
if self._funcs is None: if self._funcs is None:
@@ -422,7 +422,7 @@ class Translator:
if _mbuddy is None: if _mbuddy is None:
return 1 return 1
pool: rowptr[memhub.MemBuddy] = _mbuddy pool: rawptr[memhub.MemBuddy] = _mbuddy
# 初始化状态 # 初始化状态
self._init_state(pool) self._init_state(pool)
@@ -503,7 +503,7 @@ class Translator:
# ============================================================ # ============================================================
# 包装 main 函数(无用户 main 时)→ 委托 HandlesMain # 包装 main 函数(无用户 main 时)→ 委托 HandlesMain
# ============================================================ # ============================================================
def _translate_wrapper_main(self, pool: rowptr[memhub.MemBuddy], def _translate_wrapper_main(self, pool: rawptr[memhub.MemBuddy],
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
tree: ast.AST | t.CPtr, tree: ast.AST | t.CPtr,
i32_ty: llvmlite.LLVMType | t.CPtr): i32_ty: llvmlite.LLVMType | t.CPtr):
@@ -513,7 +513,7 @@ class Translator:
# ============================================================ # ============================================================
# 模块级翻译(用户已定义 main)→ 委托 HandlesMain # 模块级翻译(用户已定义 main)→ 委托 HandlesMain
# ============================================================ # ============================================================
def _translate_module_level(self, pool: rowptr[memhub.MemBuddy], def _translate_module_level(self, pool: rawptr[memhub.MemBuddy],
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
tree: ast.AST | t.CPtr): tree: ast.AST | t.CPtr):
"""委托 GenApi.translate_children() 翻译模块级语句(trans 单参)""" """委托 GenApi.translate_children() 翻译模块级语句(trans 单参)"""
@@ -585,7 +585,7 @@ class Translator:
# - AnnAssign 注解裸名 Name(list/dict):d: dict # - AnnAssign 注解裸名 Name(list/dict):d: dict
# - 构造调用 func 裸名 Name(list/dict):dict(bd) # - 构造调用 func 裸名 Name(list/dict):dict(bd)
# - Subscript 的 value 裸名 Name(list/dict):list[int] # - Subscript 的 value 裸名 Name(list/dict):list[int]
def _inject_auto_container_visibility(self, pool: rowptr[memhub.MemBuddy], def _inject_auto_container_visibility(self, pool: rawptr[memhub.MemBuddy],
tree: ast.AST | t.CPtr): tree: ast.AST | t.CPtr):
"""检测 list/dict 容器使用,注入容器类可见性""" """检测 list/dict 容器使用,注入容器类可见性"""
if tree is None or tree.children is None: if tree is None or tree.children is None:
@@ -752,7 +752,7 @@ class Translator:
sub_s: ast.Subscript | t.CPtr = (ast.Subscript | t.CPtr)(node) sub_s: ast.Subscript | t.CPtr = (ast.Subscript | t.CPtr)(node)
if sub_s.value is not None: if sub_s.value is not None:
self._check_container_type_node(sub_s.value, need_list_box, need_dict_box) self._check_container_type_node(sub_s.value, need_list_box, need_dict_box)
# rowptr[list[int]] / list[AST] 等:slice 里可能含 list,需下钻 # rawptr[list[int]] / list[AST] 等:slice 里可能含 list,需下钻
if sub_s.slice is not None: if sub_s.slice is not None:
self._check_container_type_node(sub_s.slice, need_list_box, need_dict_box) self._check_container_type_node(sub_s.slice, need_list_box, need_dict_box)
elif k == ast.ASTKind.BinOp: elif k == ast.ASTKind.BinOp:
@@ -820,5 +820,5 @@ class Mixin:
# ============================================================ # ============================================================
# 全局 mbuddy 指针 # 全局 mbuddy 指针
_mbuddy: rowptr[memhub.MemBuddy] _mbuddy: rawptr[memhub.MemBuddy]
+12 -12
View File
@@ -154,7 +154,7 @@ class TranslatorGenMixin:
"""预解析模块级函数签名的返回/参数类型,触发泛型类特化""" """预解析模块级函数签名的返回/参数类型,触发泛型类特化"""
if trans is None or fd is None: if trans is None or fd is None:
return return
pool: rowptr[memhub.MemBuddy] = trans.Pool pool: rawptr[memhub.MemBuddy] = trans.Pool
if pool is None: if pool is None:
return return
imp: str = trans._imported_modules imp: str = trans._imported_modules
@@ -178,7 +178,7 @@ class TranslatorGenMixin:
# 生成格式: [N x elem_ty] [elem_ty val0, elem_ty val1, ...] # 生成格式: [N x elem_ty] [elem_ty val0, elem_ty val1, ...]
# 用于模块级 t.CArray 列表字面量初始化(不依赖 builder,直接生成常量初始化器) # 用于模块级 t.CArray 列表字面量初始化(不依赖 builder,直接生成常量初始化器)
# ============================================================ # ============================================================
def _build_array_initializer_text(self, pool: rowptr[memhub.MemBuddy], def _build_array_initializer_text(self, pool: rawptr[memhub.MemBuddy],
var_ty: llvmlite.LLVMType | t.CPtr, var_ty: llvmlite.LLVMType | t.CPtr,
list_node: ast.List | t.CPtr) -> str: list_node: ast.List | t.CPtr) -> str:
"""从 AST List 节点生成 LLVM IR 数组初始化器文本,None 失败""" """从 AST List 节点生成 LLVM IR 数组初始化器文本,None 失败"""
@@ -369,7 +369,7 @@ class TranslatorGenMixin:
# t.CArray[char, N] = "..." → [i8 b0, i8 b1, ..., i8 0, ...](字符串字节 + # t.CArray[char, N] = "..." → [i8 b0, i8 b1, ..., i8 0, ...](字符串字节 +
# 零填充到数组长度;空串返回 zeroinitializer)。 # 零填充到数组长度;空串返回 zeroinitializer)。
# 不能用字符串指针 GEP 初始化器:会导致 @g = global [N x i8] <ptr> 类型不匹配。 # 不能用字符串指针 GEP 初始化器:会导致 @g = global [N x i8] <ptr> 类型不匹配。
def _build_string_array_initializer_text(self, pool: rowptr[memhub.MemBuddy], def _build_string_array_initializer_text(self, pool: rawptr[memhub.MemBuddy],
var_ty: llvmlite.LLVMType | t.CPtr, var_ty: llvmlite.LLVMType | t.CPtr,
str_val: str) -> str: str_val: str) -> str:
"""字符串字面量初始化数组全局,返回初始化器文本或 None""" """字符串字面量初始化数组全局,返回初始化器文本或 None"""
@@ -411,7 +411,7 @@ class TranslatorGenMixin:
# 返回 GEP 初始化器文本: getelementptr inbounds ([len+1 x i8], [len+1 x i8]* @.str.{var_name}, i32 0, i32 0) # 返回 GEP 初始化器文本: getelementptr inbounds ([len+1 x i8], [len+1 x i8]* @.str.{var_name}, i32 0, i32 0)
# 用于 b64_tab: t.CArray[char, None] = "ABC..." 等字符串初始化指针类型 # 用于 b64_tab: t.CArray[char, None] = "ABC..." 等字符串初始化指针类型
# ============================================================ # ============================================================
def _build_string_ptr_initializer(self, pool: rowptr[memhub.MemBuddy], def _build_string_ptr_initializer(self, pool: rawptr[memhub.MemBuddy],
mod: llvmlite.LLVMModule | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr,
var_name: str, var_name: str,
str_val: str) -> str: str_val: str) -> str:
@@ -441,7 +441,7 @@ class TranslatorGenMixin:
str_len + 1, str_len + 1, str_name_buf) str_len + 1, str_len + 1, str_name_buf)
return init_buf return init_buf
def _stg_field_zero_text(self, pool: rowptr[memhub.MemBuddy], def _stg_field_zero_text(self, pool: rawptr[memhub.MemBuddy],
fty: llvmlite.LLVMType | t.CPtr, fty: llvmlite.LLVMType | t.CPtr,
ty_str: str) -> str: ty_str: str) -> str:
"""按 LLVM 类型生成 storage struct 字段的零值初始化器文本 """按 LLVM 类型生成 storage struct 字段的零值初始化器文本
@@ -473,7 +473,7 @@ class TranslatorGenMixin:
# 仅处理可常量折叠的整型默认值(CONST_INT/CONST_CHAR 及负号字面量); # 仅处理可常量折叠的整型默认值(CONST_INT/CONST_CHAR 及负号字面量);
# 其余(浮点/字符串/None/名字/表达式)返回 None,由调用方按零值兜底。 # 其余(浮点/字符串/None/名字/表达式)返回 None,由调用方按零值兜底。
# ============================================================ # ============================================================
def _default_val_const_text(self, pool: rowptr[memhub.MemBuddy], def _default_val_const_text(self, pool: rawptr[memhub.MemBuddy],
fty: llvmlite.LLVMType | t.CPtr, fty: llvmlite.LLVMType | t.CPtr,
ty_str: str, ty_str: str,
dval: ast.AST | t.CPtr) -> str: dval: ast.AST | t.CPtr) -> str:
@@ -511,7 +511,7 @@ class TranslatorGenMixin:
# - _build_stg_struct_init_text:外包 "{ ... }" 作为完整初始化器; # - _build_stg_struct_init_text:外包 "{ ... }" 作为完整初始化器;
# - vtable 对象 storage:首元素为 vtable 指针,其后追加本函数结果(start_idx=1 跳过字段 0)。 # - vtable 对象 storage:首元素为 vtable 指针,其后追加本函数结果(start_idx=1 跳过字段 0)。
# 无任何非零默认值时返回 None,调用方据此保持原零值路径(避免无谓文本)。 # 无任何非零默认值时返回 None,调用方据此保持原零值路径(避免无谓文本)。
def _build_stg_struct_body_text(self, pool: rowptr[memhub.MemBuddy], def _build_stg_struct_body_text(self, pool: rawptr[memhub.MemBuddy],
se: GenTypes.StructEntry | t.CPtr, se: GenTypes.StructEntry | t.CPtr,
start_idx: int) -> str: start_idx: int) -> str:
"""按字段默认值生成 "e0, e1, ..." 元素文本;无非零默认值返回 None""" """按字段默认值生成 "e0, e1, ..." 元素文本;无非零默认值返回 None"""
@@ -561,7 +561,7 @@ class TranslatorGenMixin:
# 用于模块级对象全局 `X: T = T()`:按字段默认值生成完整 struct 常量 # 用于模块级对象全局 `X: T = T()`:按字段默认值生成完整 struct 常量
# (LLVM 要求列全每个字段);不生成则字段默认值全丢。 # (LLVM 要求列全每个字段);不生成则字段默认值全丢。
# 无任何非零默认值时返回 None,由调用方保持 zeroinitializer(避免无谓文本)。 # 无任何非零默认值时返回 None,由调用方保持 zeroinitializer(避免无谓文本)。
def _build_stg_struct_init_text(self, pool: rowptr[memhub.MemBuddy], def _build_stg_struct_init_text(self, pool: rawptr[memhub.MemBuddy],
se: GenTypes.StructEntry | t.CPtr, se: GenTypes.StructEntry | t.CPtr,
start_idx: int) -> str: start_idx: int) -> str:
"""按字段默认值生成完整 struct 初始化器;无非零默认值返回 None""" """按字段默认值生成完整 struct 初始化器;无非零默认值返回 None"""
@@ -585,7 +585,7 @@ class TranslatorGenMixin:
def handle_module_level_var(self, trans: HT.Translator | t.CPtr, def handle_module_level_var(self, trans: HT.Translator | t.CPtr,
node: ast.AST | t.CPtr) -> int: node: ast.AST | t.CPtr) -> int:
"""处理模块级变量声明,创建全局变量""" """处理模块级变量声明,创建全局变量"""
pool: rowptr[memhub.MemBuddy] = trans.Pool pool: rawptr[memhub.MemBuddy] = trans.Pool
mod: llvmlite.LLVMModule | t.CPtr = trans.Module mod: llvmlite.LLVMModule | t.CPtr = trans.Module
# CDefine 注解: 编译期常量,不创建全局变量 # CDefine 注解: 编译期常量,不创建全局变量
@@ -1061,7 +1061,7 @@ class TranslatorGenMixin:
Returns: Returns:
int: 新增的变量数 int: 新增的变量数
""" """
pool: rowptr[memhub.MemBuddy] = trans.Pool pool: rawptr[memhub.MemBuddy] = trans.Pool
mod: llvmlite.LLVMModule | t.CPtr = trans.Module mod: llvmlite.LLVMModule | t.CPtr = trans.Module
main_func: llvmlite.Function | t.CPtr = llvmlite.create_function( main_func: llvmlite.Function | t.CPtr = llvmlite.create_function(
@@ -1129,7 +1129,7 @@ class TranslatorGenMixin:
if self.is_global_name(trans, name) != 0: if self.is_global_name(trans, name) != 0:
return return
if trans._global_name_count >= MAX_GLOBAL_NAMES: if trans._global_name_count >= MAX_GLOBAL_NAMES:
pool_err: rowptr[memhub.MemBuddy] = trans.Pool pool_err: rawptr[memhub.MemBuddy] = trans.Pool
err_buf: str = None err_buf: str = None
if pool_err is not None: if pool_err is not None:
err_buf = pool_err.alloc(256) err_buf = pool_err.alloc(256)
@@ -1183,7 +1183,7 @@ class TranslatorGenMixin:
ty_slot[0] = var_ty ty_slot[0] = var_ty
return return
if trans._nonlocal_name_count >= MAX_GLOBAL_NAMES: if trans._nonlocal_name_count >= MAX_GLOBAL_NAMES:
pool_err_nl: rowptr[memhub.MemBuddy] = trans.Pool pool_err_nl: rawptr[memhub.MemBuddy] = trans.Pool
err_buf_nl: str = None err_buf_nl: str = None
if pool_err_nl is not None: if pool_err_nl is not None:
err_buf_nl = pool_err_nl.alloc(256) err_buf_nl = pool_err_nl.alloc(256)
+13 -13
View File
@@ -105,15 +105,15 @@ class TypeGenBase:
# 引用按别名还原真实模块名(__stdint.size_t → stdint.size_t)。 # 引用按别名还原真实模块名(__stdint.size_t → stdint.size_t)。
# 用 malloc 而非 pool list——pool 每文件 reset_to 后 list 悬空;malloc 跨 pool # 用 malloc 而非 pool list——pool 每文件 reset_to 后 list 悬空;malloc 跨 pool
# 生命周期存活,clear_ctypedefs 释放置空。 # 生命周期存活,clear_ctypedefs 释放置空。
ImportAliasBuf: bytes ImportAliasBuf: bytes
# --- 库 typedef 按模块一次性门禁(_lookup_library_typedef 性能优化) --- # --- 库 typedef 按模块一次性门禁(_lookup_library_typedef 性能优化) ---
# 库模块 typedef 缓存(PermPool 永久分配,跨文件/Phase 存活): # 库模块 typedef 缓存(PermPool 永久分配,跨文件/Phase 存活):
# LibTypedefScannedMods: key=库模块名 → 已扫描标记(命中=该模块源已读并入缓存); # LibTypedefScannedMods: key=库模块名 → 已扫描标记(命中=该模块源已读并入缓存);
# LibTypedefTypeMap: key="模块名|typedef 名" → 源中原始类型表达式。 # LibTypedefTypeMap: key="模块名|typedef 名" → 源中原始类型表达式。
# 每次查询都读 64KB 库源全文扫描会使单文件 translate 耗时 7–12s;库源单次编译内 # 每次查询都读 64KB 库源全文扫描会使单文件 translate 耗时 7–12s;库源单次编译内
# 不变,故缓存命中结果与逐次读源等价。 # 不变,故缓存命中结果与逐次读源等价。
LibTypedefScannedMods: hashtable.HashTable | t.CPtr LibTypedefScannedMods: hashtable.HashTable | t.CPtr
LibTypedefTypeMap: hashtable.HashTable | t.CPtr LibTypedefTypeMap: hashtable.HashTable | t.CPtr
# --- 常量整数表达式计算成功标志(原 _g_const_eval_ok) --- # --- 常量整数表达式计算成功标志(原 _g_const_eval_ok) ---
@@ -164,9 +164,9 @@ class TypeGenBase:
self.LastBuiltinsTypedefResult = None self.LastBuiltinsTypedefResult = None
self.LastBuiltinsTypedefNameBuf = None self.LastBuiltinsTypedefNameBuf = None
self.LastBuiltinsTypedefResultBuf = None self.LastBuiltinsTypedefResultBuf = None
self.ImportAliasBuf = None self.ImportAliasBuf = None
# 库 typedef 持久缓存字段(不随 clear_ctypedefs 复位 → 跨文件/Phase 存活) # 库 typedef 持久缓存字段(不随 clear_ctypedefs 复位 → 跨文件/Phase 存活)
self.LibTypedefScannedMods = None self.LibTypedefScannedMods = None
self.LibTypedefTypeMap = None self.LibTypedefTypeMap = None
self.ConstEvalOk = 0 self.ConstEvalOk = 0
self.CurrentFile = None self.CurrentFile = None
@@ -260,7 +260,7 @@ class TypeGenBase:
def set_current_module_sha1(self, sha1: str) -> None: def set_current_module_sha1(self, sha1: str) -> None:
"""设置当前正在编译的模块 SHA1(Phase1 在模块开始翻译前调用)""" """设置当前正在编译的模块 SHA1(Phase1 在模块开始翻译前调用)"""
self.CurrentModuleSha1 = sha1 self.CurrentModuleSha1 = sha1
def _dbg_check_ast_floats(self, mb: rowptr[memhub.MemBuddy], def _dbg_check_ast_floats(self, mb: rawptr[memhub.MemBuddy],
tree: ast.AST | t.CPtr, tag: str): tree: ast.AST | t.CPtr, tag: str):
"""已移除调试插桩(占位保留签名,避免外部调用引用失败)""" """已移除调试插桩(占位保留签名,避免外部调用引用失败)"""
pass pass
+5 -5
View File
@@ -59,7 +59,7 @@ class TypeGenCDef(TypeGenBase.TypeGenBase):
"""取索引第 si 个槽(8 字节,存槽下标+1;0=空槽)""" """取索引第 si 个槽(8 字节,存槽下标+1;0=空槽)"""
return (sizet | t.CPtr)(t.CVoid(uint64(self.CDefineNameIdx) + uint64(si) * 8, t.CPtr)) return (sizet | t.CPtr)(t.CVoid(uint64(self.CDefineNameIdx) + uint64(si) * 8, t.CPtr))
def _cdef_idx_init(self, pool: rowptr[memhub.MemBuddy]) -> None: def _cdef_idx_init(self, pool: rawptr[memhub.MemBuddy]) -> None:
"""创建/清零名索引(与 CDefineNames 同池);失败则标记不可信""" """创建/清零名索引(与 CDefineNames 同池);失败则标记不可信"""
idx: sizet | t.CPtr = pool.alloc(sizet(CDEFINE_IDX_CAP) * 8) idx: sizet | t.CPtr = pool.alloc(sizet(CDEFINE_IDX_CAP) * 8)
if idx is None: if idx is None:
@@ -120,7 +120,7 @@ class TypeGenCDef(TypeGenBase.TypeGenBase):
else: else:
self.CDefineNameIdxBuilt = -1 self.CDefineNameIdxBuilt = -1
def register_cdefine_constant(self, pool: rowptr[memhub.MemBuddy], def register_cdefine_constant(self, pool: rawptr[memhub.MemBuddy],
name: str, value: int64) -> None: name: str, value: int64) -> None:
"""注册 CDefine 编译期常量到本地表 """注册 CDefine 编译期常量到本地表
@@ -165,7 +165,7 @@ class TypeGenCDef(TypeGenBase.TypeGenBase):
self.CDefineDoubleFlags.append(0) self.CDefineDoubleFlags.append(0)
if self.CDefineStrFlags is not None: if self.CDefineStrFlags is not None:
self.CDefineStrFlags.append(0) self.CDefineStrFlags.append(0)
def register_cdefine_double(self, pool: rowptr[memhub.MemBuddy], def register_cdefine_double(self, pool: rawptr[memhub.MemBuddy],
name: str, value: double) -> None: name: str, value: double) -> None:
"""注册浮点 CDefine 编译期常量(如 U_M_PI: t.CDefine = 3.14159...) """注册浮点 CDefine 编译期常量(如 U_M_PI: t.CDefine = 3.14159...)
@@ -206,7 +206,7 @@ class TypeGenCDef(TypeGenBase.TypeGenBase):
if val_buf is None: if val_buf is None:
VLogger.error("CDefine 浮点值缓冲区分配失败", "CDEF-DBG") VLogger.error("CDefine 浮点值缓冲区分配失败", "CDEF-DBG")
self.Gen.TypeGenErr.fatal_error(None, "CDefine 浮点值缓冲区分配失败", "MemoryError") self.Gen.TypeGenErr.fatal_error(None, "CDefine 浮点值缓冲区分配失败", "MemoryError")
def register_cdefine_string(self, pool: rowptr[memhub.MemBuddy], def register_cdefine_string(self, pool: rawptr[memhub.MemBuddy],
name: str, value: str) -> None: name: str, value: str) -> None:
"""注册字符串 CDefine 编译期常量(如 ZLIB_VERSION: t.CDefine = "1.3.2") """注册字符串 CDefine 编译期常量(如 ZLIB_VERSION: t.CDefine = "1.3.2")
@@ -272,7 +272,7 @@ class TypeGenCDef(TypeGenBase.TypeGenBase):
x_nm: str = self.XmodCdefNames.get(x_i) x_nm: str = self.XmodCdefNames.get(x_i)
if x_nm is not None and string.strcmp(x_nm, name) == 0: if x_nm is not None and string.strcmp(x_nm, name) == 0:
return return
perm: rowptr[memhub.MemBuddy] = CompilerFactory.factory.PermPool perm: rawptr[memhub.MemBuddy] = CompilerFactory.factory.PermPool
if self.XmodCdefNames is None: if self.XmodCdefNames is None:
self.XmodCdefNames = list[str](perm, 64) self.XmodCdefNames = list[str](perm, 64)
self.XmodCdefValues = list[str](perm, 64) self.XmodCdefValues = list[str](perm, 64)
+11 -11
View File
@@ -60,7 +60,7 @@ class TypeGenCType(TypeGenBase.TypeGenBase):
"""取索引第 si 个槽(8 字节,存槽下标+1;0=空槽)""" """取索引第 si 个槽(8 字节,存槽下标+1;0=空槽)"""
return (sizet | t.CPtr)(t.CVoid(uint64(self.CTypedefNameIdx) + uint64(si) * 8, t.CPtr)) return (sizet | t.CPtr)(t.CVoid(uint64(self.CTypedefNameIdx) + uint64(si) * 8, t.CPtr))
def _ctypedef_idx_init(self, pool: rowptr[memhub.MemBuddy]) -> None: def _ctypedef_idx_init(self, pool: rawptr[memhub.MemBuddy]) -> None:
"""创建/清零名索引(与 CTypedefNames 同池);失败则标记不可信""" """创建/清零名索引(与 CTypedefNames 同池);失败则标记不可信"""
idx: sizet | t.CPtr = pool.alloc(sizet(CTYPEDEF_IDX_CAP) * 8) idx: sizet | t.CPtr = pool.alloc(sizet(CTYPEDEF_IDX_CAP) * 8)
if idx is None: if idx is None:
@@ -121,7 +121,7 @@ class TypeGenCType(TypeGenBase.TypeGenBase):
else: else:
self.CTypedefNameIdxBuilt = -1 self.CTypedefNameIdxBuilt = -1
def register_ctypedef(self, pool: rowptr[memhub.MemBuddy], def register_ctypedef(self, pool: rawptr[memhub.MemBuddy],
name: str, type_str: str) -> None: name: str, type_str: str) -> None:
"""注册 CTypedef 到本地表 """注册 CTypedef 到本地表
@@ -132,10 +132,10 @@ class TypeGenCType(TypeGenBase.TypeGenBase):
""" """
if name is None or type_str is None or pool is None: if name is None or type_str is None or pool is None:
return return
# rowptr 是编译器内置语法(TPC/TPV 双端),不可重定义: # rawptr 是编译器内置语法(TPC/TPV 双端),不可重定义:
# 忽略任何对 rowptr 的 typedef 注册,防止覆盖内置裸指针语义 # 忽略任何对 rawptr 的 typedef 注册,防止覆盖内置裸指针语义
# (rowptr[T] 固定 = 指向原始类型 T 的裸指针)。 # (rawptr[T] 固定 = 指向原始类型 T 的裸指针)。
if string.strcmp(name, "rowptr") == 0: if string.strcmp(name, "rawptr") == 0:
return return
# 复制 name/type_str 到 pool:调用方可能传入零拷贝 AST 字符串 # 复制 name/type_str 到 pool:调用方可能传入零拷贝 AST 字符串
# (如 .vpi 读取缓冲区),缓冲区随后被 free 会导致表项悬空、 # (如 .vpi 读取缓冲区),缓冲区随后被 free 会导致表项悬空、
@@ -340,7 +340,7 @@ class TypeGenCType(TypeGenBase.TypeGenBase):
# C 指针后缀 '*' → 指针,不表态(指针语义由 PtrLevel 表达) # C 指针后缀 '*' → 指针,不表态(指针语义由 PtrLevel 表达)
if text[e - 1] == '*': if text[e - 1] == '*':
return TSpec.TS_SIGN_UNKNOWN return TSpec.TS_SIGN_UNKNOWN
# 泛型/数组/rowptr 下标:IDENT[INNER, ...] → 取 INNER(元素决定值符号性) # 泛型/数组/rawptr 下标:IDENT[INNER, ...] → 取 INNER(元素决定值符号性)
bracket: sizet = 0 bracket: sizet = 0
has_bracket: int = 0 has_bracket: int = 0
k: sizet = s k: sizet = s
@@ -412,7 +412,7 @@ class TypeGenCType(TypeGenBase.TypeGenBase):
if self.ImportAliasBuf is not None: if self.ImportAliasBuf is not None:
stdlib.free(self.ImportAliasBuf) stdlib.free(self.ImportAliasBuf)
self.ImportAliasBuf = None self.ImportAliasBuf = None
def _ctypedef_push_visiting(self, pool: rowptr[memhub.MemBuddy], name: str) -> int: def _ctypedef_push_visiting(self, pool: rawptr[memhub.MemBuddy], name: str) -> int:
"""将 CTypedef 名加入正在解析列表(循环检测) """将 CTypedef 名加入正在解析列表(循环检测)
Returns: Returns:
@@ -483,7 +483,7 @@ class TypeGenCType(TypeGenBase.TypeGenBase):
and sep_ch_m != '\r' and sep_ch_m != '\t' and sep_ch_m != '|': and sep_ch_m != '\r' and sep_ch_m != '\t' and sep_ch_m != '|':
return 0 return 0
return 1 return 1
def ScanCTypedefDeclarations(self, pool: rowptr[memhub.MemBuddy], def ScanCTypedefDeclarations(self, pool: rawptr[memhub.MemBuddy],
tree: ast.AST | t.CPtr) -> int: tree: ast.AST | t.CPtr) -> int:
"""扫描 AST 顶层节点,注册所有 NAME: t.CTypedef = Type 声明 """扫描 AST 顶层节点,注册所有 NAME: t.CTypedef = Type 声明
@@ -534,7 +534,7 @@ class TypeGenCType(TypeGenBase.TypeGenBase):
self.register_ctypedef(pool, tgt_id_v, type_str) self.register_ctypedef(pool, tgt_id_v, type_str)
count += 1 count += 1
return count return count
def register_ctypedef_from_source(self, pool: rowptr[memhub.MemBuddy], def register_ctypedef_from_source(self, pool: rawptr[memhub.MemBuddy],
src: str) -> int: src: str) -> int:
"""从源码文本逐行扫描注册 CTypedef(NAME: t.CTypedef = TYPE) """从源码文本逐行扫描注册 CTypedef(NAME: t.CTypedef = TYPE)
@@ -608,7 +608,7 @@ class TypeGenCType(TypeGenBase.TypeGenBase):
i += 1 i += 1
return count return count
def _eval_const_int_expr(self, node: ast.AST | t.CPtr, def _eval_const_int_expr(self, node: ast.AST | t.CPtr,
pool: rowptr[memhub.MemBuddy] = None, pool: rawptr[memhub.MemBuddy] = None,
from_imports: str = None, from_imports: str = None,
imported_modules: str = None, imported_modules: str = None,
depth: int = 0) -> int: depth: int = 0) -> int:
+6 -6
View File
@@ -34,7 +34,7 @@ class TypeGenErr(TypeGenBase.TypeGenBase):
"""从源文件读取第 lineno 行内容""" """从源文件读取第 lineno 行内容"""
if file_path is None or lineno <= 0: if file_path is None or lineno <= 0:
return None return None
f: rowptr[fileio.File] = fileio.File(file_path, fileio.MODE.R) f: rawptr[fileio.File] = fileio.File(file_path, fileio.MODE.R)
if f.closed: if f.closed:
return None return None
# 按文件实际大小分配缓冲区:固定 256KB 会截断大源文件,末尾行号读不到 → # 按文件实际大小分配缓冲区:固定 256KB 会截断大源文件,末尾行号读不到 →
@@ -185,7 +185,7 @@ class TypeGenErr(TypeGenBase.TypeGenBase):
col_start: int = 0, col_end: int = 0): col_start: int = 0, col_end: int = 0):
"""以 Python 风格报错并退出(TypeError 版本)""" """以 Python 风格报错并退出(TypeError 版本)"""
self.fatal_error(node, msg, "TypeError", col_start, col_end) self.fatal_error(node, msg, "TypeError", col_start, col_end)
def try_extract_callable_ret(self, pool: rowptr[memhub.MemBuddy], def try_extract_callable_ret(self, pool: rawptr[memhub.MemBuddy],
annot: ast.AST | t.CPtr, annot: ast.AST | t.CPtr,
imported_modules: str, imported_modules: str,
from_imports: str, from_imports: str,
@@ -259,7 +259,7 @@ class TypeGenErr(TypeGenBase.TypeGenBase):
def get_llvm_type_bits(self, ty: llvmlite.LLVMType | t.CPtr) -> int: def get_llvm_type_bits(self, ty: llvmlite.LLVMType | t.CPtr) -> int:
"""获取 LLVM 整数类型的位宽,非整数类型返回 0(委托 SpecTypeBits)""" """获取 LLVM 整数类型的位宽,非整数类型返回 0(委托 SpecTypeBits)"""
return TSpec.SpecTypeBits(ty) return TSpec.SpecTypeBits(ty)
def infer_expr_type(self, pool: rowptr[memhub.MemBuddy], def infer_expr_type(self, pool: rawptr[memhub.MemBuddy],
node: ast.AST | t.CPtr, node: ast.AST | t.CPtr,
param_types: str) -> llvmlite.LLVMType | t.CPtr: param_types: str) -> llvmlite.LLVMType | t.CPtr:
"""推断表达式的 LLVM 类型 """推断表达式的 LLVM 类型
@@ -318,7 +318,7 @@ class TypeGenErr(TypeGenBase.TypeGenBase):
return rhs_ty return rhs_ty
return llvmlite.Int32(pool) return llvmlite.Int32(pool)
def infer_return_type(self, pool: rowptr[memhub.MemBuddy], def infer_return_type(self, pool: rawptr[memhub.MemBuddy],
body: list[ast.AST | t.CPtr] | t.CPtr, body: list[ast.AST | t.CPtr] | t.CPtr,
param_types: str) -> llvmlite.LLVMType | t.CPtr: param_types: str) -> llvmlite.LLVMType | t.CPtr:
"""扫描函数体中的 return 语句,推断返回类型""" """扫描函数体中的 return 语句,推断返回类型"""
@@ -340,7 +340,7 @@ class TypeGenErr(TypeGenBase.TypeGenBase):
if new_bits > cur_bits: if new_bits > cur_bits:
ret_ty = expr_ty ret_ty = expr_ty
return ret_ty return ret_ty
def body_has_value_return(self, pool: rowptr[memhub.MemBuddy], def body_has_value_return(self, pool: rawptr[memhub.MemBuddy],
body: list[ast.AST | t.CPtr] | t.CPtr) -> int: body: list[ast.AST | t.CPtr] | t.CPtr) -> int:
"""扫描函数体,判断是否存在返回非 None 值的 return """扫描函数体,判断是否存在返回非 None 值的 return
@@ -378,7 +378,7 @@ class TypeGenErr(TypeGenBase.TypeGenBase):
if self.body_has_value_return(pool, sub) != 0: if self.body_has_value_return(pool, sub) != 0:
return 1 return 1
return 0 return 0
def build_param_types_str(self, pool: rowptr[memhub.MemBuddy], def build_param_types_str(self, pool: rawptr[memhub.MemBuddy],
args_node: ast.AST | t.CPtr) -> str: args_node: ast.AST | t.CPtr) -> str:
"""构建参数类型编码字符串 "name:bits,name:bits,..." """构建参数类型编码字符串 "name:bits,name:bits,..."
+39 -39
View File
@@ -35,7 +35,7 @@ import w32.fileio as fileio
class TypeGenResolve(TypeGenBase.TypeGenBase): class TypeGenResolve(TypeGenBase.TypeGenBase):
"""类型映射/注解解析(map_t_type/resolve_annotation_type 等)""" """类型映射/注解解析(map_t_type/resolve_annotation_type 等)"""
def _get_type_name_from_annotation(self, pool: rowptr[memhub.MemBuddy], def _get_type_name_from_annotation(self, pool: rawptr[memhub.MemBuddy],
node: ast.AST | t.CPtr) -> str: node: ast.AST | t.CPtr) -> str:
"""从类型注解节点提取类型名(支持 Name/Attribute/BinOp)""" """从类型注解节点提取类型名(支持 Name/Attribute/BinOp)"""
if node is None: if node is None:
@@ -117,7 +117,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase):
return buf2 return buf2
return None return None
return None return None
def _subscript_slice_to_str(self, pool: rowptr[memhub.MemBuddy], def _subscript_slice_to_str(self, pool: rawptr[memhub.MemBuddy],
node: ast.AST | t.CPtr) -> str: node: ast.AST | t.CPtr) -> str:
"""Subscript slice 节点转类型字符串(递归,支持 Name/Attribute/BinOp/Constant/List/Tuple/Subscript)""" """Subscript slice 节点转类型字符串(递归,支持 Name/Attribute/BinOp/Constant/List/Tuple/Subscript)"""
if node is None: if node is None:
@@ -150,7 +150,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase):
tup: ast.Tuple | t.CPtr = (ast.Tuple | t.CPtr)(node) tup: ast.Tuple | t.CPtr = (ast.Tuple | t.CPtr)(node)
return self._list_elts_to_type_str(pool, tup.elts, "", "") return self._list_elts_to_type_str(pool, tup.elts, "", "")
return None return None
def _list_elts_to_type_str(self, pool: rowptr[memhub.MemBuddy], def _list_elts_to_type_str(self, pool: rawptr[memhub.MemBuddy],
elts: list[ast.AST | t.CPtr] | t.CPtr, elts: list[ast.AST | t.CPtr] | t.CPtr,
open_ch: str, close_ch: str) -> str: open_ch: str, close_ch: str) -> str:
"""元素列表转逗号分隔字符串(List/Tuple 共用),包上 open/close 括号 """元素列表转逗号分隔字符串(List/Tuple 共用),包上 open/close 括号
@@ -216,7 +216,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase):
此处只做委托:保留本方法是因 `@t.NoVTable` 静态绑定下大量调用点依赖它存在。 此处只做委托:保留本方法是因 `@t.NoVTable` 静态绑定下大量调用点依赖它存在。
""" """
return GenApi.sha1_prefix_len(s) return GenApi.sha1_prefix_len(s)
def _concat_sha1_class(self, pool: rowptr[memhub.MemBuddy], def _concat_sha1_class(self, pool: rawptr[memhub.MemBuddy],
sha1: str, cls_name: str) -> str: sha1: str, cls_name: str) -> str:
"""拼接 "{sha1}.{cls_name}"(pool 分配),失败返回 None""" """拼接 "{sha1}.{cls_name}"(pool 分配),失败返回 None"""
if pool is None or sha1 is None or cls_name is None: if pool is None or sha1 is None or cls_name is None:
@@ -230,7 +230,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase):
string.strcat(buf, ".") string.strcat(buf, ".")
string.strcat(buf, cls_name) string.strcat(buf, cls_name)
return buf return buf
def _norm_type_arg_name(self, pool: rowptr[memhub.MemBuddy], def _norm_type_arg_name(self, pool: rawptr[memhub.MemBuddy],
type_name: str, type_name: str,
from_imports: str) -> str: from_imports: str) -> str:
"""泛型类型参数名 SHA1 规范化:统一为 "{定义模块SHA1}.{Class}" 形式 """泛型类型参数名 SHA1 规范化:统一为 "{定义模块SHA1}.{Class}" 形式
@@ -493,7 +493,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase):
return 1 return 1
return 0 return 0
def _parse_type_string(self, pool: rowptr[memhub.MemBuddy], def _parse_type_string(self, pool: rawptr[memhub.MemBuddy],
type_str: str, type_str: str,
ctx: int) -> ast.AST | t.CPtr: ctx: int) -> ast.AST | t.CPtr:
"""将类型名字符串解析为 AST 节点 """将类型名字符串解析为 AST 节点
@@ -556,10 +556,10 @@ class TypeGenResolve(TypeGenBase.TypeGenBase):
break break
bi += 1 bi += 1
if bracket_idx < seg_len: if bracket_idx < seg_len:
# 内层以数字开头(如 rowptr[7565e081d88517ac.AST],_norm_type_arg_name # 内层以数字开头(如 rawptr[7565e081d88517ac.AST],_norm_type_arg_name
# 的 "{16hex}.Class" 规范化产物)时,完整 lexer 会把数字开头的令牌当 # 的 "{16hex}.Class" 规范化产物)时,完整 lexer 会把数字开头的令牌当
# 数值扫描(7565e081d88517ac 含字母 → 坏数/占位)→ slice 变 Constant # 数值扫描(7565e081d88517ac 含字母 → 坏数/占位)→ slice 变 Constant
# 占位 → 解析失败(SlotsBugTest list[rowptr[sha.AST]] 特化方法参数 # 占位 → 解析失败(SlotsBugTest list[rawptr[sha.AST]] 特化方法参数
# 注解根因)。单实参且无嵌套/无逗号时手工拆 base+slice 递归解析, # 注解根因)。单实参且无嵌套/无逗号时手工拆 base+slice 递归解析,
# 避开 lexer 的数字扫描。 # 避开 lexer 的数字扫描。
first_inner_ch: int = type_str[bracket_idx + 1] if (bracket_idx + 1) < seg_len else 0 first_inner_ch: int = type_str[bracket_idx + 1] if (bracket_idx + 1) < seg_len else 0
@@ -669,7 +669,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase):
def get_current_file(self) -> str: def get_current_file(self) -> str:
"""获取当前编译的文件名(供报错归因使用)""" """获取当前编译的文件名(供报错归因使用)"""
return self.CurrentFile return self.CurrentFile
def resolve_typedef_or_map(self, pool: rowptr[memhub.MemBuddy], def resolve_typedef_or_map(self, pool: rawptr[memhub.MemBuddy],
name: str, name: str,
imported_modules: str, imported_modules: str,
from_imports: str, from_imports: str,
@@ -696,7 +696,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase):
if ity_rt is not None: if ity_rt is not None:
return ity_rt return ity_rt
# [builtins 最后匹配] 常规 typedef 表 + map_t_type 均 miss 后查 # [builtins 最后匹配] 常规 typedef 表 + map_t_type 均 miss 后查
# includes/builtins.vp(如 rowptr: t.CTypedef = t.CPtr),命中展开递归解析。 # includes/builtins.vp(如 rawptr: t.CTypedef = t.CPtr),命中展开递归解析。
# 与 resolve_annotation_type 的 Name/Subscript 兜底同一口径,保证 # 与 resolve_annotation_type 的 Name/Subscript 兜底同一口径,保证
# __sizeof__/REnum 等旁路查表(get_type_size_bytes 等)也能命中 builtins。 # __sizeof__/REnum 等旁路查表(get_type_size_bytes 等)也能命中 builtins。
btd_r: str = self._lookup_builtins_typedef(pool, name) btd_r: str = self._lookup_builtins_typedef(pool, name)
@@ -728,7 +728,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase):
if lib_ty is not None: if lib_ty is not None:
return lib_ty return lib_ty
return self.map_t_type(pool, name) return self.map_t_type(pool, name)
def get_type_size_bytes(self, pool: rowptr[memhub.MemBuddy], def get_type_size_bytes(self, pool: rawptr[memhub.MemBuddy],
name: str, name: str,
imported_modules: str, imported_modules: str,
from_imports: str) -> int: from_imports: str) -> int:
@@ -857,14 +857,14 @@ class TypeGenResolve(TypeGenBase.TypeGenBase):
if string.strncmp(buf + al_start, mod, mod_len) == 0: if string.strncmp(buf + al_start, mod, mod_len) == 0:
return buf + tg_start return buf + tg_start
return None return None
def _lookup_builtins_typedef(self, pool: rowptr[memhub.MemBuddy], def _lookup_builtins_typedef(self, pool: rawptr[memhub.MemBuddy],
name: str) -> str: name: str) -> str:
"""builtins 最后匹配:查 includes/builtins.vp 的 CTypedef 声明 """builtins 最后匹配:查 includes/builtins.vp 的 CTypedef 声明
所有常规解析路径 miss 后("没有匹配到前面模式的注解")的最终兜底: 所有常规解析路径 miss 后("没有匹配到前面模式的注解")的最终兜底:
builtins 始终纳入编译链(StubMerger 预加入),但其 typedef 不随当前 builtins 始终纳入编译链(StubMerger 预加入),但其 typedef 不随当前
文件 from_imports 注入(builtins 不在 import 闭包),如 文件 from_imports 注入(builtins 不在 import 闭包),如
`rowptr: t.CTypedef = t.CPtr`(main2.vp `k: rowptr[int] = &i` 根因)。 `rawptr: t.CTypedef = t.CPtr`(main2.vp `k: rawptr[int] = &i` 根因)。
定位 builtins 源文件按 "NAME: t.CTypedef = TYPE" 逐行扫描,命中即 定位 builtins 源文件按 "NAME: t.CTypedef = TYPE" 逐行扫描,命中即
注册到本地 CTypedef 表并返回类型表达式;表内已注册直接返回。 注册到本地 CTypedef 表并返回类型表达式;表内已注册直接返回。
""" """
@@ -878,10 +878,10 @@ class TypeGenResolve(TypeGenBase.TypeGenBase):
self.Gen.TypeGenCType.LastBuiltinsTypedefName = \ self.Gen.TypeGenCType.LastBuiltinsTypedefName = \
self.Gen.TypeGenCType.store_builtins_diag(0, name) self.Gen.TypeGenCType.store_builtins_diag(0, name)
self.Gen.TypeGenCType.LastBuiltinsTypedefResult = None self.Gen.TypeGenCType.LastBuiltinsTypedefResult = None
# rowptr 已内置于编译器(TPC/TPV 双端语法保留字,不可重定义): # rawptr 已内置于编译器(TPC/TPV 双端语法保留字,不可重定义):
# 优先于一切外部声明(builtins.vp 已不再声明,用户自行 typedef 也会被 # 优先于一切外部声明(builtins.vp 已不再声明,用户自行 typedef 也会被
# register_ctypedef 拒绝),始终返回内置类型表达式 t.CPtr。 # register_ctypedef 拒绝),始终返回内置类型表达式 t.CPtr。
if string.strcmp(name, "rowptr") == 0: if string.strcmp(name, "rawptr") == 0:
self.Gen.TypeGenCType.LastBuiltinsTypedefResult = "t.CPtr" self.Gen.TypeGenCType.LastBuiltinsTypedefResult = "t.CPtr"
return "t.CPtr" return "t.CPtr"
ts_b: str = self.Gen.TypeGenCType.lookup_ctypedef(name) ts_b: str = self.Gen.TypeGenCType.lookup_ctypedef(name)
@@ -906,7 +906,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase):
if b_buf is None: if b_buf is None:
stdlib.free(b_path) stdlib.free(b_path)
return None return None
bf: rowptr[fileio.File] = fileio.File(b_path, fileio.MODE.R) bf: rawptr[fileio.File] = fileio.File(b_path, fileio.MODE.R)
stdlib.free(b_path) stdlib.free(b_path)
if bf.closed: if bf.closed:
stdlib.free(b_buf) stdlib.free(b_buf)
@@ -1066,7 +1066,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase):
""" """
if mod is None or name_src is None or type_str is None or name_len == 0: if mod is None or name_src is None or type_str is None or name_len == 0:
return return
perm: rowptr[memhub.MemBuddy] = CompilerFactory.factory.PermPool perm: rawptr[memhub.MemBuddy] = CompilerFactory.factory.PermPool
if perm is None: if perm is None:
return return
if self.LibTypedefTypeMap is None: if self.LibTypedefTypeMap is None:
@@ -1099,7 +1099,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase):
# 会误返回 None(改变语义);此时不标记、留待下次重试读源。 # 会误返回 None(改变语义);此时不标记、留待下次重试读源。
if self.LibTypedefTypeMap is None: if self.LibTypedefTypeMap is None:
return return
perm: rowptr[memhub.MemBuddy] = CompilerFactory.factory.PermPool perm: rawptr[memhub.MemBuddy] = CompilerFactory.factory.PermPool
if perm is None: if perm is None:
return return
if self.LibTypedefScannedMods is None: if self.LibTypedefScannedMods is None:
@@ -1133,7 +1133,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase):
if v is None: if v is None:
return None return None
return (str | t.CPtr)(v) return (str | t.CPtr)(v)
def _lookup_library_typedef(self, pool: rowptr[memhub.MemBuddy], def _lookup_library_typedef(self, pool: rawptr[memhub.MemBuddy],
mod: str, attr: str) -> str: mod: str, attr: str) -> str:
"""查库模块源文件中 "attr: t.CTypedef = TYPE" 并注册,返回 TYPE 或 None """查库模块源文件中 "attr: t.CTypedef = TYPE" 并注册,返回 TYPE 或 None
@@ -1172,7 +1172,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase):
if m_buf is None: if m_buf is None:
stdlib.free(m_path) stdlib.free(m_path)
return None return None
mf: rowptr[fileio.File] = fileio.File(m_path, fileio.MODE.R) mf: rawptr[fileio.File] = fileio.File(m_path, fileio.MODE.R)
stdlib.free(m_path) stdlib.free(m_path)
if mf.closed: if mf.closed:
stdlib.free(m_buf) stdlib.free(m_buf)
@@ -1251,7 +1251,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase):
self.Gen.TypeGenCType.register_ctypedef(pool, attr, m_res) self.Gen.TypeGenCType.register_ctypedef(pool, attr, m_res)
stdlib.free(m_buf) stdlib.free(m_buf)
return m_res return m_res
def _expand_typedef_ref(self, pool: rowptr[memhub.MemBuddy], def _expand_typedef_ref(self, pool: rawptr[memhub.MemBuddy],
type_str: str, depth: int = 0) -> str: type_str: str, depth: int = 0) -> str:
"""展开类型表达式中的模块限定 typedef 引用(stdint.size_t → sizet) """展开类型表达式中的模块限定 typedef 引用(stdint.size_t → sizet)
@@ -1291,7 +1291,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase):
and string.strcmp(ts_x, type_str) != 0: and string.strcmp(ts_x, type_str) != 0:
return self._expand_typedef_ref(pool, ts_x, depth + 1) return self._expand_typedef_ref(pool, ts_x, depth + 1)
return type_str return type_str
def _long_llvm_ty(self, pool: rowptr[memhub.MemBuddy]) -> llvmlite.LLVMType | t.CPtr: def _long_llvm_ty(self, pool: rawptr[memhub.MemBuddy]) -> llvmlite.LLVMType | t.CPtr:
"""C 的 long / unsigned long 的目标平台 LLVM 类型 """C 的 long / unsigned long 的目标平台 LLVM 类型
Windows 目标(LLP64)下 long = 32 位——对齐 TPC Windows 目标(LLP64)下 long = 32 位——对齐 TPC
@@ -1311,7 +1311,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase):
or string.strstr(triple, "msvc") is not None: or string.strstr(triple, "msvc") is not None:
return llvmlite.Int32(pool) return llvmlite.Int32(pool)
return llvmlite.Int64(pool) return llvmlite.Int64(pool)
def map_t_type(self, pool: rowptr[memhub.MemBuddy], def map_t_type(self, pool: rawptr[memhub.MemBuddy],
type_name: str) -> llvmlite.LLVMType | t.CPtr: type_name: str) -> llvmlite.LLVMType | t.CPtr:
"""将 t.CXxx / c.CXxx 类型名映射到 LLVMType """将 t.CXxx / c.CXxx 类型名映射到 LLVMType
@@ -1601,7 +1601,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase):
def extract_class_name_from_annotation(self, node: ast.AST | t.CPtr, def extract_class_name_from_annotation(self, node: ast.AST | t.CPtr,
imported_modules: str, imported_modules: str,
pool: rowptr[memhub.MemBuddy] = None, pool: rawptr[memhub.MemBuddy] = None,
from_imports: str = None) -> str: from_imports: str = None) -> str:
"""从类型注解 AST 中提取类名,返回 None=无法提取 """从类型注解 AST 中提取类名,返回 None=无法提取
@@ -1737,13 +1737,13 @@ class TypeGenResolve(TypeGenBase.TypeGenBase):
sub: ast.Subscript | t.CPtr = (ast.Subscript | t.CPtr)(node) sub: ast.Subscript | t.CPtr = (ast.Subscript | t.CPtr)(node)
if sub.value is None: if sub.value is None:
return None return None
# rowptr[T] 是内建裸指针(等价 t.CPtr[T]),AnnotClassName 应取 pointee # rawptr[T] 是内建裸指针(等价 t.CPtr[T]),AnnotClassName 应取 pointee
# 类名 T(字段访问按 T 查结构体),而非 "rowptr" / "rowptr[T]"——否则 # 类名 T(字段访问按 T 查结构体),而非 "rawptr" / "rawptr[T]"——否则
# lookup_field_by_class 报"类 'rowptr' 未注册"(json.__parser _peek # lookup_field_by_class 报"类 'rawptr' 未注册"(json.__parser _peek
# 参数 s: rowptr[ParseState] 根因)。 # 参数 s: rawptr[ParseState] 根因)。
if sub.value.kind() == ast.ASTKind.Name: if sub.value.kind() == ast.ASTKind.Name:
rp_nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(sub.value) rp_nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(sub.value)
if rp_nm.id is not None and string.strcmp(rp_nm.id, "rowptr") == 0: if rp_nm.id is not None and string.strcmp(rp_nm.id, "rawptr") == 0:
if sub.slice is not None: if sub.slice is not None:
return self.extract_class_name_from_annotation( return self.extract_class_name_from_annotation(
sub.slice, imported_modules, pool, from_imports) sub.slice, imported_modules, pool, from_imports)
@@ -1812,7 +1812,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase):
return mangled_buf return mangled_buf
return None return None
def _resolve_generic_subscript_ty(self, pool: rowptr[memhub.MemBuddy], def _resolve_generic_subscript_ty(self, pool: rawptr[memhub.MemBuddy],
sub: ast.Subscript | t.CPtr, sub: ast.Subscript | t.CPtr,
gen_cls_name: str, gen_cls_name: str,
trans: HT.Translator | t.CPtr, trans: HT.Translator | t.CPtr,
@@ -1963,7 +1963,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase):
# Phase B(declare_only==0)全量翻译时,泛型模板类的下标仍解析不出特化结构体 # Phase B(declare_only==0)全量翻译时,泛型模板类的下标仍解析不出特化结构体
# ⇒ 上游注解必然退化(BinOp 分支落到 Ptr(i8) 丢类型,或退化到裸基类 list*), # ⇒ 上游注解必然退化(BinOp 分支落到 Ptr(i8) 丢类型,或退化到裸基类 list*),
# 后续 .get() 按错误元素类型分派 → inttoptr 截断崩溃。禁止静默退化:报出查表键 # 后续 .get() 按错误元素类型分派 → inttoptr 截断崩溃。禁止静默退化:报出查表键
# 与实际模板名。仅当基名确为泛型模板时才触发(避免误伤 rowptr/CArray 等 builtin)。 # 与实际模板名。仅当基名确为泛型模板时才触发(避免误伤 rawptr/CArray 等 builtin)。
if trans is not None and trans._declare_only == 0 \ if trans is not None and trans._declare_only == 0 \
and self.Gen.ClassGenGeneric._find_generic_template(gen_cls_name) is not None: and self.Gen.ClassGenGeneric._find_generic_template(gen_cls_name) is not None:
self.Gen.TypeGenErr.fatal_error( self.Gen.TypeGenErr.fatal_error(
@@ -1973,7 +1973,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase):
"TypeError") "TypeError")
# 未特化:返回 None(不报错,让后续流程处理) # 未特化:返回 None(不报错,让后续流程处理)
return None return None
def resolve_annotation_type(self, pool: rowptr[memhub.MemBuddy], def resolve_annotation_type(self, pool: rawptr[memhub.MemBuddy],
node: ast.AST | t.CPtr, node: ast.AST | t.CPtr,
imported_modules: str, imported_modules: str,
from_imports: str, from_imports: str,
@@ -2065,11 +2065,11 @@ class TypeGenResolve(TypeGenBase.TypeGenBase):
if gp_sub_node is not None: if gp_sub_node is not None:
return self.resolve_annotation_type(pool, gp_sub_node, imported_modules, from_imports, trans, depth + 1) return self.resolve_annotation_type(pool, gp_sub_node, imported_modules, from_imports, trans, depth + 1)
# 已规范化 sha1 前缀名 "{16hex}.Class"(_norm_type_arg_name 产物,如泛型 # 已规范化 sha1 前缀名 "{16hex}.Class"(_norm_type_arg_name 产物,如泛型
# 实参 rowptr[7565e081d88517ac.AST] 的括号内层):模块段即 SHA1(天然 # 实参 rawptr[7565e081d88517ac.AST] 的括号内层):模块段即 SHA1(天然
# 已编译),无需 import 检查。解析器把 "a.b" 折叠为单 Name(int 同款), # 已编译),无需 import 检查。解析器把 "a.b" 折叠为单 Name(int 同款),
# 与 Attribute 形态(L1978-1992)都要支持;否则 rowptr[sha.AST] 解析失败 # 与 Attribute 形态(L1978-1992)都要支持;否则 rawptr[sha.AST] 解析失败
# → 特化方法参数类型退化 → "方法 'list[...].append' 参数 'item' 类型解析 # → 特化方法参数类型退化 → "方法 'list[...].append' 参数 'item' 类型解析
# 失败"(SlotsBugTest ast 包 rowptr[list[rowptr[AST]]] 根因)。 # 失败"(SlotsBugTest ast 包 rawptr[list[rawptr[AST]]] 根因)。
sp_pre2: int = self._is_sha1_prefixed(nm.id) sp_pre2: int = self._is_sha1_prefixed(nm.id)
if sp_pre2 != 0: if sp_pre2 != 0:
# [D3 收敛] 前缀长度取自唯一真源(不再硬编码 17/16): # [D3 收敛] 前缀长度取自唯一真源(不再硬编码 17/16):
@@ -2213,7 +2213,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase):
if alias_ty is not None: if alias_ty is not None:
return alias_ty return alias_ty
# [builtins 最后匹配] 常规路径全部 miss 后的最终兜底:查 # [builtins 最后匹配] 常规路径全部 miss 后的最终兜底:查
# includes/builtins.vp 的 CTypedef 声明(如 rowptr: t.CTypedef = # includes/builtins.vp 的 CTypedef 声明(如 rawptr: t.CTypedef =
# t.CPtr)。命中展开类型表达式后递归解析,仍失败才由调用方报错。 # t.CPtr)。命中展开类型表达式后递归解析,仍失败才由调用方报错。
btd_n: str = self._lookup_builtins_typedef(pool, nm.id) btd_n: str = self._lookup_builtins_typedef(pool, nm.id)
if btd_n is not None: if btd_n is not None:
@@ -2655,10 +2655,10 @@ class TypeGenResolve(TypeGenBase.TypeGenBase):
if self.Gen.TypeGenCType.ConstEvalOk == 0 or count_n <= 0: if self.Gen.TypeGenCType.ConstEvalOk == 0 or count_n <= 0:
return None return None
return llvmlite.Array(pool, elem_ty_n, count_n) return llvmlite.Array(pool, elem_ty_n, count_n)
# rowptr[T] 内建裸指针:等价 t.CPtr[T] → Ptr(T)(T 自身可含指针层级)。 # rawptr[T] 内建裸指针:等价 t.CPtr[T] → Ptr(T)(T 自身可含指针层级)。
# 与 t.CPtr[T] 语义一致;不处理则泛型特化/builtins 兜底失败 → # 与 t.CPtr[T] 语义一致;不处理则泛型特化/builtins 兜底失败 →
# "函数返回类型解析失败:注解不可解析"。 # "函数返回类型解析失败:注解不可解析"。
if string.strcmp(gen_nm.id, "rowptr") == 0: if string.strcmp(gen_nm.id, "rawptr") == 0:
if sub.slice.kind() != ast.ASTKind.Tuple: if sub.slice.kind() != ast.ASTKind.Tuple:
rp_elem: llvmlite.LLVMType | t.CPtr = self.resolve_annotation_type( rp_elem: llvmlite.LLVMType | t.CPtr = self.resolve_annotation_type(
pool, sub.slice, imported_modules, from_imports, trans, depth + 1) pool, sub.slice, imported_modules, from_imports, trans, depth + 1)
@@ -2672,7 +2672,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase):
if gen_ty_nm is not None: if gen_ty_nm is not None:
return gen_ty_nm return gen_ty_nm
# 泛型特化 miss 时不能 return None 直接退出——否则下面的 # 泛型特化 miss 时不能 return None 直接退出——否则下面的
# [builtins 最后匹配] 兜底永远不可达(rowptr[int] 根因)。 # [builtins 最后匹配] 兜底永远不可达(rawptr[int] 根因)。
# 下方 builtins 兜底若也未命中,仍按旧行为返回 None(多遍 # 下方 builtins 兜底若也未命中,仍按旧行为返回 None(多遍
# 收敛/上层报错),不落到"仅支持 t.CArray/t.Callable"fatal。 # 收敛/上层报错),不落到"仅支持 t.CArray/t.Callable"fatal。
if sub.value.kind() == ast.ASTKind.Name: if sub.value.kind() == ast.ASTKind.Name:
+2 -2
View File
@@ -351,7 +351,7 @@ def SpecArenaInit(arena: TypeSpecArena | t.CPtr, cap: int) -> int:
use_cap: int = cap use_cap: int = cap
if use_cap <= 0: if use_cap <= 0:
use_cap = SPEC_INTERN_MAX use_cap = SPEC_INTERN_MAX
pp: rowptr[memhub.MemBuddy] = CompilerFactory.factory.PermPool pp: rawptr[memhub.MemBuddy] = CompilerFactory.factory.PermPool
keys: bytes = pp.alloc(use_cap * SPEC_TEXT_MAX) keys: bytes = pp.alloc(use_cap * SPEC_TEXT_MAX)
if keys is None: if keys is None:
return 1 return 1
@@ -386,7 +386,7 @@ def SpecArenaInit(arena: TypeSpecArena | t.CPtr, cap: int) -> int:
# ============================================================ # ============================================================
def _spec_alloc() -> TypeSpec | t.CPtr: def _spec_alloc() -> TypeSpec | t.CPtr:
"""分配并清零一个 TypeSpec(PermPool)""" """分配并清零一个 TypeSpec(PermPool)"""
pp: rowptr[memhub.MemBuddy] = CompilerFactory.factory.PermPool pp: rawptr[memhub.MemBuddy] = CompilerFactory.factory.PermPool
size: sizet = TypeSpec.__sizeof__() size: sizet = TypeSpec.__sizeof__()
sp: TypeSpec | t.CPtr = (TypeSpec | t.CPtr)(t.CVoid(pp.alloc(size), t.CPtr)) sp: TypeSpec | t.CPtr = (TypeSpec | t.CPtr)(t.CVoid(pp.alloc(size), t.CPtr))
if sp is None: if sp is None:
+6 -6
View File
@@ -47,7 +47,7 @@ class VarGenMixin:
# init_vars — 分配并清零 VarEntry 数组 # init_vars — 分配并清零 VarEntry 数组
# ============================================================ # ============================================================
Gen: Generator.Generator | t.CPtr Gen: Generator.Generator | t.CPtr
def init_vars(self, pool: rowptr[memhub.MemBuddy]) -> GenTypes.VarEntry | t.CPtr: def init_vars(self, pool: rawptr[memhub.MemBuddy]) -> GenTypes.VarEntry | t.CPtr:
"""分配并清零变量表数组""" """分配并清零变量表数组"""
size: sizet = MAX_VARS * GenTypes.VarEntry.__sizeof__() size: sizet = MAX_VARS * GenTypes.VarEntry.__sizeof__()
vars_ptr: GenTypes.VarEntry | t.CPtr = pool.alloc(size) vars_ptr: GenTypes.VarEntry | t.CPtr = pool.alloc(size)
@@ -272,7 +272,7 @@ class VarGenMixin:
return llvmlite.build_alloca_at_entry(builder, ty) return llvmlite.build_alloca_at_entry(builder, ty)
# get_or_create_var — 查找或创建变量 alloca(旧版兼容) # get_or_create_var — 查找或创建变量 alloca(旧版兼容)
def get_or_create_var(self, pool: rowptr[memhub.MemBuddy], def get_or_create_var(self, pool: rawptr[memhub.MemBuddy],
builder: llvmlite.IRBuilder | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr,
vars_ptr: GenTypes.VarEntry | t.CPtr, vars_ptr: GenTypes.VarEntry | t.CPtr,
var_count: int, var_count: int,
@@ -292,7 +292,7 @@ class VarGenMixin:
# ============================================================ # ============================================================
# _create_scope — 创建新作用域节点(内部辅助函数) # _create_scope — 创建新作用域节点(内部辅助函数)
# ============================================================ # ============================================================
def _create_scope(self, pool: rowptr[memhub.MemBuddy], def _create_scope(self, pool: rawptr[memhub.MemBuddy],
parent: GenTypes.Scope | t.CPtr, parent: GenTypes.Scope | t.CPtr,
kind: int) -> GenTypes.Scope | t.CPtr: kind: int) -> GenTypes.Scope | t.CPtr:
"""创建并初始化作用域节点""" """创建并初始化作用域节点"""
@@ -311,7 +311,7 @@ class VarGenMixin:
# ============================================================ # ============================================================
# init_symbol_table — 创建符号表(含模块级根作用域) # init_symbol_table — 创建符号表(含模块级根作用域)
# ============================================================ # ============================================================
def init_symbol_table(self, pool: rowptr[memhub.MemBuddy]) -> GenTypes.SymbolTable | t.CPtr: def init_symbol_table(self, pool: rawptr[memhub.MemBuddy]) -> GenTypes.SymbolTable | t.CPtr:
"""创建并初始化符号表,包含模块级根作用域""" """创建并初始化符号表,包含模块级根作用域"""
if pool is None: if pool is None:
return None return None
@@ -338,7 +338,7 @@ class VarGenMixin:
"""进入新作用域,返回新创建的作用域""" """进入新作用域,返回新创建的作用域"""
if symtab is None: if symtab is None:
return None return None
pool: rowptr[memhub.MemBuddy] = symtab.Pool pool: rawptr[memhub.MemBuddy] = symtab.Pool
scope: GenTypes.Scope | t.CPtr = self._create_scope(pool, symtab.Current, kind) scope: GenTypes.Scope | t.CPtr = self._create_scope(pool, symtab.Current, kind)
if scope is None: if scope is None:
return None return None
@@ -479,7 +479,7 @@ class VarGenMixin:
# get_or_create_sym — 查找或创建变量(在当前作用域) # get_or_create_sym — 查找或创建变量(在当前作用域)
# ============================================================ # ============================================================
def get_or_create_sym(self, symtab: GenTypes.SymbolTable | t.CPtr, def get_or_create_sym(self, symtab: GenTypes.SymbolTable | t.CPtr,
pool: rowptr[memhub.MemBuddy], pool: rawptr[memhub.MemBuddy],
builder: llvmlite.IRBuilder | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr,
name: str, name: str,
ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr:
+6 -6
View File
@@ -18,7 +18,7 @@ import lib.core.VLogger as VLogger
# ============================================================ # ============================================================
# 全局 mbuddy 指针 # 全局 mbuddy 指针
_mbuddy: rowptr[memhub.MemBuddy] _mbuddy: rawptr[memhub.MemBuddy]
# 文件路径最大长度 # 文件路径最大长度
MAX_PATH_LEN: t.CDefine = 512 MAX_PATH_LEN: t.CDefine = 512
@@ -53,7 +53,7 @@ class ScanResult:
# ============================================================ # ============================================================
# create_scan_result - 创建扫描结果容器 # create_scan_result - 创建扫描结果容器
# ============================================================ # ============================================================
def create_scan_result(pool: rowptr[memhub.MemBuddy]) -> ScanResult | t.CPtr: def create_scan_result(pool: rawptr[memhub.MemBuddy]) -> ScanResult | t.CPtr:
"""创建扫描结果容器,预分配 MAX_FILES 个槽位""" """创建扫描结果容器,预分配 MAX_FILES 个槽位"""
if pool is None: if pool is None:
return None return None
@@ -78,7 +78,7 @@ def create_scan_result(pool: rowptr[memhub.MemBuddy]) -> ScanResult | t.CPtr:
# add_file_entry - 向扫描结果添加文件条目 # add_file_entry - 向扫描结果添加文件条目
# ============================================================ # ============================================================
def add_file_entry(result: ScanResult | t.CPtr, def add_file_entry(result: ScanResult | t.CPtr,
pool: rowptr[memhub.MemBuddy], pool: rawptr[memhub.MemBuddy],
abs_path: str, rel_path: str, abs_path: str, rel_path: str,
sha1: str, inc_dir: str) -> int: sha1: str, inc_dir: str) -> int:
"""添加文件条目到扫描结果,返回 0 成功(inc_dir 为所属 includes 根目录)""" """添加文件条目到扫描结果,返回 0 成功(inc_dir 为所属 includes 根目录)"""
@@ -140,7 +140,7 @@ def add_file_entry(result: ScanResult | t.CPtr,
# ============================================================ # ============================================================
# compute_file_sha1 - 读取文件内容并计算 SHA1(CRLF→LF 后计算,与 Projectrans.py 一致) # compute_file_sha1 - 读取文件内容并计算 SHA1(CRLF→LF 后计算,与 Projectrans.py 一致)
# ============================================================ # ============================================================
def compute_file_sha1(pool: rowptr[memhub.MemBuddy], def compute_file_sha1(pool: rawptr[memhub.MemBuddy],
file_path: str) -> str: file_path: str) -> str:
"""读取文件内容并计算 SHA1 前16字符(CRLF→LF 后计算,与 Projectrans.py 一致)""" """读取文件内容并计算 SHA1 前16字符(CRLF→LF 后计算,与 Projectrans.py 一致)"""
if pool is None or file_path is None: if pool is None or file_path is None:
@@ -186,7 +186,7 @@ def compute_file_sha1(pool: rowptr[memhub.MemBuddy],
# ============================================================ # ============================================================
# scan_directory_recursive - 递归扫描目录(FindFirstFileA/FindNextFileA 遍历目录树) # scan_directory_recursive - 递归扫描目录(FindFirstFileA/FindNextFileA 遍历目录树)
# ============================================================ # ============================================================
def scan_directory_recursive(pool: rowptr[memhub.MemBuddy], def scan_directory_recursive(pool: rawptr[memhub.MemBuddy],
root_dir: str, root_dir: str,
rel_prefix: str, rel_prefix: str,
result: ScanResult | t.CPtr, result: ScanResult | t.CPtr,
@@ -300,7 +300,7 @@ def scan_directory_recursive(pool: rowptr[memhub.MemBuddy],
# ============================================================ # ============================================================
# scan_includes - 扫描 includes 目录入口(返回所有 .vp 文件路径与 SHA1) # scan_includes - 扫描 includes 目录入口(返回所有 .vp 文件路径与 SHA1)
# ============================================================ # ============================================================
def scan_includes(pool: rowptr[memhub.MemBuddy], def scan_includes(pool: rawptr[memhub.MemBuddy],
includes_dirs: str) -> ScanResult | t.CPtr: includes_dirs: str) -> ScanResult | t.CPtr:
"""扫描 includes 目录(支持空格分隔的多目录),返回所有 .vp/.py 文件的扫描结果""" """扫描 includes 目录(支持空格分隔的多目录),返回所有 .vp/.py 文件的扫描结果"""
if pool is None or includes_dirs is None: if pool is None or includes_dirs is None:
+2 -2
View File
@@ -47,7 +47,7 @@ class Logger:
_level: int _level: int
_console_handle: win32base.HANDLE _console_handle: win32base.HANDLE
_use_color: int _use_color: int
__mbuddy__: rowptr[memhub.MemBuddy] __mbuddy__: rawptr[memhub.MemBuddy]
def __init__(self, level: int = 1): def __init__(self, level: int = 1):
self._level = level self._level = level
@@ -171,7 +171,7 @@ class Logger:
# 全局 mbuddy 指针(由 lib.InitLib 注入) # 全局 mbuddy 指针(由 lib.InitLib 注入)
_mbuddy: rowptr[memhub.MemBuddy] _mbuddy: rawptr[memhub.MemBuddy]
# 全局 logger 指针 # 全局 logger 指针
logger: Logger | t.CPtr logger: Logger | t.CPtr
+5 -5
View File
@@ -77,12 +77,12 @@ def main() -> int:
stdio.printf("FAIL: malloc for perm_pool arena failed\n") stdio.printf("FAIL: malloc for perm_pool arena failed\n")
return 1 return 1
mb: rowptr[memhub.MemBuddy] = memhub.MemBuddy(arena, POOL_SIZE, detect_flag, deep_detect_flag) mb: rawptr[memhub.MemBuddy] = memhub.MemBuddy(arena, POOL_SIZE, detect_flag, deep_detect_flag)
if mb is None: if mb is None:
stdio.printf("FAIL: MemBuddy init failed\n") stdio.printf("FAIL: MemBuddy init failed\n")
return 1 return 1
perm_pool: rowptr[memhub.MemBuddy] = memhub.MemBuddy(perm_arena, PERM_POOL_SIZE, detect_flag, deep_detect_flag) perm_pool: rawptr[memhub.MemBuddy] = memhub.MemBuddy(perm_arena, PERM_POOL_SIZE, detect_flag, deep_detect_flag)
if perm_pool is None: if perm_pool is None:
stdio.printf("FAIL: perm_pool init failed\n") stdio.printf("FAIL: perm_pool init failed\n")
@@ -109,7 +109,7 @@ def main() -> int:
lib._mbuddy = mb lib._mbuddy = mb
# P2: 创建项目级 Generator 单例(Phase1/Phase2/BuildPipeline 全程复用; # P2: 创建项目级 Generator 单例(Phase1/Phase2/BuildPipeline 全程复用;
gen: rowptr[GenGenerator.Generator] = mb.alloc(GenGenerator.Generator.__sizeof__()) gen: rawptr[GenGenerator.Generator] = mb.alloc(GenGenerator.Generator.__sizeof__())
if gen is None: if gen is None:
stdio.printf("FAIL: Generator alloc failed\n") stdio.printf("FAIL: Generator alloc failed\n")
return 1 return 1
@@ -534,7 +534,7 @@ Target: %s
sf_stub_len: sizet = string.strlen(sf_stub_buf) sf_stub_len: sizet = string.strlen(sf_stub_buf)
sf_stub_path: str = StubMergerCollect._sliced_path(temp_dir, td_len_sf, module_name, "stub.ll") sf_stub_path: str = StubMergerCollect._sliced_path(temp_dir, td_len_sf, module_name, "stub.ll")
if sf_stub_path is not None: if sf_stub_path is not None:
sf_f: rowptr[fileio.File] = fileio.File(sf_stub_path, fileio.MODE.W) sf_f: rawptr[fileio.File] = fileio.File(sf_stub_path, fileio.MODE.W)
if not sf_f.closed: if not sf_f.closed:
sf_f.write(sf_stub_buf, sf_stub_len) sf_f.write(sf_stub_buf, sf_stub_len)
sf_f.close() sf_f.close()
@@ -547,7 +547,7 @@ Target: %s
sf_text_len: sizet = string.strlen(sf_text_buf) sf_text_len: sizet = string.strlen(sf_text_buf)
sf_text_path: str = StubMergerCollect._sliced_path(temp_dir, td_len_sf, module_name, "text.ll") sf_text_path: str = StubMergerCollect._sliced_path(temp_dir, td_len_sf, module_name, "text.ll")
if sf_text_path is not None: if sf_text_path is not None:
sf_tf: rowptr[fileio.File] = fileio.File(sf_text_path, fileio.MODE.W) sf_tf: rawptr[fileio.File] = fileio.File(sf_text_path, fileio.MODE.W)
if not sf_tf.closed: if not sf_tf.closed:
sf_tf.write(sf_text_buf, sf_text_len) sf_tf.write(sf_text_buf, sf_text_len)
sf_tf.close() sf_tf.close()
+2 -2
View File
@@ -17,7 +17,7 @@ import string
# ============================================================ # ============================================================
# 内存池(测试内部使用) # 内存池(测试内部使用)
_mbuddy: rowptr[memhub.MemBuddy] _mbuddy: rawptr[memhub.MemBuddy]
# 测试用内存大小(64KB,足够构造 LLVMType 值) # 测试用内存大小(64KB,足够构造 LLVMType 值)
_NMATCH_POOL_SIZE: t.CDefine = 65536 _NMATCH_POOL_SIZE: t.CDefine = 65536
@@ -30,7 +30,7 @@ def _init_mbuddy() -> int:
if arena is None: if arena is None:
stdio.printf("FAIL: malloc for arena failed\n") stdio.printf("FAIL: malloc for arena failed\n")
return 1 return 1
mb: rowptr[memhub.MemBuddy] = stdlib.malloc(memhub.MemBuddy.__sizeof__()) mb: rawptr[memhub.MemBuddy] = stdlib.malloc(memhub.MemBuddy.__sizeof__())
if mb is None: if mb is None:
stdio.printf("FAIL: MemBuddy init failed\n") stdio.printf("FAIL: MemBuddy init failed\n")
return 1 return 1
+1 -1
View File
@@ -14,7 +14,7 @@ def main() -> int:
arena: bytes = stdlib.malloc(POOL_SIZE) arena: bytes = stdlib.malloc(POOL_SIZE)
if arena is None: if arena is None:
return 1 return 1
mb: rowptr[memhub.MemBuddy] = memhub.MemBuddy(arena, POOL_SIZE) mb: rawptr[memhub.MemBuddy] = memhub.MemBuddy(arena, POOL_SIZE)
if mb is None: if mb is None:
return 1 return 1
hashlib._mbuddy = (memhub.MemManager | t.CPtr)(mb) hashlib._mbuddy = (memhub.MemManager | t.CPtr)(mb)