错拼 rowptr 改为 rawptr
This commit is contained in:
1 parent
7cba4cbc95
commit
9a191daa8d
70 files changed
+585
-585
No files matched your search
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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 字节), 文件更长会被静默截断
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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"""
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
# 若提供过滤集合,只写入集合中的条目
|
# 若提供过滤集合,只写入集合中的条目
|
||||||
|
|||||||
@@ -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
@@ -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]
|
||||||
@@ -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
|
||||||
@@ -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"""
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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"""
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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 内置分支统一翻译。
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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 位升级)
|
||||||
|
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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) ----
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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,收尾覆盖
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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):
|
||||||
"""递归扫描类型树,确保值类型子结构体有完整定义"""
|
"""递归扫描类型树,确保值类型子结构体有完整定义"""
|
||||||
|
|||||||
@@ -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]
|
||||||
|
|
||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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,..."
|
||||||
|
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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
@@ -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()
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in new issue
Block a user