修正了部分代码的表达方式,最后可用版本,正在为 mlirlite 做准备

This commit is contained in:
TermiNexus committed 2026-09-23 16:09:32 +08:00
1 parent a5ceb3d4eb
commit 951b89be36
69 files changed
+8833 -8590

No files matched your search

+6 -6
View File
@@ -34,7 +34,7 @@ import lib.Stub.StubMerger.StubMergerCollect as StubMergerCollect
# ============================================================
# 全局 mbuddy 指针
_mbuddy: rawptr[memhub.MemBuddy]
_mbuddy: memhub.MemBuddy*
# ASan 模式(--asan):对 .ll 先 opt -passes=asan 插桩;ASan 运行库由
# 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 存根文件)
# Returns: Translator 对象(None 失败)
# ============================================================
def TranslateFileGetTrans(mb: rawptr[memhub.MemBuddy], file_path: str,
def TranslateFileGetTrans(mb: memhub.MemBuddy*, file_path: str,
sha1_val: str,
current_package: str = None,
declare_only: int = 0,
@@ -92,10 +92,10 @@ def TranslateFileGetTrans(mb: rawptr[memhub.MemBuddy], file_path: str,
return None
if bytes_read < SRC_BUF_SIZE:
src_buf[bytes_read] = 0
lx: rawptr[ast.Lexer] = ast.new_lexer(mb)
lx: ast.Lexer* = ast.new_lexer(mb)
ast._lexer_init(lx, src_buf, mb)
tokens: rawptr[ast.Token] = ast.tokenize(lx)
tree: rawptr[ast.AST] = ast.parse_tokens(mb, tokens)
tokens: ast.Token* = ast.tokenize(lx)
tree: ast.AST* = ast.parse_tokens(mb, tokens)
# parse 完成后 AST 树已独立,释放源代码缓冲区(避免 1MB/文件泄漏)
stdlib.free(src_buf)
if tree is None:
@@ -585,7 +585,7 @@ def run_llc_parallel(tasks: bytes, task_count: int, max_threads: int) -> int:
max_threads = 1
# 线程句柄数组:list[str](str=bytes=i8*,elem_size=8 显式)存句柄值;list[t.CPtr] 特化下 append 会读零页崩溃(原因待查),list[str] 全库验证稳定。
# start() 后立即取 handle 存入,join/close 直接对句柄操作,不依赖 Thread 对象存续。
handles: list[str] | t.CPtr = list[str](_mbuddy, 8)
handles: list[str]* = list[str](_mbuddy, 8)
if handles is None:
VLogger.error("run_llc_parallel: 线程句柄数组分配失败", "PhaseB")
return 1
+11 -11
View File
@@ -234,7 +234,7 @@ def _BreakContainerCyclesInDeps(temp_dir: str) -> int:
# Args: mb 内存池;includes_dir includes 根目录(仅用于失败诊断,路径以 store 为准)
# Returns: ScanResult 指针(stdlib 分配,调用方负责释放);失败返回 None
# ============================================================
def _BuildReachableResult(mb: rawptr[memhub.MemBuddy],
def _BuildReachableResult(mb: memhub.MemBuddy*,
includes_dir: str) -> rawptr[IncludesScanner.ScanResult]:
"""从 Sha1Store(仅可达 includes + App)构建可达 FileEntry 列表"""
if mb is None:
@@ -318,7 +318,7 @@ def _BuildReachableResult(mb: rawptr[memhub.MemBuddy],
# Args: mb 内存池;includes_dir includes 目录路径;temp_dir 临时目录(保存 stub);log 日志器
# Returns: 0 成功,非 0 失败
# ============================================================
def RunPhase1(mb: rawptr[memhub.MemBuddy], includes_dir: str, temp_dir: str,
def RunPhase1(mb: memhub.MemBuddy*, includes_dir: str, temp_dir: str,
log: rawptr[VLogger.Logger]) -> int:
"""Phase1: 扫描 includes 目录,按需翻译并生成 stub"""
if includes_dir is None or temp_dir is None:
@@ -609,14 +609,14 @@ def RunPhase1(mb: rawptr[memhub.MemBuddy], includes_dir: str, temp_dir: str,
src_buf_r[bytes_read_r] = 0
# 解析 AST
lx_r: rawptr[ast.Lexer] = ast.new_lexer(mb)
lx_r: ast.Lexer* = ast.new_lexer(mb)
if lx_r is None:
stdlib.free(src_buf_r)
p1a_fl += 1
continue
ast._lexer_init(lx_r, src_buf_r, mb)
tokens_r: rawptr[ast.Token] = ast.tokenize(lx_r)
tree_r: rawptr[ast.AST] = ast.parse_tokens(mb, tokens_r)
tokens_r: ast.Token* = ast.tokenize(lx_r)
tree_r: ast.AST* = ast.parse_tokens(mb, tokens_r)
if tree_r is None:
stdlib.free(src_buf_r)
p1a_fl += 1
@@ -767,15 +767,15 @@ def RunPhase1(mb: rawptr[memhub.MemBuddy], includes_dir: str, temp_dir: str,
continue
if bytes_read_pv < Phase1.SRC_BUF_SIZE:
src_buf_pv[bytes_read_pv] = 0
lx_pv: rawptr[ast.Lexer] = ast.new_lexer(mb)
lx_pv: ast.Lexer* = ast.new_lexer(mb)
if lx_pv is None:
stdlib.free(src_buf_pv)
p1bpre_failed += 1
VLogger.error(f"[Phase 1b-pre] {file_path_pv} | 词法器分配失败(OOM)", "Phase1")
continue
ast._lexer_init(lx_pv, src_buf_pv, mb)
tokens_pv: rawptr[ast.Token] = ast.tokenize(lx_pv)
tree_pv: rawptr[ast.AST] = ast.parse_tokens(mb, tokens_pv)
tokens_pv: ast.Token* = ast.tokenize(lx_pv)
tree_pv: ast.AST* = ast.parse_tokens(mb, tokens_pv)
if tree_pv is None:
stdlib.free(src_buf_pv)
p1bpre_failed += 1
@@ -972,14 +972,14 @@ def RunPhase1(mb: rawptr[memhub.MemBuddy], includes_dir: str, temp_dir: str,
src_buf[bytes_read] = 0
# 解析 AST
lx: rawptr[ast.Lexer] = ast.new_lexer(mb)
lx: ast.Lexer* = ast.new_lexer(mb)
if lx is None:
stdlib.free(src_buf)
failed += 1
continue
ast._lexer_init(lx, src_buf, mb)
tokens: rawptr[ast.Token] = ast.tokenize(lx)
tree: rawptr[ast.AST] = ast.parse_tokens(mb, tokens)
tokens: ast.Token* = ast.tokenize(lx)
tree: ast.AST* = ast.parse_tokens(mb, tokens)
if tree is None:
VLogger.error(f"AST 解析失败: {file_path}", "Phase1")
stdlib.free(src_buf)
+32 -32
View File
@@ -53,7 +53,7 @@ import lib.core.Gen.GenApi as GenApi
# parent_names_buf 父类名扁平数组(每个 Phase1.CLASS_NAME_LEN 字节,无父类填 '\0');def_sha1s_buf 定义 SHA1 扁平数组(每个 Phase1.SHA1_LEN 字节)
# Returns: 收集到的类数量,-1 失败
# ============================================================
def _ScanClassInheritance(mb: rawptr[memhub.MemBuddy],
def _ScanClassInheritance(mb: memhub.MemBuddy*,
result: rawptr[IncludesScanner.ScanResult],
reachable_set: str, reachable_count: int,
use_reachable: int,
@@ -121,13 +121,13 @@ def _ScanClassInheritance(mb: rawptr[memhub.MemBuddy],
src_buf[bytes_read] = 0
# 解析 AST
lx: rawptr[ast.Lexer] = ast.new_lexer(mb)
lx: ast.Lexer* = ast.new_lexer(mb)
if lx is None:
stdlib.free(src_buf)
continue
ast._lexer_init(lx, src_buf, mb)
tokens: rawptr[ast.Token] = ast.tokenize(lx)
tree: rawptr[ast.AST] = ast.parse_tokens(mb, tokens)
tokens: ast.Token* = ast.tokenize(lx)
tree: ast.AST* = ast.parse_tokens(mb, tokens)
if tree is None:
stdlib.free(src_buf)
continue
@@ -137,20 +137,20 @@ def _ScanClassInheritance(mb: rawptr[memhub.MemBuddy],
if ch is not None:
cn: sizet = len(ch)
for ci in range(cn):
child: rawptr[ast.AST] = ch.get(ci)
child: ast.AST* = ch.get(ci)
if child is None:
continue
kd: int = child.kind()
if kd != ast.ASTKind.ClassDef:
continue
cd: rawptr[ast.ClassDef] = rawptr[ast.ClassDef](child)
cd: ast.ClassDef* = ast.ClassDef*(child)
if cd is None or cd.name is None:
continue
# 检测泛型类(有 type_params),记录文件索引以供 Phase 1a 预注册
if file_has_generic == 0:
tp_scan: list[str] | t.CPtr = cd.type_params
tp_scan: list[str]* = cd.type_params
if tp_scan is not None:
file_has_generic = 1
if generic_file_count_box is not None:
@@ -252,12 +252,12 @@ def _BufHasGenericClassMarker(buf: bytes, blen: sizet) -> int:
# _find_generic_template 遍历悬空内存 strcmp 崩溃。本函数先文本扫描(_BufHasGenericClassMarker,不 parse)筛选出含泛型类的文件,
# 仅对命中文件用**永久池(perm_pool)**解析(模板节点与表直接进 perm_pool,跨 mark 永久存活、不占主 pool);重复注册由 _register_generic_template 内部查重跳过。
# ============================================================
def _PreRegisterAllGenericTemplates(mb: rawptr[memhub.MemBuddy],
def _PreRegisterAllGenericTemplates(mb: memhub.MemBuddy*,
result: rawptr[IncludesScanner.ScanResult]) -> int:
"""预注册全部 includes 文件的泛型类模板,返回处理到的泛型类数量"""
if result is None or mb is None:
return 0
perm: rawptr[memhub.MemBuddy] = CompilerFactory.factory.PermPool
perm: memhub.MemBuddy* = CompilerFactory.factory.PermPool
if perm is None:
return 0
p1e_size: sizet = IncludesScanner.FileEntry.__sizeof__()
@@ -294,13 +294,13 @@ def _PreRegisterAllGenericTemplates(mb: rawptr[memhub.MemBuddy],
stdlib.free(src_buf_pg)
continue
# 泛型文件:永久池解析 → 注册模板(节点/表进 perm_pool,跨 reset 存活)
lx_pg: rawptr[ast.Lexer] = ast.new_lexer(perm)
lx_pg: ast.Lexer* = ast.new_lexer(perm)
if lx_pg is None:
stdlib.free(src_buf_pg)
continue
ast._lexer_init(lx_pg, src_buf_pg, perm)
tokens_pg: rawptr[ast.Token] = ast.tokenize(lx_pg)
tree_pg: rawptr[ast.AST] = ast.parse_tokens(perm, tokens_pg)
tokens_pg: ast.Token* = ast.tokenize(lx_pg)
tree_pg: ast.AST* = ast.parse_tokens(perm, tokens_pg)
if tree_pg is None:
stdlib.free(src_buf_pg)
continue
@@ -309,13 +309,13 @@ def _PreRegisterAllGenericTemplates(mb: rawptr[memhub.MemBuddy],
if ch_pg is not None:
cn_pg: sizet = len(ch_pg)
for ci_pg in range(cn_pg):
child_pg: rawptr[ast.AST] = ch_pg.get(ci_pg)
child_pg: ast.AST* = ch_pg.get(ci_pg)
if child_pg is None or child_pg.kind() != ast.ASTKind.ClassDef:
continue
cd_pg: rawptr[ast.ClassDef] = rawptr[ast.ClassDef](child_pg)
cd_pg: ast.ClassDef* = ast.ClassDef*(child_pg)
if cd_pg is None or cd_pg.name is None:
continue
tp_pg: list[str] | t.CPtr = cd_pg.type_params
tp_pg: list[str]* = cd_pg.type_params
if tp_pg is None:
continue
GenApi.set_current_file_type(file_path_pg)
@@ -351,7 +351,7 @@ def _FindClassDefSha1(class_names_buf: bytes, def_sha1s_buf: bytes,
# 命中即置 need_list/need_dict;误报无害(最多多编译两个空壳模块)。
# ============================================================
def _AnnIsContainer(ann: rawptr[ast.AST]) -> int:
def _AnnIsContainer(ann: ast.AST*) -> int:
"""注解是否为 list/dict 容器(Name 裸名或 Subscript list[...]/dict[...])
数组初始化(t.CArray[...] / 裸数组注解)返回 0,避免 _ScanTreeForContainers
@@ -360,7 +360,7 @@ def _AnnIsContainer(ann: rawptr[ast.AST]) -> int:
while ann is not None:
ak_c: int = ann.kind()
if ak_c == ast.ASTKind.Name:
nm_c: rawptr[ast.Name] = rawptr[ast.Name](ann)
nm_c: ast.Name* = ast.Name*(ann)
if nm_c.id is not None:
if string.strcmp(nm_c.id, "list") == 0:
return 1
@@ -368,14 +368,14 @@ def _AnnIsContainer(ann: rawptr[ast.AST]) -> int:
return 1
return 0
elif ak_c == ast.ASTKind.Subscript:
sub_c: rawptr[ast.Subscript] = rawptr[ast.Subscript](ann)
sub_c: ast.Subscript* = ast.Subscript*(ann)
ann = sub_c.value
else:
return 0
return 0
def _ScanTreeForContainers(node: rawptr[ast.AST],
def _ScanTreeForContainers(node: ast.AST*,
need_list_box: t.CPtr,
need_dict_box: t.CPtr,
depth: int = 0):
@@ -388,22 +388,22 @@ def _ScanTreeForContainers(node: rawptr[ast.AST],
return
k_s: int = node.kind()
if k_s == ast.ASTKind.Name:
nm_s: rawptr[ast.Name] = rawptr[ast.Name](node)
nm_s: ast.Name* = ast.Name*(node)
if nm_s.id is not None:
if string.strcmp(nm_s.id, "list") == 0:
need_list_box[0] = 1
elif string.strcmp(nm_s.id, "dict") == 0:
need_dict_box[0] = 1
elif k_s == ast.ASTKind.Subscript:
sub_s: rawptr[ast.Subscript] = rawptr[ast.Subscript](node)
sub_s: ast.Subscript* = ast.Subscript*(node)
_ScanTreeForContainers(sub_s.value, need_list_box, need_dict_box, depth + 1)
_ScanTreeForContainers(sub_s.slice, need_list_box, need_dict_box, depth + 1)
elif k_s == ast.ASTKind.BinOp:
bop_s: rawptr[ast.BinOp] = rawptr[ast.BinOp](node)
bop_s: ast.BinOp* = ast.BinOp*(node)
_ScanTreeForContainers(bop_s.left, need_list_box, need_dict_box, depth + 1)
_ScanTreeForContainers(bop_s.right, need_list_box, need_dict_box, depth + 1)
elif k_s == ast.ASTKind.Call:
cl_s2: rawptr[ast.Call] = rawptr[ast.Call](node)
cl_s2: ast.Call* = ast.Call*(node)
_ScanTreeForContainers(cl_s2.func, need_list_box, need_dict_box, depth + 1)
cl_args_s: list[ast.AST*]* = cl_s2.args
if cl_args_s is not None:
@@ -420,7 +420,7 @@ def _ScanTreeForContainers(node: rawptr[ast.AST],
if kw_s is not None:
_ScanTreeForContainers(kw_s.value, need_list_box, need_dict_box, depth + 1)
elif k_s == ast.ASTKind.Assign:
asn_s: rawptr[ast.Assign] = rawptr[ast.Assign](node)
asn_s: ast.Assign* = ast.Assign*(node)
_ScanTreeForContainers(asn_s.value, need_list_box, need_dict_box, depth + 1)
tgts_s: list[ast.AST*]* = asn_s.targets
if tgts_s is not None:
@@ -429,24 +429,24 @@ def _ScanTreeForContainers(node: rawptr[ast.AST],
for i_t2 in range(nt_s):
_ScanTreeForContainers(tgts_s.get(i_t2), need_list_box, need_dict_box, depth + 1)
elif k_s == ast.ASTKind.AnnAssign:
aa_s2: rawptr[ast.AnnAssign] = rawptr[ast.AnnAssign](node)
aa_s2: ast.AnnAssign* = ast.AnnAssign*(node)
_ScanTreeForContainers(aa_s2.annotation, need_list_box, need_dict_box, depth + 1)
_ScanTreeForContainers(aa_s2.value, need_list_box, need_dict_box, depth + 1)
elif k_s == ast.ASTKind.FunctionDef:
fn_s: rawptr[ast.FunctionDef] = rawptr[ast.FunctionDef](node)
fn_s: ast.FunctionDef* = ast.FunctionDef*(node)
_ScanTreeForContainers(fn_s.returns, need_list_box, need_dict_box, depth + 1)
fn_args_s: rawptr[ast.Arguments] = rawptr[ast.Arguments](fn_s.args)
fn_args_s: ast.Arguments* = ast.Arguments*(fn_s.args)
if fn_args_s is not None:
fa_s: list[ast.AST*]* = fn_args_s.args
if fa_s is not None:
nf_s: sizet = len(fa_s)
i_f2: sizet
for i_f2 in range(nf_s):
arg_s: rawptr[ast.Arg] = rawptr[ast.Arg](fa_s.get(i_f2))
arg_s: ast.Arg* = ast.Arg*(fa_s.get(i_f2))
if arg_s is not None:
_ScanTreeForContainers(arg_s.annotation, need_list_box, need_dict_box, depth + 1)
elif k_s == ast.ASTKind.ClassDef:
cd_s: rawptr[ast.ClassDef] = rawptr[ast.ClassDef](node)
cd_s: ast.ClassDef* = ast.ClassDef*(node)
bases_s: list[ast.AST*]* = cd_s.bases
if bases_s is not None:
nb_s: sizet = len(bases_s)
@@ -454,10 +454,10 @@ def _ScanTreeForContainers(node: rawptr[ast.AST],
for i_b2 in range(nb_s):
_ScanTreeForContainers(bases_s.get(i_b2), need_list_box, need_dict_box, depth + 1)
elif k_s == ast.ASTKind.Attribute:
at_s: rawptr[ast.Attribute] = rawptr[ast.Attribute](node)
at_s: ast.Attribute* = ast.Attribute*(node)
_ScanTreeForContainers(at_s.value, need_list_box, need_dict_box, depth + 1)
elif k_s == ast.ASTKind.Tuple:
tu_s: rawptr[ast.Tuple] = rawptr[ast.Tuple](node)
tu_s: ast.Tuple* = ast.Tuple*(node)
elts_s: list[ast.AST*]* = tu_s.elts
if elts_s is not None:
ne_s: sizet = len(elts_s)
@@ -465,7 +465,7 @@ def _ScanTreeForContainers(node: rawptr[ast.AST],
for i_e2 in range(ne_s):
_ScanTreeForContainers(elts_s.get(i_e2), need_list_box, need_dict_box, depth + 1)
elif k_s == ast.ASTKind.UnaryOp:
uop_s: rawptr[ast.UnaryOp] = rawptr[ast.UnaryOp](node)
uop_s: ast.UnaryOp* = ast.UnaryOp*(node)
_ScanTreeForContainers(uop_s.operand, need_list_box, need_dict_box, depth + 1)
elif k_s == ast.ASTKind.Expr:
ex_s: rawptr[ast.Expr] = rawptr[ast.Expr](node)
+1 -1
View File
@@ -45,7 +45,7 @@ import lib.Phase.Phase1 as Phase1
# class_count 类数量;out_order 输出拓扑顺序的文件索引数组(调用者分配,int 数组);out_count 输出文件数量
# Returns: 0 成功,-1 失败
# ============================================================
def _TopoSortFiles(mb: rawptr[memhub.MemBuddy],
def _TopoSortFiles(mb: memhub.MemBuddy*,
result: rawptr[IncludesScanner.ScanResult],
reachable_set: str, reachable_count: int,
use_reachable: int,
+1 -1
View File
@@ -3,7 +3,7 @@ from stdint import *
import memhub
# 全局 mbuddy 指针
_mbuddy: rawptr[memhub.MemBuddy]
_mbuddy: memhub.MemBuddy*
# 源代码缓冲区大小(1MB)
SRC_BUF_SIZE: t.CDefine = 1048576
+16 -16
View File
@@ -30,7 +30,7 @@ import lib.Stub.StubMerger.StubMergerTopo as StubMergerTopo
import lib.Stub.StubGen.Converter as StubConverter
# 全局 mbuddy 指针
_mbuddy: rawptr[memhub.MemBuddy]
_mbuddy: memhub.MemBuddy*
# 源代码缓冲区大小(1MB)
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 最大文件数
# Returns: 新的 file_count
# ============================================================
def _ScanDirForPyFiles(mb: rawptr[memhub.MemBuddy],
def _ScanDirForPyFiles(mb: memhub.MemBuddy*,
dir_path: str,
entries: SrcFileEntry | t.CPtr,
entry_size: sizet,
@@ -156,7 +156,7 @@ def _ScanDirForPyFiles(mb: rawptr[memhub.MemBuddy],
# Kernel/intr/isr.s 定义 isr0/syscall_entry/_per_cpu 等符号)。
# TPV 不对 .s 翻译,直接用 llvm-mc 汇编为 .obj 参与链接。
# ============================================================
def _ScanDirForAsmFiles(mb: rawptr[memhub.MemBuddy],
def _ScanDirForAsmFiles(mb: memhub.MemBuddy*,
dir_path: str,
entries: SrcFileEntry | t.CPtr,
entry_size: sizet,
@@ -256,7 +256,7 @@ def _ScanDirForAsmFiles(mb: rawptr[memhub.MemBuddy],
# 才首次注册,reset_to(mark2) 会回收表与节点 → 后续查重/特化遍历悬空内存崩溃;App 文件数量少,mark2 前预注册的 AST 驻留内存可忽略。
# 重复注册由 _register_generic_template 查重跳过。
# ============================================================
def _PreRegisterAppGenericTemplates(mb: rawptr[memhub.MemBuddy],
def _PreRegisterAppGenericTemplates(mb: memhub.MemBuddy*,
entries: SrcFileEntry | t.CPtr,
file_count: int,
entry_size: sizet) -> int:
@@ -290,16 +290,16 @@ def _PreRegisterAppGenericTemplates(mb: rawptr[memhub.MemBuddy],
if bytes_read_pa < SRC_BUF_SIZE:
src_buf_pa[bytes_read_pa] = 0
# 解析 AST(只解析,不完整翻译;用永久池使模板节点跨 mark2 reset 存活)
perm_pa: rawptr[memhub.MemBuddy] = CompilerFactory.factory.PermPool
perm_pa: memhub.MemBuddy* = CompilerFactory.factory.PermPool
if perm_pa is None:
perm_pa = mb
lx_pa: rawptr[ast.Lexer] = ast.new_lexer(perm_pa)
lx_pa: ast.Lexer* = ast.new_lexer(perm_pa)
if lx_pa is None:
stdlib.free(src_buf_pa)
continue
ast._lexer_init(lx_pa, src_buf_pa, perm_pa)
tokens_pa: rawptr[ast.Token] = ast.tokenize(lx_pa)
tree_pa: rawptr[ast.AST] = ast.parse_tokens(perm_pa, tokens_pa)
tokens_pa: ast.Token* = ast.tokenize(lx_pa)
tree_pa: ast.AST* = ast.parse_tokens(perm_pa, tokens_pa)
if tree_pa is None:
stdlib.free(src_buf_pa)
continue
@@ -308,13 +308,13 @@ def _PreRegisterAppGenericTemplates(mb: rawptr[memhub.MemBuddy],
if ch_pa is not None:
cn_pa: sizet = len(ch_pa)
for ci_pa in range(cn_pa):
child_pa: rawptr[ast.AST] = ch_pa.get(ci_pa)
child_pa: ast.AST* = ch_pa.get(ci_pa)
if child_pa is None or child_pa.kind() != ast.ASTKind.ClassDef:
continue
cd_pa: rawptr[ast.ClassDef] = rawptr[ast.ClassDef](child_pa)
cd_pa: ast.ClassDef* = ast.ClassDef*(child_pa)
if cd_pa is None or cd_pa.name is None:
continue
tp_pa: list[str] | t.CPtr = cd_pa.type_params
tp_pa: list[str]* = cd_pa.type_params
if tp_pa is None:
continue
GenApi.set_current_file_type(ent_pa.Path)
@@ -608,7 +608,7 @@ def _PhaseADumpFailGraph(temp_dir: str, td_len: sizet, path: str, sha1: str) ->
stdio.fflush(None)
def RunMultiFileProject(mb: rawptr[memhub.MemBuddy],
def RunMultiFileProject(mb: memhub.MemBuddy*,
source_dir: str, temp_dir: str, output_dir: str,
cc_cmd: str, cc_flags: str,
linker_cmd: str, linker_flags: str, linker_output: str,
@@ -793,15 +793,15 @@ def RunMultiFileProject(mb: rawptr[memhub.MemBuddy],
continue
if bytes_read_vp2 < SRC_BUF_SIZE:
src_buf_vp2[bytes_read_vp2] = 0
lx_vp2: rawptr[ast.Lexer] = ast.new_lexer(mb)
lx_vp2: ast.Lexer* = ast.new_lexer(mb)
if lx_vp2 is None:
stdlib.free(src_buf_vp2)
vpi_failed_p2 += 1
VLogger.error(f"[Phase A-pre-vpi] {ent_vp2.Path} | 词法器分配失败(OOM)", "PhaseA")
continue
ast._lexer_init(lx_vp2, src_buf_vp2, mb)
tokens_vp2: rawptr[ast.Token] = ast.tokenize(lx_vp2)
tree_vp2: rawptr[ast.AST] = ast.parse_tokens(mb, tokens_vp2)
tokens_vp2: ast.Token* = ast.tokenize(lx_vp2)
tree_vp2: ast.AST* = ast.parse_tokens(mb, tokens_vp2)
if tree_vp2 is None:
stdlib.free(src_buf_vp2)
vpi_failed_p2 += 1
@@ -1348,7 +1348,7 @@ def RunMultiFileProject(mb: rawptr[memhub.MemBuddy],
# 拓扑排序可达 includes:被依赖模块先完整翻译。跨模块 vtable 生成
# 需要依赖模块的函数 TypeStr 已注册到全局表(如 astaux 继承 base 的 AST)
topo_idx: sizet | t.CPtr = (sizet | t.CPtr)(stdlib.malloc(8 * (store_count_mi + 1)))
topo_idx: sizet* = (sizet*)(stdlib.malloc(8 * (store_count_mi + 1)))
topo_count: int = 0
if topo_idx is None:
VLogger.error("拓扑排序索引分配失败,终止编译", "PhaseB+")