diff --git a/App/lib/Phase/BuildPipeline.vp b/App/lib/Phase/BuildPipeline.vp index 1c09b4a..a0931a2 100644 --- a/App/lib/Phase/BuildPipeline.vp +++ b/App/lib/Phase/BuildPipeline.vp @@ -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: ast.Lexer | t.CPtr = ast.new_lexer(mb) + lx: rawptr[ast.Lexer] = ast.new_lexer(mb) ast._lexer_init(lx, src_buf, mb) - tokens: ast.Token | t.CPtr = ast.tokenize(lx) - tree: ast.AST | t.CPtr = ast.parse_tokens(mb, tokens) + tokens: rawptr[ast.Token] = ast.tokenize(lx) + tree: rawptr[ast.AST] = ast.parse_tokens(mb, tokens) # parse 完成后 AST 树已独立,释放源代码缓冲区(避免 1MB/文件泄漏) stdlib.free(src_buf) if tree is None: diff --git a/App/lib/Phase/Phase1/Phase1Main.vp b/App/lib/Phase/Phase1/Phase1Main.vp index 388c60e..13f9c3b 100644 --- a/App/lib/Phase/Phase1/Phase1Main.vp +++ b/App/lib/Phase/Phase1/Phase1Main.vp @@ -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: ast.Lexer | t.CPtr = ast.new_lexer(mb) + lx_r: rawptr[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: ast.Token | t.CPtr = ast.tokenize(lx_r) - tree_r: ast.AST | t.CPtr = ast.parse_tokens(mb, tokens_r) + tokens_r: rawptr[ast.Token] = ast.tokenize(lx_r) + tree_r: rawptr[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: ast.Lexer | t.CPtr = ast.new_lexer(mb) + lx_pv: rawptr[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: ast.Token | t.CPtr = ast.tokenize(lx_pv) - tree_pv: ast.AST | t.CPtr = ast.parse_tokens(mb, tokens_pv) + tokens_pv: rawptr[ast.Token] = ast.tokenize(lx_pv) + tree_pv: rawptr[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: ast.Lexer | t.CPtr = ast.new_lexer(mb) + lx: rawptr[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: ast.Token | t.CPtr = ast.tokenize(lx) - tree: ast.AST | t.CPtr = ast.parse_tokens(mb, tokens) + tokens: rawptr[ast.Token] = ast.tokenize(lx) + tree: rawptr[ast.AST] = ast.parse_tokens(mb, tokens) if tree is None: VLogger.error(f"AST 解析失败: {file_path}", "Phase1") stdlib.free(src_buf) diff --git a/App/lib/Phase/Phase1/Phase1Scan.vp b/App/lib/Phase/Phase1/Phase1Scan.vp index 971bf3b..114986c 100644 --- a/App/lib/Phase/Phase1/Phase1Scan.vp +++ b/App/lib/Phase/Phase1/Phase1Scan.vp @@ -121,30 +121,30 @@ def _ScanClassInheritance(mb: rawptr[memhub.MemBuddy], src_buf[bytes_read] = 0 # 解析 AST - lx: ast.Lexer | t.CPtr = ast.new_lexer(mb) + lx: rawptr[ast.Lexer] = ast.new_lexer(mb) if lx is None: stdlib.free(src_buf) continue ast._lexer_init(lx, src_buf, mb) - tokens: ast.Token | t.CPtr = ast.tokenize(lx) - tree: ast.AST | t.CPtr = ast.parse_tokens(mb, tokens) + tokens: rawptr[ast.Token] = ast.tokenize(lx) + tree: rawptr[ast.AST] = ast.parse_tokens(mb, tokens) if tree is None: stdlib.free(src_buf) continue # 遍历 AST 顶层节点,收集 ClassDef - ch: list[ast.AST | t.CPtr] | t.CPtr = tree.children + ch: list[rawptr[ast.AST]] | t.CPtr = tree.children if ch is not None: cn: sizet = len(ch) for ci in range(cn): - child: ast.AST | t.CPtr = ch.get(ci) + child: rawptr[ast.AST] = ch.get(ci) if child is None: continue kd: int = child.kind() if kd != ast.ASTKind.ClassDef: continue - cd: ast.ClassDef | t.CPtr = (ast.ClassDef | t.CPtr)(child) + cd: rawptr[ast.ClassDef] = rawptr[ast.ClassDef](child) if cd is None or cd.name is None: continue @@ -294,25 +294,25 @@ def _PreRegisterAllGenericTemplates(mb: rawptr[memhub.MemBuddy], stdlib.free(src_buf_pg) continue # 泛型文件:永久池解析 → 注册模板(节点/表进 perm_pool,跨 reset 存活) - lx_pg: ast.Lexer | t.CPtr = ast.new_lexer(perm) + lx_pg: rawptr[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: ast.Token | t.CPtr = ast.tokenize(lx_pg) - tree_pg: ast.AST | t.CPtr = ast.parse_tokens(perm, tokens_pg) + tokens_pg: rawptr[ast.Token] = ast.tokenize(lx_pg) + tree_pg: rawptr[ast.AST] = ast.parse_tokens(perm, tokens_pg) if tree_pg is None: stdlib.free(src_buf_pg) continue # 遍历顶层 ClassDef,注册泛型模板(type_params 非 None) - ch_pg: list[ast.AST | t.CPtr] | t.CPtr = tree_pg.children + ch_pg: list[rawptr[ast.AST]] | t.CPtr = tree_pg.children if ch_pg is not None: cn_pg: sizet = len(ch_pg) for ci_pg in range(cn_pg): - child_pg: ast.AST | t.CPtr = ch_pg.get(ci_pg) + child_pg: rawptr[ast.AST] = ch_pg.get(ci_pg) if child_pg is None or child_pg.kind() != ast.ASTKind.ClassDef: continue - cd_pg: ast.ClassDef | t.CPtr = (ast.ClassDef | t.CPtr)(child_pg) + cd_pg: rawptr[ast.ClassDef] = rawptr[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 @@ -351,7 +351,7 @@ def _FindClassDefSha1(class_names_buf: bytes, def_sha1s_buf: bytes, # 命中即置 need_list/need_dict;误报无害(最多多编译两个空壳模块)。 # ============================================================ -def _AnnIsContainer(ann: ast.AST | t.CPtr) -> int: +def _AnnIsContainer(ann: rawptr[ast.AST]) -> int: """注解是否为 list/dict 容器(Name 裸名或 Subscript list[...]/dict[...]) 数组初始化(t.CArray[...] / 裸数组注解)返回 0,避免 _ScanTreeForContainers @@ -360,7 +360,7 @@ def _AnnIsContainer(ann: ast.AST | t.CPtr) -> int: while ann is not None: ak_c: int = ann.kind() if ak_c == ast.ASTKind.Name: - nm_c: ast.Name | t.CPtr = (ast.Name | t.CPtr)(ann) + nm_c: rawptr[ast.Name] = rawptr[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: ast.AST | t.CPtr) -> int: return 1 return 0 elif ak_c == ast.ASTKind.Subscript: - sub_c: ast.Subscript | t.CPtr = (ast.Subscript | t.CPtr)(ann) + sub_c: rawptr[ast.Subscript] = rawptr[ast.Subscript](ann) ann = sub_c.value else: return 0 return 0 -def _ScanTreeForContainers(node: ast.AST | t.CPtr, +def _ScanTreeForContainers(node: rawptr[ast.AST], need_list_box: t.CPtr, need_dict_box: t.CPtr, depth: int = 0): @@ -388,30 +388,30 @@ def _ScanTreeForContainers(node: ast.AST | t.CPtr, return k_s: int = node.kind() if k_s == ast.ASTKind.Name: - nm_s: ast.Name | t.CPtr = (ast.Name | t.CPtr)(node) + nm_s: rawptr[ast.Name] = rawptr[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: ast.Subscript | t.CPtr = (ast.Subscript | t.CPtr)(node) + sub_s: rawptr[ast.Subscript] = rawptr[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: ast.BinOp | t.CPtr = (ast.BinOp | t.CPtr)(node) + bop_s: rawptr[ast.BinOp] = rawptr[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: ast.Call | t.CPtr = (ast.Call | t.CPtr)(node) + cl_s2: rawptr[ast.Call] = rawptr[ast.Call](node) _ScanTreeForContainers(cl_s2.func, need_list_box, need_dict_box, depth + 1) - cl_args_s: list[ast.AST | t.CPtr] | t.CPtr = cl_s2.args + cl_args_s: list[rawptr[ast.AST]] | t.CPtr = cl_s2.args if cl_args_s is not None: na_s: sizet = len(cl_args_s) i_a2: sizet for i_a2 in range(na_s): _ScanTreeForContainers(cl_args_s.get(i_a2), need_list_box, need_dict_box, depth + 1) - cl_kws_s: list[ast.AST | t.CPtr] | t.CPtr = cl_s2.keywords + cl_kws_s: list[rawptr[ast.AST]] | t.CPtr = cl_s2.keywords if cl_kws_s is not None: nk_s: sizet = len(cl_kws_s) i_k2: sizet @@ -420,52 +420,52 @@ def _ScanTreeForContainers(node: ast.AST | t.CPtr, 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: ast.Assign | t.CPtr = (ast.Assign | t.CPtr)(node) + asn_s: rawptr[ast.Assign] = rawptr[ast.Assign](node) _ScanTreeForContainers(asn_s.value, need_list_box, need_dict_box, depth + 1) - tgts_s: list[ast.AST | t.CPtr] | t.CPtr = asn_s.targets + tgts_s: list[rawptr[ast.AST]] | t.CPtr = asn_s.targets if tgts_s is not None: nt_s: sizet = len(tgts_s) i_t2: sizet 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: ast.AnnAssign | t.CPtr = (ast.AnnAssign | t.CPtr)(node) + aa_s2: rawptr[ast.AnnAssign] = rawptr[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: ast.FunctionDef | t.CPtr = (ast.FunctionDef | t.CPtr)(node) + fn_s: rawptr[ast.FunctionDef] = rawptr[ast.FunctionDef](node) _ScanTreeForContainers(fn_s.returns, need_list_box, need_dict_box, depth + 1) - fn_args_s: ast.Arguments | t.CPtr = fn_s.args + fn_args_s: rawptr[ast.Arguments] = rawptr[ast.Arguments](fn_s.args) if fn_args_s is not None: - fa_s: list[ast.AST | t.CPtr] | t.CPtr = fn_args_s.args + fa_s: list[rawptr[ast.AST]] | t.CPtr = 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: ast.Arg | t.CPtr = (ast.Arg | t.CPtr)(fa_s.get(i_f2)) + arg_s: rawptr[ast.Arg] = rawptr[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: ast.ClassDef | t.CPtr = (ast.ClassDef | t.CPtr)(node) - bases_s: list[ast.AST | t.CPtr] | t.CPtr = cd_s.bases + cd_s: rawptr[ast.ClassDef] = rawptr[ast.ClassDef](node) + bases_s: list[rawptr[ast.AST]] | t.CPtr = cd_s.bases if bases_s is not None: nb_s: sizet = len(bases_s) i_b2: sizet 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: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(node) + at_s: rawptr[ast.Attribute] = rawptr[ast.Attribute](node) _ScanTreeForContainers(at_s.value, need_list_box, need_dict_box, depth + 1) elif k_s == ast.ASTKind.Tuple: - tu_s: ast.Tuple | t.CPtr = (ast.Tuple | t.CPtr)(node) - elts_s: list[ast.AST | t.CPtr] | t.CPtr = tu_s.elts + tu_s: rawptr[ast.Tuple] = rawptr[ast.Tuple](node) + elts_s: list[rawptr[ast.AST]] | t.CPtr = tu_s.elts if elts_s is not None: ne_s: sizet = len(elts_s) i_e2: sizet 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: ast.UnaryOp | t.CPtr = (ast.UnaryOp | t.CPtr)(node) + uop_s: rawptr[ast.UnaryOp] = rawptr[ast.UnaryOp](node) _ScanTreeForContainers(uop_s.operand, need_list_box, need_dict_box, depth + 1) elif k_s == ast.ASTKind.Expr: ex_s: ast.Expr | t.CPtr = (ast.Expr | t.CPtr)(node) @@ -476,7 +476,7 @@ def _ScanTreeForContainers(node: ast.AST | t.CPtr, elif k_s == ast.ASTKind.Compare: cp_s: ast.Compare | t.CPtr = (ast.Compare | t.CPtr)(node) _ScanTreeForContainers(cp_s.left, need_list_box, need_dict_box, depth + 1) - cps_s: list[ast.AST | t.CPtr] | t.CPtr = cp_s.comparators + cps_s: list[rawptr[ast.AST]] | t.CPtr = cp_s.comparators if cps_s is not None: nc_s: sizet = len(cps_s) i_c2: sizet @@ -484,7 +484,7 @@ def _ScanTreeForContainers(node: ast.AST | t.CPtr, _ScanTreeForContainers(cps_s.get(i_c2), need_list_box, need_dict_box, depth + 1) elif k_s == ast.ASTKind.BoolOp: bo_s: ast.BoolOp | t.CPtr = (ast.BoolOp | t.CPtr)(node) - bvs_s: list[ast.AST | t.CPtr] | t.CPtr = bo_s.values + bvs_s: list[rawptr[ast.AST]] | t.CPtr = bo_s.values if bvs_s is not None: nv_s: sizet = len(bvs_s) i_v2: sizet @@ -498,7 +498,7 @@ def _ScanTreeForContainers(node: ast.AST | t.CPtr, # need_dict_box[0] = 1 # 递归语句块子节点 if node.children is not None: - ch_s: list[ast.AST | t.CPtr] | t.CPtr = node.children + ch_s: list[rawptr[ast.AST]] | t.CPtr = node.children n_s: sizet = len(ch_s) ci_s: sizet for ci_s in range(n_s): diff --git a/App/lib/Phase/Phase2/__init__.vp b/App/lib/Phase/Phase2/__init__.vp index 53629a7..a230735 100644 --- a/App/lib/Phase/Phase2/__init__.vp +++ b/App/lib/Phase/Phase2/__init__.vp @@ -293,25 +293,25 @@ def _PreRegisterAppGenericTemplates(mb: rawptr[memhub.MemBuddy], perm_pa: rawptr[memhub.MemBuddy] = CompilerFactory.factory.PermPool if perm_pa is None: perm_pa = mb - lx_pa: ast.Lexer | t.CPtr = ast.new_lexer(perm_pa) + lx_pa: rawptr[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: ast.Token | t.CPtr = ast.tokenize(lx_pa) - tree_pa: ast.AST | t.CPtr = ast.parse_tokens(perm_pa, tokens_pa) + tokens_pa: rawptr[ast.Token] = ast.tokenize(lx_pa) + tree_pa: rawptr[ast.AST] = ast.parse_tokens(perm_pa, tokens_pa) if tree_pa is None: stdlib.free(src_buf_pa) continue # 遍历顶层 ClassDef,注册泛型模板(type_params 非 None) - ch_pa: list[ast.AST | t.CPtr] | t.CPtr = tree_pa.children + ch_pa: list[rawptr[ast.AST]] | t.CPtr = tree_pa.children if ch_pa is not None: cn_pa: sizet = len(ch_pa) for ci_pa in range(cn_pa): - child_pa: ast.AST | t.CPtr = ch_pa.get(ci_pa) + child_pa: rawptr[ast.AST] = ch_pa.get(ci_pa) if child_pa is None or child_pa.kind() != ast.ASTKind.ClassDef: continue - cd_pa: ast.ClassDef | t.CPtr = (ast.ClassDef | t.CPtr)(child_pa) + cd_pa: rawptr[ast.ClassDef] = rawptr[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 @@ -792,15 +792,15 @@ def RunMultiFileProject(mb: rawptr[memhub.MemBuddy], continue if bytes_read_vp2 < SRC_BUF_SIZE: src_buf_vp2[bytes_read_vp2] = 0 - lx_vp2: ast.Lexer | t.CPtr = ast.new_lexer(mb) + lx_vp2: rawptr[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: ast.Token | t.CPtr = ast.tokenize(lx_vp2) - tree_vp2: ast.AST | t.CPtr = ast.parse_tokens(mb, tokens_vp2) + tokens_vp2: rawptr[ast.Token] = ast.tokenize(lx_vp2) + tree_vp2: rawptr[ast.AST] = ast.parse_tokens(mb, tokens_vp2) if tree_vp2 is None: stdlib.free(src_buf_vp2) vpi_failed_p2 += 1 diff --git a/App/lib/Stub/StubGen/Converter.vp b/App/lib/Stub/StubGen/Converter.vp index 90e6032..c208ff0 100644 --- a/App/lib/Stub/StubGen/Converter.vp +++ b/App/lib/Stub/StubGen/Converter.vp @@ -20,22 +20,22 @@ import sys # 用于 .vpi 存根文件生成时计算 BinOp 表达式(如 A | B, A + B)的整数值。 # 支持 BitOr/BitAnd/Add/Sub 以及嵌套的 Name(引用已注册的 CDefine 常量)。 # ============================================================ -def _eval_binop_valid(node: ast.AST | t.CPtr) -> int: +def _eval_binop_valid(node: rawptr[ast.AST]) -> int: """检查 BinOp 节点是否可计算(所有叶子节点都是常量或已注册的 CDefine)""" if node is None: return 0 k: int = node.kind() if k == ast.ASTKind.Constant: - cn: ast.Constant | t.CPtr = (ast.Constant | t.CPtr)(node) + cn: rawptr[ast.Constant] = rawptr[ast.Constant](node) if cn.const_kind == ast.CONST_INT: return 1 return 0 if k == ast.ASTKind.UnaryOp: - uop: ast.UnaryOp | t.CPtr = (ast.UnaryOp | t.CPtr)(node) + uop: rawptr[ast.UnaryOp] = rawptr[ast.UnaryOp](node) if uop.operand is not None: return _eval_binop_valid(uop.operand) return 0 if k == ast.ASTKind.BinOp: - bop: ast.BinOp | t.CPtr = (ast.BinOp | t.CPtr)(node) + bop: rawptr[ast.BinOp] = rawptr[ast.BinOp](node) if bop.left is not None and bop.right is not None: if _eval_binop_valid(bop.left) != 0: if _eval_binop_valid(bop.right) != 0: @@ -43,7 +43,7 @@ def _eval_binop_valid(node: ast.AST | t.CPtr) -> int: return 0 if k == ast.ASTKind.Name: # Name 引用:检查是否是已注册的 CDefine 常量 - nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(node) + nm: rawptr[ast.Name] = rawptr[ast.Name](node) if nm.id is not None: # 从本地 CDefine 表查找 val: int = _lookup_cdefine_for_pyi(nm.id) @@ -53,18 +53,18 @@ def _eval_binop_valid(node: ast.AST | t.CPtr) -> int: return 0 -def _eval_binop_int(node: ast.AST | t.CPtr) -> int64: +def _eval_binop_int(node: rawptr[ast.AST]) -> int64: """递归计算 BinOp 节点的整数值(64 位,避免大整数 CDefine 截断)""" if node is None: return 0 k: int = node.kind() if k == ast.ASTKind.Constant: - cn: ast.Constant | t.CPtr = (ast.Constant | t.CPtr)(node) + cn: rawptr[ast.Constant] = rawptr[ast.Constant](node) if cn.const_kind == ast.CONST_INT: return cn.int_val return 0 if k == ast.ASTKind.UnaryOp: - uop: ast.UnaryOp | t.CPtr = (ast.UnaryOp | t.CPtr)(node) + uop: rawptr[ast.UnaryOp] = rawptr[ast.UnaryOp](node) if uop.op == ast.OpKind.USub and uop.operand is not None: return -_eval_binop_int(uop.operand) if uop.op == ast.OpKind.UAdd and uop.operand is not None: @@ -73,36 +73,25 @@ def _eval_binop_int(node: ast.AST | t.CPtr) -> int64: return ~_eval_binop_int(uop.operand) return 0 if k == ast.ASTKind.BinOp: - bop: ast.BinOp | t.CPtr = (ast.BinOp | t.CPtr)(node) + bop: rawptr[ast.BinOp] = rawptr[ast.BinOp](node) if bop.left is None or bop.right is None: return 0 lv: int64 = _eval_binop_int(bop.left) rv: int64 = _eval_binop_int(bop.right) - if bop.op == ast.OpKind.BitOr: - return lv | rv - if bop.op == ast.OpKind.BitAnd: - return lv & rv - if bop.op == ast.OpKind.BitXor: - return lv ^ rv - if bop.op == ast.OpKind.Add: - return lv + rv - if bop.op == ast.OpKind.Sub: - return lv - rv - if bop.op == ast.OpKind.Mult: - return lv * rv - if bop.op == ast.OpKind.Div: - return lv // rv - if bop.op == ast.OpKind.FloorDiv: - return lv // rv - if bop.op == ast.OpKind.Mod: - return lv % rv - if bop.op == ast.OpKind.LShift: - return lv << rv - if bop.op == ast.OpKind.RShift: - return lv >> rv + if bop.op == ast.OpKind.BitOr: return lv | rv + if bop.op == ast.OpKind.BitAnd: return lv & rv + if bop.op == ast.OpKind.BitXor: return lv ^ rv + if bop.op == ast.OpKind.Add: return lv + rv + if bop.op == ast.OpKind.Sub: return lv - rv + if bop.op == ast.OpKind.Mult: return lv * rv + if bop.op == ast.OpKind.Div: return lv // rv + if bop.op == ast.OpKind.FloorDiv: return lv // rv + if bop.op == ast.OpKind.Mod: return lv % rv + if bop.op == ast.OpKind.LShift: return lv << rv + if bop.op == ast.OpKind.RShift: return lv >> rv return 0 if k == ast.ASTKind.Name: - nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(node) + nm: rawptr[ast.Name] = rawptr[ast.Name](node) if nm.id is not None: return _lookup_cdefine_for_pyi(nm.id) return 0 @@ -127,7 +116,6 @@ def _lookup_cdefine_for_pyi(name: str) -> int64: if _g_pyi_cdef_names is not None and _g_pyi_cdef_vals is not None: # 循环上限用 _g_pyi_cdef_count,且绝不能用 len()/.get:i8** 指针数组上 len() 回退 strlen(基址当字符串算长度 → 垃圾小值 → 靠后注册项查不到),.get 会被误分派为 HashTable.get(索引 inttoptr 成 key 指针 → 零页崩溃);用 t.CPtr(base + i*8) + e[0] 依次取名。 pn: sizet = sizet(_g_pyi_cdef_count) - pi: sizet for pi in range(pn): entry_pc: str | t.CPtr = t.CPtr(uint64(_g_pyi_cdef_names) + pi * 8) pnm: str = entry_pc[0] @@ -142,13 +130,13 @@ def _lookup_cdefine_for_pyi(name: str) -> int64: return 0 -def _eval_cdefine_value_cache(node: ast.AST | t.CPtr) -> int64: +def _eval_cdefine_value_cache(node: rawptr[ast.AST]) -> int64: """求值 CDefine 值(Constant/UnaryOp/BinOp/Call/Name),供 vpi 预处理注册缓存""" if node is None: return 0 k: int = node.kind() if k == ast.ASTKind.Constant: - cn_c: ast.Constant | t.CPtr = (ast.Constant | t.CPtr)(node) + cn_c: rawptr[ast.Constant] = rawptr[ast.Constant](node) if cn_c.const_kind == ast.CONST_INT: return cn_c.int_val if cn_c.const_kind == ast.CONST_BOOL: @@ -160,12 +148,12 @@ def _eval_cdefine_value_cache(node: ast.AST | t.CPtr) -> int64: if k == ast.ASTKind.BinOp: return _eval_binop_int(node) if k == ast.ASTKind.Call: - cl_c: ast.Call | t.CPtr = (ast.Call | t.CPtr)(node) + cl_c: rawptr[ast.Call] = rawptr[ast.Call](node) if cl_c.args is not None and len(cl_c.args) > 0: return _eval_cdefine_value_cache(cl_c.args.get(0)) return 0 if k == ast.ASTKind.Name: - nm_c: ast.Name | t.CPtr = (ast.Name | t.CPtr)(node) + nm_c: rawptr[ast.Name] = rawptr[ast.Name](node) if nm_c.id is not None: return _lookup_cdefine_for_pyi(nm_c.id) return 0 @@ -221,7 +209,7 @@ def _PyiIndent(buf: bytes, buf_size: sizet, pos: sizet, # 支持: Name, Attribute, Subscript, BinOp(|), Constant(前向引用), Tuple # ============================================================ def _PyiTypeStr(buf: bytes, buf_size: sizet, pos: sizet, - annot: ast.AST | t.CPtr, + annot: rawptr[ast.AST], depth: int = 0) -> sizet: """递归生成类型注解字符串,返回新的 pos""" # 递归深度守卫:AST 损坏成自引用环(Attribute.value/Subscript.slice/ @@ -237,14 +225,14 @@ def _PyiTypeStr(buf: bytes, buf_size: sizet, pos: sizet, # Name: 简单类型名 (如 int, str, MyClass) if k == ast.ASTKind.Name: - nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(annot) + nm: rawptr[ast.Name] = rawptr[ast.Name](annot) if nm.id is not None: return _PyiEmit(buf, buf_size, pos, nm.id) return _PyiEmit(buf, buf_size, pos, "int") # Attribute: 属性引用 (如 int, memhub.MemBuddy) if k == ast.ASTKind.Attribute: - at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(annot) + at: rawptr[ast.Attribute] = rawptr[ast.Attribute](annot) pos = _PyiTypeStr(buf, buf_size, pos, at.value, depth + 1) pos = _PyiEmit(buf, buf_size, pos, ".") if at.attr is not None: @@ -253,7 +241,7 @@ def _PyiTypeStr(buf: bytes, buf_size: sizet, pos: sizet, # Subscript: 下标类型 (如 list[int], t.CArray[elem, count]) if k == ast.ASTKind.Subscript: - sub: ast.Subscript | t.CPtr = (ast.Subscript | t.CPtr)(annot) + sub: rawptr[ast.Subscript] = rawptr[ast.Subscript](annot) pos = _PyiTypeStr(buf, buf_size, pos, sub.value, depth + 1) pos = _PyiEmit(buf, buf_size, pos, "[") pos = _PyiTypeStr(buf, buf_size, pos, sub.slice, depth + 1) @@ -262,7 +250,7 @@ def _PyiTypeStr(buf: bytes, buf_size: sizet, pos: sizet, # BinOp: 联合类型 (如 int | str, File | t.CPtr) if k == ast.ASTKind.BinOp: - bop: ast.BinOp | t.CPtr = (ast.BinOp | t.CPtr)(annot) + bop: rawptr[ast.BinOp] = rawptr[ast.BinOp](annot) pos = _PyiTypeStr(buf, buf_size, pos, bop.left, depth + 1) pos = _PyiEmit(buf, buf_size, pos, " | ") pos = _PyiTypeStr(buf, buf_size, pos, bop.right, depth + 1) @@ -270,7 +258,7 @@ def _PyiTypeStr(buf: bytes, buf_size: sizet, pos: sizet, # Constant: 字符串前向引用 (如 'MyClass')、None 或数字常量(CArray count) if k == ast.ASTKind.Constant: - cn: ast.Constant | t.CPtr = (ast.Constant | t.CPtr)(annot) + cn: rawptr[ast.Constant] = rawptr[ast.Constant](annot) if cn.const_kind == ast.CONST_STR: pos = _PyiEmit(buf, buf_size, pos, "'") if cn.str_val is not None: @@ -294,32 +282,32 @@ def _PyiTypeStr(buf: bytes, buf_size: sizet, pos: sizet, # Tuple: 多参数下标 (如 Dict[str, int]) if k == ast.ASTKind.Tuple: - tup: ast.Tuple | t.CPtr = (ast.Tuple | t.CPtr)(annot) + tup: rawptr[ast.Tuple] = rawptr[ast.Tuple](annot) if tup.elts is not None: - tup_elts: list[ast.AST | t.CPtr] | t.CPtr = tup.elts + tup_elts: list[rawptr[ast.AST]] | t.CPtr = tup.elts tn: sizet = len(tup_elts) ti: sizet = 0 while ti < tn: if ti > 0: pos = _PyiEmit(buf, buf_size, pos, ", ") - el: ast.AST | t.CPtr = tup_elts.get(ti) + el: rawptr[ast.AST] = tup_elts.get(ti) pos = _PyiTypeStr(buf, buf_size, pos, el, depth + 1) ti += 1 return pos # Call: 函数调用表达式 (用于装饰器如 @t.NoVTable()) if k == ast.ASTKind.Call: - cl: ast.Call | t.CPtr = (ast.Call | t.CPtr)(annot) + cl: rawptr[ast.Call] = rawptr[ast.Call](annot) pos = _PyiTypeStr(buf, buf_size, pos, cl.func, depth + 1) pos = _PyiEmit(buf, buf_size, pos, "(") if cl.args is not None: - cl_args: list[ast.AST | t.CPtr] | t.CPtr = cl.args + cl_args: list[rawptr[ast.AST]] | t.CPtr = cl.args can: sizet = len(cl_args) cai: sizet = 0 while cai < can: if cai > 0: pos = _PyiEmit(buf, buf_size, pos, ", ") - ca: ast.AST | t.CPtr = cl_args.get(cai) + ca: rawptr[ast.AST] = cl_args.get(cai) pos = _PyiTypeStr(buf, buf_size, pos, ca, depth + 1) cai += 1 pos = _PyiEmit(buf, buf_size, pos, ")") @@ -340,7 +328,7 @@ def _PyiTypeStr(buf: bytes, buf_size: sizet, pos: sizet, # 支持: Constant(int/str/bool/None), Name(CDefine 常量), UnaryOp。 # ============================================================ def _PyiDefaultStr(buf: bytes, buf_size: sizet, pos: sizet, - node: ast.AST | t.CPtr, + node: rawptr[ast.AST], depth: int = 0) -> sizet: """生成默认值表达式文本到 buf,返回新的 pos""" # 递归深度守卫:AST 损坏成自引用环时 fail-fast 终止(同 _PyiTypeStr) @@ -353,7 +341,7 @@ def _PyiDefaultStr(buf: bytes, buf_size: sizet, pos: sizet, k: int = node.kind() # Constant: 数字/字符串/bool/None 直接输出字面量 if k == ast.ASTKind.Constant: - cn: ast.Constant | t.CPtr = (ast.Constant | t.CPtr)(node) + cn: rawptr[ast.Constant] = rawptr[ast.Constant](node) if cn.const_kind == ast.CONST_INT or cn.const_kind == ast.CONST_CHAR: num_buf_dv: str = stdlib.malloc(24) if num_buf_dv is not None: @@ -376,14 +364,14 @@ def _PyiDefaultStr(buf: bytes, buf_size: sizet, pos: sizet, # Name: CDefine 常量名(如 share: ULONG = SHARE_READ) if k == ast.ASTKind.Name: - nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(node) + nm: rawptr[ast.Name] = rawptr[ast.Name](node) if nm.id is not None: return _PyiEmit(buf, buf_size, pos, nm.id) return pos # UnaryOp: 一元运算(如 -1, ~0) if k == ast.ASTKind.UnaryOp: - uop: ast.UnaryOp | t.CPtr = (ast.UnaryOp | t.CPtr)(node) + uop: rawptr[ast.UnaryOp] = rawptr[ast.UnaryOp](node) if uop.op == ast.OpKind.USub: pos = _PyiEmit(buf, buf_size, pos, "-") elif uop.op == ast.OpKind.UAdd: @@ -407,21 +395,21 @@ def _PyiDefaultStr(buf: bytes, buf_size: sizet, pos: sizet, # 据此合成 `-> tuple[a, b, c]`(tuple 分支同样打包成 Struct),使 stub declare 与 define 的返回类型一致。 # 返回 None = 装饰器列表里没有 CReturn。 # ============================================================ -def _PyiCreturnArgs(decorators: list[ast.AST | t.CPtr] | t.CPtr) -> list[ast.AST | t.CPtr] | t.CPtr: +def _PyiCreturnArgs(decorators: list[rawptr[ast.AST]] | t.CPtr) -> list[rawptr[ast.AST]] | t.CPtr: """在装饰器列表里找 @c.CReturn(...),返回其实参列表;未找到返回 None""" if decorators is None: return None dn: sizet = len(decorators) di: sizet = 0 while di < dn: - dnode: ast.AST | t.CPtr = decorators.get(di) + dnode: rawptr[ast.AST] = decorators.get(di) di += 1 if dnode is None or dnode.kind() != ast.ASTKind.Call: continue - dcall: ast.Call | t.CPtr = (ast.Call | t.CPtr)(dnode) + dcall: rawptr[ast.Call] = rawptr[ast.Call](dnode) if dcall.func is None or dcall.func.kind() != ast.ASTKind.Attribute: continue - dat: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(dcall.func) + dat: rawptr[ast.Attribute] = rawptr[ast.Attribute](dcall.func) if dat.attr is not None and string.strcmp(dat.attr, "CReturn") == 0: return dcall.args return None @@ -433,16 +421,16 @@ def _PyiCreturnArgs(decorators: list[ast.AST | t.CPtr] | t.CPtr) -> list[ast.AST # 格式: def name(param: Type, ...) -> ReturnType: pass # ============================================================ def _PyiFunction(buf: bytes, buf_size: sizet, pos: sizet, - fn: ast.FunctionDef | t.CPtr, + fn: rawptr[ast.FunctionDef], indent_level: int, class_name: str) -> sizet: """生成函数签名到 buf,返回新的 pos""" # 装饰器 if fn.decorator_list is not None: - fn_decorator_list: list[ast.AST | t.CPtr] | t.CPtr = fn.decorator_list + fn_decorator_list: list[rawptr[ast.AST]] | t.CPtr = fn.decorator_list dn: sizet = len(fn_decorator_list) di: sizet = 0 while di < dn: - dec: ast.AST | t.CPtr = fn_decorator_list.get(di) + dec: rawptr[ast.AST] = fn_decorator_list.get(di) if dec is not None: pos = _PyiIndent(buf, buf_size, pos, indent_level) pos = _PyiEmit(buf, buf_size, pos, "@") @@ -457,19 +445,19 @@ def _PyiFunction(buf: bytes, buf_size: sizet, pos: sizet, pos = _PyiEmit(buf, buf_size, pos, "(") # 参数列表 - args_node: ast.AST | t.CPtr = fn.args + args_node: rawptr[ast.AST] = fn.args if args_node is not None: - args: ast.Arguments | t.CPtr = (ast.Arguments | t.CPtr)(args_node) + args: rawptr[ast.Arguments] = rawptr[ast.Arguments](args_node) first: int = 1 # 位置参数 if args.args is not None: - args_args: list[ast.AST | t.CPtr] | t.CPtr = args.args + args_args: list[rawptr[ast.AST]] | t.CPtr = args.args an: sizet = len(args_args) # 默认值右对齐到 args 尾部:defaults[i] 对应 args[an - dn + i]。 # 必须输出 '= ',否则 VpiReader 解析出的默认参数表无条目,跨模块缺参调用(如 depth=0)读到栈垃圾。 # arg_defaults 必须内联声明:联合接收者的 .get 会被误分派,预声明 + 重赋值会解析成 list[int].get 返回 i32 截断指针而崩溃。 - arg_defaults: list[ast.AST | t.CPtr] | t.CPtr = args.defaults + arg_defaults: list[rawptr[ast.AST]] | t.CPtr = args.defaults dn: sizet = 0 if arg_defaults is not None: dn = len(arg_defaults) @@ -478,7 +466,7 @@ def _PyiFunction(buf: bytes, buf_size: sizet, pos: sizet, if first == 0: pos = _PyiEmit(buf, buf_size, pos, ", ") first = 0 - ag: ast.Arg | t.CPtr = (ast.Arg | t.CPtr)(args_args.get(ai)) + ag: rawptr[ast.Arg] = rawptr[ast.Arg](args_args.get(ai)) if ag.arg is not None: pos = _PyiEmit(buf, buf_size, pos, ag.arg) if ag.annotation is not None: @@ -486,7 +474,7 @@ def _PyiFunction(buf: bytes, buf_size: sizet, pos: sizet, pos = _PyiTypeStr(buf, buf_size, pos, ag.annotation) if arg_defaults is not None and an - dn <= ai: di: sizet = ai - (an - dn) - dnode: ast.AST | t.CPtr = arg_defaults.get(di) + dnode: rawptr[ast.AST] = arg_defaults.get(di) if dnode is not None: pos = _PyiEmit(buf, buf_size, pos, " = ") pos = _PyiDefaultStr(buf, buf_size, pos, dnode) @@ -498,7 +486,7 @@ def _PyiFunction(buf: bytes, buf_size: sizet, pos: sizet, pos = _PyiEmit(buf, buf_size, pos, ", ") first = 0 pos = _PyiEmit(buf, buf_size, pos, "*") - va: ast.Arg | t.CPtr = (ast.Arg | t.CPtr)(args.vararg) + va: rawptr[ast.Arg] = rawptr[ast.Arg](args.vararg) if va.arg is not None: pos = _PyiEmit(buf, buf_size, pos, va.arg) @@ -508,7 +496,7 @@ def _PyiFunction(buf: bytes, buf_size: sizet, pos: sizet, pos = _PyiEmit(buf, buf_size, pos, ", ") first = 0 pos = _PyiEmit(buf, buf_size, pos, "**") - kw: ast.Arg | t.CPtr = (ast.Arg | t.CPtr)(args.kwarg) + kw: rawptr[ast.Arg] = rawptr[ast.Arg](args.kwarg) if kw.arg is not None: pos = _PyiEmit(buf, buf_size, pos, kw.arg) @@ -520,7 +508,7 @@ def _PyiFunction(buf: bytes, buf_size: sizet, pos: sizet, pos = _PyiTypeStr(buf, buf_size, pos, fn.returns) else: # 无 `->` 注解但带 @c.CReturn(...):合成 " -> tuple[a, b, c]"(N11) - cre_args: list[ast.AST | t.CPtr] | t.CPtr = _PyiCreturnArgs(fn.decorator_list) + cre_args: list[rawptr[ast.AST]] | t.CPtr = _PyiCreturnArgs(fn.decorator_list) if cre_args is not None: cre_n: sizet = len(cre_args) if cre_n > 0: @@ -546,15 +534,15 @@ def _PyiFunction(buf: bytes, buf_size: sizet, pos: sizet, # def method(self: Name, ...) -> RetType: pass # ============================================================ def _PyiClass(buf: bytes, buf_size: sizet, pos: sizet, - cls: ast.ClassDef | t.CPtr, indent_level: int) -> sizet: + cls: rawptr[ast.ClassDef], indent_level: int) -> sizet: """生成类定义到 buf,返回新的 pos""" # 装饰器 if cls.decorator_list is not None: - cls_decorator_list: list[ast.AST | t.CPtr] | t.CPtr = cls.decorator_list + cls_decorator_list: list[rawptr[ast.AST]] | t.CPtr = cls.decorator_list dcn: sizet = len(cls_decorator_list) dci: sizet = 0 while dci < dcn: - ddec: ast.AST | t.CPtr = cls_decorator_list.get(dci) + ddec: rawptr[ast.AST] = cls_decorator_list.get(dci) if ddec is not None: pos = _PyiIndent(buf, buf_size, pos, indent_level) pos = _PyiEmit(buf, buf_size, pos, "@") @@ -569,7 +557,7 @@ def _PyiClass(buf: bytes, buf_size: sizet, pos: sizet, # PEP 695 类型参数 (class Foo[T]:) if cls.type_params is not None: - cls_type_params: list[ast.AST | t.CPtr] | t.CPtr = cls.type_params + cls_type_params: list[rawptr[ast.AST]] | t.CPtr = cls.type_params tpn: sizet = len(cls_type_params) if tpn > 0: pos = _PyiEmit(buf, buf_size, pos, "[") @@ -585,7 +573,7 @@ def _PyiClass(buf: bytes, buf_size: sizet, pos: sizet, # 基类 if cls.bases is not None: - cls_bases: list[ast.AST | t.CPtr] | t.CPtr = cls.bases + cls_bases: list[rawptr[ast.AST]] | t.CPtr = cls.bases bn: sizet = len(cls_bases) if bn > 0: pos = _PyiEmit(buf, buf_size, pos, "(") @@ -593,7 +581,7 @@ def _PyiClass(buf: bytes, buf_size: sizet, pos: sizet, while bi < bn: if bi > 0: pos = _PyiEmit(buf, buf_size, pos, ", ") - base: ast.AST | t.CPtr = cls_bases.get(bi) + base: rawptr[ast.AST] = cls_bases.get(bi) pos = _PyiTypeStr(buf, buf_size, pos, base) bi += 1 pos = _PyiEmit(buf, buf_size, pos, ")") @@ -604,32 +592,32 @@ def _PyiClass(buf: bytes, buf_size: sizet, pos: sizet, has_member: int = 0 if cls.children is not None: - cls_children: list[ast.AST | t.CPtr] | t.CPtr = cls.children + cls_children: list[rawptr[ast.AST]] | t.CPtr = cls.children cn: sizet = len(cls_children) ci: sizet = 0 while ci < cn: - stmt: ast.AST | t.CPtr = cls_children.get(ci) + stmt: rawptr[ast.AST] = cls_children.get(ci) if stmt is not None: sk: int = stmt.kind() # 方法 if sk == ast.ASTKind.FunctionDef: - mfn: ast.FunctionDef | t.CPtr = (ast.FunctionDef | t.CPtr)(stmt) + mfn: rawptr[ast.FunctionDef] = rawptr[ast.FunctionDef](stmt) # __init__ 方法:先提取 self.x: Type 属性 if mfn.name is not None and string.strcmp(mfn.name, "__init__") == 0: if mfn.children is not None: - mfn_children: list[ast.AST | t.CPtr] | t.CPtr = mfn.children + mfn_children: list[rawptr[ast.AST]] | t.CPtr = mfn.children icn: sizet = len(mfn_children) ici: sizet = 0 while ici < icn: - ibody: ast.AST | t.CPtr = mfn_children.get(ici) + ibody: rawptr[ast.AST] = mfn_children.get(ici) if ibody is not None and ibody.kind() == ast.ASTKind.AnnAssign: - iaa: ast.AnnAssign | t.CPtr = (ast.AnnAssign | t.CPtr)(ibody) + iaa: rawptr[ast.AnnAssign] = rawptr[ast.AnnAssign](ibody) if iaa.target is not None and iaa.target.kind() == ast.ASTKind.Attribute: - iat: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(iaa.target) + iat: rawptr[ast.Attribute] = rawptr[ast.Attribute](iaa.target) # 检查 target.value 是否为 Name("self") if iat.value is not None and iat.value.kind() == ast.ASTKind.Name: - iavn: ast.Name | t.CPtr = (ast.Name | t.CPtr)(iat.value) + iavn: rawptr[ast.Name] = rawptr[ast.Name](iat.value) if iavn.id is None or string.strcmp(iavn.id, "self") != 0: ici += 1 continue @@ -646,9 +634,9 @@ def _PyiClass(buf: bytes, buf_size: sizet, pos: sizet, # 带注解的属性 elif sk == ast.ASTKind.AnnAssign: - aa: ast.AnnAssign | t.CPtr = (ast.AnnAssign | t.CPtr)(stmt) + aa: rawptr[ast.AnnAssign] = rawptr[ast.AnnAssign](stmt) if aa.target is not None and aa.target.kind() == ast.ASTKind.Name: - tn: ast.Name | t.CPtr = (ast.Name | t.CPtr)(aa.target) + tn: rawptr[ast.Name] = rawptr[ast.Name](aa.target) pos = _PyiIndent(buf, buf_size, pos, indent_level + 1) if tn.id is not None: pos = _PyiEmit(buf, buf_size, pos, tn.id) @@ -659,7 +647,7 @@ def _PyiClass(buf: bytes, buf_size: sizet, pos: sizet, # 嵌套类 elif sk == ast.ASTKind.ClassDef: - ncls: ast.ClassDef | t.CPtr = (ast.ClassDef | t.CPtr)(stmt) + ncls: rawptr[ast.ClassDef] = rawptr[ast.ClassDef](stmt) pos = _PyiClass(buf, buf_size, pos, ncls, indent_level + 1) has_member = 1 ci += 1 @@ -678,7 +666,7 @@ def _PyiClass(buf: bytes, buf_size: sizet, pos: sizet, # Args: mb 内存池(保留以符合调用约定,实际未使用);tree AST Module 根节点;rel_path 相对路径(用于模块名,当前未使用);buf 输出缓冲区;buf_size 缓冲区大小 # Returns: 写入的字节数(0 表示失败) # ============================================================ -def _GeneratePyiFromAst(mb: rawptr[memhub.MemBuddy], tree: ast.AST | t.CPtr, +def _GeneratePyiFromAst(mb: rawptr[memhub.MemBuddy], tree: rawptr[ast.AST], rel_path: str, buf: bytes, buf_size: sizet) -> sizet: """从 AST 生成 .vpi 存根文件内容到 buf""" @@ -691,19 +679,19 @@ def _GeneratePyiFromAst(mb: rawptr[memhub.MemBuddy], tree: ast.AST | t.CPtr, # 必须带 global 声明:TPV 语义下函数内对模块级变量赋值无 global 时会创建局部变量,_lookup_cdefine_for_pyi 读到的仍是模块级 None,缓存永不命中。 global _g_pyi_cdef_names, _g_pyi_cdef_vals, _g_pyi_cdef_count if tree.children is not None: - pre_children: list[ast.AST | t.CPtr] | t.CPtr = tree.children + pre_children: list[rawptr[ast.AST]] | t.CPtr = tree.children pcn: sizet = len(pre_children) # 第一遍:数本文件 t.CDefine 声明数(C 数组需先定长分配) _g_pyi_cdef_count = 0 for pci0 in range(pcn): - stmt_pc0: ast.AST | t.CPtr = pre_children.get(pci0) + stmt_pc0: rawptr[ast.AST] = pre_children.get(pci0) if stmt_pc0 is not None and stmt_pc0.kind() == ast.ASTKind.AnnAssign: - aa_pc0: ast.AnnAssign | t.CPtr = (ast.AnnAssign | t.CPtr)(stmt_pc0) + aa_pc0: rawptr[ast.AnnAssign] = rawptr[ast.AnnAssign](stmt_pc0) if aa_pc0.target is not None and aa_pc0.target.kind() == ast.ASTKind.Name \ and aa_pc0.annotation is not None: - tgt_pc0: ast.Name | t.CPtr = (ast.Name | t.CPtr)(aa_pc0.target) + tgt_pc0: rawptr[ast.Name] = rawptr[ast.Name](aa_pc0.target) if tgt_pc0.id is not None and aa_pc0.annotation.kind() == ast.ASTKind.Attribute: - ann_pc0: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(aa_pc0.annotation) + ann_pc0: rawptr[ast.Attribute] = rawptr[ast.Attribute](aa_pc0.annotation) if ann_pc0.attr is not None and string.strcmp(ann_pc0.attr, "CDefine") == 0: _g_pyi_cdef_count += 1 if _g_pyi_cdef_count > 0: @@ -713,14 +701,14 @@ def _GeneratePyiFromAst(mb: rawptr[memhub.MemBuddy], tree: ast.AST | t.CPtr, pci: sizet = 0 cdi: int = 0 for pci in range(pcn): - stmt_pc: ast.AST | t.CPtr = pre_children.get(pci) + stmt_pc: rawptr[ast.AST] = pre_children.get(pci) if stmt_pc is not None and stmt_pc.kind() == ast.ASTKind.AnnAssign: - aa_pc: ast.AnnAssign | t.CPtr = (ast.AnnAssign | t.CPtr)(stmt_pc) + aa_pc: rawptr[ast.AnnAssign] = rawptr[ast.AnnAssign](stmt_pc) if aa_pc.target is not None and aa_pc.target.kind() == ast.ASTKind.Name \ and aa_pc.annotation is not None: - tgt_pc: ast.Name | t.CPtr = (ast.Name | t.CPtr)(aa_pc.target) + tgt_pc: rawptr[ast.Name] = rawptr[ast.Name](aa_pc.target) if tgt_pc.id is not None and aa_pc.annotation.kind() == ast.ASTKind.Attribute: - ann_pc: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(aa_pc.annotation) + ann_pc: rawptr[ast.Attribute] = rawptr[ast.Attribute](aa_pc.annotation) if ann_pc.attr is not None and string.strcmp(ann_pc.attr, "CDefine") == 0: if _g_pyi_cdef_names is not None and _g_pyi_cdef_vals is not None: slot_pc: str | t.CPtr = t.CPtr(uint64(_g_pyi_cdef_names) + cdi * 8) @@ -736,21 +724,21 @@ def _GeneratePyiFromAst(mb: rawptr[memhub.MemBuddy], tree: ast.AST | t.CPtr, buf[pos] = 0 return pos - tree_children: list[ast.AST | t.CPtr] | t.CPtr = tree.children + tree_children: list[rawptr[ast.AST]] | t.CPtr = tree.children n: sizet = len(tree_children) # 第一遍扫描:检测 import t/c has_import_t: int = 0 has_import_c: int = 0 for i in range(n): - stmt: ast.AST | t.CPtr = tree_children.get(i) + stmt: rawptr[ast.AST] = tree_children.get(i) if stmt is not None and stmt.kind() == ast.ASTKind.Import: - imp: ast.Import | t.CPtr = (ast.Import | t.CPtr)(stmt) + imp: rawptr[ast.Import] = rawptr[ast.Import](stmt) if imp.names is not None: - imp_names: list[ast.AST | t.CPtr] | t.CPtr = imp.names + imp_names: list[rawptr[ast.AST]] | t.CPtr = imp.names an: sizet = len(imp_names) for ai in range(an): - al: ast.Alias | t.CPtr = (ast.Alias | t.CPtr)(imp_names.get(ai)) + al: rawptr[ast.Alias] = rawptr[ast.Alias](imp_names.get(ai)) if al is not None and al.name is not None: if string.strcmp(al.name, "t") == 0: has_import_t = 1 @@ -775,16 +763,16 @@ def _GeneratePyiFromAst(mb: rawptr[memhub.MemBuddy], tree: ast.AST | t.CPtr, # Import 语句 if k == ast.ASTKind.Import: - imp2: ast.Import | t.CPtr = (ast.Import | t.CPtr)(stmt) + imp2: rawptr[ast.Import] = rawptr[ast.Import](stmt) pos = _PyiEmit(buf, buf_size, pos, "import ") if imp2.names is not None: - imp2_names: list[ast.AST | t.CPtr] | t.CPtr = imp2.names + imp2_names: list[rawptr[ast.AST]] | t.CPtr = imp2.names an2: sizet = len(imp2_names) ai2: sizet = 0 while ai2 < an2: if ai2 > 0: pos = _PyiEmit(buf, buf_size, pos, ", ") - al2: ast.Alias | t.CPtr = (ast.Alias | t.CPtr)(imp2_names.get(ai2)) + al2: rawptr[ast.Alias] = rawptr[ast.Alias](imp2_names.get(ai2)) if al2 is not None and al2.name is not None: pos = _PyiEmit(buf, buf_size, pos, al2.name) if al2.asname is not None and string.strlen(al2.asname) > 0: @@ -795,7 +783,7 @@ def _GeneratePyiFromAst(mb: rawptr[memhub.MemBuddy], tree: ast.AST | t.CPtr, # ImportFrom 语句 elif k == ast.ASTKind.ImportFrom: - ifr: ast.ImportFrom | t.CPtr = (ast.ImportFrom | t.CPtr)(stmt) + ifr: rawptr[ast.ImportFrom] = rawptr[ast.ImportFrom](stmt) pos = _PyiEmit(buf, buf_size, pos, "from ") lvl: int = ifr.level while lvl > 0: @@ -805,13 +793,13 @@ def _GeneratePyiFromAst(mb: rawptr[memhub.MemBuddy], tree: ast.AST | t.CPtr, pos = _PyiEmit(buf, buf_size, pos, ifr.module) pos = _PyiEmit(buf, buf_size, pos, " import ") if ifr.names is not None: - ifr_names: list[ast.AST | t.CPtr] | t.CPtr = ifr.names + ifr_names: list[rawptr[ast.AST]] | t.CPtr = ifr.names an3: sizet = len(ifr_names) ai3: sizet = 0 while ai3 < an3: if ai3 > 0: pos = _PyiEmit(buf, buf_size, pos, ", ") - al3: ast.Alias | t.CPtr = (ast.Alias | t.CPtr)(ifr_names.get(ai3)) + al3: rawptr[ast.Alias] = rawptr[ast.Alias](ifr_names.get(ai3)) if al3 is not None and al3.name is not None: pos = _PyiEmit(buf, buf_size, pos, al3.name) if al3.asname is not None and string.strlen(al3.asname) > 0: @@ -822,19 +810,19 @@ def _GeneratePyiFromAst(mb: rawptr[memhub.MemBuddy], tree: ast.AST | t.CPtr, # 函数定义(_PyiFunction 已以 "\n" 收尾,不再补空行) elif k == ast.ASTKind.FunctionDef: - fn: ast.FunctionDef | t.CPtr = (ast.FunctionDef | t.CPtr)(stmt) + fn: rawptr[ast.FunctionDef] = rawptr[ast.FunctionDef](stmt) pos = _PyiFunction(buf, buf_size, pos, fn, 0, "") # 类定义 elif k == ast.ASTKind.ClassDef: - cls: ast.ClassDef | t.CPtr = (ast.ClassDef | t.CPtr)(stmt) + cls: rawptr[ast.ClassDef] = rawptr[ast.ClassDef](stmt) pos = _PyiClass(buf, buf_size, pos, cls, 0) # 带注解的变量声明 elif k == ast.ASTKind.AnnAssign: - aa: ast.AnnAssign | t.CPtr = (ast.AnnAssign | t.CPtr)(stmt) + aa: rawptr[ast.AnnAssign] = rawptr[ast.AnnAssign](stmt) if aa.target is not None and aa.target.kind() == ast.ASTKind.Name: - nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(aa.target) + nm: rawptr[ast.Name] = rawptr[ast.Name](aa.target) if nm.id is not None: pos = _PyiEmit(buf, buf_size, pos, nm.id) pos = _PyiEmit(buf, buf_size, pos, ": ") @@ -844,17 +832,17 @@ def _GeneratePyiFromAst(mb: rawptr[memhub.MemBuddy], tree: ast.AST | t.CPtr, # 不是整数,用 _PyiTypeStr 输出类型字符串 is_ctypedef_ann: int = 0 if aa.annotation is not None and aa.annotation.kind() == ast.ASTKind.Attribute: - ctd_at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(aa.annotation) + ctd_at: rawptr[ast.Attribute] = rawptr[ast.Attribute](aa.annotation) if ctd_at.attr is not None and string.strcmp(ctd_at.attr, "CTypedef") == 0: if ctd_at.value is not None and ctd_at.value.kind() == ast.ASTKind.Name: - ctd_mod: ast.Name | t.CPtr = (ast.Name | t.CPtr)(ctd_at.value) + ctd_mod: rawptr[ast.Name] = rawptr[ast.Name](ctd_at.value) if ctd_mod.id is not None and string.strcmp(ctd_mod.id, "t") == 0: is_ctypedef_ann = 1 if is_ctypedef_ann != 0 and aa.value is not None: pos = _PyiEmit(buf, buf_size, pos, " = ") pos = _PyiTypeStr(buf, buf_size, pos, aa.value) elif aa.value is not None and aa.value.kind() == ast.ASTKind.Constant: - cv: ast.Constant | t.CPtr = (ast.Constant | t.CPtr)(aa.value) + cv: rawptr[ast.Constant] = rawptr[ast.Constant](aa.value) num_buf: bytes = mb.alloc(32) if cv.const_kind == ast.CONST_INT and num_buf is not None: viperlib.snprintf(num_buf, 32, " = %lld", cv.int_val) @@ -882,11 +870,11 @@ def _GeneratePyiFromAst(mb: rawptr[memhub.MemBuddy], tree: ast.AST | t.CPtr, elif aa.value is not None and aa.value.kind() == ast.ASTKind.UnaryOp: # 处理负值常量(如 INVALID_HANDLE_VALUE = -1) # UnaryOp(USub, Constant(1)) → -1 - uop_cv: ast.UnaryOp | t.CPtr = (ast.UnaryOp | t.CPtr)(aa.value) + uop_cv: rawptr[ast.UnaryOp] = rawptr[ast.UnaryOp](aa.value) num_buf_u: bytes = mb.alloc(32) if uop_cv.op == ast.OpKind.USub and uop_cv.operand is not None \ and uop_cv.operand.kind() == ast.ASTKind.Constant: - uop_const: ast.Constant | t.CPtr = (ast.Constant | t.CPtr)(uop_cv.operand) + uop_const: rawptr[ast.Constant] = rawptr[ast.Constant](uop_cv.operand) if uop_const.const_kind == ast.CONST_INT and num_buf_u is not None: neg_val: int64 = -uop_const.int_val viperlib.snprintf(num_buf_u, 32, " = %lld", neg_val) @@ -894,15 +882,15 @@ def _GeneratePyiFromAst(mb: rawptr[memhub.MemBuddy], tree: ast.AST | t.CPtr, elif aa.value is not None and aa.value.kind() == ast.ASTKind.Call: # 处理类型构造函数常量(如 t.CUnsignedLong(-11)) # 提取第一个参数的整数值并输出 - call_cv: ast.Call | t.CPtr = (ast.Call | t.CPtr)(aa.value) + call_cv: rawptr[ast.Call] = rawptr[ast.Call](aa.value) if call_cv.args is not None: - call_args_cv: list[ast.AST | t.CPtr] | t.CPtr = call_cv.args + call_args_cv: list[rawptr[ast.AST]] | t.CPtr = call_cv.args if len(call_args_cv) > 0: - first_arg: ast.AST | t.CPtr = call_args_cv.get(0) + first_arg: rawptr[ast.AST] = call_args_cv.get(0) if first_arg is not None: arg_kind: int = first_arg.kind() if arg_kind == ast.ASTKind.Constant: - ca_cv: ast.Constant | t.CPtr = (ast.Constant | t.CPtr)(first_arg) + ca_cv: rawptr[ast.Constant] = rawptr[ast.Constant](first_arg) num_buf_c: bytes = mb.alloc(32) if ca_cv.const_kind == ast.CONST_INT and num_buf_c is not None: viperlib.snprintf(num_buf_c, 32, " = %lld", ca_cv.int_val) @@ -916,11 +904,11 @@ def _GeneratePyiFromAst(mb: rawptr[memhub.MemBuddy], tree: ast.AST | t.CPtr, viperlib.snprintf(fbuf_cc, 64, " = %.17g", ca_cv.float_val) pos = _PyiEmit(buf, buf_size, pos, fbuf_cc) elif arg_kind == ast.ASTKind.UnaryOp: - uop_ca: ast.UnaryOp | t.CPtr = (ast.UnaryOp | t.CPtr)(first_arg) + uop_ca: rawptr[ast.UnaryOp] = rawptr[ast.UnaryOp](first_arg) num_buf_cu: bytes = mb.alloc(32) if uop_ca.op == ast.OpKind.USub and uop_ca.operand is not None \ and uop_ca.operand.kind() == ast.ASTKind.Constant: - uoc: ast.Constant | t.CPtr = (ast.Constant | t.CPtr)(uop_ca.operand) + uoc: rawptr[ast.Constant] = rawptr[ast.Constant](uop_ca.operand) if uoc.const_kind == ast.CONST_INT and num_buf_cu is not None: neg_c_val: int64 = -uoc.int_val viperlib.snprintf(num_buf_cu, 32, " = %lld", neg_c_val) @@ -954,7 +942,7 @@ def _GeneratePyiFromAst(mb: rawptr[memhub.MemBuddy], tree: ast.AST | t.CPtr, elif aa.value is not None and aa.value.kind() == ast.ASTKind.Name: # 处理 Name 引用常量(如 ALIAS = OTHER_CONST) # 输出引用的名字,让消费方在本地查找 - name_val: ast.Name | t.CPtr = (ast.Name | t.CPtr)(aa.value) + name_val: rawptr[ast.Name] = rawptr[ast.Name](aa.value) if name_val.id is not None: pos = _PyiEmit(buf, buf_size, pos, " = ") pos = _PyiEmit(buf, buf_size, pos, name_val.id) @@ -962,19 +950,19 @@ def _GeneratePyiFromAst(mb: rawptr[memhub.MemBuddy], tree: ast.AST | t.CPtr, # 全局赋值(无注解)— 从 Constant value 推断类型 elif k == ast.ASTKind.Assign: - asg: ast.Assign | t.CPtr = (ast.Assign | t.CPtr)(stmt) + asg: rawptr[ast.Assign] = rawptr[ast.Assign](stmt) if asg.targets is not None and asg.value is not None: - asg_targets: list[ast.AST | t.CPtr] | t.CPtr = asg.targets + asg_targets: list[rawptr[ast.AST]] | t.CPtr = asg.targets atn: sizet = len(asg_targets) if atn == 1: - atg: ast.AST | t.CPtr = asg_targets.get(0) + atg: rawptr[ast.AST] = asg_targets.get(0) if atg is not None and atg.kind() == ast.ASTKind.Name: - agn: ast.Name | t.CPtr = (ast.Name | t.CPtr)(atg) - aval: ast.AST | t.CPtr = asg.value + agn: rawptr[ast.Name] = rawptr[ast.Name](atg) + aval: rawptr[ast.AST] = asg.value avk: int = aval.kind() inferred: int = 0 if avk == ast.ASTKind.Constant: - acv: ast.Constant | t.CPtr = (ast.Constant | t.CPtr)(aval) + acv: rawptr[ast.Constant] = rawptr[ast.Constant](aval) if acv.const_kind == ast.CONST_INT: inferred = 1 elif acv.const_kind == ast.CONST_FLOAT: diff --git a/App/lib/Stub/StubGen/VpiReader.vp b/App/lib/Stub/StubGen/VpiReader.vp index 44672d9..6e36541 100644 --- a/App/lib/Stub/StubGen/VpiReader.vp +++ b/App/lib/Stub/StubGen/VpiReader.vp @@ -704,8 +704,8 @@ def _resolve_vpi_param_annot_seg_template(pool: rawptr[memhub.MemBuddy], cls_name: str, method_name: str, seg_idx: int, - i32_ty: llvmlite.LLVMType | t.CPtr, - i8_ptr_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.LLVMType | t.CPtr: + i32_ty: rawptr[llvmlite.LLVMType], + i8_ptr_ty: rawptr[llvmlite.LLVMType]) -> rawptr[llvmlite.LLVMType]: """特化类 X[arg] 的参数注解段解析(模板 X[T] 注解 + T→arg 替换);未命中 None""" if pool is None or src_sha1 is None or cls_name is None or method_name is None \ or _g_vpi_param_keys is None: @@ -732,7 +732,7 @@ def _resolve_vpi_param_annot_seg_template(pool: rawptr[memhub.MemBuddy], string.strncpy(arg_t, lbkt_t + 1, arg_len_t) arg_t[arg_len_t] = '\0' sha1_len_t: sizet = string.strlen(src_sha1) - ty_t: llvmlite.LLVMType | t.CPtr = None + ty_t: rawptr[llvmlite.LLVMType] = None ki_t: int for ki_t in range(_g_vpi_param_count): gk_t: bytes = _g_vpi_param_keys + ki_t * VPI_PARAM_KEY_LEN @@ -803,13 +803,13 @@ def _resolve_vpi_param_annot_seg_template(pool: rawptr[memhub.MemBuddy], # 补全后 declare 参数数与 define 一致,调用点默认参数填充才能生效,避免被调函数读栈垃圾。 # ============================================================ def _repair_declare_params_from_text(pool: rawptr[memhub.MemBuddy], - func: llvmlite.Function | t.CPtr, + func: rawptr[llvmlite.Function], src_sha1: str, cls_name: str, method_name: str, param_count: int, - i32_ty: llvmlite.LLVMType | t.CPtr, - i8_ptr_ty: llvmlite.LLVMType | t.CPtr) -> int: + i32_ty: rawptr[llvmlite.LLVMType], + i8_ptr_ty: rawptr[llvmlite.LLVMType]) -> int: """用 vpi 文本缓存的参数注解补全 declare 参数;返回补全后参数数""" if func is None or src_sha1 is None or method_name is None: return param_count @@ -836,13 +836,13 @@ def _repair_declare_params_from_text(pool: rawptr[memhub.MemBuddy], if prm_annots[cur2] == '@': cur2 += 1 if seg_idx >= param_count: - param_ty_r: llvmlite.LLVMType | t.CPtr = i8_ptr_ty + param_ty_r: rawptr[llvmlite.LLVMType] = i8_ptr_ty if seg_len2 > 0: seg_buf_r: bytes = stdlib.malloc(seg_len2 + 1) if seg_buf_r is not None: string.strncpy(seg_buf_r, prm_annots + seg_start2, seg_len2) seg_buf_r[seg_len2] = '\0' - rt: llvmlite.LLVMType | t.CPtr = _resolve_vpi_ret_annot_str( + rt: rawptr[llvmlite.LLVMType] = _resolve_vpi_ret_annot_str( pool, seg_buf_r, i32_ty, i8_ptr_ty) if rt is not None: param_ty_r = rt @@ -865,8 +865,8 @@ def _resolve_vpi_param_annot_seg(pool: rawptr[memhub.MemBuddy], cls_name: str, method_name: str, seg_idx: int, - i32_ty: llvmlite.LLVMType | t.CPtr, - i8_ptr_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.LLVMType | t.CPtr: + i32_ty: rawptr[llvmlite.LLVMType], + i8_ptr_ty: rawptr[llvmlite.LLVMType]) -> rawptr[llvmlite.LLVMType]: """按段索引解析 vpi 参数注解段为 LLVMType,空段/失败返回 None""" if pool is None or src_sha1 is None or method_name is None: return None @@ -893,7 +893,7 @@ def _resolve_vpi_param_annot_seg(pool: rawptr[memhub.MemBuddy], return None string.strncpy(seg_buf_p, prm_annots_p + seg_start_p, seg_len_p) seg_buf_p[seg_len_p] = '\0' - seg_ty_p: llvmlite.LLVMType | t.CPtr = _resolve_vpi_ret_annot_str( + seg_ty_p: rawptr[llvmlite.LLVMType] = _resolve_vpi_ret_annot_str( pool, seg_buf_p, i32_ty, i8_ptr_ty) stdlib.free(seg_buf_p) return seg_ty_p @@ -1206,12 +1206,12 @@ def _lookup_vpi_ret_annot(src_sha1: str, cls_name: str, method_name: str) -> str # 纯字符串解析,不构造 AST 节点。 # ============================================================ def _resolve_single_vpi_type_str(pool: rawptr[memhub.MemBuddy], - seg: str) -> llvmlite.LLVMType | t.CPtr: + seg: str) -> rawptr[llvmlite.LLVMType]: """解析单个类型段为 LLVMType,无法识别返回 None""" if seg is None or pool is None: return None - i8_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int8(pool) - i8_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, i8_ty) + i8_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int8(pool) + i8_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, i8_ty) # 内置别名 if string.strcmp(seg, "str") == 0 or string.strcmp(seg, "bytes") == 0: return i8_ptr_ty @@ -1223,22 +1223,14 @@ def _resolve_single_vpi_type_str(pool: rawptr[memhub.MemBuddy], # (见 _cache_vpi_return_annots_text;push 等无注解方法返回 i32)。 # 之前缺分支导致解析返回 None → 泛型模板方法(Vector[int].push)调用 # 走 fail-fast"方法返回类型无法精确获取",实际是约定不一致。 - if string.strcmp(seg, "i32") == 0: - return llvmlite.Int32(pool) - if string.strcmp(seg, "i64") == 0: - return llvmlite.Int64(pool) - if string.strcmp(seg, "i16") == 0: - return llvmlite.Int16(pool) - if string.strcmp(seg, "i8") == 0: - return i8_ty - if string.strcmp(seg, "i1") == 0: - return llvmlite.Int1(pool) - if string.strcmp(seg, "f32") == 0: - return llvmlite.Float(pool) - if string.strcmp(seg, "f64") == 0: - return llvmlite.Double(pool) - if string.strcmp(seg, "void") == 0: - return llvmlite.Void(pool) + if string.strcmp(seg, "i32") == 0: return llvmlite.Int32(pool) + if string.strcmp(seg, "i64") == 0: return llvmlite.Int64(pool) + if string.strcmp(seg, "i16") == 0: return llvmlite.Int16(pool) + if string.strcmp(seg, "i8") == 0: return i8_ty + if string.strcmp(seg, "i1") == 0: return llvmlite.Int1(pool) + if string.strcmp(seg, "f32") == 0: return llvmlite.Float(pool) + if string.strcmp(seg, "f64") == 0: return llvmlite.Double(pool) + if string.strcmp(seg, "void") == 0: return llvmlite.Void(pool) # vpi 源文本中 `-> None` 被原样缓存为 "None"(_cache_vpi_return_annots_text # 提取 arrow_pos 后到 ':' 前的内容)。此前无 "None" 分支 → 解析返回 None → # `-> None` 的跨模块方法(如 AssignGenMixin._register_cdefine_from_value)vpi @@ -1260,8 +1252,7 @@ def _resolve_single_vpi_type_str(pool: rawptr[memhub.MemBuddy], if inner_buf_rp is not None: string.strncpy(inner_buf_rp, seg + 7, inner_len_rp) inner_buf_rp[inner_len_rp] = '\0' - inner_ty_rp: llvmlite.LLVMType | t.CPtr = _resolve_single_vpi_type_str( - pool, inner_buf_rp) + inner_ty_rp: rawptr[llvmlite.LLVMType] = _resolve_single_vpi_type_str(pool, inner_buf_rp) stdlib.free(inner_buf_rp) if inner_ty_rp is not None: return llvmlite.Ptr(pool, inner_ty_rp) @@ -1279,7 +1270,7 @@ def _resolve_single_vpi_type_str(pool: rawptr[memhub.MemBuddy], if inner_buf_cp is not None: string.strncpy(inner_buf_cp, seg + cptr_sub_pfx, inner_len_cp) inner_buf_cp[inner_len_cp] = '\0' - inner_ty_cp: llvmlite.LLVMType | t.CPtr = _resolve_single_vpi_type_str( + inner_ty_cp: rawptr[llvmlite.LLVMType] = _resolve_single_vpi_type_str( pool, inner_buf_cp) stdlib.free(inner_buf_cp) if inner_ty_cp is not None: @@ -1297,7 +1288,7 @@ def _resolve_single_vpi_type_str(pool: rawptr[memhub.MemBuddy], return llvmlite.Void(pool) # [阶段2] 统一口径:CTypedef 动态表优先(库 typedef 走正常库分析), # miss 回退 map_t_type(t/c 库内部特判)。 - mapped_ty: llvmlite.LLVMType | t.CPtr = GenApi.resolve_typedef_or_map(pool, attr_nm, None, None) + mapped_ty: rawptr[llvmlite.LLVMType] = GenApi.resolve_typedef_or_map(pool, attr_nm, None, None) if mapped_ty is not None: return mapped_ty return None @@ -1305,7 +1296,7 @@ def _resolve_single_vpi_type_str(pool: rawptr[memhub.MemBuddy], last_dot: str = string.strrchr(seg, '.') if last_dot is not None: cls_nm2: str = last_dot + 1 - mod_struct_ty: llvmlite.LLVMType | t.CPtr = GenApi.get_struct_type(cls_nm2) + mod_struct_ty: rawptr[llvmlite.LLVMType] = GenApi.get_struct_type(cls_nm2) if mod_struct_ty is not None: return mod_struct_ty # 枚举兜底:t.CEnum 注册在独立 EnumTable(EnumEntry),不进 StructTable, @@ -1313,20 +1304,20 @@ def _resolve_single_vpi_type_str(pool: rawptr[memhub.MemBuddy], # struct 落空必须回退枚举表取 BaseTy(通常 i32)。否则 vpi 返回注解解析 # 失败 → 跨模块函数返回类型无法精确获取 → text.ll 缺失(依赖环)时 # 永久 pending(VKernel fat32→sched→process→fat32 Phase A 死锁根因)。 - mod_enum_ty: llvmlite.LLVMType | t.CPtr = GenApi.get_enum_base_type(cls_nm2) + mod_enum_ty: rawptr[llvmlite.LLVMType] = GenApi.get_enum_base_type(cls_nm2) if mod_enum_ty is not None: return mod_enum_ty return None # 裸类名 → 全局 struct 注册表 - bare_struct_ty: llvmlite.LLVMType | t.CPtr = GenApi.get_struct_type(seg) + bare_struct_ty: rawptr[llvmlite.LLVMType] = GenApi.get_struct_type(seg) if bare_struct_ty is not None: return bare_struct_ty # 裸枚举名 → EnumTable 兜底(同上:枚举不在 StructTable) - bare_enum_ty: llvmlite.LLVMType | t.CPtr = GenApi.get_enum_base_type(seg) + bare_enum_ty: rawptr[llvmlite.LLVMType] = GenApi.get_enum_base_type(seg) if bare_enum_ty is not None: return bare_enum_ty # 裸 typedef 名(如 VOIDPTR):CTypedef 动态表优先,miss 回退 map_t_type - mapped_bare: llvmlite.LLVMType | t.CPtr = GenApi.resolve_typedef_or_map(pool, seg, None, None) + mapped_bare: rawptr[llvmlite.LLVMType] = GenApi.resolve_typedef_or_map(pool, seg, None, None) if mapped_bare is not None: return mapped_bare return None @@ -1341,8 +1332,8 @@ def _resolve_single_vpi_type_str(pool: rawptr[memhub.MemBuddy], # ============================================================ def _resolve_vpi_ret_annot_str(pool: rawptr[memhub.MemBuddy], ret_annot: str, - i32_ty: llvmlite.LLVMType | t.CPtr, - i8_ptr_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.LLVMType | t.CPtr: + i32_ty: rawptr[llvmlite.LLVMType], + i8_ptr_ty: rawptr[llvmlite.LLVMType]) -> rawptr[llvmlite.LLVMType]: """直接解析 vpi 返回注解字符串为 LLVMType(不构造 AST 节点)""" if ret_annot is None or pool is None: return None @@ -1357,8 +1348,8 @@ def _resolve_vpi_ret_annot_str(pool: rawptr[memhub.MemBuddy], inner_len_t += 1 if ret_annot[6 + inner_len_t] != ']' or inner_len_t == 0: return None - tup_head_t: llvmlite.ParamNode | t.CPtr = None - tup_tail_t: llvmlite.ParamNode | t.CPtr = None + tup_head_t: rawptr[llvmlite.Function] = None + tup_tail_t: rawptr[llvmlite.Function] = None tup_count_t: int = 0 p_t: sizet = 0 while p_t < inner_len_t: @@ -1378,11 +1369,11 @@ def _resolve_vpi_ret_annot_str(pool: rawptr[memhub.MemBuddy], return None string.strncpy(seg_buf_t, ret_annot + 6 + seg_s_t, seg_len_t) seg_buf_t[seg_len_t] = '\0' - seg_ty_t: llvmlite.LLVMType | t.CPtr = _resolve_single_vpi_type_str(pool, seg_buf_t) + seg_ty_t: rawptr[llvmlite.LLVMType] = _resolve_single_vpi_type_str(pool, seg_buf_t) stdlib.free(seg_buf_t) if seg_ty_t is None: return None - tup_node_t: llvmlite.ParamNode | t.CPtr = llvmlite.new_param_node(pool, seg_ty_t) + tup_node_t: rawptr[llvmlite.Function] = llvmlite.new_param_node(pool, seg_ty_t) if tup_node_t is None: return None if tup_head_t is None: @@ -1397,7 +1388,7 @@ def _resolve_vpi_ret_annot_str(pool: rawptr[memhub.MemBuddy], has_cptr: int = 0 has_cvoid: int = 0 - first_ty: llvmlite.LLVMType | t.CPtr = None + first_ty: rawptr[llvmlite.LLVMType] = None # 产生 first_ty 那一段文本的属性(供末尾 has_cptr 分支复刻定义侧规则,N12): # first_qual=1 段是限定名(含 '.',如 mod.Class / int64) # first_wl =1 段是白名单裸标量名(int/char/str/bytes/bool/float/double) @@ -1412,7 +1403,7 @@ def _resolve_vpi_ret_annot_str(pool: rawptr[memhub.MemBuddy], # 与定义侧 `X | t.CPtr[T]` 分支同口径:CPtr 侧贡献 N 层指针、另一侧提供基类型 ⇒ Ptr^N(基类型)。 # 与 has_cptr(裸 t.CPtr 段)分开记录:裸标记恒「追加 1 层」且有 struct 吸收特例,下标路径无吸收,两者在定义侧分属互斥分支。 cptr_sub_lvl: int = 0 - cptr_sub_ty: llvmlite.LLVMType | t.CPtr = None + cptr_sub_ty: rawptr[llvmlite.LLVMType] = None buf_len: sizet = string.strlen(ret_annot) pos: sizet = 0 @@ -1441,16 +1432,16 @@ def _resolve_vpi_ret_annot_str(pool: rawptr[memhub.MemBuddy], # 语义不同(如 X=struct S、t.CPtr[t.CPtr]:定义侧 Ptr(Ptr(S)), # 取该段本身则得 i8**)。此处只记录 N 与段类型,末尾统一合并。 if string.strncmp(seg_buf, "t.CPtr[", 7) == 0 or string.strncmp(seg_buf, "c.CPtr[", 7) == 0: - seg_ty_cs: llvmlite.LLVMType | t.CPtr = _resolve_single_vpi_type_str(pool, seg_buf) + seg_ty_cs: rawptr[llvmlite.LLVMType] = _resolve_single_vpi_type_str(pool, seg_buf) if seg_ty_cs is not None: # 计算外层 Ptr 嵌套数(定义侧 L2616-2632 同口径)。注意不能在 # case body 内更新 while 条件变量(自举编译的 match 会写到 subject # 快照槽 → 条件读旧槽死循环,见 TypeGenResolve.vp L2620-2624): # case 绑定 pointee 到局部变量,match 外更新循环变量。 lvl_cs: int = 0 - cur_cs: llvmlite.LLVMType | t.CPtr = seg_ty_cs + cur_cs: rawptr[llvmlite.LLVMType] = seg_ty_cs while cur_cs is not None: - nxt_cs: llvmlite.LLVMType | t.CPtr = None + nxt_cs: rawptr[llvmlite.LLVMType] = None match cur_cs: case llvmlite.LLVMType.Ptr(pointee_cs): lvl_cs += 1 @@ -1467,7 +1458,7 @@ def _resolve_vpi_ret_annot_str(pool: rawptr[memhub.MemBuddy], elif string.strcmp(seg_buf, "t.CVoid") == 0 or string.strcmp(seg_buf, "CVoid") == 0: has_cvoid = 1 else: - seg_ty: llvmlite.LLVMType | t.CPtr = _resolve_single_vpi_type_str(pool, seg_buf) + seg_ty: rawptr[llvmlite.LLVMType] = _resolve_single_vpi_type_str(pool, seg_buf) if seg_ty is not None and first_ty is None: first_ty = seg_ty # 记录该段属性(N12):定义侧 TypeGenResolve.resolve_annotation_type @@ -1521,7 +1512,7 @@ def _resolve_vpi_ret_annot_str(pool: rawptr[memhub.MemBuddy], if cptr_sub_lvl > 0: if first_ty is None: return cptr_sub_ty - res_ty_cs: llvmlite.LLVMType | t.CPtr = first_ty + res_ty_cs: rawptr[llvmlite.LLVMType] = first_ty wrap_i_cs: int = 0 while wrap_i_cs < cptr_sub_lvl: res_ty_cs = llvmlite.Ptr(pool, res_ty_cs) @@ -1788,13 +1779,13 @@ def _vpi_register_typedef_closure(pool: rawptr[memhub.MemBuddy], _vpi_typedef_visited_mark(sha1_r) if bytes_read_r < VPI_READ_BUF_SIZE: vpi_buf_r[bytes_read_r] = 0 - lx_r: ast.Lexer | t.CPtr = ast.new_lexer(pool) + lx_r: rawptr[ast.Lexer] = ast.new_lexer(pool) if lx_r is not None: ast._lexer_init(lx_r, vpi_buf_r, pool) - tokens_r: ast.Token | t.CPtr = ast.tokenize(lx_r) - tree_r: ast.AST | t.CPtr = ast.parse_tokens(pool, tokens_r) + tokens_r: rawptr[ast.Token] = ast.tokenize(lx_r) + tree_r: rawptr[ast.AST] = ast.parse_tokens(pool, tokens_r) if tree_r is not None and tree_r.children is not None: - ch_r: list[ast.AST | t.CPtr] | t.CPtr = tree_r.children + ch_r: list[rawptr[ast.AST]] | t.CPtr = tree_r.children cn_r: sizet = len(ch_r) # 收集子模块 imports(递归闭包):两遍处理——先累计所需长度,再按精确长度分配后填充,不存在长度上限,故无需丢弃。 # (定长缓冲 + "装不下就静默丢弃" 会让闭包缺模块 ⇒ 该模块的 CTypedef/CDefine 不可见 ⇒ 注解解析退化。) @@ -1802,21 +1793,21 @@ def _vpi_register_typedef_closure(pool: rawptr[memhub.MemBuddy], sub_need: sizet = 1 # 末尾 NUL ci_c: sizet for ci_c in range(cn_r): - child_c: ast.AST | t.CPtr = ch_r.get(ci_c) + child_c: rawptr[ast.AST] = ch_r.get(ci_c) if child_c is None: continue kk_c: int = child_c.kind() if kk_c == ast.ASTKind.Import: - imp_c: ast.Import | t.CPtr = (ast.Import | t.CPtr)(child_c) + imp_c: rawptr[ast.Import] = rawptr[ast.Import](child_c) if imp_c.names is not None: in_nc: sizet = len(imp_c.names) ii_c: sizet for ii_c in range(in_nc): - al_c: ast.Alias | t.CPtr = (ast.Alias | t.CPtr)(imp_c.names.get(ii_c)) + al_c: rawptr[ast.Alias] = rawptr[ast.Alias](imp_c.names.get(ii_c)) if al_c is not None and al_c.name is not None: sub_need += string.strlen(al_c.name) + 1 elif kk_c == ast.ASTKind.ImportFrom: - ifr_c: ast.ImportFrom | t.CPtr = (ast.ImportFrom | t.CPtr)(child_c) + ifr_c: rawptr[ast.ImportFrom] = rawptr[ast.ImportFrom](child_c) if ifr_c.module is not None: sub_need += string.strlen(ifr_c.module) + 1 sub_imports: bytes = stdlib.malloc(sub_need) @@ -1825,17 +1816,17 @@ def _vpi_register_typedef_closure(pool: rawptr[memhub.MemBuddy], sub_len: sizet = 0 ci_r: sizet for ci_r in range(cn_r): - child_r: ast.AST | t.CPtr = ch_r.get(ci_r) + child_r: rawptr[ast.AST] = ch_r.get(ci_r) if child_r is None: continue kk_r: int = child_r.kind() if kk_r == ast.ASTKind.Import: - imp_r: ast.Import | t.CPtr = (ast.Import | t.CPtr)(child_r) + imp_r: rawptr[ast.Import] = rawptr[ast.Import](child_r) if imp_r.names is not None: in_n: sizet = len(imp_r.names) ii_r: sizet for ii_r in range(in_n): - al_r: ast.Alias | t.CPtr = (ast.Alias | t.CPtr)(imp_r.names.get(ii_r)) + al_r: rawptr[ast.Alias] = rawptr[ast.Alias](imp_r.names.get(ii_r)) if al_r is not None and al_r.name is not None: il_r: sizet = string.strlen(al_r.name) if sub_len > 0: @@ -1845,7 +1836,7 @@ def _vpi_register_typedef_closure(pool: rawptr[memhub.MemBuddy], sub_len += il_r sub_imports[sub_len] = '\0' elif kk_r == ast.ASTKind.ImportFrom: - ifr_r: ast.ImportFrom | t.CPtr = (ast.ImportFrom | t.CPtr)(child_r) + ifr_r: rawptr[ast.ImportFrom] = rawptr[ast.ImportFrom](child_r) if ifr_r.module is not None: ml_r: sizet = string.strlen(ifr_r.module) if sub_len > 0: @@ -1857,12 +1848,12 @@ def _vpi_register_typedef_closure(pool: rawptr[memhub.MemBuddy], # 第二遍:注册本模块 AnnAssign 的 CTypedef/CDefine ci2_r: sizet for ci2_r in range(cn_r): - child2_r: ast.AST | t.CPtr = ch_r.get(ci2_r) + child2_r: rawptr[ast.AST] = ch_r.get(ci2_r) if child2_r is None: continue if child2_r.kind() != ast.ASTKind.AnnAssign: continue - aa_r: ast.AnnAssign | t.CPtr = (ast.AnnAssign | t.CPtr)(child2_r) + aa_r: rawptr[ast.AnnAssign] = rawptr[ast.AnnAssign](child2_r) if aa_r.annotation is None or aa_r.target is None or aa_r.value is None: continue if GenApi._is_ctypedef_annotation(aa_r.annotation) != 0: @@ -1870,11 +1861,11 @@ def _vpi_register_typedef_closure(pool: rawptr[memhub.MemBuddy], elif GenApi.is_cdefine_annotation(aa_r.annotation) != 0: if aa_r.target.kind() != ast.ASTKind.Name: continue - cdef_t: ast.Name | t.CPtr = (ast.Name | t.CPtr)(aa_r.target) + cdef_t: rawptr[ast.Name] = rawptr[ast.Name](aa_r.target) if cdef_t.id is None: continue if aa_r.value.kind() == ast.ASTKind.Constant: - cn_v: ast.Constant | t.CPtr = (ast.Constant | t.CPtr)(aa_r.value) + cn_v: rawptr[ast.Constant] = rawptr[ast.Constant](aa_r.value) if cn_v.const_kind == ast.CONST_FLOAT: GenApi.register_cdefine_double(pool, cdef_t.id, cn_v.float_val) elif cn_v.const_kind == ast.CONST_INT: @@ -1900,9 +1891,9 @@ def _vpi_register_typedef_closure(pool: rawptr[memhub.MemBuddy], # Returns: 1=成功,0=失败 # ============================================================ def ParseVpiIntoModule(pool: rawptr[memhub.MemBuddy], - mod: llvmlite.LLVMModule | t.CPtr, + mod: rawptr[llvmlite.LLVMModule], vpi_path: str, - trans: HT.Translator | t.CPtr) -> int: + trans: rawptr[HT.Translator]) -> int: """解析 .vpi 文件,将函数声明注入到当前模块 解析 stub 期间临时将错误归因切换到被读 stub 文件(.vpi): @@ -1919,9 +1910,9 @@ def ParseVpiIntoModule(pool: rawptr[memhub.MemBuddy], def _ParseVpiIntoModuleImpl(pool: rawptr[memhub.MemBuddy], - mod: llvmlite.LLVMModule | t.CPtr, + mod: rawptr[llvmlite.LLVMModule], vpi_path: str, - trans: HT.Translator | t.CPtr) -> int: + trans: rawptr[HT.Translator]) -> int: """解析 .vpi 文件,将函数声明注入到当前模块(ParseVpiIntoModule 实际实现)""" if pool is None or mod is None or vpi_path is None or trans is None: return 0 @@ -1943,13 +1934,13 @@ def _ParseVpiIntoModuleImpl(pool: rawptr[memhub.MemBuddy], vpi_buf[bytes_read] = 0 # 2. 解析为 AST - lx: ast.Lexer | t.CPtr = ast.new_lexer(pool) + lx: rawptr[ast.Lexer] = ast.new_lexer(pool) if lx is None: stdlib.free(vpi_buf) return 0 ast._lexer_init(lx, vpi_buf, pool) - tokens: ast.Token | t.CPtr = ast.tokenize(lx) - tree: ast.AST | t.CPtr = ast.parse_tokens(pool, tokens) + tokens: rawptr[ast.Token] = ast.tokenize(lx) + tree: rawptr[ast.AST] = ast.parse_tokens(pool, tokens) # vpi_buf 延迟释放:AST 字符串字段可能引用 vpi_buf 内部(token 零拷贝), # 提前 free 会导致 Name.id/Attribute.attr 等悬空 → 后续解析返回错误类型。 # 在 ParseVpiIntoModule 末尾统一释放。 @@ -1969,7 +1960,7 @@ def _ParseVpiIntoModuleImpl(pool: rawptr[memhub.MemBuddy], _cache_vpi_param_annots_text(vpi_buf, src_sha1) # 3. 遍历 AST 顶层节点 - ch: list[ast.AST | t.CPtr] | t.CPtr = tree.children + ch: list[rawptr[ast.AST]] | t.CPtr = tree.children if ch is None: if src_sha1 is not None: stdlib.free(src_sha1) @@ -1984,17 +1975,17 @@ def _ParseVpiIntoModuleImpl(pool: rawptr[memhub.MemBuddy], stub_from_imports: str = None si: sizet for si in range(n): - schild: ast.AST | t.CPtr = ch.get(si) + schild: rawptr[ast.AST] = ch.get(si) if schild is None: continue sk: int = schild.kind() if sk == ast.ASTKind.Import: - simp: ast.Import | t.CPtr = (ast.Import | t.CPtr)(schild) + simp: rawptr[ast.Import] = rawptr[ast.Import](schild) if simp.names is not None: sn_n: sizet = len(simp.names) sni: sizet for sni in range(sn_n): - sal: ast.Alias | t.CPtr = (ast.Alias | t.CPtr)(simp.names.get(sni)) + sal: rawptr[ast.Alias] = rawptr[ast.Alias](simp.names.get(sni)) if sal is not None and sal.name is not None: stub_imported_modules = _stub_add_imported( pool, stub_imported_modules, sal.name) @@ -2002,7 +1993,7 @@ def _ParseVpiIntoModuleImpl(pool: rawptr[memhub.MemBuddy], stub_imported_modules = _stub_add_imported( pool, stub_imported_modules, sal.asname) elif sk == ast.ASTKind.ImportFrom: - sifr: ast.ImportFrom | t.CPtr = (ast.ImportFrom | t.CPtr)(schild) + sifr: rawptr[ast.ImportFrom] = rawptr[ast.ImportFrom](schild) sifr_mod: str = sifr.module # 相对导入补包前缀: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 保持原样,避免未确认路径形态时做过深上溯)。 @@ -2075,7 +2066,7 @@ def _ParseVpiIntoModuleImpl(pool: rawptr[memhub.MemBuddy], sifr_nn: sizet = len(sifr.names) sifri: sizet for sifri in range(sifr_nn): - sial: ast.Alias | t.CPtr = (ast.Alias | t.CPtr)(sifr.names.get(sifri)) + sial: rawptr[ast.Alias] = rawptr[ast.Alias](sifr.names.get(sifri)) if sial is not None and sial.name is not None: # '*' star import 不建 from 映射(lookup 有 star 回退) if string.strcmp(sial.name, "*") != 0: @@ -2132,12 +2123,12 @@ def _ParseVpiIntoModuleImpl(pool: rawptr[memhub.MemBuddy], if imported_modules is not None: _vpi_register_typedef_closure(pool, imported_modules, GenApi.get_temp_dir(), 0) - i32_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int32(pool) - i8_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int8(pool) - i8_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, i8_ty) + i32_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int32(pool) + i8_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int8(pool) + i8_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, i8_ty) # 函数表信息 - funcs_ptr: GenTypes.FuncEntry | t.CPtr = trans._funcs + funcs_ptr: rawptr[GenTypes.FuncEntry] = trans._funcs max_funcs: int = 1024 # ============================================================ @@ -2147,12 +2138,12 @@ def _ParseVpiIntoModuleImpl(pool: rawptr[memhub.MemBuddy], # ============================================================ i0: sizet for i0 in range(n): - child0: ast.AST | t.CPtr = ch.get(i0) + child0: rawptr[ast.AST] = ch.get(i0) if child0 is None: continue if child0.kind() != ast.ASTKind.ClassDef: continue - class_cd0: ast.ClassDef | t.CPtr = (ast.ClassDef | t.CPtr)(child0) + class_cd0: rawptr[ast.ClassDef] = rawptr[ast.ClassDef](child0) if class_cd0 is None or class_cd0.name is None: continue cls_name_v0: str = class_cd0.name @@ -2168,14 +2159,13 @@ def _ParseVpiIntoModuleImpl(pool: rawptr[memhub.MemBuddy], # 第一遍 B:**全部类注册完成之后**再处理方法 declare——方法形参/返回值可能引用本文件更靠后定义的类(类间前向引用), # 若边注册边处理方法,前向引用的类此刻尚未注册 → 形参注解裸名解析落空 → fail-fast。 # ============================================================ - i1: sizet for i1 in range(n): - child1: ast.AST | t.CPtr = ch.get(i1) + child1: rawptr[ast.AST] = ch.get(i1) if child1 is None: continue if child1.kind() != ast.ASTKind.ClassDef: continue - class_cd1: ast.ClassDef | t.CPtr = (ast.ClassDef | t.CPtr)(child1) + class_cd1: rawptr[ast.ClassDef] = rawptr[ast.ClassDef](child1) if class_cd1 is None or class_cd1.name is None: continue cls_name_v1: str = class_cd1.name @@ -2183,17 +2173,17 @@ def _ParseVpiIntoModuleImpl(pool: rawptr[memhub.MemBuddy], tp_stub1: list[str] | t.CPtr = class_cd1.type_params if tp_stub1 is not None and len(tp_stub1) > 0: continue - cls_children1: list[ast.AST | t.CPtr] | t.CPtr = class_cd1.children + cls_children1: list[rawptr[ast.AST]] | t.CPtr = class_cd1.children if cls_children1 is None: continue cn21: sizet = len(cls_children1) for ci21 in range(cn21): - m_child1: ast.AST | t.CPtr = cls_children1.get(ci21) + m_child1: rawptr[ast.AST] = cls_children1.get(ci21) if m_child1 is None: continue if m_child1.kind() != ast.ASTKind.FunctionDef: continue - m_fd1: ast.FunctionDef | t.CPtr = (ast.FunctionDef | t.CPtr)(m_child1) + m_fd1: rawptr[ast.FunctionDef] = rawptr[ast.FunctionDef](m_child1) if m_fd1 is None or m_fd1.name is None: continue _inject_method_declare(pool, mod, m_fd1, cls_name_v1, trans, @@ -2202,14 +2192,14 @@ def _ParseVpiIntoModuleImpl(pool: rawptr[memhub.MemBuddy], i: sizet for i in range(n): - child: ast.AST | t.CPtr = ch.get(i) + child: rawptr[ast.AST] = ch.get(i) if child is None: continue kd: int = child.kind() # FunctionDef → 提取函数名、参数、返回类型 → 注入 declare if kd == ast.ASTKind.FunctionDef: - fd: ast.FunctionDef | t.CPtr = (ast.FunctionDef | t.CPtr)(child) + fd: rawptr[ast.FunctionDef] = rawptr[ast.FunctionDef](child) if fd is None or fd.name is None: continue _inject_function_declare(pool, mod, fd, trans, src_sha1, @@ -2221,11 +2211,11 @@ def _ParseVpiIntoModuleImpl(pool: rawptr[memhub.MemBuddy], # AnnAssign with t.CTypedef → 注册 CTypedef; # 普通模块级全局变量(如 tokens._op_head)→ external global declare if kd == ast.ASTKind.AnnAssign: - aa: ast.AnnAssign | t.CPtr = (ast.AnnAssign | t.CPtr)(child) + aa: rawptr[ast.AnnAssign] = rawptr[ast.AnnAssign](child) if aa is None: continue if aa.target is not None and aa.target.kind() == ast.ASTKind.Name: - dbg_tn: ast.Name | t.CPtr = (ast.Name | t.CPtr)(aa.target) + dbg_tn: rawptr[ast.Name] = rawptr[ast.Name](aa.target) if dbg_tn.id is not None and dbg_tn.id[0] != '\0': # 存疑 if string.strcmp(dbg_tn.id, "irq_handler_t") == 0 \ or string.strcmp(dbg_tn.id, "gdt") == 0 \ @@ -2240,7 +2230,7 @@ def _ParseVpiIntoModuleImpl(pool: rawptr[memhub.MemBuddy], # (否则跨模块 count 查找 [CDEF-MISS] fail-fast,VKernel PhaseA 根因) if aa.target is not None and aa.target.kind() == ast.ASTKind.Name \ and aa.value is not None: - cdef_tgt: ast.Name | t.CPtr = (ast.Name | t.CPtr)(aa.target) + cdef_tgt: rawptr[ast.Name] = rawptr[ast.Name](aa.target) if cdef_tgt.id is not None: # 字符串 CDefine(版本号等)跳过:extract_cdefine_int_value # 对字符串常量 fail-fast,且 count 引用只关心整数 CDefine @@ -2248,7 +2238,7 @@ def _ParseVpiIntoModuleImpl(pool: rawptr[memhub.MemBuddy], cdef_is_float: int = 0 cdef_float_val: double = 0.0 if aa.value.kind() == ast.ASTKind.Constant: - cn_v: ast.Constant | t.CPtr = (ast.Constant | t.CPtr)(aa.value) + cn_v: rawptr[ast.Constant] = rawptr[ast.Constant](aa.value) if cn_v.const_kind == ast.CONST_STR: cdef_is_str = 1 elif cn_v.const_kind == ast.CONST_FLOAT: @@ -2312,9 +2302,9 @@ def ResetVpiInjectVisited() -> None: def _ensure_dep_vpi_injected(pool: rawptr[memhub.MemBuddy], - mod: llvmlite.LLVMModule | t.CPtr, + mod: rawptr[llvmlite.LLVMModule], dep_sha1: str, - trans: HT.Translator | t.CPtr) -> int: + trans: rawptr[HT.Translator]) -> int: """按需注入 dep_sha1 对应的 .vpi 到当前模块(防重入),1=就绪 / 0=失败""" global _vpi_inj_sha1s, _vpi_inj_count, _vpi_inj_depth if pool is None or mod is None or dep_sha1 is None or trans is None: @@ -2387,12 +2377,12 @@ def _ensure_dep_vpi_injected(pool: rawptr[memhub.MemBuddy], # Args: src_name 子模块中的原类名;local_name 包命名空间中的名字(或 as 别名);sub_sha1 子模块(定义文件)sha1;pkg_sha1 当前包 __init__ 的 sha1;trans 翻译器对象(源 entry 缺失时按需注入子模块 vpi 需要) # ============================================================ def _inject_reexport_class_declare(pool: rawptr[memhub.MemBuddy], - mod: llvmlite.LLVMModule | t.CPtr, + mod: rawptr[llvmlite.LLVMModule], src_name: str, local_name: str, sub_sha1: str, pkg_sha1: str, - trans: HT.Translator | t.CPtr) -> int: + trans: rawptr[HT.Translator]) -> int: """把包子模块重导出的类以包 sha1 注册别名 entry(方案A:ast.Attribute 归属 ast 包)""" if pool is None or mod is None or src_name is None or local_name is None: return 0 @@ -2427,24 +2417,24 @@ def _inject_reexport_class_declare(pool: rawptr[memhub.MemBuddy], # 跨模块 stub 注入 struct 时必须同步 packed 标记(<{...}>),否则引用 # 模块按非 packed 布局 GEP,与定义侧 packed 布局错位(B5)。 # ============================================================ -def _vpi_tattr_name(node: ast.AST | t.CPtr, attr_name: str) -> int: +def _vpi_tattr_name(node: rawptr[ast.AST], attr_name: str) -> int: """从 t.attr. / t.attr.(args) 提取最外层属性名并比较""" if node is None: return 0 if node.kind() == ast.ASTKind.Call: - cl2: ast.Call | t.CPtr = (ast.Call | t.CPtr)(node) + cl2: rawptr[ast.Call] = rawptr[ast.Call](node) if cl2.func is None: return 0 return _vpi_tattr_name(cl2.func, attr_name) if node.kind() == ast.ASTKind.Attribute: - at2: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(node) + at2: rawptr[ast.Attribute] = rawptr[ast.Attribute](node) if at2.attr is None: return 0 return 1 if string.strcmp(at2.attr, attr_name) == 0 else 0 return 0 -def _vpi_class_has_packed(decorator_list: list[ast.AST | t.CPtr] | t.CPtr) -> int: +def _vpi_class_has_packed(decorator_list: list[rawptr[ast.AST]] | t.CPtr) -> int: """检查 vpi ClassDef 装饰器列表是否含 t.attr.packed""" if decorator_list is None: return 0 @@ -2452,21 +2442,21 @@ def _vpi_class_has_packed(decorator_list: list[ast.AST | t.CPtr] | t.CPtr) -> in if dn == 0: return 0 for di in range(dn): - deco: ast.AST | t.CPtr = decorator_list.get(di) + deco: rawptr[ast.AST] = decorator_list.get(di) if deco is None: continue if deco.kind() == ast.ASTKind.Call: - cl: ast.Call | t.CPtr = (ast.Call | t.CPtr)(deco) + cl: rawptr[ast.Call] = rawptr[ast.Call](deco) if cl.func is None or cl.func.kind() != ast.ASTKind.Attribute: continue - at0: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(cl.func) + at0: rawptr[ast.Attribute] = rawptr[ast.Attribute](cl.func) if at0.attr is None or string.strcmp(at0.attr, "Attribute") != 0: continue if cl.args is None: continue an: sizet = len(cl.args) for ai in range(an): - ag: ast.AST | t.CPtr = cl.args.get(ai) + ag: rawptr[ast.AST] = cl.args.get(ai) if ag is not None and _vpi_tattr_name(ag, "packed") != 0: return 1 else: @@ -2475,7 +2465,7 @@ def _vpi_class_has_packed(decorator_list: list[ast.AST | t.CPtr] | t.CPtr) -> in return 0 -def _vpi_class_is_renum(class_cd: ast.ClassDef | t.CPtr) -> int: +def _vpi_class_is_renum(class_cd: rawptr[ast.ClassDef]) -> int: """检查 vpi ClassDef 是否为 REnum(基类含 t.REnum),返回 1=是 / 0=否 vpi 文本保留原始基类(`class LLVMType(t.REnum):`),故可据此识别。 @@ -2485,21 +2475,21 @@ def _vpi_class_is_renum(class_cd: ast.ClassDef | t.CPtr) -> int: """ if class_cd is None or class_cd.bases is None: return 0 - bases: list[ast.AST | t.CPtr] | t.CPtr = class_cd.bases + bases: list[rawptr[ast.AST]] | t.CPtr = class_cd.bases bn: sizet = len(bases) for bi in range(bn): - base_node: ast.AST | t.CPtr = bases.get(bi) + base_node: rawptr[ast.AST] = bases.get(bi) if base_node is None: continue bk: int = base_node.kind() # Attribute(t.REnum) 形式 if bk == ast.ASTKind.Attribute: - at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(base_node) + at: rawptr[ast.Attribute] = rawptr[ast.Attribute](base_node) if at.attr is not None and string.strcmp(at.attr, "REnum") == 0: return 1 # Name(REnum) 形式(from t import REnum) elif bk == ast.ASTKind.Name: - nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(base_node) + nm: rawptr[ast.Name] = rawptr[ast.Name](base_node) if nm.id is not None and string.strcmp(nm.id, "REnum") == 0: return 1 return 0 @@ -2515,10 +2505,10 @@ def _vpi_class_is_renum(class_cd: ast.ClassDef | t.CPtr) -> int: # 字段解析失败不 fatal(不注册该类,留给源模块编译注册,后续裸类名引用由调用侧 fail-fast 暴露)。 # ============================================================ def _inject_class_struct_declare(pool: rawptr[memhub.MemBuddy], - mod: llvmlite.LLVMModule | t.CPtr, - class_cd: ast.ClassDef | t.CPtr, + mod: rawptr[llvmlite.LLVMModule], + class_cd: rawptr[ast.ClassDef], cls_name: str, - trans: HT.Translator | t.CPtr, + trans: rawptr[HT.Translator], src_sha1: str, imported_modules: str, from_imports: str) -> int: @@ -2546,24 +2536,24 @@ def _inject_class_struct_declare(pool: rawptr[memhub.MemBuddy], string.memset(field_names_buf, 0, 8 * GenTypes.FIELD_MAX) string.memset(field_types_buf, 0, 8 * GenTypes.FIELD_MAX) field_count: int = 0 - cls_children_c: list[ast.AST | t.CPtr] | t.CPtr = class_cd.children + cls_children_c: list[rawptr[ast.AST]] | t.CPtr = class_cd.children if cls_children_c is not None: cn_c: sizet = len(cls_children_c) for ci_c in range(cn_c): - m_child_c: ast.AST | t.CPtr = cls_children_c.get(ci_c) + m_child_c: rawptr[ast.AST] = cls_children_c.get(ci_c) if m_child_c is None: continue if m_child_c.kind() != ast.ASTKind.AnnAssign: continue - m_aa_c: ast.AnnAssign | t.CPtr = (ast.AnnAssign | t.CPtr)(m_child_c) + m_aa_c: rawptr[ast.AnnAssign] = rawptr[ast.AnnAssign](m_child_c) if m_aa_c is None or m_aa_c.target is None: continue if m_aa_c.target.kind() != ast.ASTKind.Name: continue - m_tgt_c: ast.Name | t.CPtr = (ast.Name | t.CPtr)(m_aa_c.target) + m_tgt_c: rawptr[ast.Name] = rawptr[ast.Name](m_aa_c.target) if m_tgt_c.id is None: continue - field_ty_c: llvmlite.LLVMType | t.CPtr = GenApi.resolve_annotation_type( + field_ty_c: rawptr[llvmlite.LLVMType] = GenApi.resolve_annotation_type( pool, m_aa_c.annotation, imported_modules, from_imports, trans, 0) if field_ty_c is None: # 字段类型解析失败:不注册该类(留给源模块编译注册),不 fatal @@ -2577,11 +2567,11 @@ def _inject_class_struct_declare(pool: rawptr[memhub.MemBuddy], if field_count == 0: return 0 # 4. 构建 ParamNode 链表 - first_node_c: llvmlite.ParamNode | t.CPtr = None - prev_node_c: llvmlite.ParamNode | t.CPtr = None + first_node_c: rawptr[llvmlite.Function] = None + prev_node_c: rawptr[llvmlite.Function] = None for fi_c in range(field_count): - fty_c: llvmlite.LLVMType | t.CPtr = (llvmlite.LLVMType | t.CPtr)(field_types_buf[fi_c]) - pnode_c: llvmlite.ParamNode | t.CPtr = pool.alloc(llvmlite.ParamNode.__sizeof__()) + fty_c: rawptr[llvmlite.LLVMType] = (rawptr[llvmlite.LLVMType])(field_types_buf[fi_c]) + pnode_c: rawptr[llvmlite.Function] = pool.alloc(llvmlite.ParamNode.__sizeof__()) if pnode_c is None: continue string.memset(pnode_c, 0, llvmlite.ParamNode.__sizeof__()) @@ -2606,14 +2596,14 @@ def _inject_class_struct_declare(pool: rawptr[memhub.MemBuddy], name_buf_c[sh_len_c] = '.' string.strcpy(name_buf_c + sh_len_c + 1, cls_name) type_name_c = name_buf_c - struct_ty_c: llvmlite.LLVMType | t.CPtr = llvmlite.Struct( + struct_ty_c: rawptr[llvmlite.LLVMType] = llvmlite.Struct( pool, first_node_c, field_count, type_name_c) if struct_ty_c is None: return 0 # 5. StdlibAlloc(Phase B)时深拷贝到 perm_pool,跨文件 reset 存活 # (对齐 ClassGenDef.translate_class_def L489-494) if GenApi.get_stdlib_alloc() != 0: - st_copy_c: llvmlite.LLVMType | t.CPtr = llvmlite.DeepCopyType( + st_copy_c: rawptr[llvmlite.LLVMType] = llvmlite.DeepCopyType( CompilerFactory.factory.PermPool, struct_ty_c) if st_copy_c is not None: struct_ty_c = st_copy_c @@ -2639,7 +2629,7 @@ def _inject_class_struct_declare(pool: rawptr[memhub.MemBuddy], afi_c: int = 0 for afi_c in range(field_count): af_name_c: str = str(field_names_buf[afi_c]) - af_ty_c: llvmlite.LLVMType | t.CPtr = (llvmlite.LLVMType | t.CPtr)(field_types_buf[afi_c]) + af_ty_c: rawptr[llvmlite.LLVMType] = (rawptr[llvmlite.LLVMType])(field_types_buf[afi_c]) GenApi.add_field(pool, entry_c, af_name_c, af_ty_c) GenApi.add_visible_struct(pool, cls_name) return 1 @@ -2652,9 +2642,9 @@ def _inject_class_struct_declare(pool: rawptr[memhub.MemBuddy], # 均报 "use of undefined type"(值类型大小需已知)。vpi 注入类已 add_field 含字段(完整 Ty),在注册表可查时注册完整定义; # 指针引用(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: rawptr[llvmlite.LLVMModule], pool: rawptr[memhub.MemBuddy], - ty: llvmlite.LLVMType | t.CPtr) -> None: + ty: rawptr[llvmlite.LLVMType]) -> None: """递归为值 struct / 数组元素 struct 注册完整定义(递归深度守卫)""" if mod is None or pool is None or ty is None: return @@ -2690,10 +2680,10 @@ def _ensure_full_value_types(mod: llvmlite.LLVMModule | t.CPtr, # Windows x64 ABI 小结构体(≤8 字节)按整数寄存器传、位兼容,且与定义侧同样降级 ⇒ 同符号签名仍逐字一致)。 # * TPV 内部函数/方法(存在 define 侧)→ Ptr(struct):与定义侧逐字一致,指针目标只需 opaque 声明(module_ensure_opaque_for_type)。 # ============================================================ -def _AggregateParamTy(mod: llvmlite.LLVMModule | t.CPtr, +def _AggregateParamTy(mod: rawptr[llvmlite.LLVMModule], pool: rawptr[memhub.MemBuddy], - ty: llvmlite.LLVMType | t.CPtr, - is_c_abi: int) -> llvmlite.LLVMType | t.CPtr: + ty: rawptr[llvmlite.LLVMType], + is_c_abi: int) -> rawptr[llvmlite.LLVMType]: """裸结构体形参类型(C ABI 按值 / 内部 Ptr(struct),见上方注释)""" if mod is None or pool is None or ty is None: return ty @@ -2710,7 +2700,7 @@ def _AggregateParamTy(mod: llvmlite.LLVMModule | t.CPtr, _ensure_full_value_types(mod, pool, ty) return ty return llvmlite.Int64(pool) - ptr_ty_ap: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, ty) + ptr_ty_ap: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, ty) llvmlite.module_ensure_opaque_for_type(mod, pool, ptr_ty_ap) return ptr_ty_ap @@ -2722,21 +2712,21 @@ def _AggregateParamTy(mod: llvmlite.LLVMModule | t.CPtr, # 否则跨模块 from-import 读取全局变量时 find_global_in_module 找不到 → 误杀「跨模块全局变量类型未知(stub 未注入)」。 # ============================================================ def _inject_global_variable_declare(pool: rawptr[memhub.MemBuddy], - mod: llvmlite.LLVMModule | t.CPtr, - aa: ast.AnnAssign | t.CPtr, - trans: HT.Translator | t.CPtr, + mod: rawptr[llvmlite.LLVMModule], + aa: rawptr[ast.AnnAssign], + trans: rawptr[HT.Translator], imported_modules: str, from_imports: str, - i32_ty: llvmlite.LLVMType | t.CPtr, - i8_ptr_ty: llvmlite.LLVMType | t.CPtr, + i32_ty: rawptr[llvmlite.LLVMType], + i8_ptr_ty: rawptr[llvmlite.LLVMType], src_sha1: str) -> None: """从 vpi AnnAssign 创建模块级全局变量 external declare(mangled 名 @.)""" if pool is None or mod is None or aa is None or trans is None: return - tgt_v: ast.AST | t.CPtr = aa.target + tgt_v: rawptr[ast.AST] = aa.target if tgt_v is None or tgt_v.kind() != ast.ASTKind.Name: return - nm_v: ast.Name | t.CPtr = (ast.Name | t.CPtr)(tgt_v) + nm_v: rawptr[ast.Name] = rawptr[ast.Name](tgt_v) if nm_v is None or nm_v.id is None: return gname_v: str = nm_v.id @@ -2766,13 +2756,13 @@ def _inject_global_variable_declare(pool: rawptr[memhub.MemBuddy], return cur_v = cur_v.Next # 解析注解类型(裸类 → Ptr(struct),CArray → 元素指针) - resolved_v: llvmlite.LLVMType | t.CPtr = None + resolved_v: rawptr[llvmlite.LLVMType] = None if aa.annotation is not None: resolved_v = GenApi.resolve_annotation_type( pool, aa.annotation, imported_modules, from_imports, trans) if resolved_v is None: return # 类型解析失败跳过:调用侧有 fail-fast 定位 - gv_ty_v: llvmlite.LLVMType | t.CPtr = resolved_v + gv_ty_v: rawptr[llvmlite.LLVMType] = resolved_v match resolved_v: case llvmlite.LLVMType.Struct(_, _, _): # 对象类(@t.Object/@t.CVTable:对象即指针,HasNew/HasVTable/IsOOP)→ Ptr(struct),与定义端 handle_module_level_var 一致; @@ -2819,15 +2809,15 @@ def _inject_global_variable_declare(pool: rawptr[memhub.MemBuddy], # 注册到函数表。 # ============================================================ def _inject_function_declare(pool: rawptr[memhub.MemBuddy], - mod: llvmlite.LLVMModule | t.CPtr, - fd: ast.FunctionDef | t.CPtr, - trans: HT.Translator | t.CPtr, + mod: rawptr[llvmlite.LLVMModule], + fd: rawptr[ast.FunctionDef], + trans: rawptr[HT.Translator], src_sha1: str, imported_modules: str, from_imports: str, - i32_ty: llvmlite.LLVMType | t.CPtr, - i8_ptr_ty: llvmlite.LLVMType | t.CPtr, - funcs_ptr: GenTypes.FuncEntry | t.CPtr, + i32_ty: rawptr[llvmlite.LLVMType], + i8_ptr_ty: rawptr[llvmlite.LLVMType], + funcs_ptr: rawptr[GenTypes.FuncEntry], max_funcs: int) -> None: """为 FunctionDef 创建 declare 声明并注入到模块""" if fd.name is None: @@ -2859,12 +2849,12 @@ def _inject_function_declare(pool: rawptr[memhub.MemBuddy], mangled_name = GenApi._mangle_name_with_sha1(src_sha1, fd.name) # 去重:如果函数已存在则跳过 - existing: llvmlite.Function | t.CPtr = GenApi.find_func_in_module(mod, mangled_name) + existing: rawptr[llvmlite.Function] = GenApi.find_func_in_module(mod, mangled_name) if existing is not None: return # 也检查裸名(非裸名模式时,CExport 函数可能已通过其他途径注册) if use_bare_name == 0: - existing_bare: llvmlite.Function | t.CPtr = GenApi.find_func_in_module(mod, fd.name) + existing_bare: rawptr[llvmlite.Function] = GenApi.find_func_in_module(mod, fd.name) if existing_bare is not None: return @@ -2872,7 +2862,7 @@ def _inject_function_declare(pool: rawptr[memhub.MemBuddy], # 优先用缓存的返回注解字符串(tree 解析后立即提取,节点未损坏) # 直接字符串解析(绕开 _parse_type_string 跨模块 AST 构造在 TPV 中的 # __init__/vtable 未执行问题,节点 kind() 异常导致 resolve 得垃圾类型) - ret_ty: llvmlite.LLVMType | t.CPtr = None + ret_ty: rawptr[llvmlite.LLVMType] = None ret_annot_fd: str = _lookup_vpi_ret_annot(src_sha1, None, fd.name) if ret_annot_fd is not None: ret_ty = _resolve_vpi_ret_annot_str(pool, ret_annot_fd, i32_ty, i8_ptr_ty) @@ -2891,7 +2881,7 @@ def _inject_function_declare(pool: rawptr[memhub.MemBuddy], if rk2_rt == ast.ASTKind.Name or rk2_rt == ast.ASTKind.Constant: is_pure_marker_rt = 1 elif rk2_rt == ast.ASTKind.Attribute: - pm_at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(fd.returns) + pm_at: rawptr[ast.Attribute] = rawptr[ast.Attribute](fd.returns) if pm_at.attr is not None and (string.strcmp(pm_at.attr, "State") == 0 or string.strcmp(pm_at.attr, "CExtern") == 0 or string.strcmp(pm_at.attr, "CExport") == 0): @@ -2919,7 +2909,7 @@ def _inject_function_declare(pool: rawptr[memhub.MemBuddy], llvmlite.module_ensure_opaque_for_type(mod, pool, ret_ty) # 创建 declare - func: llvmlite.Function | t.CPtr = llvmlite.create_declare( + func: rawptr[llvmlite.Function] = llvmlite.create_declare( pool, mod, mangled_name, ret_ty) if func is None: return @@ -2929,9 +2919,9 @@ def _inject_function_declare(pool: rawptr[memhub.MemBuddy], fd_defaults: t.CPtr = None fd_default_count: int = 0 if fd.args is not None: - args_node: ast.Arguments | t.CPtr = (ast.Arguments | t.CPtr)(fd.args) + args_node: rawptr[ast.Arguments] = rawptr[ast.Arguments](fd.args) if args_node.args is not None: - args_list: list[ast.AST | t.CPtr] | t.CPtr = args_node.args + args_list: list[rawptr[ast.AST]] | t.CPtr = args_node.args param_count = len(args_list) # 参数数上限哨兵(fail-fast):vpi tree 深层节点在遍历处理过程中 # 可能被覆盖损坏(见本文件顶部注释),fd.args 悬空时 __len__() @@ -2944,20 +2934,20 @@ def _inject_function_declare(pool: rawptr[memhub.MemBuddy], stdlib.exit(1) pi: sizet for pi in range(param_count): - ag: ast.Arg | t.CPtr = (ast.Arg | t.CPtr)(args_list.get(pi)) + ag: rawptr[ast.Arg] = rawptr[ast.Arg](args_list.get(pi)) if ag is None: continue pname: str = ag.arg if pname is None: pname = "arg" # 解析参数类型 - param_ty: llvmlite.LLVMType | t.CPtr = i8_ptr_ty + param_ty: rawptr[llvmlite.LLVMType] = i8_ptr_ty # 优先用 vpi 文本注解缓存解析参数类型(与返回类型同源——vpi # tree 深层节点 kind() 可能损坏,AST resolve 得垃圾类型如 # sizet→i32,跨模块 declare 参数宽错 → 调用侧 trunc 传参、 # callee 按宽类型读栈残留垃圾高位 → 参数巨值崩溃(SlotsBugTest # 根因)。段索引 = pi(模块级函数无 self,0=首参)。 - pseg_ty: llvmlite.LLVMType | t.CPtr = _resolve_vpi_param_annot_seg( + pseg_ty: rawptr[llvmlite.LLVMType] = _resolve_vpi_param_annot_seg( pool, src_sha1, None, fd.name, pi, i32_ty, i8_ptr_ty) if pseg_ty is not None: match pseg_ty: @@ -2970,7 +2960,7 @@ def _inject_function_declare(pool: rawptr[memhub.MemBuddy], case _: param_ty = pseg_ty elif ag.annotation is not None: - resolved_ty: llvmlite.LLVMType | t.CPtr = GenApi.resolve_annotation_type( + resolved_ty: rawptr[llvmlite.LLVMType] = GenApi.resolve_annotation_type( pool, ag.annotation, imported_modules, from_imports, trans) if resolved_ty is not None: # CArray 参数 → 元素指针 ty*(C 数组衰减,与编译侧一致)。 @@ -3004,7 +2994,7 @@ def _inject_function_declare(pool: rawptr[memhub.MemBuddy], # 列表注册默认参数表——跨模块缺参调用(如 resolve_annotation_type 的 # depth=0)才能按表填充,否则被调函数读到栈垃圾(假报递归过深/崩溃)。 if args_node.defaults is not None: - fd_dlist: list[ast.AST | t.CPtr] | t.CPtr = args_node.defaults + fd_dlist: list[rawptr[ast.AST]] | t.CPtr = args_node.defaults fd_default_count = len(fd_dlist) if fd_default_count < 0 or fd_default_count > 128: # vpi tree 深层节点(args.defaults)可能被覆盖损坏,len 返回 @@ -3039,16 +3029,16 @@ def _inject_function_declare(pool: rawptr[memhub.MemBuddy], # 注入正确签名可避免调用时 _ensure_method_declare 用实参类型创建错误 declare(如 size: sizet 被写成 i32 而非 i64)。 # ============================================================ def _inject_method_declare(pool: rawptr[memhub.MemBuddy], - mod: llvmlite.LLVMModule | t.CPtr, - m_fd: ast.FunctionDef | t.CPtr, + mod: rawptr[llvmlite.LLVMModule], + m_fd: rawptr[ast.FunctionDef], cls_name: str, - trans: HT.Translator | t.CPtr, + trans: rawptr[HT.Translator], src_sha1: str, imported_modules: str, from_imports: str, - i32_ty: llvmlite.LLVMType | t.CPtr, - i8_ptr_ty: llvmlite.LLVMType | t.CPtr, - funcs_ptr: GenTypes.FuncEntry | t.CPtr, + i32_ty: rawptr[llvmlite.LLVMType], + i8_ptr_ty: rawptr[llvmlite.LLVMType], + funcs_ptr: rawptr[GenTypes.FuncEntry], max_funcs: int) -> None: """为 ClassDef 内方法创建 declare 声明并注入到模块""" if m_fd is None or m_fd.name is None or cls_name is None: @@ -3071,7 +3061,7 @@ def _inject_method_declare(pool: rawptr[memhub.MemBuddy], viperlib.snprintf(mangled_name, mangled_len, "%s.%s", src_sha1, lookup_name) # 去重:如果方法已存在则跳过 - existing: llvmlite.Function | t.CPtr = GenApi.find_func_in_module(mod, mangled_name) + existing: rawptr[llvmlite.Function] = GenApi.find_func_in_module(mod, mangled_name) if existing is not None: return @@ -3079,7 +3069,7 @@ def _inject_method_declare(pool: rawptr[memhub.MemBuddy], # 优先用缓存的返回注解字符串(tree 解析后立即提取,节点未损坏), # 用 _parse_type_string 重新解析成新 AST(立即使用不被覆盖)。 # 直接解析 m_fd.returns 可能因 vpi tree 深层节点被覆盖而得到垃圾类型。 - ret_ty: llvmlite.LLVMType | t.CPtr = None + ret_ty: rawptr[llvmlite.LLVMType] = None ret_annot: str = _lookup_vpi_ret_annot(src_sha1, cls_name, m_fd.name) if ret_annot is not None: ret_ty = _resolve_vpi_ret_annot_str(pool, ret_annot, i32_ty, i8_ptr_ty) @@ -3088,7 +3078,7 @@ def _inject_method_declare(pool: rawptr[memhub.MemBuddy], pool, m_fd.returns, imported_modules, from_imports, trans) # __new__ 无返回注解时推断为类指针(__new__ 返回 self 指针,默认 i32 会截断指针) if ret_ty is None and string.strcmp(m_fd.name, "__new__") == 0: - cls_ty: llvmlite.LLVMType | t.CPtr = GenApi.get_struct_type(cls_name) + cls_ty: rawptr[llvmlite.LLVMType] = GenApi.get_struct_type(cls_name) if cls_ty is not None: ret_ty = llvmlite.Ptr(pool, cls_ty) # [S4 fail-fast] 有返回注解却解析不出类型 → 不再静默退 i32; @@ -3102,7 +3092,7 @@ def _inject_method_declare(pool: rawptr[memhub.MemBuddy], ret_ty = i32_ty # 创建 declare - func: llvmlite.Function | t.CPtr = llvmlite.create_declare( + func: rawptr[llvmlite.Function] = llvmlite.create_declare( pool, mod, mangled_name, ret_ty) if func is None: return @@ -3112,9 +3102,9 @@ def _inject_method_declare(pool: rawptr[memhub.MemBuddy], md_defaults: t.CPtr = None md_default_count: int = 0 if m_fd.args is not None: - args_node: ast.Arguments | t.CPtr = (ast.Arguments | t.CPtr)(m_fd.args) + args_node: rawptr[ast.Arguments] = rawptr[ast.Arguments](m_fd.args) if args_node.args is not None: - args_list: list[ast.AST | t.CPtr] | t.CPtr = args_node.args + args_list: list[rawptr[ast.AST]] | t.CPtr = args_node.args param_count = len(args_list) # 参数数上限哨兵(fail-fast):与 _inject_function_declare 同因 # (vpi tree 深层节点被覆盖损坏时 __len__() 返回垃圾大数)。 @@ -3125,7 +3115,7 @@ def _inject_method_declare(pool: rawptr[memhub.MemBuddy], stdlib.exit(1) pi: sizet for pi in range(param_count): - ag: ast.Arg | t.CPtr = (ast.Arg | t.CPtr)(args_list.get(pi)) + ag: rawptr[ast.Arg] = rawptr[ast.Arg](args_list.get(pi)) if ag is None: continue pname: str = ag.arg @@ -3138,17 +3128,17 @@ def _inject_method_declare(pool: rawptr[memhub.MemBuddy], # 块)。类类型未注册时兜底走下方注解解析/i8*(保持原行为)。 if pi == 0 and (string.strcmp(pname, "self") == 0 or string.strcmp(pname, "cls") == 0): - cls_ty_sd: llvmlite.LLVMType | t.CPtr = GenApi.get_struct_type(cls_name) + cls_ty_sd: rawptr[llvmlite.LLVMType] = GenApi.get_struct_type(cls_name) if cls_ty_sd is not None: llvmlite.add_param(pool, func, llvmlite.Ptr(pool, cls_ty_sd), pname) continue - param_ty: llvmlite.LLVMType | t.CPtr = i8_ptr_ty + param_ty: rawptr[llvmlite.LLVMType] = i8_ptr_ty # 优先用 vpi 文本注解缓存解析参数类型(与返回类型同源——vpi # tree 深层节点 kind() 可能损坏,AST resolve 得垃圾类型如 # sizet→i32,declare 参数宽错 → 调用侧 trunc i64→i32 传参、 # callee 按 i64 读栈残留垃圾高位 → can=巨值读未写槽位崩溃, # SlotsBugTest 根因)。段索引 = pi(0=self 空段)。 - pseg_ty: llvmlite.LLVMType | t.CPtr = _resolve_vpi_param_annot_seg( + pseg_ty: rawptr[llvmlite.LLVMType] = _resolve_vpi_param_annot_seg( pool, src_sha1, cls_name, m_fd.name, pi, i32_ty, i8_ptr_ty) if pseg_ty is not None: match pseg_ty: @@ -3163,7 +3153,7 @@ def _inject_method_declare(pool: rawptr[memhub.MemBuddy], case _: param_ty = pseg_ty elif ag.annotation is not None: - resolved_ty: llvmlite.LLVMType | t.CPtr = GenApi.resolve_annotation_type( + resolved_ty: rawptr[llvmlite.LLVMType] = GenApi.resolve_annotation_type( pool, ag.annotation, imported_modules, from_imports, trans) if resolved_ty is not None: # CArray 参数 → 元素指针 ty*(C 数组衰减,与编译侧一致)。 @@ -3195,18 +3185,18 @@ def _inject_method_declare(pool: rawptr[memhub.MemBuddy], # 与 _translate_method 的 define 签名一致(对齐 TPC HandlesFunctions.py # L703-705)。for x in obj 循环会以 2 个实参调用 __next__(self, flag)。 if m_fd.name is not None and string.strcmp(m_fd.name, "__next__") == 0: - i1_ty_si: llvmlite.LLVMType | t.CPtr = llvmlite.Int1(pool) + i1_ty_si: rawptr[llvmlite.LLVMType] = llvmlite.Int1(pool) if i1_ty_si is not None: - i1_ptr_ty_si: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, i1_ty_si) + i1_ptr_ty_si: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, i1_ty_si) if i1_ptr_ty_si is not None: llvmlite.add_param(pool, func, i1_ptr_ty_si, "__stop_iter_flag__") # 默认参数:vpi 签名含 '= '(Converter 已输出),提取 defaults # 列表注册默认参数表——跨模块缺参调用(如 resolve_annotation_type 的 # depth=0)才能按表填充,否则被调函数读到栈垃圾(假报递归过深/崩溃)。 if m_fd.args is not None: - md_args_node: ast.Arguments | t.CPtr = (ast.Arguments | t.CPtr)(m_fd.args) + md_args_node: rawptr[ast.Arguments] = rawptr[ast.Arguments](m_fd.args) if md_args_node.defaults is not None: - md_dlist: list[ast.AST | t.CPtr] | t.CPtr = md_args_node.defaults + md_dlist: list[rawptr[ast.AST]] | t.CPtr = md_args_node.defaults md_default_count = len(md_dlist) if md_default_count < 0 or md_default_count > 128: # 同 _inject_function_declare:vpi tree 深层节点被覆盖时 @@ -3245,14 +3235,14 @@ def _inject_method_declare(pool: rawptr[memhub.MemBuddy], # 调用 register_ctypedef 注册到动态 CTypedef 表。 # ============================================================ def _register_ctypedef_from_annassign(pool: rawptr[memhub.MemBuddy], - aa: ast.AnnAssign | t.CPtr) -> None: + aa: rawptr[ast.AnnAssign]) -> None: """从 AnnAssign 节点提取并注册 CTypedef""" if aa is None or pool is None: return # 提取目标名称(必须是 Name 节点) if aa.target is None or aa.target.kind() != ast.ASTKind.Name: return - tgt: ast.Name | t.CPtr = (ast.Name | t.CPtr)(aa.target) + tgt: rawptr[ast.Name] = rawptr[ast.Name](aa.target) if tgt.id is None: return # 提取类型表达式字符串(从 value AST 节点) diff --git a/App/lib/Stub/StubGen/__init__.vp b/App/lib/Stub/StubGen/__init__.vp index e69de29..41e04b5 100644 --- a/App/lib/Stub/StubGen/__init__.vp +++ b/App/lib/Stub/StubGen/__init__.vp @@ -0,0 +1 @@ +# StubGen \ No newline at end of file diff --git a/App/lib/Stub/StubMerger/StubMergerBuild.vp b/App/lib/Stub/StubMerger/StubMergerBuild.vp index 20991c7..ee3d94a 100644 --- a/App/lib/Stub/StubMerger/StubMergerBuild.vp +++ b/App/lib/Stub/StubMerger/StubMergerBuild.vp @@ -802,11 +802,11 @@ def _BuildReachableSha1Set(mb: rawptr[memhub.MemBuddy], source_dir: str, if sbuf is None: mb.reset_to(app_mark) continue - lx: ast.Lexer | t.CPtr = ast.new_lexer(mb) - tree: ast.AST | t.CPtr = None + lx: rawptr[ast.Lexer] = ast.new_lexer(mb) + tree: rawptr[ast.AST] = None if lx is not None: ast._lexer_init(lx, sbuf, mb) - tokens: ast.Token | t.CPtr = ast.tokenize(lx) + tokens: rawptr[ast.Token] = ast.tokenize(lx) tree = ast.parse_tokens(mb, tokens) if tree is not None: tr: HandlesTranslator.Translator | t.CPtr = HandlesTranslator.Translator() @@ -1062,11 +1062,11 @@ def _BuildReachableSha1Set(mb: rawptr[memhub.MemBuddy], source_dir: str, stdlib.free(mod_buf) mb.reset_to(scan_mark_r) continue - lx_r: ast.Lexer | t.CPtr = ast.new_lexer(mb) - tree_r: ast.AST | t.CPtr = None + lx_r: rawptr[ast.Lexer] = ast.new_lexer(mb) + tree_r: rawptr[ast.AST] = None if lx_r is not None: ast._lexer_init(lx_r, sbuf_r, mb) - tokens_r: ast.Token | t.CPtr = ast.tokenize(lx_r) + tokens_r: rawptr[ast.Token] = ast.tokenize(lx_r) tree_r = ast.parse_tokens(mb, tokens_r) if tree_r is None: VLogger.error(f"可达 includes 解析失败: {abs_path}", "Reachable") @@ -1761,7 +1761,7 @@ def BuildCombinedIR(temp_dir: str, local_sha1: str, # Returns: 成功加载的 .vpi 文件数 # ============================================================ def LoadDepVpiIntoModule(pool: rawptr[memhub.MemBuddy], - mod: llvmlite.LLVMModule | t.CPtr, + mod: rawptr[llvmlite.LLVMModule], imported_modules: str, from_imports: str, temp_dir: str, diff --git a/App/lib/core/Gen/AssignGenMixin.vp b/App/lib/core/Gen/AssignGenMixin.vp index 056d737..be451e7 100644 --- a/App/lib/core/Gen/AssignGenMixin.vp +++ b/App/lib/core/Gen/AssignGenMixin.vp @@ -37,17 +37,17 @@ class AssignGenMixin: # 1. Attribute(Name('t'), 'CDefine') # 2. BinOp(... | Attribute(Name('t'), 'CDefine'))(联合注解) # ============================================================ - def is_cdefine_annotation(self, annot: ast.AST | t.CPtr) -> int: + def is_cdefine_annotation(self, annot: rawptr[ast.AST]) -> int: """检测注解是否为 t.CDefine,返回 1 表示是,0 表示否""" if annot is None: return 0 k: int = annot.kind() if k == ast.ASTKind.Attribute: - at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(annot) + at: rawptr[ast.Attribute] = rawptr[ast.Attribute](annot) if at.attr is not None and string.strcmp(at.attr, "CDefine") == 0: return 1 return 0 if k == ast.ASTKind.BinOp: - bop: ast.BinOp | t.CPtr = (ast.BinOp | t.CPtr)(annot) + bop: rawptr[ast.BinOp] = rawptr[ast.BinOp](annot) if self.is_cdefine_annotation(bop.left) != 0: return 1 if self.is_cdefine_annotation(bop.right) != 0: @@ -64,7 +64,7 @@ class AssignGenMixin: # 4. Call — 如 t.CUnsignedLong(-11) → 取第一个参数 # 5. UnaryOp(USub/UAdd/Invert) — 如 -11 # ============================================================ - def extract_cdefine_int_value(self, val_node: ast.AST | t.CPtr) -> int64: + def extract_cdefine_int_value(self, val_node: rawptr[ast.AST]) -> int64: """从值节点提取整数常量(支持 Constant/BinOp/Name/Call/UnaryOp) 64 位返回:大整数 CDefine(如 sys.maxsize=9223372036854775807) @@ -76,7 +76,7 @@ class AssignGenMixin: # Case 1: Constant(INT) — 如 0x0002 if k == ast.ASTKind.Constant: - cn: ast.Constant | t.CPtr = (ast.Constant | t.CPtr)(val_node) + cn: rawptr[ast.Constant] = rawptr[ast.Constant](val_node) # True/False 布尔常量 → 1/0(对齐 TPC:bool 在 CDefine 语境按整数处理, # 如 SHADOW_ENABLED: t.CDefine = False) if cn.const_kind == ast.CONST_BOOL: @@ -88,7 +88,7 @@ class AssignGenMixin: # Case 2: BinOp — 如 FOREGROUND_RED | FOREGROUND_GREEN、(1 << ZDEFLATE_WINDOW_BITS) if k == ast.ASTKind.BinOp: - bop: ast.BinOp | t.CPtr = (ast.BinOp | t.CPtr)(val_node) + bop: rawptr[ast.BinOp] = rawptr[ast.BinOp](val_node) left_val: int64 = self.extract_cdefine_int_value(bop.left) right_val: int64 = self.extract_cdefine_int_value(bop.right) if bop.op == ast.OpKind.BitOr: return left_val | right_val @@ -107,7 +107,7 @@ class AssignGenMixin: # Case 3: Name — 引用已注册的 CDefine 常量,或 True/False 布尔字面量 if k == ast.ASTKind.Name: - nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(val_node) + nm: rawptr[ast.Name] = rawptr[ast.Name](val_node) if nm.id is not None: # True/False 布尔字面量 → 1/0(bool 在 CDefine 语境按整数处理) if string.strcmp(nm.id, "True") == 0: @@ -122,12 +122,12 @@ class AssignGenMixin: # Case 4: Call — 如 t.CUnsignedLong(-11) if k == ast.ASTKind.Call: - cl: ast.Call | t.CPtr = (ast.Call | t.CPtr)(val_node) + cl: rawptr[ast.Call] = rawptr[ast.Call](val_node) # 必须先把属性赋给显式类型为 list[...] | t.CPtr 的局部变量再调用 __len__(), # 否则编译器无法识别属性返回的 list 类型,GEP base 会变成 i32 0 导致 llc 报错 - cl_args_list: list[ast.AST | t.CPtr] | t.CPtr = cl.args + cl_args_list: list[rawptr[ast.AST]] | t.CPtr = cl.args if cl_args_list is not None and len(cl_args_list) > 0: - first_arg: ast.AST | t.CPtr = cl_args_list.get(0) + first_arg: rawptr[ast.AST] = cl_args_list.get(0) arg_val: int64 = self.extract_cdefine_int_value(first_arg) return arg_val # Call 无参数:直接报错终止(fail-fast) @@ -135,7 +135,7 @@ class AssignGenMixin: # Case 5: UnaryOp — 如 -11 if k == ast.ASTKind.UnaryOp: - uop: ast.UnaryOp | t.CPtr = (ast.UnaryOp | t.CPtr)(val_node) + uop: rawptr[ast.UnaryOp] = rawptr[ast.UnaryOp](val_node) operand_val: int64 = self.extract_cdefine_int_value(uop.operand) if uop.op == ast.OpKind.USub: return -operand_val if uop.op == ast.OpKind.UAdd: return operand_val @@ -157,7 +157,7 @@ class AssignGenMixin: # ret i32 0(llc 报错 "value doesn't match function result type")。 # ============================================================ def _register_cdefine_from_value(self, pool: rawptr[memhub.MemBuddy], - name: str, val_node: ast.AST | t.CPtr) -> None: + name: str, val_node: rawptr[ast.AST]) -> None: """注册 CDefine 常量(浮点字面量 → register_cdefine_double,否则整数)""" if pool is None or name is None: return @@ -165,15 +165,15 @@ class AssignGenMixin: # t.CFloat64T(2.5) / t.CDouble(1.0)。取第一个参数作为真实值节点, # 再按 Constant 分支处理(浮点 → register_cdefine_double)。 if val_node is not None and val_node.kind() == ast.ASTKind.Call: - cl_cd: ast.Call | t.CPtr = (ast.Call | t.CPtr)(val_node) + cl_cd: rawptr[ast.Call] = rawptr[ast.Call](val_node) if cl_cd is not None and cl_cd.args is not None: - cl_args_cd: list[ast.AST | t.CPtr] | t.CPtr = cl_cd.args + cl_args_cd: list[rawptr[ast.AST]] | t.CPtr = cl_cd.args if len(cl_args_cd) > 0: - first_arg_cd: ast.AST | t.CPtr = cl_args_cd.get(0) + first_arg_cd: rawptr[ast.AST] = cl_args_cd.get(0) if first_arg_cd is not None and first_arg_cd.kind() == ast.ASTKind.Constant: val_node = first_arg_cd if val_node is not None and val_node.kind() == ast.ASTKind.Constant: - cn_fp: ast.Constant | t.CPtr = (ast.Constant | t.CPtr)(val_node) + cn_fp: rawptr[ast.Constant] = rawptr[ast.Constant](val_node) if cn_fp.const_kind == ast.CONST_STR: # 字符串 CDefine(如 ZLIB_VERSION: t.CDefine = "1.3.2"): # 注册为字符串常量,读取端返回 global string(对齐 TPC)。 @@ -337,23 +337,23 @@ class AssignGenMixin: # # 支持 BinOp(BitOr) 递归,同时检查 Attribute.attr 和 Name.id。 # ============================================================ - def _annotation_contains_name(self, annot: ast.AST | t.CPtr, name: str) -> int: + def _annotation_contains_name(self, annot: rawptr[ast.AST], name: str) -> int: """递归检查注解中是否包含指定名称,返回 1=包含 / 0=不包含""" if annot is None or name is None: return 0 k: int = annot.kind() if k == ast.ASTKind.Attribute: - at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(annot) + at: rawptr[ast.Attribute] = rawptr[ast.Attribute](annot) if at.attr is not None and string.strcmp(at.attr, name) == 0: return 1 return 0 if k == ast.ASTKind.Name: - nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(annot) + nm: rawptr[ast.Name] = rawptr[ast.Name](annot) if nm.id is not None and string.strcmp(nm.id, name) == 0: return 1 return 0 if k == ast.ASTKind.BinOp: - bop: ast.BinOp | t.CPtr = (ast.BinOp | t.CPtr)(annot) + bop: rawptr[ast.BinOp] = rawptr[ast.BinOp](annot) if self._annotation_contains_name(bop.left, name) != 0: return 1 if self._annotation_contains_name(bop.right, name) != 0: @@ -372,14 +372,14 @@ class AssignGenMixin: # # 注: 注解中的 "|" 是"和"的意思(组合类型),非右值中的位或运算 # ============================================================ - def _is_ptr_element_annotation(self, annot: ast.AST | t.CPtr) -> int: + def _is_ptr_element_annotation(self, annot: rawptr[ast.AST]) -> int: """检查注解是否为 bytes|t.CPtr 或 str|t.CPtr 形式""" if annot is None: return 0 k: int = annot.kind() if k != ast.ASTKind.BinOp: return 0 - bop: ast.BinOp | t.CPtr = (ast.BinOp | t.CPtr)(annot) + bop: rawptr[ast.BinOp] = rawptr[ast.BinOp](annot) if bop.op != ast.OpKind.BitOr: return 0 if self._annotation_contains_name(annot, "str") != 0: @@ -394,10 +394,10 @@ class AssignGenMixin: if self._is_generic_tp_or_nested(bop.left) != 0 or self._is_generic_tp_or_nested(bop.right) != 0: gp_nm: str = None if bop.left is not None and bop.left.kind() == ast.ASTKind.Name: - gp_left_nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(bop.left) + gp_left_nm: rawptr[ast.Name] = rawptr[ast.Name](bop.left) gp_nm = gp_left_nm.id elif bop.right is not None and bop.right.kind() == ast.ASTKind.Name: - gp_right_nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(bop.right) + gp_right_nm: rawptr[ast.Name] = rawptr[ast.Name](bop.right) gp_nm = gp_right_nm.id if gp_nm is not None: # 经全局 gen 委托解析泛型参数(T → 具体类型名)。不能 self.GenericTpNames @@ -419,8 +419,8 @@ class AssignGenMixin: return 0 def _stg_ty_equal(self, pool: rawptr[memhub.MemBuddy], - ta: llvmlite.LLVMType | t.CPtr, - tb: llvmlite.LLVMType | t.CPtr) -> int: + ta: rawptr[llvmlite.LLVMType], + tb: rawptr[llvmlite.LLVMType]) -> int: """类型内容相等比较(storage 绑定判定用)。 llvmlite 类型非 canonical:Ptr/Struct 每次构造都 pool.alloc 新实例 @@ -447,7 +447,7 @@ class AssignGenMixin: return 0 return 1 if string.strcmp(buf_a, buf_b) == 0 else 0 - def _is_addrlike_call(self, node: ast.AST | t.CPtr) -> int: + def _is_addrlike_call(self, node: rawptr[ast.AST]) -> int: """检查 rhs 是否为 c.Addr/c.Deref 等显式指针操作调用。 此类调用返回指针(如 c.Addr(obj) 返回对象 storage 地址,类型 Ptr(Struct)), @@ -457,13 +457,13 @@ class AssignGenMixin: """ if node is None or node.kind() != ast.ASTKind.Call: return 0 - cl: ast.Call | t.CPtr = (ast.Call | t.CPtr)(node) + cl: rawptr[ast.Call] = rawptr[ast.Call](node) if cl.func is None or cl.func.kind() != ast.ASTKind.Attribute: return 0 - at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(cl.func) + at: rawptr[ast.Attribute] = rawptr[ast.Attribute](cl.func) if at.value is None or at.value.kind() != ast.ASTKind.Name: return 0 - vn: ast.Name | t.CPtr = (ast.Name | t.CPtr)(at.value) + vn: rawptr[ast.Name] = rawptr[ast.Name](at.value) if vn.id is None or string.strcmp(vn.id, "c") != 0: return 0 if at.attr is None: @@ -474,17 +474,17 @@ class AssignGenMixin: if string.strcmp(at.attr, "Ptr") == 0: return 1 return 0 - def _is_64bit_scalar_ty(self, node: ast.AST | t.CPtr) -> int: + def _is_64bit_scalar_ty(self, node: rawptr[ast.AST]) -> int: """判断类型节点是否为 64 位标量数值类型(CUInt64T/CInt64T/CSizeT),元素 8 字节""" if node is None: return 0 ty_nm: str = None nk: int = node.kind() if nk == ast.ASTKind.Name: - nm64: ast.Name | t.CPtr = (ast.Name | t.CPtr)(node) + nm64: rawptr[ast.Name] = rawptr[ast.Name](node) ty_nm = nm64.id elif nk == ast.ASTKind.Attribute: - at64: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(node) + at64: rawptr[ast.Attribute] = rawptr[ast.Attribute](node) ty_nm = at64.attr if ty_nm is None: return 0 @@ -575,7 +575,7 @@ class AssignGenMixin: # 未知类名(结构体/类/污染类型)→ 非标量,按 8 字节指针槽 return 0 - def _is_generic_tp_or_nested(self, node: ast.AST | t.CPtr) -> int: + def _is_generic_tp_or_nested(self, node: rawptr[ast.AST]) -> int: """判断注解节点是否为泛型类型参数名(单字母大写,如 T)或嵌套联合(BinOp)""" if node is None: return 0 @@ -583,7 +583,7 @@ class AssignGenMixin: if nk == ast.ASTKind.BinOp: return 1 if nk == ast.ASTKind.Name: - nm_tp: ast.Name | t.CPtr = (ast.Name | t.CPtr)(node) + nm_tp: rawptr[ast.Name] = rawptr[ast.Name](node) if nm_tp.id is None: return 0 tp_len: sizet = string.strlen(nm_tp.id) @@ -611,23 +611,23 @@ class AssignGenMixin: # ============================================================ def _init_global_array_from_list(self, builder: llvmlite.IRBuilder | t.CPtr, pool: rawptr[memhub.MemBuddy], - mod: llvmlite.LLVMModule | t.CPtr, + mod: rawptr[llvmlite.LLVMModule], array_alloca: llvmlite.Value | t.CPtr, - list_node: ast.AST | t.CPtr, - trans: HT.Translator | t.CPtr) -> int: + list_node: rawptr[ast.AST], + trans: rawptr[HT.Translator]) -> int: """从列表字面量初始化全局数组,为每个元素生成 GEP + store""" if builder is None or array_alloca is None or list_node is None: return 1 # 获取数组类型(Pointee of [N x elem_ty]*) - arr_ty: llvmlite.LLVMType | t.CPtr = None + arr_ty: rawptr[llvmlite.LLVMType] = None if array_alloca.Ty is not None: arr_ty = array_alloca.Ty.Pointee if arr_ty is None: return 1 # 匹配数组类型获取元素类型与声明长度 - elem_ty: llvmlite.LLVMType | t.CPtr = None + elem_ty: rawptr[llvmlite.LLVMType] = None arr_count: int = 0 match arr_ty: case llvmlite.LLVMType.Array(et, cnt): @@ -640,15 +640,15 @@ class AssignGenMixin: lst: ast.List | t.CPtr = (ast.List | t.CPtr)(list_node) if lst is None or lst.elts is None: return 1 - elts: list[ast.AST | t.CPtr] | t.CPtr = lst.elts + elts: list[rawptr[ast.AST]] | t.CPtr = lst.elts elts_count: sizet = len(elts) # 特例:单个字符串字面量初始化字符数组([N x i8],N = strlen+1) # 逐字节写入字符串内容;调用方已先 store zeroinitializer,末字节 NUL 由零保持。 if self.Gen.ExprGenBase.get_llvm_type_bits(elem_ty) == 8 and elts_count == 1 and arr_count >= 1: - e0_s: ast.AST | t.CPtr = elts.get(0) + e0_s: rawptr[ast.AST] = elts.get(0) if e0_s is not None and e0_s.kind() == ast.ASTKind.Constant: - c0_s: ast.Constant | t.CPtr = (ast.Constant | t.CPtr)(e0_s) + c0_s: rawptr[ast.Constant] = rawptr[ast.Constant](e0_s) if c0_s.const_kind == ast.CONST_STR: sv_s: str = ast.constant_get_str_val(c0_s) if sv_s is not None: @@ -681,7 +681,7 @@ class AssignGenMixin: # 为每个元素生成 GEP + store for i in range(elts_count): - elem_node: ast.AST | t.CPtr = elts.get(i) + elem_node: rawptr[ast.AST] = elts.get(i) idx_val: llvmlite.Value | t.CPtr = llvmlite.const_int32(pool, i) elem_ptr: llvmlite.Value | t.CPtr = llvmlite.build_gep_array( builder, arr_ty, elem_ty, array_alloca, idx_val) @@ -722,9 +722,9 @@ class AssignGenMixin: op: int, lhs: llvmlite.Value | t.CPtr, rhs: llvmlite.Value | t.CPtr, - node: ast.AST | t.CPtr = None, - trans: HT.Translator | t.CPtr = None, - lhs_node: ast.AST | t.CPtr = None) -> llvmlite.Value | t.CPtr: + node: rawptr[ast.AST] = None, + trans: rawptr[HT.Translator] = None, + lhs_node: rawptr[ast.AST] = None) -> llvmlite.Value | t.CPtr: """应用增强赋值的二元运算(浮点 + 指针算术 + 整数运算)""" lhs_bits: int = self.Gen.ExprGenBase.get_llvm_type_bits(lhs.Ty) rhs_bits: int = self.Gen.ExprGenBase.get_llvm_type_bits(rhs.Ty) @@ -738,7 +738,7 @@ class AssignGenMixin: target_fbits: int = lhs_fbits if rhs_fbits > target_fbits: target_fbits = rhs_fbits - target_float_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Double(pool) + target_float_ty: rawptr[llvmlite.LLVMType] = llvmlite.Double(pool) if target_fbits == 32: target_float_ty = llvmlite.Float(pool) # 将两个操作数转换为目标浮点类型(int→float via si2fp, float→float via fpext/fptrunc) @@ -802,8 +802,8 @@ class AssignGenMixin: # # 支持 += -= *= /= %= &= |= ^= <<= >>=,local/global/nonlocal 三种作用域 # ============================================================ - def translate_augassign(self, trans: HT.Translator | t.CPtr, - node: ast.AST | t.CPtr) -> int: + def translate_augassign(self, trans: rawptr[HT.Translator], + node: rawptr[ast.AST]) -> int: """翻译增强赋值语句 (x += 1, y -= 2, etc.)""" if node is None: return 0 @@ -812,7 +812,7 @@ class AssignGenMixin: if aug is None: return 0 - target: ast.AST | t.CPtr = aug.target + target: rawptr[ast.AST] = aug.target if target is None: return 0 @@ -823,7 +823,7 @@ class AssignGenMixin: if tk == ast.ASTKind.Attribute: pool: rawptr[memhub.MemBuddy] = trans.Pool builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder - mod: llvmlite.LLVMModule | t.CPtr = trans.Module + mod: rawptr[llvmlite.LLVMModule] = trans.Module # 1. 获取字段指针 field_ptr: llvmlite.Value | t.CPtr = self.Gen.ExprGenAttr.get_attribute_ptr( @@ -833,7 +833,7 @@ class AssignGenMixin: self.Gen.TypeGenErr.fatal_error(target, "attribute ptr is None", "TypeError") # 2. 确定字段类型并加载当前值 - target_ty: llvmlite.LLVMType | t.CPtr = None + target_ty: rawptr[llvmlite.LLVMType] = None if field_ptr.Ty is not None and field_ptr.Ty.Pointee is not None: target_ty = field_ptr.Ty.Pointee if target_ty is None: @@ -872,7 +872,7 @@ class AssignGenMixin: if tk == ast.ASTKind.Subscript: pool: rawptr[memhub.MemBuddy] = trans.Pool builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder - mod: llvmlite.LLVMModule | t.CPtr = trans.Module + mod: rawptr[llvmlite.LLVMModule] = trans.Module # 1. 获取元素指针 elem_ptr: llvmlite.Value | t.CPtr = self.Gen.ExprGenName.get_subscript_ptr( @@ -882,7 +882,7 @@ class AssignGenMixin: self.Gen.TypeGenErr.fatal_error(target, "subscript ptr is None", "TypeError") # 2. 确定元素类型并加载当前值 - target_ty: llvmlite.LLVMType | t.CPtr = None + target_ty: rawptr[llvmlite.LLVMType] = None if elem_ptr.Ty is not None and elem_ptr.Ty.Pointee is not None: target_ty = elem_ptr.Ty.Pointee if target_ty is None: @@ -921,13 +921,13 @@ class AssignGenMixin: self.Gen.TypeGenErr.fatal_error( target, "AugAssign 目标类型不支持,仅支持 Name/Attribute/Subscript", "TypeError") - nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(target) + nm: rawptr[ast.Name] = rawptr[ast.Name](target) if nm is None or nm.id is None: return 0 pool: rawptr[memhub.MemBuddy] = trans.Pool builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder - mod: llvmlite.LLVMModule | t.CPtr = trans.Module + mod: rawptr[llvmlite.LLVMModule] = trans.Module # 1. 确定变量作用域类型: 0=local, 1=global, 2=nonlocal scope_type: int = 0 @@ -939,7 +939,7 @@ class AssignGenMixin: # 2. 加载当前值 cur_val: llvmlite.Value | t.CPtr = None target_alloca: llvmlite.Value | t.CPtr = None - target_ty: llvmlite.LLVMType | t.CPtr = None + target_ty: rawptr[llvmlite.LLVMType] = None if scope_type == 1: # global 变量 @@ -1017,7 +1017,7 @@ class AssignGenMixin: # 真实实现 TypeGenCType._is_ctypedef_annotation 在另一 Mixin,经 # gen 单例(HandlesExpr._g_gen 镜像)跨链调用。 # ============================================================ - def is_ctypedef_annotation(self, annot: ast.AST | t.CPtr) -> int: + def is_ctypedef_annotation(self, annot: rawptr[ast.AST]) -> int: """检测注解是否为 t.CTypedef,返回 1 表示是,0 表示否""" return self.Gen.TypeGenCType._is_ctypedef_annotation(annot) @@ -1029,7 +1029,7 @@ class AssignGenMixin: # 静态数组 [len x elem_ty](对齐 TPC ParseListAnnotation 的 is_pointer 分支: # "单参数 list[type] → 指针,但如果有列表字面量初始化值则按数组 list[type, N] 处理")。 # ============================================================ - def _is_single_param_carray_annot(self, annot: ast.AST | t.CPtr) -> int: + def _is_single_param_carray_annot(self, annot: rawptr[ast.AST]) -> int: """检查注解是否为单参/None 长度 t.CArray[...],返回 1=是 0=否 支持两种书写形式: @@ -1038,21 +1038,21 @@ class AssignGenMixin: """ if annot is None or annot.kind() != ast.ASTKind.Subscript: return 0 - sub: ast.Subscript | t.CPtr = (ast.Subscript | t.CPtr)(annot) + sub: rawptr[ast.Subscript] = rawptr[ast.Subscript](annot) if sub.value is None or sub.slice is None: return 0 if sub.value.kind() == ast.ASTKind.Attribute: - at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(sub.value) + at: rawptr[ast.Attribute] = rawptr[ast.Attribute](sub.value) if at.attr is None or string.strcmp(at.attr, "CArray") != 0: return 0 if at.value is None or at.value.kind() != ast.ASTKind.Name: return 0 - mv: ast.Name | t.CPtr = (ast.Name | t.CPtr)(at.value) + mv: rawptr[ast.Name] = rawptr[ast.Name](at.value) if mv.id is None or string.strcmp(mv.id, "t") != 0: return 0 elif sub.value.kind() == ast.ASTKind.Name: # 裸名 CArray(from t import *)/ 内建 rawarray:与 t.CArray 等价 - bn: ast.Name | t.CPtr = (ast.Name | t.CPtr)(sub.value) + bn: rawptr[ast.Name] = rawptr[ast.Name](sub.value) if bn.id is None or (string.strcmp(bn.id, "CArray") != 0 and string.strcmp(bn.id, "rawarray") != 0): return 0 else: @@ -1061,12 +1061,12 @@ class AssignGenMixin: if sub.slice.kind() != ast.ASTKind.Tuple: return 1 # 双参形式:count=None(t.CArray[u64, None])→ 等价单参 - tup: ast.Tuple | t.CPtr = (ast.Tuple | t.CPtr)(sub.slice) + tup: rawptr[ast.Tuple] = rawptr[ast.Tuple](sub.slice) if tup.elts is None or len(tup.elts) < 2: return 0 - cnt_node: ast.AST | t.CPtr = tup.elts.get(1) + cnt_node: rawptr[ast.AST] = tup.elts.get(1) if cnt_node is not None and cnt_node.kind() == ast.ASTKind.Constant: - cn0: ast.Constant | t.CPtr = (ast.Constant | t.CPtr)(cnt_node) + cn0: rawptr[ast.Constant] = rawptr[ast.Constant](cnt_node) if cn0.const_kind == ast.CONST_NONE: return 1 return 0 @@ -1076,13 +1076,13 @@ class AssignGenMixin: # ParseListAnnotation 语义推断为静态数组(否则误走动态 list 构造 → 链接期 undefined)。 # PreScan 与 Handle 都必须调用:两处 alloca 类型须一致,否则复用旧 alloca 使推断失效。 def _infer_static_array_ty_from_literal(self, pool: rawptr[memhub.MemBuddy], - annot: ast.AST | t.CPtr, - value: ast.AST | t.CPtr, - resolved_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.LLVMType | t.CPtr: + annot: rawptr[ast.AST], + value: rawptr[ast.AST], + resolved_ty: rawptr[llvmlite.LLVMType]) -> rawptr[llvmlite.LLVMType]: """单参 CArray + 列表字面量 → Array(elem_ty, len);否则返回原类型""" if value is not None and value.kind() == ast.ASTKind.List and resolved_ty is not None: if self._is_single_param_carray_annot(annot) != 0: - elem_ty_arr: llvmlite.LLVMType | t.CPtr = resolved_ty.Pointee + elem_ty_arr: rawptr[llvmlite.LLVMType] = resolved_ty.Pointee lst_arr: ast.List | t.CPtr = (ast.List | t.CPtr)(value) cnt_arr: int = 0 if lst_arr.elts is not None: @@ -1091,9 +1091,9 @@ class AssignGenMixin: # 语义是"以字符串内容初始化字符数组",长度应取 strlen+1(含结尾 NUL), # 而不是列表元素个数 1——否则 alloca [1 x i8] 且只写首字节 → 下标 0..15 越界读。 if elem_ty_arr is not None and cnt_arr == 1 and lst_arr.elts is not None: - e0_arr: ast.AST | t.CPtr = lst_arr.elts.get(0) + e0_arr: rawptr[ast.AST] = lst_arr.elts.get(0) if e0_arr is not None and e0_arr.kind() == ast.ASTKind.Constant: - c0_arr: ast.Constant | t.CPtr = (ast.Constant | t.CPtr)(e0_arr) + c0_arr: rawptr[ast.Constant] = rawptr[ast.Constant](e0_arr) if c0_arr.const_kind == ast.CONST_STR: sv0_arr: str = ast.constant_get_str_val(c0_arr) if sv0_arr is not None and self.Gen.ExprGenBase.get_llvm_type_bits(elem_ty_arr) == 8: @@ -1110,7 +1110,7 @@ class AssignGenMixin: # 便于直接定位是"注解本身未注册"还是"builtins 扫描未命中/未展开"。 # ============================================================ def _build_ann_fail_msg(self, pool: rawptr[memhub.MemBuddy], - annot: ast.AST | t.CPtr, nm_id: str) -> str: + annot: rawptr[ast.AST], nm_id: str) -> str: """构建变量类型注解解析失败的详细报错信息 注意:f-string 翻译产物是栈上 alloca 缓冲,在助手函数返回后帧销毁, @@ -1142,8 +1142,8 @@ class AssignGenMixin: # # 为有类型注解的变量提前创建 alloca 到 entry block 顶部;返回新增的变量数 # ============================================================ - def translate_annassign_prescan(self, trans: HT.Translator | t.CPtr, - node: ast.AST | t.CPtr) -> int: + def translate_annassign_prescan(self, trans: rawptr[HT.Translator], + node: rawptr[ast.AST]) -> int: """预扫描 AnnAssign,提前创建 alloca 到 entry block 顶部""" if node is None: return 0 @@ -1151,14 +1151,14 @@ class AssignGenMixin: if k != ast.ASTKind.AnnAssign: return 0 - aa: ast.AnnAssign | t.CPtr = (ast.AnnAssign | t.CPtr)(node) + aa: rawptr[ast.AnnAssign] = rawptr[ast.AnnAssign](node) if aa is None or aa.target is None: return 0 - target: ast.AST | t.CPtr = aa.target + target: rawptr[ast.AST] = aa.target if target.kind() != ast.ASTKind.Name: return 0 - nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(target) + nm: rawptr[ast.Name] = rawptr[ast.Name](target) if nm.id is None: return 0 @@ -1199,8 +1199,8 @@ class AssignGenMixin: builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder # 从 annotation 推断类型(修复:原硬编码 i32 导致 str 等类型错误) - var_ty: llvmlite.LLVMType | t.CPtr = None - annot: ast.AST | t.CPtr = aa.annotation + var_ty: rawptr[llvmlite.LLVMType] = None + annot: rawptr[ast.AST] = aa.annotation if annot is not None: # 泛型特化补救(在解析之前无条件执行,_specialize_generic_class 幂等): # 注解可能是 list[X](Subscript)或 list[X] | t.CPtr(含 CPtr 的 BinOp)。 @@ -1210,7 +1210,7 @@ class AssignGenMixin: # i32→AST* 截断指针 → StmtGenMixin._translate_stmt_impl 读垃圾节点崩溃。 # 与 Handle 路径共用 _prespecialize_generic_annotation,保证两处解析一致。 self._prespecialize_generic_annotation(trans, pool, annot) - resolved: llvmlite.LLVMType | t.CPtr = self.Gen.TypeGenResolve.resolve_annotation_type( + resolved: rawptr[llvmlite.LLVMType] = self.Gen.TypeGenResolve.resolve_annotation_type( pool, annot, trans._imported_modules, trans._from_imports, trans, 0) if resolved is not None: var_ty = resolved @@ -1263,32 +1263,32 @@ class AssignGenMixin: # 保证两处解析结果一致(未复用预扫描 alloca 的路径也必须先特化)。 # _specialize_generic_class 幂等,重复调用安全。 # 返回 1=执行过特化尝试;0=注解形态不适用(非泛型 Subscript)。 - def _prespecialize_generic_annotation(self, trans: HT.Translator | t.CPtr, + def _prespecialize_generic_annotation(self, trans: rawptr[HT.Translator], pool: rawptr[memhub.MemBuddy], - annot: ast.AST | t.CPtr) -> int: + annot: rawptr[ast.AST]) -> int: """泛型注解预特化(见上方注释),返回 1=已尝试 / 0=不适用""" if annot is None or trans is None: return 0 # 取注解中的泛型 Subscript 一侧:Subscript 本身,或 A | t.CPtr 的 Subscript 分支 - spec_annot: ast.Subscript | t.CPtr = None + spec_annot: rawptr[ast.Subscript] = None if annot.kind() == ast.ASTKind.Subscript: - spec_annot = (ast.Subscript | t.CPtr)(annot) + spec_annot = rawptr[ast.Subscript](annot) elif annot.kind() == ast.ASTKind.BinOp: - bop_ps: ast.BinOp | t.CPtr = (ast.BinOp | t.CPtr)(annot) + bop_ps: rawptr[ast.BinOp] = rawptr[ast.BinOp](annot) if bop_ps.op == ast.OpKind.BitOr: if bop_ps.left is not None and bop_ps.left.kind() == ast.ASTKind.Subscript: - spec_annot = (ast.Subscript | t.CPtr)(bop_ps.left) + spec_annot = rawptr[ast.Subscript](bop_ps.left) elif bop_ps.right is not None and bop_ps.right.kind() == ast.ASTKind.Subscript: - spec_annot = (ast.Subscript | t.CPtr)(bop_ps.right) + spec_annot = rawptr[ast.Subscript](bop_ps.right) if spec_annot is None: return 0 - sv_ps: ast.AST | t.CPtr = spec_annot.value + sv_ps: rawptr[ast.AST] = spec_annot.value if sv_ps is None or sv_ps.kind() != ast.ASTKind.Name: return 0 - sub_nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(sv_ps) + sub_nm: rawptr[ast.Name] = rawptr[ast.Name](sv_ps) if sub_nm.id is None: return 0 - template_cd: ast.ClassDef | t.CPtr = self.Gen.ClassGenGeneric._find_generic_template(sub_nm.id) + template_cd: rawptr[ast.ClassDef] = self.Gen.ClassGenGeneric._find_generic_template(sub_nm.id) if template_cd is None: return 0 type_args_ps: list[str] | t.CPtr = self.Gen.CallGenCtor._extract_type_args_from_slice( @@ -1306,10 +1306,10 @@ class AssignGenMixin: # 返回新增的变量数 # ============================================================ def _fail_on_degenerated_generic_annotation(self, - aa: ast.AnnAssign | t.CPtr, + aa: rawptr[ast.AnnAssign], var_name: str, - annot: ast.AST | t.CPtr, - var_ty: llvmlite.LLVMType | t.CPtr) -> int: + annot: rawptr[ast.AST], + var_ty: rawptr[llvmlite.LLVMType]) -> int: """fail-fast:泛型注解解析成了「裸泛型基类指针」(丢失类型实参) 场景:注解是泛型下标 `list[X]` 或 `list[X] | t.CPtr`,但 @@ -1328,20 +1328,20 @@ class AssignGenMixin: if aa is None or annot is None or var_ty is None: return 0 # 取注解里的泛型 Subscript 一侧:Subscript 本身,或 A | t.CPtr 的 Subscript 分支 - ann_sub: ast.Subscript | t.CPtr = None + ann_sub: rawptr[ast.Subscript] = None if annot.kind() == ast.ASTKind.Subscript: - ann_sub = (ast.Subscript | t.CPtr)(annot) + ann_sub = rawptr[ast.Subscript](annot) elif annot.kind() == ast.ASTKind.BinOp: - bop_ff: ast.BinOp | t.CPtr = (ast.BinOp | t.CPtr)(annot) + bop_ff: rawptr[ast.BinOp] = rawptr[ast.BinOp](annot) if bop_ff.op == ast.OpKind.BitOr: if bop_ff.left is not None and bop_ff.left.kind() == ast.ASTKind.Subscript: - ann_sub = (ast.Subscript | t.CPtr)(bop_ff.left) + ann_sub = rawptr[ast.Subscript](bop_ff.left) elif bop_ff.right is not None and bop_ff.right.kind() == ast.ASTKind.Subscript: - ann_sub = (ast.Subscript | t.CPtr)(bop_ff.right) + ann_sub = rawptr[ast.Subscript](bop_ff.right) if ann_sub is None or ann_sub.value is None \ or ann_sub.value.kind() != ast.ASTKind.Name: return 0 - base_nm_ff: ast.Name | t.CPtr = (ast.Name | t.CPtr)(ann_sub.value) + base_nm_ff: rawptr[ast.Name] = rawptr[ast.Name](ann_sub.value) if base_nm_ff.id is None: return 0 # 仅当该基名确实是泛型模板(list/GSList/...)才判定为退化 @@ -1365,18 +1365,18 @@ class AssignGenMixin: "TypeError") return 0 - def translate_annassign(self, trans: HT.Translator | t.CPtr, - node: ast.AST | t.CPtr) -> int: + def translate_annassign(self, trans: rawptr[HT.Translator], + node: rawptr[ast.AST]) -> int: """翻译 AnnAssign(target=Name, annotation=..., value=expr)""" - aa: ast.AnnAssign | t.CPtr = (ast.AnnAssign | t.CPtr)(node) + aa: rawptr[ast.AnnAssign] = rawptr[ast.AnnAssign](node) if aa is None: return 0 - target: ast.AST | t.CPtr = aa.target + target: rawptr[ast.AST] = aa.target if target is None or target.kind() != ast.ASTKind.Name: return 0 - nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(target) + nm: rawptr[ast.Name] = rawptr[ast.Name](target) if nm.id is None: return 0 @@ -1403,17 +1403,17 @@ class AssignGenMixin: pool: rawptr[memhub.MemBuddy] = trans.Pool builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder - mod: llvmlite.LLVMModule | t.CPtr = trans.Module + mod: rawptr[llvmlite.LLVMModule] = trans.Module # 确定类型(从 annotation 推断) - var_ty: llvmlite.LLVMType | t.CPtr = None - annot: ast.AST | t.CPtr = aa.annotation + var_ty: rawptr[llvmlite.LLVMType] = None + annot: rawptr[ast.AST] = aa.annotation if annot is not None: # 与 PreScan 同源:先注册泛型特化,避免 list[X] 退化为裸 list* 后 .get() # 误分派(返回 i32 → inttoptr 截断)。此处为循环体内重声明同名变量、 # 不复用预扫描 alloca 的路径(详见 _prespecialize_generic_annotation)。 self._prespecialize_generic_annotation(trans, pool, annot) - resolved: llvmlite.LLVMType | t.CPtr = self.Gen.TypeGenResolve.resolve_annotation_type( + resolved: rawptr[llvmlite.LLVMType] = self.Gen.TypeGenResolve.resolve_annotation_type( pool, annot, trans._imported_modules, trans._from_imports, trans, 0) if resolved is not None: var_ty = resolved @@ -1431,7 +1431,7 @@ class AssignGenMixin: "SyntaxError") # t.Callable 函数指针:注册返回类型签名(供函数指针间接调用精确返回类型) - callable_ret: llvmlite.LLVMType | t.CPtr = self.Gen.TypeGenErr.try_extract_callable_ret( + callable_ret: rawptr[llvmlite.LLVMType] = self.Gen.TypeGenErr.try_extract_callable_ret( pool, annot, trans._imported_modules, trans._from_imports, trans) if callable_ret is not None: self.Gen.CallGenLeafKit.register_func_ptr_sig(nm.id, callable_ret) @@ -1444,7 +1444,7 @@ class AssignGenMixin: # P1-A(上下文位宽传播):把目标变量的类型作为 target_ty 传入, # 使整数字面量按目标位宽直接物化(如 uint64 目标 → i64 const), # 与显式 u64(...) 强转一致,且省去后续 coerce 生成的 zext。 - aa_glob_ty: llvmlite.LLVMType | t.CPtr = None + aa_glob_ty: rawptr[llvmlite.LLVMType] = None if mod_alloca.Ty is not None: aa_glob_ty = mod_alloca.Ty.Pointee # 供 c.Deref(i8*) 推断读取宽度 / 裸名泛型构造从注解推断类型实参: @@ -1469,8 +1469,8 @@ class AssignGenMixin: if self._is_addrlike_call(aa.value) == 0 \ and stg_ref_aa is not None and rhs_val.Ty is not None \ and stg_ref_aa.Ty is not None and stg_ref_aa.Ty.Pointee is not None: - stg_ty_aa: llvmlite.LLVMType | t.CPtr = stg_ref_aa.Ty.Pointee - rhs_inner_aa: llvmlite.LLVMType | t.CPtr = None + stg_ty_aa: rawptr[llvmlite.LLVMType] = stg_ref_aa.Ty.Pointee + rhs_inner_aa: rawptr[llvmlite.LLVMType] = None match rhs_val.Ty: case llvmlite.LLVMType.Ptr(pointee_aa): rhs_inner_aa = pointee_aa @@ -1488,7 +1488,7 @@ class AssignGenMixin: trans.CurAssignAnnot = None trans.CurAssignNode = None return 0 - target_ty: llvmlite.LLVMType | t.CPtr = None + target_ty: rawptr[llvmlite.LLVMType] = None if mod_alloca.Ty is not None: target_ty = mod_alloca.Ty.Pointee if target_ty is not None: @@ -1512,7 +1512,7 @@ class AssignGenMixin: trans, nm.id) # 从 nl_ptr 的类型推断 nonlocal 变量实际类型, # 不再强制 i32(会截断指针/结构体/i64 导致闭包数据损坏) - nl_target_ty: llvmlite.LLVMType | t.CPtr = None + nl_target_ty: rawptr[llvmlite.LLVMType] = None if nl_ptr is not None and nl_ptr.Ty is not None: nl_target_ty = nl_ptr.Ty.Pointee # 供 c.Deref(i8*) 推断读取宽度 / 裸名泛型构造从注解推断类型实参: @@ -1565,7 +1565,7 @@ class AssignGenMixin: builder, pool, mod, mod_glob, aa.value, trans) else: # P1-A:模块级全局目标类型作为 target_ty(同上方 global 分支) - mg_val_ty: llvmlite.LLVMType | t.CPtr = None + mg_val_ty: rawptr[llvmlite.LLVMType] = None if mod_glob.Ty is not None: mg_val_ty = mod_glob.Ty.Pointee # 供 c.Deref(i8*) 推断读取宽度 / 裸名泛型构造从注解推断类型实参: @@ -1589,8 +1589,8 @@ class AssignGenMixin: if self._is_addrlike_call(aa.value) == 0 \ and stg_ref_mg is not None and rhs_val_mg.Ty is not None \ and stg_ref_mg.Ty is not None and stg_ref_mg.Ty.Pointee is not None: - stg_ty_mg: llvmlite.LLVMType | t.CPtr = stg_ref_mg.Ty.Pointee - rhs_inner_mg: llvmlite.LLVMType | t.CPtr = None + stg_ty_mg: rawptr[llvmlite.LLVMType] = stg_ref_mg.Ty.Pointee + rhs_inner_mg: rawptr[llvmlite.LLVMType] = None match rhs_val_mg.Ty: case llvmlite.LLVMType.Ptr(pointee_mg): rhs_inner_mg = pointee_mg @@ -1608,7 +1608,7 @@ class AssignGenMixin: trans.CurAssignAnnot = None trans.CurAssignNode = None return 0 - target_ty_mg: llvmlite.LLVMType | t.CPtr = None + target_ty_mg: rawptr[llvmlite.LLVMType] = None if mod_glob.Ty is not None: target_ty_mg = mod_glob.Ty.Pointee if target_ty_mg is not None: @@ -1644,11 +1644,11 @@ class AssignGenMixin: # 旧 alloca(同名重声明 / 退化 alloca,如裸 list* 对上 list[ast.ASTptr]*)。 # 只比较「双方都是指针且 pointee 都是结构体」:结构体名不同即 fail-fast(不兜底)。 if alloca is not None and alloca.Ty is not None and var_ty is not None: - av_pt_d: llvmlite.LLVMType | t.CPtr = alloca.Ty.Pointee + av_pt_d: rawptr[llvmlite.LLVMType] = alloca.Ty.Pointee if av_pt_d is not None and self.Gen.ExprGenBase.is_ptr_type(av_pt_d) != 0 \ and self.Gen.ExprGenBase.is_ptr_type(var_ty) != 0: - av_in: llvmlite.LLVMType | t.CPtr = av_pt_d.Pointee - vt_in: llvmlite.LLVMType | t.CPtr = var_ty.Pointee + av_in: rawptr[llvmlite.LLVMType] = av_pt_d.Pointee + vt_in: rawptr[llvmlite.LLVMType] = var_ty.Pointee if av_in is not None and vt_in is not None: av_nm_d: str = llvmlite.get_struct_name(av_in) vt_nm_d: str = llvmlite.get_struct_name(vt_in) @@ -1661,7 +1661,7 @@ class AssignGenMixin: av_pf: int = GenApi.sha1_prefix_len(av_nm_d) av_short: str = av_nm_d + av_pf if av_pf != 0 else av_nm_d if string.strchr(av_short, '[') is None: - av_tpl: ast.ClassDef | t.CPtr = self.Gen.ClassGenGeneric._find_generic_template(av_short) + av_tpl: rawptr[ast.ClassDef] = self.Gen.ClassGenGeneric._find_generic_template(av_short) if av_tpl is not None: self.Gen.TypeGenErr.fatal_error( aa, @@ -1674,11 +1674,11 @@ class AssignGenMixin: # 仅裸 str 注解(Name("str"))且 _str 已注册时创建;bytes / char|t.CPtr 不创建。 # a 保持为 i8*(可 printf/len),a__meta__ 存 __data__/__mbuddy__ 等字段, # 属性读写(fd3)与方法调用(fd5)均通过该影子解析。 - fd_str_ty: llvmlite.LLVMType | t.CPtr = None + fd_str_ty: rawptr[llvmlite.LLVMType] = None fd_meta_alloca: llvmlite.Value | t.CPtr = None fd_meta_name: str = None if annot is not None and annot.kind() == ast.ASTKind.Name: - fd_annot: ast.Name | t.CPtr = (ast.Name | t.CPtr)(annot) + fd_annot: rawptr[ast.Name] = rawptr[ast.Name](annot) if fd_annot is not None and fd_annot.id is not None: if string.strcmp(fd_annot.id, "str") == 0: fd_str_ty = self.Gen.StructGen.get_struct_type("_str") @@ -1725,30 +1725,30 @@ class AssignGenMixin: # value 是 Call 且 func 是 Name 且该名字是 async 函数时, # 登记 _coro_var_async[target] = callee。 if aa.value.kind() == ast.ASTKind.Call: - val_cl: ast.Call | t.CPtr = (ast.Call | t.CPtr)(aa.value) + val_cl: rawptr[ast.Call] = rawptr[ast.Call](aa.value) if val_cl.func is not None and val_cl.func.kind() == ast.ASTKind.Name: - val_nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(val_cl.func) + val_nm: rawptr[ast.Name] = rawptr[ast.Name](val_cl.func) if val_nm.id is not None: if self.Gen.AsyncGen.is_async_func(trans, val_nm.id) != 0: self.Gen.AsyncGen.register_coro_var(trans, nm.id, val_nm.id) # c.Addr(async_call):tt: Coroutine = c.Addr(task()) 就地解读 elif val_cl.func is not None and val_cl.func.kind() == ast.ASTKind.Attribute: - val_at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(val_cl.func) + val_at: rawptr[ast.Attribute] = rawptr[ast.Attribute](val_cl.func) if val_at.attr is not None and string.strcmp(val_at.attr, "Addr") == 0 \ and val_cl.args is not None and len(val_cl.args) >= 1: - icall: ast.AST | t.CPtr = val_cl.args.get(0) + icall: rawptr[ast.AST] = val_cl.args.get(0) if icall is not None and icall.kind() == ast.ASTKind.Call: - icl2: ast.Call | t.CPtr = (ast.Call | t.CPtr)(icall) + icl2: rawptr[ast.Call] = rawptr[ast.Call](icall) if icl2.func is not None and icl2.func.kind() == ast.ASTKind.Name: - inm2: ast.Name | t.CPtr = (ast.Name | t.CPtr)(icl2.func) + inm2: rawptr[ast.Name] = rawptr[ast.Name](icl2.func) if inm2.id is not None: if self.Gen.AsyncGen.is_async_func(trans, inm2.id) != 0: self.Gen.AsyncGen.register_coro_var(trans, nm.id, inm2.id) # 局部数组:列表字面量 → 先整体置零,再逐元素 GEP + store 初始化。 # 不走 translate_list_literal(避免误触发 list[T] 泛型特化)。 - local_arr_ty: llvmlite.LLVMType | t.CPtr = None + local_arr_ty: rawptr[llvmlite.LLVMType] = None if aa.value.kind() == ast.ASTKind.List and alloca.Ty is not None: - pt_l: llvmlite.LLVMType | t.CPtr = alloca.Ty.Pointee + pt_l: rawptr[llvmlite.LLVMType] = alloca.Ty.Pointee if self.Gen.ExprGenBase.is_array_type(pt_l) != 0: local_arr_ty = pt_l if local_arr_ty is not None: @@ -1769,7 +1769,7 @@ class AssignGenMixin: trans.CurAssignNode = aa.value # P1-A:局部变量 alloca 的 pointee 类型作为 target_ty(同全局分支), # 使 `x: uint64 = 12345` 直接物化 i64 常量,与 `x: uint64 = u64(12345)` 一致。 - lv_target_ty: llvmlite.LLVMType | t.CPtr = None + lv_target_ty: rawptr[llvmlite.LLVMType] = None if alloca.Ty is not None: lv_target_ty = alloca.Ty.Pointee rhs_val: llvmlite.Value | t.CPtr = self.Gen.ExprGen.translate_value( @@ -1780,7 +1780,7 @@ class AssignGenMixin: # 会让 alloca 退化为 Ptr(i8),而 rhs 构造返回精确结构体指针 → 用 rhs # 精确类型重建 alloca 并更新符号表,使方法调用按精确特化类名解析; # 旧退化 alloca 残留为 entry 块死代码(文本 IR 即时生成无法删除,无害)。 - precise_rhs_ty: llvmlite.LLVMType | t.CPtr = None + precise_rhs_ty: rawptr[llvmlite.LLVMType] = None if rhs_val.Ty is not None: match rhs_val.Ty: case llvmlite.LLVMType.Ptr(inner_struct): @@ -1792,7 +1792,7 @@ class AssignGenMixin: case _: pass if precise_rhs_ty is not None and alloca.Ty is not None: - alloca_pt: llvmlite.LLVMType | t.CPtr = alloca.Ty.Pointee + alloca_pt: rawptr[llvmlite.LLVMType] = alloca.Ty.Pointee # 禁止「降级重建」:RHS 的 pointee 若是裸泛型基类(丢类型实参, # 如 {sha1}.list / {sha1}.GSList),以它重建会把注解已解析出的 # 带类型实参特化覆盖成裸基类 → .get() 按错误元素类型分派 → @@ -1802,24 +1802,24 @@ class AssignGenMixin: # Subscript 一侧),用于下方不依赖泛型模板注册表的方向判定。 ann_gen_base: str = None if annot is not None: - ag_side: ast.AST | t.CPtr = annot + ag_side: rawptr[ast.AST] = annot if ag_side.kind() == ast.ASTKind.BinOp: - ag_bop: ast.BinOp | t.CPtr = (ast.BinOp | t.CPtr)(ag_side) + ag_bop: rawptr[ast.BinOp] = rawptr[ast.BinOp](ag_side) if ag_bop.op == ast.OpKind.BitOr: if ag_bop.left is not None and ag_bop.left.kind() == ast.ASTKind.Subscript: ag_side = ag_bop.left elif ag_bop.right is not None and ag_bop.right.kind() == ast.ASTKind.Subscript: ag_side = ag_bop.right if ag_side.kind() == ast.ASTKind.Subscript: - ag_sub: ast.Subscript | t.CPtr = (ast.Subscript | t.CPtr)(ag_side) + ag_sub: rawptr[ast.Subscript] = rawptr[ast.Subscript](ag_side) if ag_sub.value is not None and ag_sub.value.kind() == ast.ASTKind.Name: - ag_nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(ag_sub.value) + ag_nm: rawptr[ast.Name] = rawptr[ast.Name](ag_sub.value) if ag_nm.id is not None: ann_gen_base = ag_nm.id rb_is_bare_generic: int = 0 if alloca_pt is not None \ and uint64(alloca_pt) != uint64(precise_rhs_ty): - rhs_pt_rb: llvmlite.LLVMType | t.CPtr = precise_rhs_ty.Pointee + rhs_pt_rb: rawptr[llvmlite.LLVMType] = precise_rhs_ty.Pointee if rhs_pt_rb is not None: rb_nm: str = llvmlite.get_struct_name(rhs_pt_rb) if rb_nm is not None: @@ -1849,7 +1849,7 @@ class AssignGenMixin: alloca = new_alloca # 类型转换:将 rhs_val 转换为 alloca 的 pointee 类型 # 修复:整数字面量是 i32,但变量可能是 i8/i16/i64,需 trunc/sext - target_ty: llvmlite.LLVMType | t.CPtr = None + target_ty: rawptr[llvmlite.LLVMType] = None if alloca.Ty is not None: target_ty = alloca.Ty.Pointee if target_ty is not None: @@ -1902,16 +1902,16 @@ class AssignGenMixin: # 迁移自 HandlesAssign.AssignHandle.Handle(对应 TransPyC # AssignHandle._HandleAssignLlvm)。共享状态从 trans 获取。 # ============================================================ - def translate_assign(self, trans: HT.Translator | t.CPtr, - node: ast.AST | t.CPtr) -> int: + def translate_assign(self, trans: rawptr[HT.Translator], + node: rawptr[ast.AST]) -> int: """翻译 Assign 语句,返回新增变量数(0 或 1)""" - asgn: ast.Assign | t.CPtr = (ast.Assign | t.CPtr)(node) + asgn: rawptr[ast.Assign] = rawptr[ast.Assign](node) if asgn is None: VLogger.error("cast failed", "ASGN") return 0 - targets: list[ast.AST | t.CPtr] | t.CPtr = asgn.targets + targets: list[rawptr[ast.AST]] | t.CPtr = asgn.targets if targets is None: VLogger.error("targets is None", "ASGN") return 0 @@ -1919,7 +1919,7 @@ class AssignGenMixin: # 从 trans 取共享状态(替代 11 个参数) pool: rawptr[memhub.MemBuddy] = trans.Pool builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder - mod: llvmlite.LLVMModule | t.CPtr = trans.Module + mod: rawptr[llvmlite.LLVMModule] = trans.Module # 翻译 RHS 值 # 无注解赋值无目标类型可推断,清空 CurAssignAnnot/CurAssignNode @@ -1930,11 +1930,11 @@ class AssignGenMixin: # target_ty 传入,使 `x = 12345`(x: uint64)与 `x = u64(12345)` 一致 # (直接 i64 常量,省去 coerce 生成的 zext)。多目标/非 Name 目标无法给出 # 唯一目标类型(且 RHS 只翻译一次供全部目标共用)⇒ 维持原行为(None)。 - asg_target_ty: llvmlite.LLVMType | t.CPtr = None + asg_target_ty: rawptr[llvmlite.LLVMType] = None if len(targets) == 1: - asg_t0: ast.AST | t.CPtr = targets.get(0) + asg_t0: rawptr[ast.AST] = targets.get(0) if asg_t0 is not None and asg_t0.kind() == ast.ASTKind.Name: - asg_nm0: ast.Name | t.CPtr = (ast.Name | t.CPtr)(asg_t0) + asg_nm0: rawptr[ast.Name] = rawptr[ast.Name](asg_t0) if asg_nm0.id is not None: asg_slot: llvmlite.Value | t.CPtr = self.Gen.VarGen.lookup_var( trans.SymTab, asg_nm0.id) @@ -1957,29 +1957,29 @@ class AssignGenMixin: rel_path = StubMergerStore.LookupSha1RelPath(sha1) # 根据 AST 节点类型提取详情 if val_kind == ast.ASTKind.Attribute: - at_nv: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(asgn.value) + at_nv: rawptr[ast.Attribute] = rawptr[ast.Attribute](asgn.value) attr_nm: str = at_nv.attr target_nm: str = "?" if at_nv.value is not None: if at_nv.value.kind() == ast.ASTKind.Name: - tn_nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(at_nv.value) + tn_nm: rawptr[ast.Name] = rawptr[ast.Name](at_nv.value) target_nm = tn_nm.id if rel_path is not None: VLogger.error(f"赋值右侧为 None: {rel_path}:{val_line} '{target_nm}.{attr_nm}' 属性访问失败", "ASGN") else: VLogger.error(f"赋值右侧为 None: sha1={sha1}:{val_line} '{target_nm}.{attr_nm}' 属性访问失败", "ASGN") elif val_kind == ast.ASTKind.Name: - nm_nv: ast.Name | t.CPtr = (ast.Name | t.CPtr)(asgn.value) + nm_nv: rawptr[ast.Name] = rawptr[ast.Name](asgn.value) if rel_path is not None: VLogger.error(f"赋值右侧为 None: {rel_path}:{val_line} 变量 '{nm_nv.id}' 未找到", "ASGN") else: VLogger.error(f"赋值右侧为 None: sha1={sha1}:{val_line} 变量 '{nm_nv.id}' 未找到", "ASGN") elif val_kind == ast.ASTKind.Call: - cl_nv: ast.Call | t.CPtr = (ast.Call | t.CPtr)(asgn.value) + cl_nv: rawptr[ast.Call] = rawptr[ast.Call](asgn.value) func_nm: str = "?" if cl_nv.func is not None: if cl_nv.func.kind() == ast.ASTKind.Name: - fn_nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(cl_nv.func) + fn_nm: rawptr[ast.Name] = rawptr[ast.Name](cl_nv.func) func_nm = fn_nm.id if rel_path is not None: VLogger.error(f"赋值右侧为 None: {rel_path}:{val_line} 调用 '{func_nm}(...)' 返回 None", "ASGN") @@ -1997,7 +1997,7 @@ class AssignGenMixin: new_vars: int = 0 tn: sizet = len(targets) for ti in range(tn): - target: ast.AST | t.CPtr = targets.get(ti) + target: rawptr[ast.AST] = targets.get(ti) if target is None: continue @@ -2007,8 +2007,8 @@ class AssignGenMixin: # rhs_val 是匿名 struct 值(函数返回 tuple[T1,T2] 打包)→ alloca + # store + GEP 逐字段 load → store 到各 Name 目标。 if tk == ast.ASTKind.Tuple: - tgt_tup: ast.Tuple | t.CPtr = (ast.Tuple | t.CPtr)(target) - tgt_elts: list[ast.AST | t.CPtr] | t.CPtr = tgt_tup.elts + tgt_tup: rawptr[ast.Tuple] = rawptr[ast.Tuple](target) + tgt_elts: list[rawptr[ast.AST]] | t.CPtr = tgt_tup.elts # 守卫:rhs 不是 struct(tuple 打包)时跳过本 target if tgt_elts is None or rhs_val is None or rhs_val.Ty is None: continue @@ -2018,14 +2018,14 @@ class AssignGenMixin: tmp_s: llvmlite.Value | t.CPtr = llvmlite.build_alloca(builder, rhs_val.Ty) if tmp_s is not None: llvmlite.build_store(builder, rhs_val, tmp_s) - fchain: llvmlite.ParamNode | t.CPtr = llvmlite.get_struct_fields(rhs_val.Ty) - fcur: llvmlite.ParamNode | t.CPtr = fchain + fchain: rawptr[llvmlite.Function] = llvmlite.get_struct_fields(rhs_val.Ty) + fcur: rawptr[llvmlite.Function] = fchain fti: sizet for fti in range(tgt_n): - tgt_elt: ast.AST | t.CPtr = tgt_elts.get(fti) + tgt_elt: rawptr[ast.AST] = tgt_elts.get(fti) if tgt_elt is None or fcur is None: break - fty: llvmlite.LLVMType | t.CPtr = llvmlite.paramnode_get_ty(fcur) + fty: rawptr[llvmlite.LLVMType] = llvmlite.paramnode_get_ty(fcur) fcur = llvmlite.paramnode_get_next(fcur) if fty is None: # fail-fast: 字段类型缺失,立即终止 @@ -2033,7 +2033,7 @@ class AssignGenMixin: # 守卫:非 Name 元素无法解包,跳过 if tgt_elt.kind() != ast.ASTKind.Name: continue - tgt_nm2: ast.Name | t.CPtr = (ast.Name | t.CPtr)(tgt_elt) + tgt_nm2: rawptr[ast.Name] = rawptr[ast.Name](tgt_elt) if tgt_nm2.id is None: continue fp2: llvmlite.Value | t.CPtr = llvmlite.build_gep_struct( @@ -2065,7 +2065,7 @@ class AssignGenMixin: target, trans) if list_obj is not None: # list[T] 类型: 内联生成 __setitem__ 逻辑 - sub_node: ast.Subscript | t.CPtr = (ast.Subscript | t.CPtr)(target) + sub_node: rawptr[ast.Subscript] = rawptr[ast.Subscript](target) if sub_node is not None and sub_node.slice is not None: list_idx_val: llvmlite.Value | t.CPtr = self.Gen.ExprGen.translate_value( builder, pool, mod, sub_node.slice, None, 0, trans) @@ -2088,18 +2088,18 @@ class AssignGenMixin: continue # get_subscript_ptr 返回 None: 尝试 __setitem__ 运算符重载 # 适用于自定义类(如 hashtable[key]=val → hashtable.__setitem__(key, val)) - sub_asgn: ast.Subscript | t.CPtr = (ast.Subscript | t.CPtr)(target) + sub_asgn: rawptr[ast.Subscript] = rawptr[ast.Subscript](target) setitem_done: int = 0 if sub_asgn is not None and sub_asgn.value is not None: if sub_asgn.value.kind() == ast.ASTKind.Name: - sub_nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(sub_asgn.value) + sub_nm: rawptr[ast.Name] = rawptr[ast.Name](sub_asgn.value) if sub_nm.id is not None: sub_alloca: llvmlite.Value | t.CPtr = self.Gen.VarGen.lookup_var( trans.SymTab, sub_nm.id) if sub_alloca is not None and sub_alloca.Ty is not None \ and sub_alloca.Ty.Pointee is not None \ and self.Gen.ExprGenBase.is_ptr_type(sub_alloca.Ty) != 0: - sub_pointee: llvmlite.LLVMType | t.CPtr = sub_alloca.Ty.Pointee + sub_pointee: rawptr[llvmlite.LLVMType] = sub_alloca.Ty.Pointee cls_nm_set: str = self.Gen.StructGen.get_class_name_by_type(pool, sub_pointee) obj_val_set: llvmlite.Value | t.CPtr = llvmlite.build_load( builder, sub_pointee, sub_alloca) @@ -2130,7 +2130,7 @@ class AssignGenMixin: if field_ptr_set is not None and field_ptr_set.Ty is not None \ and field_ptr_set.Ty.Pointee is not None \ and self.Gen.ExprGenBase.is_ptr_type(field_ptr_set.Ty) != 0: - field_pointee_set: llvmlite.LLVMType | t.CPtr = field_ptr_set.Ty.Pointee + field_pointee_set: rawptr[llvmlite.LLVMType] = field_ptr_set.Ty.Pointee cls_nm_attr: str = self.Gen.StructGen.get_class_name_by_type(pool, field_pointee_set) obj_val_attr: llvmlite.Value | t.CPtr = field_ptr_set # field_ptr 是 Ptr(Ptr(Struct)) (X|t.CPtr 字段): @@ -2186,7 +2186,7 @@ class AssignGenMixin: and obj_val_gen.Ty.Pointee is not None: # 非自定义结构体: 直接 GEP + store # 处理 get_subscript_ptr 因边界情况返回 None 的指针下标 - elem_gen: llvmlite.LLVMType | t.CPtr = obj_val_gen.Ty.Pointee + elem_gen: rawptr[llvmlite.LLVMType] = obj_val_gen.Ty.Pointee store_val_gen: llvmlite.Value | t.CPtr = rhs_val elem_ptr_gen: llvmlite.Value | t.CPtr = None match elem_gen: @@ -2219,10 +2219,10 @@ class AssignGenMixin: # a.__data__ = v → GEP {a}__meta__[field] 并 store # 对齐 TPC HandlesAssign.py L67-76:对象是 Name 变量且存在 # {var}__meta__ 影子(fd2 创建)时,属性写入改走影子结构体。 - fd_an: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(target) + fd_an: rawptr[ast.Attribute] = rawptr[ast.Attribute](target) if fd_an is not None and fd_an.value is not None and fd_an.attr is not None: if fd_an.value.kind() == ast.ASTKind.Name: - fd_obj_nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(fd_an.value) + fd_obj_nm: rawptr[ast.Name] = rawptr[ast.Name](fd_an.value) if fd_obj_nm.id is not None: # pool 持久缓冲(f-string 栈缓冲在函数返回后失效) fd_meta_w: str = pool.alloc(256) @@ -2231,7 +2231,7 @@ class AssignGenMixin: fd_meta_vw: llvmlite.Value | t.CPtr = self.Gen.VarGen.lookup_current( trans.SymTab, fd_meta_w) if fd_meta_vw is not None: - fd_sty_w: llvmlite.LLVMType | t.CPtr = \ + fd_sty_w: rawptr[llvmlite.LLVMType] = \ self.Gen.StructGen.get_struct_type("_str") if fd_sty_w is not None: fd_fe_w: GenTypes.FieldEntry | t.CPtr = \ @@ -2265,13 +2265,13 @@ class AssignGenMixin: llvmlite.build_store(builder, store_val, field_ptr) continue # 守卫:field_ptr 为 None → 构造详细错误信息 - attr_node: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(target) + attr_node: rawptr[ast.Attribute] = rawptr[ast.Attribute](target) attr_name: str = "(unknown)" obj_name: str = "(unknown)" if attr_node is not None: attr_name = attr_node.attr if attr_node.value is not None and attr_node.value.kind() == ast.ASTKind.Name: - obj_nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(attr_node.value) + obj_nm: rawptr[ast.Name] = rawptr[ast.Name](attr_node.value) obj_name = obj_nm.id err_buf: str = pool.alloc(256) if err_buf is not None: @@ -2285,7 +2285,7 @@ class AssignGenMixin: # Name 赋值: var = val if tk == ast.ASTKind.Name: - nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(target) + nm: rawptr[ast.Name] = rawptr[ast.Name](target) # 守卫:target 名缺失时跳过 if nm.id is None: continue @@ -2311,8 +2311,8 @@ class AssignGenMixin: if self._is_addrlike_call(asgn.value) == 0 \ and stg_ref_as is not None and rhs_val is not None and rhs_val.Ty is not None \ and stg_ref_as.Ty is not None and stg_ref_as.Ty.Pointee is not None: - stg_ty_as: llvmlite.LLVMType | t.CPtr = stg_ref_as.Ty.Pointee - rhs_inner_as: llvmlite.LLVMType | t.CPtr = None + stg_ty_as: rawptr[llvmlite.LLVMType] = stg_ref_as.Ty.Pointee + rhs_inner_as: rawptr[llvmlite.LLVMType] = None match rhs_val.Ty: case llvmlite.LLVMType.Ptr(pointee_as): rhs_inner_as = pointee_as @@ -2328,7 +2328,7 @@ class AssignGenMixin: if stg_obj_val_as is not None: llvmlite.build_store(builder, stg_obj_val_as, stg_ref_as) continue - target_ty: llvmlite.LLVMType | t.CPtr = None + target_ty: rawptr[llvmlite.LLVMType] = None if mod_alloca.Ty is not None: target_ty = mod_alloca.Ty.Pointee if target_ty is not None: @@ -2348,7 +2348,7 @@ class AssignGenMixin: "NameError") # 从 nl_ptr 的类型推断 nonlocal 变量实际类型, # 不再强制 i32(会截断指针/结构体/i64 导致闭包数据损坏) - nl_target_ty: llvmlite.LLVMType | t.CPtr = None + nl_target_ty: rawptr[llvmlite.LLVMType] = None if nl_ptr.Ty is not None: nl_target_ty = nl_ptr.Ty.Pointee if nl_target_ty is None: @@ -2424,9 +2424,9 @@ class AssignGenMixin: # 仅当目标为已注册结构体时采用,与"按需过滤,找不到 fast-fail"原则一致。 # ============================================================ def _infer_rhs_annot(self, pool: rawptr[memhub.MemBuddy], - mod: llvmlite.LLVMModule | t.CPtr, - node: ast.AST | t.CPtr, - trans: HT.Translator | t.CPtr, + mod: rawptr[llvmlite.LLVMModule], + node: rawptr[ast.AST], + trans: rawptr[HT.Translator], rhs_val: llvmlite.Value | t.CPtr = None) -> str: """从 RHS 表达式推断类名,无法推断返回 None""" if node is None or trans is None: @@ -2434,12 +2434,12 @@ class AssignGenMixin: k: int = node.kind() # Call: 类实例化 / 方法调用 if k == ast.ASTKind.Call: - cl: ast.Call | t.CPtr = (ast.Call | t.CPtr)(node) + cl: rawptr[ast.Call] = rawptr[ast.Call](node) if cl is None or cl.func is None: return None if cl.func.kind() == ast.ASTKind.Name: # 类实例化:func 为已注册结构体名才采用 - cand: str = ((ast.Name | t.CPtr)(cl.func)).id + cand: str = (rawptr[ast.Name](cl.func)).id if cand is None: return None se: GenTypes.StructEntry | t.CPtr = self.Gen.StructGen.find_struct(cand) @@ -2451,7 +2451,7 @@ class AssignGenMixin: # (方法可返回非同类对象,如 Transform.world_position → 'Vec3', # 启发式取 obj 类名会 GEP 错字段)。vpi 未命中时返回 None, # 由后续属性访问 fast-fail 暴露 vpi 缺失根因(不静默回退)。 - ca: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(cl.func) + ca: rawptr[ast.Attribute] = rawptr[ast.Attribute](cl.func) if ca is None or ca.attr is None or ca.value is None: return None obj_cls: str = self._infer_rhs_annot(pool, mod, ca.value, trans) @@ -2461,7 +2461,7 @@ class AssignGenMixin: # vpi 返回注解缓存解析返回类名(键 {sha1}.{func},cls_name=None 即模块级 # 函数,与 CallGenMixin 跨模块返回类型解析一致)。 if ca.value.kind() == ast.ASTKind.Name: - mod_nm_rhs: ast.Name | t.CPtr = (ast.Name | t.CPtr)(ca.value) + mod_nm_rhs: rawptr[ast.Name] = rawptr[ast.Name](ca.value) if mod_nm_rhs.id is not None: mod_sha1_rhs: str = self.Gen.CallGenBase._lookup_module_sha1( mod_nm_rhs.id) @@ -2501,7 +2501,7 @@ class AssignGenMixin: return None # Name: 源变量注解 if k == ast.ASTKind.Name: - nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(node) + nm: rawptr[ast.Name] = rawptr[ast.Name](node) if nm is None or nm.id is None: return None ve: GenTypes.VarEntry | t.CPtr = self.Gen.VarGen.lookup_var_entry( @@ -2511,7 +2511,7 @@ class AssignGenMixin: return self.Gen.VarGen.var_annot_class_name(ve) # BinOp/UnaryOp: 运算符重载返回同类对象 if k == ast.ASTKind.BinOp: - bop: ast.BinOp | t.CPtr = (ast.BinOp | t.CPtr)(node) + bop: rawptr[ast.BinOp] = rawptr[ast.BinOp](node) if bop is None or bop.left is None: return None dunder: str = self._op_to_dunder(bop.op) @@ -2522,7 +2522,7 @@ class AssignGenMixin: return None return lhs_cls if k == ast.ASTKind.UnaryOp: - uop: ast.UnaryOp | t.CPtr = (ast.UnaryOp | t.CPtr)(node) + uop: rawptr[ast.UnaryOp] = rawptr[ast.UnaryOp](node) if uop is None or uop.operand is None: return None dunder: str = self._op_to_dunder(uop.op) @@ -2622,7 +2622,7 @@ class AssignGenMixin: # 才采用运算符重载推断的类名,避免把原生运算误标为类类型。 # ============================================================ def _cls_has_dunder(self, pool: rawptr[memhub.MemBuddy], - mod: llvmlite.LLVMModule | t.CPtr, + mod: rawptr[llvmlite.LLVMModule], class_name: str, dunder: str) -> int: """类及其 MRO 祖先链中是否存在 dunder 方法,存在返回 1""" if class_name is None or dunder is None or mod is None: diff --git a/App/lib/core/Gen/AsyncGenMixin.vp b/App/lib/core/Gen/AsyncGenMixin.vp index 4f38962..810390b 100644 --- a/App/lib/core/Gen/AsyncGenMixin.vp +++ b/App/lib/core/Gen/AsyncGenMixin.vp @@ -49,8 +49,8 @@ class AsyncGenMixin(CallGenBase.CallGenBase): # 由 FuncGenDef.translate_function_def 检测 fd.flags & FLAG_IS_ASYNC # (=1,见 includes/ast/stmts.vp L342-345)后调用,早返回不进普通函数路径。 # ============================================================ - def translate_async_function(self, trans: HT.Translator | t.CPtr, - node: ast.AST | t.CPtr) -> int: + def translate_async_function(self, trans: rawptr[HT.Translator], + node: rawptr[ast.AST]) -> int: """翻译 async 函数定义,返回 0 成功 生成 create_(帧分配,M2 带参数)与 resume_(状态机), @@ -64,12 +64,12 @@ class AsyncGenMixin(CallGenBase.CallGenBase): 恢复块状态号:state0 = 入口,每个 await(顶层或嵌套)按 DFS 顺序 分配 state1..,switch case 预建(TPV build_switch 一次性生成,无法动态 add_case)。 """ - fd: ast.FunctionDef | t.CPtr = (ast.FunctionDef | t.CPtr)(node) + fd: rawptr[ast.FunctionDef] = rawptr[ast.FunctionDef](node) if fd is None or fd.name is None or trans is None: return 0 name: str = fd.name pool: rawptr[memhub.MemBuddy] = trans.Pool - mod: llvmlite.LLVMModule | t.CPtr = trans.Module + mod: rawptr[llvmlite.LLVMModule] = trans.Module if pool is None or mod is None: return 0 @@ -107,7 +107,7 @@ class AsyncGenMixin(CallGenBase.CallGenBase): trans._coro_nseg = 1 + trans._coro_await_count # 帧结构体 %Coro_ - frame_ty: llvmlite.LLVMType | t.CPtr = self._build_frame_ty( + frame_ty: rawptr[llvmlite.LLVMType] = self._build_frame_ty( pool, mod, trans, name, nparams, nlocals, nextra) if frame_ty is None: return 0 @@ -129,30 +129,30 @@ class AsyncGenMixin(CallGenBase.CallGenBase): # ============================================================ # M2:参数收集(帧参数槽 index 3+i) # ============================================================ - def _collect_param_names(self, trans: HT.Translator | t.CPtr, - fd: ast.FunctionDef | t.CPtr) -> int: + def _collect_param_names(self, trans: rawptr[HT.Translator], + fd: rawptr[ast.FunctionDef]) -> int: """收集 async 函数参数名到 trans._coro_params(char* 数组,8 字节/项)。 参数槽 index = 3 + i,create_ 按参数顺序收值入帧。""" if fd is None or fd.args is None or trans is None: return 0 if trans._coro_params is None: return 0 - ags: ast.Arguments | t.CPtr = (ast.Arguments | t.CPtr)(fd.args) + ags: rawptr[ast.Arguments] = rawptr[ast.Arguments](fd.args) cnt: int = 0 if ags.args is None: return 0 bn: sizet = len(ags.args) i: sizet = 0 for i in range(bn): - a0: ast.AST | t.CPtr = ags.args.get(i) + a0: rawptr[ast.AST] = ags.args.get(i) if a0 is None: continue aname: str = None if a0.kind() == ast.ASTKind.Arg: - ar: ast.Arg | t.CPtr = (ast.Arg | t.CPtr)(a0) + ar: rawptr[ast.Arg] = rawptr[ast.Arg](a0) aname = ar.arg elif a0.kind() == ast.ASTKind.Name: - anm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(a0) + anm: rawptr[ast.Name] = rawptr[ast.Name](a0) aname = anm.id if aname is None: continue @@ -175,8 +175,8 @@ class AsyncGenMixin(CallGenBase.CallGenBase): # 位置数组:_coro_await_slots[M]=__await_M 相对序号;_coro_for_slots[N]=__f_idx_N 相对序号 # _coro_await_count = 恢复块数(顶层 + 嵌套 await) # ============================================================ - def _pre_scan_awaits(self, trans: HT.Translator | t.CPtr, - fd: ast.FunctionDef | t.CPtr) -> int: + def _pre_scan_awaits(self, trans: rawptr[HT.Translator], + fd: rawptr[ast.FunctionDef]) -> int: """DFS 预扫描协程体,填额外槽表并返回额外槽总数""" if fd is None or fd.children is None or trans is None: return 0 @@ -191,14 +191,14 @@ class AsyncGenMixin(CallGenBase.CallGenBase): return trans._coro_extra_count # ---------- 第一遍:coro_sleep 检测(wake 槽决定) ---------- - def _scan_sleep_usage(self, trans: HT.Translator | t.CPtr, - fd: ast.FunctionDef | t.CPtr): + def _scan_sleep_usage(self, trans: rawptr[HT.Translator], + fd: rawptr[ast.FunctionDef]): if fd is None or fd.children is None or trans is None: return self._scan_sleep_stmts(trans, fd.children) - def _scan_sleep_stmts(self, trans: HT.Translator | t.CPtr, - stmts: list[ast.AST | t.CPtr] | t.CPtr): + def _scan_sleep_stmts(self, trans: rawptr[HT.Translator], + stmts: list[rawptr[ast.AST]] | t.CPtr): if stmts is None or trans._coro_uses_sleep != 0: return bn: sizet = len(stmts) @@ -206,8 +206,8 @@ class AsyncGenMixin(CallGenBase.CallGenBase): for i in range(bn): self._scan_sleep_stmt(trans, stmts.get(i)) - def _scan_sleep_stmt(self, trans: HT.Translator | t.CPtr, - stmt: ast.AST | t.CPtr): + def _scan_sleep_stmt(self, trans: rawptr[HT.Translator], + stmt: rawptr[ast.AST]): if stmt is None or trans._coro_uses_sleep != 0: return sk: int = stmt.kind() @@ -230,13 +230,13 @@ class AsyncGenMixin(CallGenBase.CallGenBase): self._scan_sleep_stmts(trans, fn2.orelse) return if sk == ast.ASTKind.Try: - trn: ast.Try | t.CPtr = (ast.Try | t.CPtr)(stmt) + trn: rawptr[ast.Try] = rawptr[ast.Try](stmt) self._scan_sleep_stmts(trans, stmt.children) if trn.handlers is not None: nh: sizet = len(trn.handlers) hh: sizet = 0 for hh in range(nh): - h0: ast.AST | t.CPtr = trn.handlers.get(hh) + h0: rawptr[ast.AST] = trn.handlers.get(hh) if h0 is not None: self._scan_sleep_stmts(trans, h0.children) self._scan_sleep_stmts(trans, trn.orelse) @@ -247,11 +247,11 @@ class AsyncGenMixin(CallGenBase.CallGenBase): self._scan_sleep_expr(trans, rv.value) return if sk == ast.ASTKind.AnnAssign: - aa: ast.AnnAssign | t.CPtr = (ast.AnnAssign | t.CPtr)(stmt) + aa: rawptr[ast.AnnAssign] = rawptr[ast.AnnAssign](stmt) self._scan_sleep_expr(trans, aa.value) return if sk == ast.ASTKind.Assign: - as_: ast.Assign | t.CPtr = (ast.Assign | t.CPtr)(stmt) + as_: rawptr[ast.Assign] = rawptr[ast.Assign](stmt) self._scan_sleep_expr(trans, as_.value) return if sk == ast.ASTKind.Expr: @@ -259,21 +259,21 @@ class AsyncGenMixin(CallGenBase.CallGenBase): self._scan_sleep_expr(trans, e.value) return - def _scan_sleep_expr(self, trans: HT.Translator | t.CPtr, - node: ast.AST | t.CPtr): + def _scan_sleep_expr(self, trans: rawptr[HT.Translator], + node: rawptr[ast.AST]): if node is None or trans._coro_uses_sleep != 0: return k: int = node.kind() if k == ast.ASTKind.Call: - cl: ast.Call | t.CPtr = (ast.Call | t.CPtr)(node) + cl: rawptr[ast.Call] = rawptr[ast.Call](node) if cl.func is not None: if cl.func.kind() == ast.ASTKind.Name: - nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(cl.func) + nm: rawptr[ast.Name] = rawptr[ast.Name](cl.func) if nm.id is not None and string.strcmp(nm.id, "coro_sleep") == 0: trans._coro_uses_sleep = 1 return elif cl.func.kind() == ast.ASTKind.Attribute: - at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(cl.func) + at: rawptr[ast.Attribute] = rawptr[ast.Attribute](cl.func) if at.attr is not None and string.strcmp(at.attr, "coro_sleep") == 0: trans._coro_uses_sleep = 1 return @@ -285,12 +285,12 @@ class AsyncGenMixin(CallGenBase.CallGenBase): self._scan_sleep_expr(trans, cl.args.get(j)) return if k == ast.ASTKind.BinOp: - b: ast.BinOp | t.CPtr = (ast.BinOp | t.CPtr)(node) + b: rawptr[ast.BinOp] = rawptr[ast.BinOp](node) self._scan_sleep_expr(trans, b.left) self._scan_sleep_expr(trans, b.right) return if k == ast.ASTKind.UnaryOp: - u: ast.UnaryOp | t.CPtr = (ast.UnaryOp | t.CPtr)(node) + u: rawptr[ast.UnaryOp] = rawptr[ast.UnaryOp](node) self._scan_sleep_expr(trans, u.operand) return if k == ast.ASTKind.Compare: @@ -317,11 +317,11 @@ class AsyncGenMixin(CallGenBase.CallGenBase): self._scan_sleep_expr(trans, ie.orelse) return if k == ast.ASTKind.Attribute: - at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(node) + at: rawptr[ast.Attribute] = rawptr[ast.Attribute](node) self._scan_sleep_expr(trans, at.value) return if k == ast.ASTKind.Subscript: - sb: ast.Subscript | t.CPtr = (ast.Subscript | t.CPtr)(node) + sb: rawptr[ast.Subscript] = rawptr[ast.Subscript](node) self._scan_sleep_expr(trans, sb.value) self._scan_sleep_expr(trans, sb.slice) return @@ -331,8 +331,8 @@ class AsyncGenMixin(CallGenBase.CallGenBase): return # ---------- 第二遍:填额外槽表 + 状态号计数 ---------- - def _scan_stmts(self, trans: HT.Translator | t.CPtr, - stmts: list[ast.AST | t.CPtr] | t.CPtr): + def _scan_stmts(self, trans: rawptr[HT.Translator], + stmts: list[rawptr[ast.AST]] | t.CPtr): if stmts is None: return bn: sizet = len(stmts) @@ -340,8 +340,8 @@ class AsyncGenMixin(CallGenBase.CallGenBase): for i in range(bn): self._scan_stmt(trans, stmts.get(i)) - def _scan_stmt(self, trans: HT.Translator | t.CPtr, - stmt: ast.AST | t.CPtr): + def _scan_stmt(self, trans: rawptr[HT.Translator], + stmt: rawptr[ast.AST]): if stmt is None: return sk: int = stmt.kind() @@ -387,13 +387,13 @@ class AsyncGenMixin(CallGenBase.CallGenBase): self._scan_stmts(trans, fn_.orelse) return if sk == ast.ASTKind.Try: - tr2: ast.Try | t.CPtr = (ast.Try | t.CPtr)(stmt) + tr2: rawptr[ast.Try] = rawptr[ast.Try](stmt) self._scan_stmts(trans, stmt.children) if tr2.handlers is not None: nh2: sizet = len(tr2.handlers) hh2: sizet = 0 for hh2 in range(nh2): - h2: ast.AST | t.CPtr = tr2.handlers.get(hh2) + h2: rawptr[ast.AST] = tr2.handlers.get(hh2) if h2 is not None: self._scan_stmts(trans, h2.children) self._scan_stmts(trans, tr2.orelse) @@ -419,19 +419,19 @@ class AsyncGenMixin(CallGenBase.CallGenBase): # 语句内嵌套 await:DFS 表达式(AnnAssign.value / Assign.value / Expr.value) self._scan_stmt_exprs(trans, stmt) - def _scan_stmt_exprs(self, trans: HT.Translator | t.CPtr, - stmt: ast.AST | t.CPtr): + def _scan_stmt_exprs(self, trans: rawptr[HT.Translator], + stmt: rawptr[ast.AST]): """扫描语句的值表达式找嵌套 await""" if stmt is None: return sk: int = stmt.kind() if sk == ast.ASTKind.AnnAssign: - aa: ast.AnnAssign | t.CPtr = (ast.AnnAssign | t.CPtr)(stmt) + aa: rawptr[ast.AnnAssign] = rawptr[ast.AnnAssign](stmt) if aa.value is not None: self._scan_expr(trans, aa.value) return if sk == ast.ASTKind.Assign: - as_: ast.Assign | t.CPtr = (ast.Assign | t.CPtr)(stmt) + as_: rawptr[ast.Assign] = rawptr[ast.Assign](stmt) if as_.value is not None: self._scan_expr(trans, as_.value) return @@ -442,8 +442,8 @@ class AsyncGenMixin(CallGenBase.CallGenBase): return # 其它语句类型:翻译端 fail-fast - def _scan_expr(self, trans: HT.Translator | t.CPtr, - node: ast.AST | t.CPtr): + def _scan_expr(self, trans: rawptr[HT.Translator], + node: rawptr[ast.AST]): """DFS 扫描表达式找 Await:命中分配 __await_N 槽并计数状态号""" if node is None: return @@ -462,12 +462,12 @@ class AsyncGenMixin(CallGenBase.CallGenBase): trans._coro_await_count = trans._coro_await_count + 1 return if k == ast.ASTKind.BinOp: - b: ast.BinOp | t.CPtr = (ast.BinOp | t.CPtr)(node) + b: rawptr[ast.BinOp] = rawptr[ast.BinOp](node) self._scan_expr(trans, b.left) self._scan_expr(trans, b.right) return if k == ast.ASTKind.Call: - cl: ast.Call | t.CPtr = (ast.Call | t.CPtr)(node) + cl: rawptr[ast.Call] = rawptr[ast.Call](node) if cl.func is not None: self._scan_expr(trans, cl.func) if cl.args is not None: @@ -477,7 +477,7 @@ class AsyncGenMixin(CallGenBase.CallGenBase): self._scan_expr(trans, cl.args.get(j)) return if k == ast.ASTKind.UnaryOp: - u: ast.UnaryOp | t.CPtr = (ast.UnaryOp | t.CPtr)(node) + u: rawptr[ast.UnaryOp] = rawptr[ast.UnaryOp](node) if u.operand is not None: self._scan_expr(trans, u.operand) return @@ -506,12 +506,12 @@ class AsyncGenMixin(CallGenBase.CallGenBase): self._scan_expr(trans, ie.orelse) return if k == ast.ASTKind.Attribute: - at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(node) + at: rawptr[ast.Attribute] = rawptr[ast.Attribute](node) if at.value is not None: self._scan_expr(trans, at.value) return if k == ast.ASTKind.Subscript: - sb: ast.Subscript | t.CPtr = (ast.Subscript | t.CPtr)(node) + sb: rawptr[ast.Subscript] = rawptr[ast.Subscript](node) if sb.value is not None: self._scan_expr(trans, sb.value) if sb.slice is not None: @@ -520,7 +520,7 @@ class AsyncGenMixin(CallGenBase.CallGenBase): # Name / Constant 等叶子:无嵌套 await # ---------- For 判定辅助(M3) ---------- - def _for_deep_await(self, stmt: ast.AST | t.CPtr) -> int: + def _for_deep_await(self, stmt: rawptr[ast.AST]) -> int: """For 语句树(含嵌套 If/While/For/Try/body/orelse)是否含 await""" if stmt is None: return 0 @@ -541,7 +541,7 @@ class AsyncGenMixin(CallGenBase.CallGenBase): return 1 return 0 - def _stmt_deep_await(self, stmt: ast.AST | t.CPtr) -> int: + def _stmt_deep_await(self, stmt: rawptr[ast.AST]) -> int: """语句树(含嵌套 If/While/For/Try)是否含 await""" if stmt is None: return 0 @@ -563,14 +563,14 @@ class AsyncGenMixin(CallGenBase.CallGenBase): if sk2 == ast.ASTKind.For: return self._for_deep_await(stmt) if sk2 == ast.ASTKind.Try: - tr3: ast.Try | t.CPtr = (ast.Try | t.CPtr)(stmt) + tr3: rawptr[ast.Try] = rawptr[ast.Try](stmt) if self._stmts_deep_await(stmt.children) != 0: return 1 if tr3.handlers is not None: nh3: sizet = len(tr3.handlers) hh3: sizet = 0 for hh3 in range(nh3): - h3: ast.AST | t.CPtr = tr3.handlers.get(hh3) + h3: rawptr[ast.AST] = tr3.handlers.get(hh3) if h3 is not None and self._stmts_deep_await(h3.children) != 0: return 1 if self._stmts_deep_await(tr3.orelse) != 0: @@ -578,7 +578,7 @@ class AsyncGenMixin(CallGenBase.CallGenBase): return self._stmts_deep_await(tr3.finalbody) return self._stmt_has_await(stmt) - def _stmts_deep_await(self, stmts: list[ast.AST | t.CPtr] | t.CPtr) -> int: + def _stmts_deep_await(self, stmts: list[rawptr[ast.AST]] | t.CPtr) -> int: if stmts is None: return 0 bn6: sizet = len(stmts) @@ -588,7 +588,7 @@ class AsyncGenMixin(CallGenBase.CallGenBase): return 1 return 0 - def _is_range_for(self, stmt: ast.AST | t.CPtr) -> int: + def _is_range_for(self, stmt: rawptr[ast.AST]) -> int: """range-For:单 Name target + iter 是 range(x) 或 range(a, b),参数无 await""" if stmt is None: return 0 @@ -597,10 +597,10 @@ class AsyncGenMixin(CallGenBase.CallGenBase): return 0 if fn4.iter is None or fn4.iter.kind() != ast.ASTKind.Call: return 0 - cl4: ast.Call | t.CPtr = (ast.Call | t.CPtr)(fn4.iter) + cl4: rawptr[ast.Call] = rawptr[ast.Call](fn4.iter) if cl4.func is None or cl4.func.kind() != ast.ASTKind.Name: return 0 - nm4: ast.Name | t.CPtr = (ast.Name | t.CPtr)(cl4.func) + nm4: rawptr[ast.Name] = rawptr[ast.Name](cl4.func) if nm4.id is None or string.strcmp(nm4.id, "range") != 0: return 0 if cl4.args is None: @@ -617,8 +617,8 @@ class AsyncGenMixin(CallGenBase.CallGenBase): # ============================================================ # 局部变量收集(顶层 AnnAssign / Assign 的 Name 目标) # ============================================================ - def _collect_local_names(self, trans: HT.Translator | t.CPtr, - fd: ast.FunctionDef | t.CPtr) -> int: + def _collect_local_names(self, trans: rawptr[HT.Translator], + fd: rawptr[ast.FunctionDef]) -> int: """收集帧局部变量名(_coro_locals,8 字节/项): - 顶层 AnnAssign/Assign 的 Name 目标(M2) - try 的 except as e 绑定名(M5/M6,跨 handler 需要帧槽) @@ -632,8 +632,8 @@ class AsyncGenMixin(CallGenBase.CallGenBase): self._collect_locals_stmts(trans, fd.children) return trans._coro_local_count - def _collect_locals_stmts(self, trans: HT.Translator | t.CPtr, - stmts: list[ast.AST | t.CPtr] | t.CPtr): + def _collect_locals_stmts(self, trans: rawptr[HT.Translator], + stmts: list[rawptr[ast.AST]] | t.CPtr): if stmts is None: return bn: sizet = len(stmts) @@ -641,23 +641,23 @@ class AsyncGenMixin(CallGenBase.CallGenBase): for i in range(bn): self._collect_locals_stmt(trans, stmts.get(i)) - def _collect_locals_stmt(self, trans: HT.Translator | t.CPtr, - stmt: ast.AST | t.CPtr): + def _collect_locals_stmt(self, trans: rawptr[HT.Translator], + stmt: rawptr[ast.AST]): if stmt is None: return sk: int = stmt.kind() if sk == ast.ASTKind.AnnAssign: - aa: ast.AnnAssign | t.CPtr = (ast.AnnAssign | t.CPtr)(stmt) + aa: rawptr[ast.AnnAssign] = rawptr[ast.AnnAssign](stmt) if aa.target is not None and aa.target.kind() == ast.ASTKind.Name: - tn: ast.Name | t.CPtr = (ast.Name | t.CPtr)(aa.target) + tn: rawptr[ast.Name] = rawptr[ast.Name](aa.target) self._add_local(trans, tn.id) return if sk == ast.ASTKind.Assign: - as_: ast.Assign | t.CPtr = (ast.Assign | t.CPtr)(stmt) + as_: rawptr[ast.Assign] = rawptr[ast.Assign](stmt) if as_.targets is not None and len(as_.targets) == 1: - t0: ast.AST | t.CPtr = as_.targets.get(0) + t0: rawptr[ast.AST] = as_.targets.get(0) if t0 is not None and t0.kind() == ast.ASTKind.Name: - tn2: ast.Name | t.CPtr = (ast.Name | t.CPtr)(t0) + tn2: rawptr[ast.Name] = rawptr[ast.Name](t0) self._add_local(trans, tn2.id) return if sk == ast.ASTKind.If: @@ -674,29 +674,29 @@ class AsyncGenMixin(CallGenBase.CallGenBase): fn: ast.For | t.CPtr = (ast.For | t.CPtr)(stmt) if self._for_deep_await(stmt) != 0: if fn.target is not None and fn.target.kind() == ast.ASTKind.Name: - tn3: ast.Name | t.CPtr = (ast.Name | t.CPtr)(fn.target) + tn3: rawptr[ast.Name] = rawptr[ast.Name](fn.target) self._add_local(trans, tn3.id) self._collect_locals_stmts(trans, stmt.children) self._collect_locals_stmts(trans, fn.orelse) return if sk == ast.ASTKind.Try: - tr: ast.Try | t.CPtr = (ast.Try | t.CPtr)(stmt) + tr: rawptr[ast.Try] = rawptr[ast.Try](stmt) self._collect_locals_stmts(trans, stmt.children) if tr.handlers is not None: nh: sizet = len(tr.handlers) hh: sizet = 0 for hh in range(nh): - h0: ast.AST | t.CPtr = tr.handlers.get(hh) + h0: rawptr[ast.AST] = tr.handlers.get(hh) if h0 is None: continue - hd: ast.ExceptHandler | t.CPtr = (ast.ExceptHandler | t.CPtr)(h0) + hd: rawptr[ast.ExceptHandler] = rawptr[ast.ExceptHandler](h0) self._add_local(trans, hd.name) self._collect_locals_stmts(trans, h0.children) self._collect_locals_stmts(trans, tr.orelse) self._collect_locals_stmts(trans, tr.finalbody) return - def _add_local(self, trans: HT.Translator | t.CPtr, + def _add_local(self, trans: rawptr[HT.Translator], name: str): if name is None: return @@ -713,27 +713,27 @@ class AsyncGenMixin(CallGenBase.CallGenBase): # 槽索引: 0=state 1=done 2=ret 3..3+nlocals-1=局部变量 # ============================================================ def _build_frame_ty(self, pool: rawptr[memhub.MemBuddy], - mod: llvmlite.LLVMModule | t.CPtr, - trans: HT.Translator | t.CPtr, + mod: rawptr[llvmlite.LLVMModule], + trans: rawptr[HT.Translator], name: str, nparams: int, nlocals: int, - nextra: int) -> llvmlite.LLVMType | t.CPtr: + nextra: int) -> rawptr[llvmlite.LLVMType]: """构造帧结构体并注册到模块与结构体表,返回 LLVMType M7 布局:{i32 state, i32 done, i32 ret, i32 exc, i8* msg, 参数槽(5+i), 局部槽(5+nparams+i), 额外槽(extra_base+i, 按类型表 1=i32 2=i64)}""" - i32_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int32(pool) - i64_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int64(pool) - i8_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr( + i32_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int32(pool) + i64_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int64(pool) + i8_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr( pool, llvmlite.Int8(pool)) # 槽基址(供 resume/await 计算槽 index) trans._coro_local_base = 5 + nparams trans._coro_extra_base = trans._coro_local_base + nlocals total: int = 5 + nparams + nlocals + nextra - head: llvmlite.ParamNode | t.CPtr = None - prev: llvmlite.ParamNode | t.CPtr = None + head: rawptr[llvmlite.Function] = None + prev: rawptr[llvmlite.Function] = None fi: int = 0 for fi in range(total): - fty: llvmlite.LLVMType | t.CPtr = i32_ty + fty: rawptr[llvmlite.LLVMType] = i32_ty if fi == 4: fty = i8_ptr_ty elif fi >= trans._coro_extra_base: @@ -741,7 +741,7 @@ class AsyncGenMixin(CallGenBase.CallGenBase): if tidx < nextra and trans._coro_extra_types is not None: if trans._coro_extra_types[tidx] == 2: fty = i64_ty - pnode: llvmlite.ParamNode | t.CPtr = pool.alloc( + pnode: rawptr[llvmlite.Function] = pool.alloc( llvmlite.ParamNode.__sizeof__()) if pnode is None: continue @@ -755,7 +755,7 @@ class AsyncGenMixin(CallGenBase.CallGenBase): ty_name: str = pool.alloc(128) if ty_name is not None: viperlib.snprintf(ty_name, 128, "Coro_%s", name) - frame_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Struct( + frame_ty: rawptr[llvmlite.LLVMType] = llvmlite.Struct( pool, head, total, ty_name) if frame_ty is None: return None @@ -768,21 +768,21 @@ class AsyncGenMixin(CallGenBase.CallGenBase): # create_() -> %Coro_* # ============================================================ def _emit_create(self, pool: rawptr[memhub.MemBuddy], - mod: llvmlite.LLVMModule | t.CPtr, - trans: HT.Translator | t.CPtr, + mod: rawptr[llvmlite.LLVMModule], + trans: rawptr[HT.Translator], name: str, - frame_ty: llvmlite.LLVMType | t.CPtr, + frame_ty: rawptr[llvmlite.LLVMType], nparams: int) -> int: """生成 create_(args...):M7 帧池弹帧(i64 池头 free-list)或 malloc, 5 头清零 + 参数存槽(帧槽 5+i)+ ret 帧指针""" if frame_ty is None: return 0 - i32_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int32(pool) - i64_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int64(pool) - i8_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int8(pool) - i8_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, i8_ty) - i64_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, i64_ty) - frame_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, frame_ty) + i32_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int32(pool) + i64_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int64(pool) + i8_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int8(pool) + i8_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, i8_ty) + i64_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, i64_ty) + frame_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, frame_ty) cname_buf2: str = pool.alloc(64) if cname_buf2 is not None: @@ -791,7 +791,7 @@ class AsyncGenMixin(CallGenBase.CallGenBase): trans, cname_buf2, 0) if self.Gen.CallGenBase.find_func_in_module(mod, mangled) is not None: return 0 - func: llvmlite.Function | t.CPtr = llvmlite.create_function( + func: rawptr[llvmlite.Function] = llvmlite.create_function( pool, mod, mangled, frame_ptr_ty) if func is None: return 0 @@ -804,7 +804,7 @@ class AsyncGenMixin(CallGenBase.CallGenBase): viperlib.snprintf(argn_buf, 16, "%%arg%d", pi) llvmlite.add_param(pool, func, i32_ty, argn_buf) # 注册到函数表(裸名 create_) - funcs_ptr: GenTypes.FuncEntry | t.CPtr = trans._funcs + funcs_ptr: rawptr[GenTypes.FuncEntry] = trans._funcs cur_count: int = trans._func_count if self.Gen.CallGenLeafKit.add_func_to_table( funcs_ptr, cur_count, cname_buf2, func, 1024, @@ -929,8 +929,8 @@ class AsyncGenMixin(CallGenBase.CallGenBase): # M7:每帧类型的全局 free-list 池头(i64,0 = 空) # ============================================================ def _get_coro_pool(self, pool: rawptr[memhub.MemBuddy], - mod: llvmlite.LLVMModule | t.CPtr, - trans: HT.Translator | t.CPtr, + mod: rawptr[llvmlite.LLVMModule], + trans: rawptr[HT.Translator], name: str) -> llvmlite.GlobalVariable | t.CPtr: """取/建 coro_pool_ 全局(i64 池头)。池节点 next 存帧首 8 字节。""" pn_buf: str = pool.alloc(128) @@ -944,7 +944,7 @@ class AsyncGenMixin(CallGenBase.CallGenBase): g = g.Next return llvmlite.create_global_int(pool, mod, pn_buf, 64, 0) - def _register_coro_wake(self, trans: HT.Translator | t.CPtr, + def _register_coro_wake(self, trans: rawptr[HT.Translator], name: str, wake_idx: int): """记录 async 名的 wake 槽 index(_coro_wake_names/_coro_wake_idxs 平行表)""" if trans is None or name is None or trans._coro_wake_names is None: @@ -958,7 +958,7 @@ class AsyncGenMixin(CallGenBase.CallGenBase): trans._coro_wake_idxs[cnt] = wake_idx trans._coro_wake_count = cnt + 1 - def _lookup_coro_wake(self, trans: HT.Translator | t.CPtr, + def _lookup_coro_wake(self, trans: rawptr[HT.Translator], name: str) -> int: """查 async 名的 wake 槽 index,无 wake 槽返回 -1""" if trans is None or name is None or trans._coro_wake_names is None: @@ -975,11 +975,11 @@ class AsyncGenMixin(CallGenBase.CallGenBase): # resume_(%Coro_*) -> i32 状态机(静态段切分) # ============================================================ def _emit_resume(self, pool: rawptr[memhub.MemBuddy], - mod: llvmlite.LLVMModule | t.CPtr, - trans: HT.Translator | t.CPtr, + mod: rawptr[llvmlite.LLVMModule], + trans: rawptr[HT.Translator], name: str, - fd: ast.FunctionDef | t.CPtr, - frame_ty: llvmlite.LLVMType | t.CPtr, + fd: rawptr[ast.FunctionDef], + frame_ty: rawptr[llvmlite.LLVMType], nparams: int, nlocals: int, nextra: int) -> int: """生成 resume_(frame) -> i32 状态机(M2): @@ -988,20 +988,20 @@ class AsyncGenMixin(CallGenBase.CallGenBase): exit 块 load done 返回(0=SUSPEND 1=DONE)。""" if frame_ty is None: return 0 - i32_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int32(pool) - frame_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, frame_ty) + i32_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int32(pool) + frame_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, frame_ty) rname_buf: str = pool.alloc(64) if rname_buf is not None: viperlib.snprintf(rname_buf, 64, "resume_%s", name) mangled: str = self.Gen.FuncGenBase._mangle_func_name( trans, rname_buf, 0) - func: llvmlite.Function | t.CPtr = llvmlite.create_function( + func: rawptr[llvmlite.Function] = llvmlite.create_function( pool, mod, mangled, i32_ty) if func is None: return 0 llvmlite.add_param(pool, func, frame_ptr_ty, "%frame") - funcs_ptr: GenTypes.FuncEntry | t.CPtr = trans._funcs + funcs_ptr: rawptr[GenTypes.FuncEntry] = trans._funcs cur_count: int = trans._func_count if self.Gen.CallGenLeafKit.add_func_to_table( funcs_ptr, cur_count, rname_buf, func, 1024, @@ -1023,9 +1023,9 @@ class AsyncGenMixin(CallGenBase.CallGenBase): return 0 # GEP 5 头槽(M4 exc / M7 msg) - i8_ptr_ty_r: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr( + i8_ptr_ty_r: rawptr[llvmlite.LLVMType] = llvmlite.Ptr( pool, llvmlite.Int8(pool)) - i64_ty_r: llvmlite.LLVMType | t.CPtr = llvmlite.Int64(pool) + i64_ty_r: rawptr[llvmlite.LLVMType] = llvmlite.Int64(pool) state_ptr: llvmlite.Value | t.CPtr = llvmlite.build_gep_struct( builder, frame_ty, i32_ty, frame_arg, 0) done_ptr: llvmlite.Value | t.CPtr = llvmlite.build_gep_struct( @@ -1068,7 +1068,7 @@ class AsyncGenMixin(CallGenBase.CallGenBase): ety: int = 1 if trans._coro_extra_types is not None: ety = trans._coro_extra_types[ei] - ety_llvm: llvmlite.LLVMType | t.CPtr = i32_ty + ety_llvm: rawptr[llvmlite.LLVMType] = i32_ty if ety == 2: ety_llvm = i64_ty_r eslot: llvmlite.Value | t.CPtr = llvmlite.build_gep_struct( @@ -1201,18 +1201,18 @@ class AsyncGenMixin(CallGenBase.CallGenBase): # ============================================================ # M2:协程体递归翻译(Return/顶层 await/If/While/嵌套 await/普通) # ============================================================ - def _handle_segment(self, trans: HT.Translator | t.CPtr, + def _handle_segment(self, trans: rawptr[HT.Translator], builder: llvmlite.IRBuilder | t.CPtr, pool: rawptr[memhub.MemBuddy], - mod: llvmlite.LLVMModule | t.CPtr, - stmts: list[ast.AST | t.CPtr] | t.CPtr): + mod: rawptr[llvmlite.LLVMModule], + stmts: list[rawptr[ast.AST]] | t.CPtr): """递归翻译协程体语句。builder 当前块 = 活跃执行块(state0 或某恢复块)。""" if stmts is None: return bn: sizet = len(stmts) i: sizet = 0 for i in range(bn): - stmt: ast.AST | t.CPtr = stmts.get(i) + stmt: rawptr[ast.AST] = stmts.get(i) if stmt is None: continue # 当前块已终止(return/挂起后无后续)→ 停止本段 @@ -1232,7 +1232,7 @@ class AsyncGenMixin(CallGenBase.CallGenBase): self._handle_coro_raise(builder, pool, mod, trans, stmt) continue if sk == ast.ASTKind.Try: - tr_: ast.Try | t.CPtr = (ast.Try | t.CPtr)(stmt) + tr_: rawptr[ast.Try] = rawptr[ast.Try](stmt) has_fin: int = 0 has_exc: int = 0 if tr_.finalbody is not None and len(tr_.finalbody) > 0: @@ -1297,11 +1297,11 @@ class AsyncGenMixin(CallGenBase.CallGenBase): # ============================================================ # M2:协程版 If(分支内 await 就地挂起/恢复) # ============================================================ - def _handle_coro_if(self, trans: HT.Translator | t.CPtr, + def _handle_coro_if(self, trans: rawptr[HT.Translator], builder: llvmlite.IRBuilder | t.CPtr, pool: rawptr[memhub.MemBuddy], - mod: llvmlite.LLVMModule | t.CPtr, - stmt: ast.AST | t.CPtr): + mod: rawptr[llvmlite.LLVMModule], + stmt: rawptr[ast.AST]): ifn: ast.If | t.CPtr = (ast.If | t.CPtr)(stmt) if ifn is None or ifn.test is None: return @@ -1316,7 +1316,7 @@ class AsyncGenMixin(CallGenBase.CallGenBase): if cond is None: return cond1: llvmlite.Value | t.CPtr = self._normalize_cond(builder, pool, cond) - func: llvmlite.Function | t.CPtr = trans._cur_func + func: rawptr[llvmlite.Function] = trans._cur_func then_bb: llvmlite.BasicBlock | t.CPtr = llvmlite.create_block( pool, func, "coro.then") merge_bb: llvmlite.BasicBlock | t.CPtr = llvmlite.create_block( @@ -1347,11 +1347,11 @@ class AsyncGenMixin(CallGenBase.CallGenBase): # ============================================================ # M2:协程版 While(条件块 + 循环体,body 内 await 就地挂起/恢复) # ============================================================ - def _handle_coro_while(self, trans: HT.Translator | t.CPtr, + def _handle_coro_while(self, trans: rawptr[HT.Translator], builder: llvmlite.IRBuilder | t.CPtr, pool: rawptr[memhub.MemBuddy], - mod: llvmlite.LLVMModule | t.CPtr, - stmt: ast.AST | t.CPtr): + mod: rawptr[llvmlite.LLVMModule], + stmt: rawptr[ast.AST]): whn: ast.While | t.CPtr = (ast.While | t.CPtr)(stmt) if whn is None: return @@ -1361,7 +1361,7 @@ class AsyncGenMixin(CallGenBase.CallGenBase): viperlib.snprintf(err_c, 256, "[coro-M2] while 条件中不支持 await") self.Gen.TypeGenErr.fatal_error(stmt, err_c, "SyntaxError") return - func: llvmlite.Function | t.CPtr = trans._cur_func + func: rawptr[llvmlite.Function] = trans._cur_func cond_bb: llvmlite.BasicBlock | t.CPtr = llvmlite.create_block( pool, func, "coro.wcond") body_bb: llvmlite.BasicBlock | t.CPtr = llvmlite.create_block( @@ -1397,11 +1397,11 @@ class AsyncGenMixin(CallGenBase.CallGenBase): # ============================================================ # M2:嵌套 await 提升:a = b + await f() → __await_N = await f(); a = b + __await_N # ============================================================ - def _handle_nested_await_stmt(self, trans: HT.Translator | t.CPtr, + def _handle_nested_await_stmt(self, trans: rawptr[HT.Translator], builder: llvmlite.IRBuilder | t.CPtr, pool: rawptr[memhub.MemBuddy], - mod: llvmlite.LLVMModule | t.CPtr, - stmt: ast.AST | t.CPtr): + mod: rawptr[llvmlite.LLVMModule], + stmt: rawptr[ast.AST]): """把语句中所有嵌套 await 提升为顶层临时赋值(与预扫描 DFS 顺序一致)""" guard: int = 0 while True: @@ -1433,22 +1433,22 @@ class AsyncGenMixin(CallGenBase.CallGenBase): # ============================================================ # 嵌套 await 存在性 / 提取 / 替换(DFS 与预扫描同序) # ============================================================ - def _stmt_has_await(self, stmt: ast.AST | t.CPtr) -> int: + def _stmt_has_await(self, stmt: rawptr[ast.AST]) -> int: aw: ast.Await | t.CPtr = self._extract_first_await(stmt) if aw is not None: return 1 return 0 - def _extract_first_await(self, stmt: ast.AST | t.CPtr) -> ast.Await | t.CPtr: + def _extract_first_await(self, stmt: rawptr[ast.AST]) -> ast.Await | t.CPtr: """取语句中第一个 Await 节点(DFS 字段序),未命中返回 None""" if stmt is None: return None sk: int = stmt.kind() if sk == ast.ASTKind.AnnAssign: - aa: ast.AnnAssign | t.CPtr = (ast.AnnAssign | t.CPtr)(stmt) + aa: rawptr[ast.AnnAssign] = rawptr[ast.AnnAssign](stmt) return self._find_expr_await(aa.value) if sk == ast.ASTKind.Assign: - as_: ast.Assign | t.CPtr = (ast.Assign | t.CPtr)(stmt) + as_: rawptr[ast.Assign] = rawptr[ast.Assign](stmt) return self._find_expr_await(as_.value) if sk == ast.ASTKind.Expr: e: ast.Expr | t.CPtr = (ast.Expr | t.CPtr)(stmt) @@ -1458,7 +1458,7 @@ class AsyncGenMixin(CallGenBase.CallGenBase): return self._find_expr_await(rv.value) return None - def _find_expr_await(self, node: ast.AST | t.CPtr) -> ast.Await | t.CPtr: + def _find_expr_await(self, node: rawptr[ast.AST]) -> ast.Await | t.CPtr: """表达式树中 DFS 找第一个 Await""" if node is None: return None @@ -1466,13 +1466,13 @@ class AsyncGenMixin(CallGenBase.CallGenBase): if k == ast.ASTKind.Await: return (ast.Await | t.CPtr)(node) if k == ast.ASTKind.BinOp: - b: ast.BinOp | t.CPtr = (ast.BinOp | t.CPtr)(node) + b: rawptr[ast.BinOp] = rawptr[ast.BinOp](node) r: ast.Await | t.CPtr = self._find_expr_await(b.left) if r is not None: return r return self._find_expr_await(b.right) if k == ast.ASTKind.Call: - cl: ast.Call | t.CPtr = (ast.Call | t.CPtr)(node) + cl: rawptr[ast.Call] = rawptr[ast.Call](node) if cl.func is not None: r2: ast.Await | t.CPtr = self._find_expr_await(cl.func) if r2 is not None: @@ -1486,7 +1486,7 @@ class AsyncGenMixin(CallGenBase.CallGenBase): return r3 return None if k == ast.ASTKind.UnaryOp: - u: ast.UnaryOp | t.CPtr = (ast.UnaryOp | t.CPtr)(node) + u: rawptr[ast.UnaryOp] = rawptr[ast.UnaryOp](node) return self._find_expr_await(u.operand) if k == ast.ASTKind.Compare: cm: ast.Compare | t.CPtr = (ast.Compare | t.CPtr)(node) @@ -1521,10 +1521,10 @@ class AsyncGenMixin(CallGenBase.CallGenBase): return r8 return self._find_expr_await(ie.orelse) if k == ast.ASTKind.Attribute: - at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(node) + at: rawptr[ast.Attribute] = rawptr[ast.Attribute](node) return self._find_expr_await(at.value) if k == ast.ASTKind.Subscript: - sb: ast.Subscript | t.CPtr = (ast.Subscript | t.CPtr)(node) + sb: rawptr[ast.Subscript] = rawptr[ast.Subscript](node) r9: ast.Await | t.CPtr = self._find_expr_await(sb.value) if r9 is not None: return r9 @@ -1532,19 +1532,19 @@ class AsyncGenMixin(CallGenBase.CallGenBase): return None def _replace_await_with_name(self, pool: rawptr[memhub.MemBuddy], - stmt: ast.AST | t.CPtr, + stmt: rawptr[ast.AST], temp_name: str) -> int: """把语句树中第一个 Await 替换为 Name(temp_name)(DFS 字段序)""" if stmt is None or temp_name is None: return 0 sk: int = stmt.kind() if sk == ast.ASTKind.AnnAssign: - aa: ast.AnnAssign | t.CPtr = (ast.AnnAssign | t.CPtr)(stmt) + aa: rawptr[ast.AnnAssign] = rawptr[ast.AnnAssign](stmt) if aa.value is not None: return self._replace_expr_await(pool, aa.value, temp_name) return 0 if sk == ast.ASTKind.Assign: - as_: ast.Assign | t.CPtr = (ast.Assign | t.CPtr)(stmt) + as_: rawptr[ast.Assign] = rawptr[ast.Assign](stmt) if as_.value is not None: return self._replace_expr_await(pool, as_.value, temp_name) return 0 @@ -1561,7 +1561,7 @@ class AsyncGenMixin(CallGenBase.CallGenBase): return 0 def _replace_expr_await(self, pool: rawptr[memhub.MemBuddy], - node: ast.AST | t.CPtr, + node: rawptr[ast.AST], temp_name: str) -> int: """在表达式树中把第一个 Await 替换为 Name(temp_name, Load)。 node 本身是 Await 时返回 2(由父字段替换)。返回 1=已替换 0=无 2=node 即 Await。""" @@ -1571,7 +1571,7 @@ class AsyncGenMixin(CallGenBase.CallGenBase): if k == ast.ASTKind.Await: return 2 if k == ast.ASTKind.BinOp: - b: ast.BinOp | t.CPtr = (ast.BinOp | t.CPtr)(node) + b: rawptr[ast.BinOp] = rawptr[ast.BinOp](node) r: int = self._replace_expr_await(pool, b.left, temp_name) if r == 1: return 1 @@ -1586,7 +1586,7 @@ class AsyncGenMixin(CallGenBase.CallGenBase): return 1 return 0 if k == ast.ASTKind.Call: - cl: ast.Call | t.CPtr = (ast.Call | t.CPtr)(node) + cl: rawptr[ast.Call] = rawptr[ast.Call](node) if cl.func is not None: r3: int = self._replace_expr_await(pool, cl.func, temp_name) if r3 == 1: @@ -1606,7 +1606,7 @@ class AsyncGenMixin(CallGenBase.CallGenBase): return 1 return 0 if k == ast.ASTKind.UnaryOp: - u: ast.UnaryOp | t.CPtr = (ast.UnaryOp | t.CPtr)(node) + u: rawptr[ast.UnaryOp] = rawptr[ast.UnaryOp](node) r5: int = self._replace_expr_await(pool, u.operand, temp_name) if r5 == 1: return 1 @@ -1668,7 +1668,7 @@ class AsyncGenMixin(CallGenBase.CallGenBase): return 1 return 0 if k == ast.ASTKind.Attribute: - at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(node) + at: rawptr[ast.Attribute] = rawptr[ast.Attribute](node) r12: int = self._replace_expr_await(pool, at.value, temp_name) if r12 == 1: return 1 @@ -1677,7 +1677,7 @@ class AsyncGenMixin(CallGenBase.CallGenBase): return 1 return 0 if k == ast.ASTKind.Subscript: - sb: ast.Subscript | t.CPtr = (ast.Subscript | t.CPtr)(node) + sb: rawptr[ast.Subscript] = rawptr[ast.Subscript](node) r13: int = self._replace_expr_await(pool, sb.value, temp_name) if r13 == 1: return 1 @@ -1701,7 +1701,7 @@ class AsyncGenMixin(CallGenBase.CallGenBase): cond: llvmlite.Value | t.CPtr) -> llvmlite.Value | t.CPtr: if cond is None: return None - ty: llvmlite.LLVMType | t.CPtr = cond.Ty + ty: rawptr[llvmlite.LLVMType] = cond.Ty is_i1: int = 0 if ty is not None: match ty: @@ -1718,7 +1718,7 @@ class AsyncGenMixin(CallGenBase.CallGenBase): # ============================================================ # 参数名读取(_coro_params 表) # ============================================================ - def _read_param_name(self, trans: HT.Translator | t.CPtr, + def _read_param_name(self, trans: rawptr[HT.Translator], idx: int) -> str: if trans is None or trans._coro_params is None: return None @@ -1729,7 +1729,7 @@ class AsyncGenMixin(CallGenBase.CallGenBase): # ============================================================ # 恢复块定位(state{N},预建数组) # ============================================================ - def _get_state_bb(self, trans: HT.Translator | t.CPtr, + def _get_state_bb(self, trans: rawptr[HT.Translator], state_no: int) -> llvmlite.BasicBlock | t.CPtr: if trans is None or trans._coro_state_bbs is None: return None @@ -1740,13 +1740,13 @@ class AsyncGenMixin(CallGenBase.CallGenBase): # 到非法块 → IR 指令链损坏 → RenumberSSA/FunctionPrint 崩溃)。 return (llvmlite.BasicBlock | t.CPtr)(trans._coro_state_bbs[state_no]) - def _lookup_coro_frame_by_trans(self, trans: HT.Translator | t.CPtr) -> llvmlite.LLVMType | t.CPtr: + def _lookup_coro_frame_by_trans(self, trans: rawptr[HT.Translator]) -> rawptr[llvmlite.LLVMType]: """取当前 resume 的帧类型:从 _coro_frames 反查(当前 async 名未知时用帧指针类型不可行, 直接返回当前协程注册的帧类型——_handle_nested_await_stmt 需要帧类型做 GEP。""" # 简化:恢复块 GEP 需要帧类型;从 _coro_frame 的 Ty(Ptr(帧))取 Pointee if trans is None or trans._coro_frame is None: return None - ft: llvmlite.LLVMType | t.CPtr = trans._coro_frame.Ty + ft: rawptr[llvmlite.LLVMType] = trans._coro_frame.Ty if ft is None: return None match ft: @@ -1760,26 +1760,26 @@ class AsyncGenMixin(CallGenBase.CallGenBase): # ============================================================ def _emit_await_sleep(self, builder: llvmlite.IRBuilder | t.CPtr, pool: rawptr[memhub.MemBuddy], - mod: llvmlite.LLVMModule | t.CPtr, - trans: HT.Translator | t.CPtr, - node: ast.AST | t.CPtr) -> llvmlite.Value | t.CPtr: + mod: rawptr[llvmlite.LLVMModule], + trans: rawptr[HT.Translator], + node: rawptr[ast.AST]) -> llvmlite.Value | t.CPtr: """await coro_sleep(ms):wake = GetTickCount64() + ms 存帧 wake 槽, 父挂起(state 分配 + br exit + position 恢复块);coro_run 轮询续跑。""" - i64_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int64(pool) - i32_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int32(pool) + i64_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int64(pool) + i32_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int32(pool) if node is None or trans is None or trans._coro_wake_ptr is None: return llvmlite.const_int32(pool, 0) ms_val: llvmlite.Value | t.CPtr = llvmlite.const_int64(pool, 0) aw_s: ast.Await | t.CPtr = (ast.Await | t.CPtr)(node) if aw_s.value is not None and aw_s.value.kind() == ast.ASTKind.Call: - cl_s: ast.Call | t.CPtr = (ast.Call | t.CPtr)(aw_s.value) + cl_s: rawptr[ast.Call] = rawptr[ast.Call](aw_s.value) if cl_s.args is not None and len(cl_s.args) > 0: ms_v: llvmlite.Value | t.CPtr = self.Gen.ExprGen.translate_value( builder, pool, mod, cl_s.args.get(0), None, 0, trans) if ms_v is not None: ms_val = ms_v # GetTickCount64() + ms(i64) - now_fn: llvmlite.Function | t.CPtr = self.Gen.CallGenBase.find_func_in_module( + now_fn: rawptr[llvmlite.Function] = self.Gen.CallGenBase.find_func_in_module( mod, "GetTickCount64") if now_fn is None: now_fn = llvmlite.create_declare(pool, mod, "GetTickCount64", i64_ty) @@ -1811,12 +1811,12 @@ class AsyncGenMixin(CallGenBase.CallGenBase): # ============================================================ def _handle_coro_raise(self, builder: llvmlite.IRBuilder | t.CPtr, pool: rawptr[memhub.MemBuddy], - mod: llvmlite.LLVMModule | t.CPtr, - trans: HT.Translator | t.CPtr, - stmt: ast.AST | t.CPtr): + mod: rawptr[llvmlite.LLVMModule], + trans: rawptr[HT.Translator], + stmt: rawptr[ast.AST]): """协程内 raise:解析异常类型/值 → 帧 exc 槽(+msg); try 栈非空跳 except 处理器,否则 done=1 + br exit 终止。""" - i32_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int32(pool) + i32_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int32(pool) exc_code: llvmlite.Value | t.CPtr = llvmlite.const_int32(pool, 1) rz: ast.Raise | t.CPtr = (ast.Raise | t.CPtr)(stmt) if rz is not None and rz.exc is not None: @@ -1845,21 +1845,21 @@ class AsyncGenMixin(CallGenBase.CallGenBase): llvmlite.build_br(builder, trans._coro_exit_bb) def _resolve_raise_code(self, pool: rawptr[memhub.MemBuddy], - exc_node: ast.AST | t.CPtr) -> int: + exc_node: rawptr[ast.AST]) -> int: """解析 raise 目标的异常码(内置/用户异常类名);非异常类返回 0""" if exc_node is None: return 0 name: str = None if exc_node.kind() == ast.ASTKind.Name: - nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(exc_node) + nm: rawptr[ast.Name] = rawptr[ast.Name](exc_node) name = nm.id elif exc_node.kind() == ast.ASTKind.Call: - cl: ast.Call | t.CPtr = (ast.Call | t.CPtr)(exc_node) + cl: rawptr[ast.Call] = rawptr[ast.Call](exc_node) if cl.func is not None and cl.func.kind() == ast.ASTKind.Name: - nm2: ast.Name | t.CPtr = (ast.Name | t.CPtr)(cl.func) + nm2: rawptr[ast.Name] = rawptr[ast.Name](cl.func) name = nm2.id elif exc_node.kind() == ast.ASTKind.Attribute: - at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(exc_node) + at: rawptr[ast.Attribute] = rawptr[ast.Attribute](exc_node) name = at.attr if name is None: return 0 @@ -1867,13 +1867,13 @@ class AsyncGenMixin(CallGenBase.CallGenBase): def _resolve_raise_msg(self, builder: llvmlite.IRBuilder | t.CPtr, pool: rawptr[memhub.MemBuddy], - mod: llvmlite.LLVMModule | t.CPtr, - trans: HT.Translator | t.CPtr, - exc_node: ast.AST | t.CPtr) -> llvmlite.Value | t.CPtr: + mod: rawptr[llvmlite.LLVMModule], + trans: rawptr[HT.Translator], + exc_node: rawptr[ast.AST]) -> llvmlite.Value | t.CPtr: """取异常消息表达式(Exception("msg") 首参),无则返回 None""" if exc_node is None or exc_node.kind() != ast.ASTKind.Call: return None - cl: ast.Call | t.CPtr = (ast.Call | t.CPtr)(exc_node) + cl: rawptr[ast.Call] = rawptr[ast.Call](exc_node) if cl.args is None or len(cl.args) < 1: return None return self.Gen.ExprGen.translate_value( @@ -1882,16 +1882,16 @@ class AsyncGenMixin(CallGenBase.CallGenBase): # ============================================================ # M5-M6:协程内 try/except(多 except 链式匹配 + 类型码 + as e 绑定) # ============================================================ - def _handle_coro_try(self, trans: HT.Translator | t.CPtr, + def _handle_coro_try(self, trans: rawptr[HT.Translator], builder: llvmlite.IRBuilder | t.CPtr, pool: rawptr[memhub.MemBuddy], - mod: llvmlite.LLVMModule | t.CPtr, - stmt: ast.AST | t.CPtr): + mod: rawptr[llvmlite.LLVMModule], + stmt: rawptr[ast.AST]): """协程内 try/except:raise/await 传播异常在 try 栈内改跳 except 处理器; 多 except 按声明序匹配(含子类码集合),Exception/裸 except 捕获所有; 全不匹配重新传播(done=1 + br exit)。""" - i32_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int32(pool) - tr: ast.Try | t.CPtr = (ast.Try | t.CPtr)(stmt) + i32_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int32(pool) + tr: rawptr[ast.Try] = rawptr[ast.Try](stmt) if tr is None: return nhandlers: int = 0 @@ -1903,7 +1903,7 @@ class AsyncGenMixin(CallGenBase.CallGenBase): viperlib.snprintf(err_t, 256, "[coro-M6] 协程内 try 需要 except 子句") self.Gen.TypeGenErr.fatal_error(stmt, err_t, "SyntaxError") return - func: llvmlite.Function | t.CPtr = trans._cur_func + func: rawptr[llvmlite.Function] = trans._cur_func except_bb: llvmlite.BasicBlock | t.CPtr = llvmlite.create_block( pool, func, "coro.try_except") merge_bb: llvmlite.BasicBlock | t.CPtr = llvmlite.create_block( @@ -1951,14 +1951,14 @@ class AsyncGenMixin(CallGenBase.CallGenBase): codes_buf: int | t.CPtr = pool.alloc(256) # 每个 handler:check 链 for hi in range(nhandlers): - h_node: ast.AST | t.CPtr = tr.handlers.get(hi) + h_node: rawptr[ast.AST] = tr.handlers.get(hi) check_bb: llvmlite.BasicBlock | t.CPtr = ( llvmlite.BasicBlock | t.CPtr)(check_bbs[hi]) llvmlite.position_at_end(builder, check_bb) catch_all: int = 0 ncodes: int = 0 if h_node is not None: - hd: ast.ExceptHandler | t.CPtr = (ast.ExceptHandler | t.CPtr)(h_node) + hd: rawptr[ast.ExceptHandler] = rawptr[ast.ExceptHandler](h_node) if hd.type is None: catch_all = 1 else: @@ -1999,12 +1999,12 @@ class AsyncGenMixin(CallGenBase.CallGenBase): llvmlite.build_br(builder, trans._coro_exit_bb) # ---- 各 except handler ---- for hi in range(nhandlers): - h_node2: ast.AST | t.CPtr = tr.handlers.get(hi) + h_node2: rawptr[ast.AST] = tr.handlers.get(hi) handler_bb2: llvmlite.BasicBlock | t.CPtr = ( llvmlite.BasicBlock | t.CPtr)(handler_bbs[hi], t.CPtr) llvmlite.position_at_end(builder, handler_bb2) if h_node2 is not None: - hd2: ast.ExceptHandler | t.CPtr = (ast.ExceptHandler | t.CPtr)(h_node2) + hd2: rawptr[ast.ExceptHandler] = rawptr[ast.ExceptHandler](h_node2) # as e:异常码绑定 e 槽(e 是局部槽,_collect_local_names 收集) if hd2.name is not None and trans._coro_exc_ptr is not None: e_slot: llvmlite.Value | t.CPtr = self.Gen.VarGen.lookup_var( @@ -2022,30 +2022,30 @@ class AsyncGenMixin(CallGenBase.CallGenBase): llvmlite.position_at_end(builder, merge_bb) def _exception_type_name(self, pool: rawptr[memhub.MemBuddy], - type_node: ast.AST | t.CPtr) -> str: + type_node: rawptr[ast.AST]) -> str: """取 except 类型名(Name/Attribute),未命中返回 None""" if type_node is None: return None if type_node.kind() == ast.ASTKind.Name: - nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(type_node) + nm: rawptr[ast.Name] = rawptr[ast.Name](type_node) return nm.id if type_node.kind() == ast.ASTKind.Attribute: - at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(type_node) + at: rawptr[ast.Attribute] = rawptr[ast.Attribute](type_node) return at.attr return None # ============================================================ # M7:协程内 try/finally(无 except) # ============================================================ - def _handle_coro_try_finally(self, trans: HT.Translator | t.CPtr, + def _handle_coro_try_finally(self, trans: rawptr[HT.Translator], builder: llvmlite.IRBuilder | t.CPtr, pool: rawptr[memhub.MemBuddy], - mod: llvmlite.LLVMModule | t.CPtr, - stmt: ast.AST | t.CPtr): + mod: rawptr[llvmlite.LLVMModule], + stmt: rawptr[ast.AST]): """协程内 try/finally:正常/异常路径都执行 fbody; 异常时 finally 后重新传播(done=1 + br exit);finally 内不支持 await。""" - i32_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int32(pool) - tr: ast.Try | t.CPtr = (ast.Try | t.CPtr)(stmt) + i32_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int32(pool) + tr: rawptr[ast.Try] = rawptr[ast.Try](stmt) if tr is None: return if tr.finalbody is not None and self._stmts_deep_await(tr.finalbody) != 0: @@ -2054,7 +2054,7 @@ class AsyncGenMixin(CallGenBase.CallGenBase): viperlib.snprintf(err_f, 256, "[coro-M7] finally 内暂不支持 await") self.Gen.TypeGenErr.fatal_error(stmt, err_f, "SyntaxError") return - func: llvmlite.Function | t.CPtr = trans._cur_func + func: rawptr[llvmlite.Function] = trans._cur_func fin_bb: llvmlite.BasicBlock | t.CPtr = llvmlite.create_block( pool, func, "coro.fin") fin_exc_bb: llvmlite.BasicBlock | t.CPtr = llvmlite.create_block( @@ -2091,14 +2091,14 @@ class AsyncGenMixin(CallGenBase.CallGenBase): # ============================================================ # M3:协程内 range-For(含 await)变换为 While(__f_idx/__f_len 帧槽) # ============================================================ - def _handle_coro_for(self, trans: HT.Translator | t.CPtr, + def _handle_coro_for(self, trans: rawptr[HT.Translator], builder: llvmlite.IRBuilder | t.CPtr, pool: rawptr[memhub.MemBuddy], - mod: llvmlite.LLVMModule | t.CPtr, - stmt: ast.AST | t.CPtr): + mod: rawptr[llvmlite.LLVMModule], + stmt: rawptr[ast.AST]): """range-For(含 await):__f_idx_N = start; __f_len_N = end; while __f_idx_N < __f_len_N: target = __f_idx_N; ; __f_idx_N += 1""" - i32_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int32(pool) + i32_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int32(pool) if self._is_range_for(stmt) == 0: err_g: str = pool.alloc(256) if err_g is not None: @@ -2119,7 +2119,7 @@ class AsyncGenMixin(CallGenBase.CallGenBase): if idx_slot is None or len_slot is None: return # start/end(range 1/2 参数) - cl: ast.Call | t.CPtr = (ast.Call | t.CPtr)(fn.iter) + cl: rawptr[ast.Call] = rawptr[ast.Call](fn.iter) start_val: llvmlite.Value | t.CPtr = None end_val: llvmlite.Value | t.CPtr = None nargs: int = len(cl.args) @@ -2139,7 +2139,7 @@ class AsyncGenMixin(CallGenBase.CallGenBase): llvmlite.build_store(builder, start_val, idx_slot) llvmlite.build_store(builder, end_val, len_slot) # 循环结构 - func: llvmlite.Function | t.CPtr = trans._cur_func + func: rawptr[llvmlite.Function] = trans._cur_func cond_bb: llvmlite.BasicBlock | t.CPtr = llvmlite.create_block( pool, func, "coro.fcond") body_bb: llvmlite.BasicBlock | t.CPtr = llvmlite.create_block( @@ -2165,7 +2165,7 @@ class AsyncGenMixin(CallGenBase.CallGenBase): # 循环体:target = idx; ; idx += 1 llvmlite.position_at_end(builder, body_bb) if fn.target is not None and fn.target.kind() == ast.ASTKind.Name: - tn: ast.Name | t.CPtr = (ast.Name | t.CPtr)(fn.target) + tn: rawptr[ast.Name] = rawptr[ast.Name](fn.target) tgt_slot: llvmlite.Value | t.CPtr = self.Gen.VarGen.lookup_var( trans.SymTab, tn.id) if tgt_slot is not None: @@ -2189,22 +2189,22 @@ class AsyncGenMixin(CallGenBase.CallGenBase): # ============================================================ def translate_coro_destroy(self, builder: llvmlite.IRBuilder | t.CPtr, pool: rawptr[memhub.MemBuddy], - mod: llvmlite.LLVMModule | t.CPtr, - cl: ast.Call | t.CPtr, - trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: + mod: rawptr[llvmlite.LLVMModule], + cl: rawptr[ast.Call], + trans: rawptr[HT.Translator]) -> llvmlite.Value | t.CPtr: """coro.coro_destroy(帧):帧回池(free-list,帧首 8 字节存 next)""" - i32_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int32(pool) - i64_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int64(pool) + i32_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int32(pool) + i64_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int64(pool) if cl is None or trans is None or cl.args is None or len(cl.args) < 1: return llvmlite.const_int32(pool, 0) async_name: str = self._var_to_async(trans, cl.args.get(0)) if async_name is None: return llvmlite.const_int32(pool, 0) - frame_ty: llvmlite.LLVMType | t.CPtr = self._lookup_coro_frame( + frame_ty: rawptr[llvmlite.LLVMType] = self._lookup_coro_frame( trans, async_name) if frame_ty is None: return llvmlite.const_int32(pool, 0) - frame_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, frame_ty) + frame_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, frame_ty) frame_val: llvmlite.Value | t.CPtr = self.Gen.ExprGen.translate_value( builder, pool, mod, cl.args.get(0), None, 0, trans) if frame_val is None: @@ -2217,7 +2217,7 @@ class AsyncGenMixin(CallGenBase.CallGenBase): pool_gv: llvmlite.GlobalVariable | t.CPtr = self._get_coro_pool( pool, mod, trans, async_name) # GlobalVariable 非 Value 子类:构造 Value 视图(Ty=Ptr(i64), Name="@coro_pool_") - i64_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, i64_ty) + i64_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, i64_ty) pool_ref_name: str = pool.alloc(96) if pool_ref_name is not None: viperlib.snprintf(pool_ref_name, 96, "@coro_pool_%s", async_name) @@ -2235,21 +2235,21 @@ class AsyncGenMixin(CallGenBase.CallGenBase): def translate_coro_exception(self, builder: llvmlite.IRBuilder | t.CPtr, pool: rawptr[memhub.MemBuddy], - mod: llvmlite.LLVMModule | t.CPtr, - cl: ast.Call | t.CPtr, - trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: + mod: rawptr[llvmlite.LLVMModule], + cl: rawptr[ast.Call], + trans: rawptr[HT.Translator]) -> llvmlite.Value | t.CPtr: """coro.coro_exception(帧):返回帧 exc 槽(异常码,0=无异常)""" - i32_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int32(pool) + i32_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int32(pool) if cl is None or trans is None or cl.args is None or len(cl.args) < 1: return llvmlite.const_int32(pool, 0) async_name: str = self._var_to_async(trans, cl.args.get(0)) if async_name is None: return llvmlite.const_int32(pool, 0) - frame_ty: llvmlite.LLVMType | t.CPtr = self._lookup_coro_frame( + frame_ty: rawptr[llvmlite.LLVMType] = self._lookup_coro_frame( trans, async_name) if frame_ty is None: return llvmlite.const_int32(pool, 0) - frame_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, frame_ty) + frame_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, frame_ty) frame_val: llvmlite.Value | t.CPtr = self.Gen.ExprGen.translate_value( builder, pool, mod, cl.args.get(0), None, 0, trans) if frame_val is None: @@ -2264,22 +2264,22 @@ class AsyncGenMixin(CallGenBase.CallGenBase): def translate_coro_exception_msg(self, builder: llvmlite.IRBuilder | t.CPtr, pool: rawptr[memhub.MemBuddy], - mod: llvmlite.LLVMModule | t.CPtr, - cl: ast.Call | t.CPtr, - trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: + mod: rawptr[llvmlite.LLVMModule], + cl: rawptr[ast.Call], + trans: rawptr[HT.Translator]) -> llvmlite.Value | t.CPtr: """coro.coro_exception_msg(帧):返回帧 msg 槽(异常消息指针,null=无)""" - i8_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr( + i8_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr( pool, llvmlite.Int8(pool)) if cl is None or trans is None or cl.args is None or len(cl.args) < 1: return llvmlite.ConstNull(pool, i8_ptr_ty, "null") async_name: str = self._var_to_async(trans, cl.args.get(0)) if async_name is None: return llvmlite.ConstNull(pool, i8_ptr_ty, "null") - frame_ty: llvmlite.LLVMType | t.CPtr = self._lookup_coro_frame( + frame_ty: rawptr[llvmlite.LLVMType] = self._lookup_coro_frame( trans, async_name) if frame_ty is None: return llvmlite.ConstNull(pool, i8_ptr_ty, "null") - frame_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, frame_ty) + frame_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, frame_ty) frame_val: llvmlite.Value | t.CPtr = self.Gen.ExprGen.translate_value( builder, pool, mod, cl.args.get(0), None, 0, trans) if frame_val is None: @@ -2294,25 +2294,25 @@ class AsyncGenMixin(CallGenBase.CallGenBase): def translate_coro_gather(self, builder: llvmlite.IRBuilder | t.CPtr, pool: rawptr[memhub.MemBuddy], - mod: llvmlite.LLVMModule | t.CPtr, - cl: ast.Call | t.CPtr, - trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: + mod: rawptr[llvmlite.LLVMModule], + cl: rawptr[ast.Call], + trans: rawptr[HT.Translator]) -> llvmlite.Value | t.CPtr: """coro.coro_gather(帧...):并发推进全部协程到完成,返回完成数(M4 纯 resume 循环)""" - i32_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int32(pool) + i32_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int32(pool) if cl is None or trans is None or cl.args is None: return llvmlite.const_int32(pool, 0) nb: sizet = len(cl.args) j: sizet = 0 for j in range(nb): - arg0: ast.AST | t.CPtr = cl.args.get(j) + arg0: rawptr[ast.AST] = cl.args.get(j) async_name: str = self._var_to_async(trans, arg0) if async_name is None: continue - frame_ty: llvmlite.LLVMType | t.CPtr = self._lookup_coro_frame( + frame_ty: rawptr[llvmlite.LLVMType] = self._lookup_coro_frame( trans, async_name) if frame_ty is None: continue - frame_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, frame_ty) + frame_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, frame_ty) frame_val: llvmlite.Value | t.CPtr = self.Gen.ExprGen.translate_value( builder, pool, mod, arg0, None, 0, trans) if frame_val is None: @@ -2328,7 +2328,7 @@ class AsyncGenMixin(CallGenBase.CallGenBase): trans, rn_buf, 0) if self.Gen.CallGenBase.find_func_in_module(mod, resume_mangled) is None: continue - func: llvmlite.Function | t.CPtr = trans._cur_func + func: rawptr[llvmlite.Function] = trans._cur_func loop_bb: llvmlite.BasicBlock | t.CPtr = llvmlite.create_block( pool, func, "gather.loop") after_bb: llvmlite.BasicBlock | t.CPtr = llvmlite.create_block( @@ -2346,12 +2346,12 @@ class AsyncGenMixin(CallGenBase.CallGenBase): llvmlite.position_at_end(builder, after_bb) return llvmlite.const_int32(pool, 0) - def _var_to_async(self, trans: HT.Translator | t.CPtr, - arg0: ast.AST | t.CPtr) -> str: + def _var_to_async(self, trans: rawptr[HT.Translator], + arg0: rawptr[ast.AST]) -> str: """变量节点 → async 函数名(_coro_var_async 反查),未命中返回 None""" if trans is None or arg0 is None or arg0.kind() != ast.ASTKind.Name: return None - nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(arg0) + nm: rawptr[ast.Name] = rawptr[ast.Name](arg0) if nm.id is None: return None return self._lookup_coro_var(trans, nm.id) @@ -2361,9 +2361,9 @@ class AsyncGenMixin(CallGenBase.CallGenBase): # ============================================================ def _emit_await(self, builder: llvmlite.IRBuilder | t.CPtr, pool: rawptr[memhub.MemBuddy], - mod: llvmlite.LLVMModule | t.CPtr, - trans: HT.Translator | t.CPtr, - node: ast.AST | t.CPtr, + mod: rawptr[llvmlite.LLVMModule], + trans: rawptr[HT.Translator], + node: rawptr[ast.AST], call_name: str) -> llvmlite.Value | t.CPtr: """await async_fn(args...) 内联翻译(M2 带参数): 1. 求值调用参数(表达式逐个翻译,i32) @@ -2373,19 +2373,19 @@ class AsyncGenMixin(CallGenBase.CallGenBase): 5. 父挂起:store state=新状态号 + br exit;恢复块 state{new_state} 立即 position(预建 case 块),后续语句在恢复块继续翻译 返回子协程 ret 值(i32)。注意 node 是 Await,须先转 ast.Await 再取 value。""" - i32_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int32(pool) - i8_ptr_ty_a: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr( + i32_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int32(pool) + i8_ptr_ty_a: rawptr[llvmlite.LLVMType] = llvmlite.Ptr( pool, llvmlite.Int8(pool)) if node is None or call_name is None or trans is None: return llvmlite.const_int32(pool, 0) # M3:await coro_sleep(ms) —— 挂起到 wake 时刻(帧 wake 槽) if string.strcmp(call_name, "coro_sleep") == 0: return self._emit_await_sleep(builder, pool, mod, trans, node) - child_frame_ty: llvmlite.LLVMType | t.CPtr = self._lookup_coro_frame( + child_frame_ty: rawptr[llvmlite.LLVMType] = self._lookup_coro_frame( trans, call_name) if child_frame_ty is None: return llvmlite.const_int32(pool, 0) - child_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, child_frame_ty) + child_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, child_frame_ty) cc_buf: str = pool.alloc(64) if cc_buf is not None: @@ -2408,7 +2408,7 @@ class AsyncGenMixin(CallGenBase.CallGenBase): args_count: int = 0 aw_n: ast.Await | t.CPtr = (ast.Await | t.CPtr)(node) if aw_n.value is not None and aw_n.value.kind() == ast.ASTKind.Call: - cl_a: ast.Call | t.CPtr = (ast.Call | t.CPtr)(aw_n.value) + cl_a: rawptr[ast.Call] = rawptr[ast.Call](aw_n.value) if cl_a.args is not None: nb: sizet = len(cl_a.args) j: sizet = 0 @@ -2493,34 +2493,34 @@ class AsyncGenMixin(CallGenBase.CallGenBase): # ============================================================ def translate_coro_run(self, builder: llvmlite.IRBuilder | t.CPtr, pool: rawptr[memhub.MemBuddy], - mod: llvmlite.LLVMModule | t.CPtr, - cl: ast.Call | t.CPtr, - trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: + mod: rawptr[llvmlite.LLVMModule], + cl: rawptr[ast.Call], + trans: rawptr[HT.Translator]) -> llvmlite.Value | t.CPtr: """coro.coro_run(frame) 内联翻译: 参数是 Name 变量 → 经 _coro_var_async 反查 async 名 → _coro_frames 取帧类型 → bitcast 变量值到 Ptr(帧) → 循环 resume_(frame) 直到 done != 0 → GEP [0,2] load ret 返回。 M1 无 coro_sleep 轮询(无 wake 槽),纯忙等直到协程完成。 """ - i32_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int32(pool) + i32_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int32(pool) if cl is None or trans is None: return llvmlite.const_int32(pool, 0) if cl.args is None or len(cl.args) < 1: return llvmlite.const_int32(pool, 0) - arg0: ast.AST | t.CPtr = cl.args.get(0) + arg0: rawptr[ast.AST] = cl.args.get(0) if arg0 is None or arg0.kind() != ast.ASTKind.Name: return llvmlite.const_int32(pool, 0) - nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(arg0) + nm: rawptr[ast.Name] = rawptr[ast.Name](arg0) if nm.id is None: return llvmlite.const_int32(pool, 0) async_name: str = self._lookup_coro_var(trans, nm.id) if async_name is None: return llvmlite.const_int32(pool, 0) - frame_ty: llvmlite.LLVMType | t.CPtr = self._lookup_coro_frame( + frame_ty: rawptr[llvmlite.LLVMType] = self._lookup_coro_frame( trans, async_name) if frame_ty is None: return llvmlite.const_int32(pool, 0) - frame_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, frame_ty) + frame_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, frame_ty) # 帧变量值(i8* / Ptr(帧))→ bitcast 到 Ptr(帧) frame_val: llvmlite.Value | t.CPtr = self.Gen.ExprGen.translate_value( @@ -2532,7 +2532,7 @@ class AsyncGenMixin(CallGenBase.CallGenBase): if frame_ptr is None: return llvmlite.const_int32(pool, 0) - func: llvmlite.Function | t.CPtr = trans._cur_func + func: rawptr[llvmlite.Function] = trans._cur_func if func is None: return llvmlite.const_int32(pool, 0) rn_buf: str = pool.alloc(64) @@ -2566,7 +2566,7 @@ class AsyncGenMixin(CallGenBase.CallGenBase): if wake_idx_r < 0: llvmlite.build_br(builder, loop_bb) else: - i64_ty_r2: llvmlite.LLVMType | t.CPtr = llvmlite.Int64(pool) + i64_ty_r2: rawptr[llvmlite.LLVMType] = llvmlite.Int64(pool) wake_ptr_r: llvmlite.Value | t.CPtr = llvmlite.build_gep_struct( builder, frame_ty, i64_ty_r2, frame_ptr, wake_idx_r) wake_v_r: llvmlite.Value | t.CPtr = llvmlite.build_load( @@ -2602,7 +2602,7 @@ class AsyncGenMixin(CallGenBase.CallGenBase): # ============================================================ # 公共查询 / 登记 # ============================================================ - def is_async_func(self, trans: HT.Translator | t.CPtr, + def is_async_func(self, trans: rawptr[HT.Translator], name: str) -> int: """查询 name 是否已注册为 async 函数(_async_funcs 表),1=是 0=否""" if trans is None or name is None or trans._async_funcs is None: @@ -2616,7 +2616,7 @@ class AsyncGenMixin(CallGenBase.CallGenBase): return 1 return 0 - def register_coro_var(self, trans: HT.Translator | t.CPtr, + def register_coro_var(self, trans: rawptr[HT.Translator], var_name: str, func_name: str) -> int: """记录 变量名→async 函数名 映射(coro.coro_run 反查帧类型用)。 对齐 TPC HandlesAnnAssign.py L319-326。返回 0 成功。""" @@ -2640,7 +2640,7 @@ class AsyncGenMixin(CallGenBase.CallGenBase): trans._coro_var_async_count = cnt + 1 return 0 - def _register_async_func(self, trans: HT.Translator | t.CPtr, + def _register_async_func(self, trans: rawptr[HT.Translator], name: str) -> int: """注册 async 函数裸名到 _async_funcs 表""" if trans is None or name is None or trans._async_funcs is None: @@ -2660,9 +2660,9 @@ class AsyncGenMixin(CallGenBase.CallGenBase): trans._async_func_count = cnt + 1 return 0 - def _register_coro_frame(self, trans: HT.Translator | t.CPtr, + def _register_coro_frame(self, trans: rawptr[HT.Translator], name: str, - frame_ty: llvmlite.LLVMType | t.CPtr) -> int: + frame_ty: rawptr[llvmlite.LLVMType]) -> int: """注册 async 名→帧类型 到 _coro_frames 表(16 字节/项 = char* + LLVMType*)""" if trans is None or name is None or frame_ty is None: return 1 @@ -2685,8 +2685,8 @@ class AsyncGenMixin(CallGenBase.CallGenBase): trans._coro_frame_count = cnt + 1 return 0 - def _lookup_coro_frame(self, trans: HT.Translator | t.CPtr, - name: str) -> llvmlite.LLVMType | t.CPtr: + def _lookup_coro_frame(self, trans: rawptr[HT.Translator], + name: str) -> rawptr[llvmlite.LLVMType]: """按 async 名查帧类型,未命中返回 None""" if trans is None or name is None or trans._coro_frames is None: return None @@ -2698,11 +2698,11 @@ class AsyncGenMixin(CallGenBase.CallGenBase): if pair[0] is not None and string.strcmp(pair[0], name) == 0: if pair[1] is not None: ty_addr: sizet = sizet(pair[1]) - return (llvmlite.LLVMType | t.CPtr)(ty_addr) + return (rawptr[llvmlite.LLVMType])(ty_addr) return None return None - def _lookup_coro_var(self, trans: HT.Translator | t.CPtr, + def _lookup_coro_var(self, trans: rawptr[HT.Translator], var_name: str) -> str: """按变量名反查 async 函数名(_coro_var_async 表),未命中返回 None""" if trans is None or var_name is None or trans._coro_var_async is None: @@ -2721,9 +2721,9 @@ class AsyncGenMixin(CallGenBase.CallGenBase): # ============================================================ def _emit_coro_return(self, builder: llvmlite.IRBuilder | t.CPtr, pool: rawptr[memhub.MemBuddy], - mod: llvmlite.LLVMModule | t.CPtr, - trans: HT.Translator | t.CPtr, - stmt: ast.AST | t.CPtr) -> None: + mod: rawptr[llvmlite.LLVMModule], + trans: rawptr[HT.Translator], + stmt: rawptr[ast.AST]) -> None: """协程内 Return 特判:store ret 槽 + done=1 + br exit。 M1 不支持 return await(顶层 await 仅限 AnnAssign/Assign)。 @@ -2749,30 +2749,30 @@ class AsyncGenMixin(CallGenBase.CallGenBase): return 0 if aw.value.kind() != ast.ASTKind.Call: return 0 - cl: ast.Call | t.CPtr = (ast.Call | t.CPtr)(aw.value) + cl: rawptr[ast.Call] = rawptr[ast.Call](aw.value) if cl.func is None: return 0 if cl.func.kind() == ast.ASTKind.Name: - nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(cl.func) + nm: rawptr[ast.Name] = rawptr[ast.Name](cl.func) if nm.id is not None and string.strcmp(nm.id, "coro_sleep") == 0: return 1 elif cl.func.kind() == ast.ASTKind.Attribute: - at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(cl.func) + at: rawptr[ast.Attribute] = rawptr[ast.Attribute](cl.func) if at.attr is not None and string.strcmp(at.attr, "coro_sleep") == 0: return 1 return 0 - def _is_await_tail(self, stmt: ast.AST | t.CPtr) -> int: + def _is_await_tail(self, stmt: rawptr[ast.AST]) -> int: """判断语句是否为段尾:AnnAssign/Assign/Expr 且 value 直接是 Await""" if stmt is None: return 0 sk: int = stmt.kind() if sk == ast.ASTKind.AnnAssign: - aa: ast.AnnAssign | t.CPtr = (ast.AnnAssign | t.CPtr)(stmt) + aa: rawptr[ast.AnnAssign] = rawptr[ast.AnnAssign](stmt) if aa.value is not None and aa.value.kind() == ast.ASTKind.Await: return 1 elif sk == ast.ASTKind.Assign: - as_: ast.Assign | t.CPtr = (ast.Assign | t.CPtr)(stmt) + as_: rawptr[ast.Assign] = rawptr[ast.Assign](stmt) if as_.value is not None and as_.value.kind() == ast.ASTKind.Await: if as_.targets is not None and len(as_.targets) == 1: return 1 @@ -2782,36 +2782,36 @@ class AsyncGenMixin(CallGenBase.CallGenBase): return 1 return 0 - def _get_assign_target_name(self, stmt: ast.AST | t.CPtr) -> str: + def _get_assign_target_name(self, stmt: rawptr[ast.AST]) -> str: """取 AnnAssign(target=Name)/Assign(单 target=Name) 的目标名,未命中返回 None""" if stmt is None: return None sk: int = stmt.kind() if sk == ast.ASTKind.AnnAssign: - aa: ast.AnnAssign | t.CPtr = (ast.AnnAssign | t.CPtr)(stmt) + aa: rawptr[ast.AnnAssign] = rawptr[ast.AnnAssign](stmt) if aa.target is not None and aa.target.kind() == ast.ASTKind.Name: - tn: ast.Name | t.CPtr = (ast.Name | t.CPtr)(aa.target) + tn: rawptr[ast.Name] = rawptr[ast.Name](aa.target) return tn.id elif sk == ast.ASTKind.Assign: - as_: ast.Assign | t.CPtr = (ast.Assign | t.CPtr)(stmt) + as_: rawptr[ast.Assign] = rawptr[ast.Assign](stmt) if as_.targets is not None and len(as_.targets) == 1: - t0: ast.AST | t.CPtr = as_.targets.get(0) + t0: rawptr[ast.AST] = as_.targets.get(0) if t0 is not None and t0.kind() == ast.ASTKind.Name: - tn2: ast.Name | t.CPtr = (ast.Name | t.CPtr)(t0) + tn2: rawptr[ast.Name] = rawptr[ast.Name](t0) return tn2.id return None - def _get_await_value(self, stmt: ast.AST | t.CPtr) -> ast.Await | t.CPtr: + def _get_await_value(self, stmt: rawptr[ast.AST]) -> ast.Await | t.CPtr: """取段尾语句的 Await value 节点,未命中返回 None""" if stmt is None: return None sk: int = stmt.kind() if sk == ast.ASTKind.AnnAssign: - aa: ast.AnnAssign | t.CPtr = (ast.AnnAssign | t.CPtr)(stmt) + aa: rawptr[ast.AnnAssign] = rawptr[ast.AnnAssign](stmt) if aa.value is not None and aa.value.kind() == ast.ASTKind.Await: return (ast.Await | t.CPtr)(aa.value) elif sk == ast.ASTKind.Assign: - as_: ast.Assign | t.CPtr = (ast.Assign | t.CPtr)(stmt) + as_: rawptr[ast.Assign] = rawptr[ast.Assign](stmt) if as_.value is not None and as_.value.kind() == ast.ASTKind.Await: return (ast.Await | t.CPtr)(as_.value) elif sk == ast.ASTKind.Expr: @@ -2825,19 +2825,19 @@ class AsyncGenMixin(CallGenBase.CallGenBase): if aw_node is None or aw_node.value is None: return None if aw_node.value.kind() == ast.ASTKind.Call: - cl: ast.Call | t.CPtr = (ast.Call | t.CPtr)(aw_node.value) + cl: rawptr[ast.Call] = rawptr[ast.Call](aw_node.value) if cl.func is not None: if cl.func.kind() == ast.ASTKind.Name: - nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(cl.func) + nm: rawptr[ast.Name] = rawptr[ast.Name](cl.func) return nm.id if cl.func.kind() == ast.ASTKind.Attribute: # coro.coro_sleep(ms):M3 sleep 挂起 - at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(cl.func) + at: rawptr[ast.Attribute] = rawptr[ast.Attribute](cl.func) if at.attr is not None and string.strcmp(at.attr, "coro_sleep") == 0: return "coro_sleep" return None - def _read_local_name(self, trans: HT.Translator | t.CPtr, + def _read_local_name(self, trans: rawptr[HT.Translator], idx: int) -> str: """读 trans._coro_locals 第 idx 个局部变量名,越界返回 None""" if trans is None or trans._coro_locals is None: diff --git a/App/lib/core/Gen/BaseGenMixin.vp b/App/lib/core/Gen/BaseGenMixin.vp index 8bc16a3..4da259b 100644 --- a/App/lib/core/Gen/BaseGenMixin.vp +++ b/App/lib/core/Gen/BaseGenMixin.vp @@ -16,18 +16,18 @@ class BaseGenMixin: # 内存/IR 状态 Gen: rawptr[Generator.Generator] Pool: rawptr[memhub.MemBuddy] # 内存池 - Module: llvmlite.LLVMModule | t.CPtr # 当前 LLVM 模块 + Module: rawptr[llvmlite.LLVMModule] # 当前 LLVM 模块 Builder: llvmlite.IRBuilder | t.CPtr # 当前 IRBuilder # 符号表/函数表 SymTab: GenTypes.SymbolTable | t.CPtr - Funcs: GenTypes.FuncEntry | t.CPtr + Funcs: rawptr[GenTypes.FuncEntry] FuncCount: int # 导入/模块信息 ImportedModules: str FromImports: str ModuleSha1: str # 当前翻译上下文 - CurFunc: llvmlite.Function | t.CPtr + CurFunc: rawptr[llvmlite.Function] CurBuilder: llvmlite.IRBuilder | t.CPtr CurClassName: str diff --git a/App/lib/core/Gen/Call/CallGenBase.vp b/App/lib/core/Gen/Call/CallGenBase.vp index 4cbaa00..c09b1fa 100644 --- a/App/lib/core/Gen/Call/CallGenBase.vp +++ b/App/lib/core/Gen/Call/CallGenBase.vp @@ -79,7 +79,7 @@ class CallGenBase: FuncptrCount: int # --- 全局函数注册表(原 _global_funcs/_global_func_count) --- - GlobalFuncs: GenTypes.FuncEntry | t.CPtr + GlobalFuncs: rawptr[GenTypes.FuncEntry] GlobalFuncCount: int # --- 全局函数表"名 → 槽下标"索引(开放寻址 | 线性探测;槽存 index+1,0=空槽) --- @@ -496,9 +496,9 @@ class CallGenBase: return sha1 - def find_func_in_module(self, mod: llvmlite.LLVMModule | t.CPtr, + def find_func_in_module(self, mod: rawptr[llvmlite.LLVMModule], name: str, - owner_sha1: str = None) -> llvmlite.Function | t.CPtr: + owner_sha1: str = None) -> rawptr[llvmlite.Function]: """在模块的函数链表中按名称查找函数 查找策略: @@ -519,8 +519,8 @@ class CallGenBase: return None name_len: sizet = string.strlen(name) # 热点优化:原 4 趟完整链表扫描合并为 2 趟——趟 1 精确匹配(命中即返回)+ 收集首个本模块同名 mangled 候选;趟 2 收集首个 IsDeclared==0 后缀命中与首个任意后缀命中,扫描后按原优先级返回(语义不变) - cur: llvmlite.Function | t.CPtr = mod.FuncHead - mangle_hit: llvmlite.Function | t.CPtr = None + cur: rawptr[llvmlite.Function] = mod.FuncHead + mangle_hit: rawptr[llvmlite.Function] = None while cur is not None: cur_name: str = llvmlite.function_get_name(cur) if cur_name is not None: @@ -547,8 +547,8 @@ class CallGenBase: if mangle_hit is not None: return mangle_hit # 后缀匹配(.name):不跳过 declare(方法 stub 也是 declare,由调用处判断 IsDeclared 决定用裸名或 sha1 前缀名)。本模块同名 define 必须优先于跨模块 stub declare,无同名 define 时回退 stub declare - declare_hit: llvmlite.Function | t.CPtr = None - any_hit: llvmlite.Function | t.CPtr = None + declare_hit: rawptr[llvmlite.Function] = None + any_hit: rawptr[llvmlite.Function] = None cur = mod.FuncHead while cur is not None: cur_name2: str = llvmlite.function_get_name(cur) @@ -579,10 +579,10 @@ class CallGenBase: # _ensure_method_declare:found_func 为 None(stub 未注入或跨模块调用)时在当前模块创建 declare,避免 llc 报 undefined value def _ensure_method_declare(self, pool: rawptr[memhub.MemBuddy], - mod: llvmlite.LLVMModule | t.CPtr, + mod: rawptr[llvmlite.LLVMModule], call_name: str, - ret_ty: llvmlite.LLVMType | t.CPtr, - param_head: llvmlite.ParamNode | t.CPtr, + ret_ty: rawptr[llvmlite.LLVMType], + param_head: rawptr[llvmlite.Function], param_count: int): """为跨模块方法调用创建 declare 声明 @@ -597,7 +597,7 @@ class CallGenBase: # 无上限遍历会死循环(builtins.vp dump 卡死根因排查),超限即报错终止。 DECLARE_CHAIN_LIMIT: int = 100000 # 检查模块中是否已有同名函数(declare 或 define) - existing: llvmlite.Function | t.CPtr = mod.FuncHead + existing: rawptr[llvmlite.Function] = mod.FuncHead existing_steps: int = 0 while existing is not None: existing_steps += 1 @@ -627,7 +627,7 @@ class CallGenBase: # 只追加缺失的参数(cur_count < param_count 时) if cur_count < param_count: # 定位到 param_head 的第 cur_count 个节点开始追加 - pnode2: llvmlite.ParamNode | t.CPtr = param_head + pnode2: rawptr[llvmlite.Function] = param_head pi2: int = 0 # 跳过已有的 cur_count 个参数 while pnode2 is not None and pi2 < cur_count: @@ -645,12 +645,12 @@ class CallGenBase: existing = existing.Next # 裸名 C 库函数(如 string.memset → @memset):call_name 无 sha1 前缀,无法提取定义侧模块查 vpi 参数注解,故按标准签名建 declare(与 CallGenLib._ensure_c_lib_declare 白名单一致) if call_name is not None and string.strchr(call_name, 46) is None: - std_lib_fn: llvmlite.Function | t.CPtr = self.Gen.CallGenLib._ensure_c_lib_declare( + std_lib_fn: rawptr[llvmlite.Function] = self.Gen.CallGenLib._ensure_c_lib_declare( pool, mod, call_name) if std_lib_fn is not None: return # 创建函数声明 - func: llvmlite.Function | t.CPtr = llvmlite.new_function(pool, call_name, ret_ty) + func: rawptr[llvmlite.Function] = llvmlite.new_function(pool, call_name, ret_ty) if func is None: return func.IsDeclared = 1 @@ -685,15 +685,15 @@ class CallGenBase: prm_annots_d: str = None if sha1_d is not None and meth_d is not None: prm_annots_d = self._vpi_method_param_annot(pool, sha1_d, cls_d, meth_d) - i32_ty_d: llvmlite.LLVMType | t.CPtr = llvmlite.Int32(pool) - i8_ptr_d: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, llvmlite.Int8(pool)) + i32_ty_d: rawptr[llvmlite.LLVMType] = llvmlite.Int32(pool) + i8_ptr_d: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, llvmlite.Int8(pool)) # 添加参数(declare 中参数名无意义,设为 None 只输出类型) - pnode: llvmlite.ParamNode | t.CPtr = param_head + pnode: rawptr[llvmlite.Function] = param_head pi: int = 0 while pnode is not None and pi < param_count: - param_ty_d: llvmlite.LLVMType | t.CPtr = pnode.Ty + param_ty_d: rawptr[llvmlite.LLVMType] = pnode.Ty if prm_annots_d is not None and prm_annots_d[0] != '\0' and pnode.Ty is not None: - seg_ty_d: llvmlite.LLVMType | t.CPtr = VpiReader._resolve_vpi_param_annot_seg( + seg_ty_d: rawptr[llvmlite.LLVMType] = VpiReader._resolve_vpi_param_annot_seg( pool, sha1_d, cls_d, meth_d, pi, i32_ty_d, i8_ptr_d) if seg_ty_d is not None: match pnode.Ty: @@ -724,13 +724,13 @@ class CallGenBase: def _lookup_method_ret_ty_via_vpi(self, pool: rawptr[memhub.MemBuddy], cls_sha1: str, cls_name: str, - method_name: str) -> llvmlite.LLVMType | t.CPtr: + method_name: str) -> rawptr[llvmlite.LLVMType]: """从 vpi stub 返回注解缓存获取方法返回类型,未命中返回 None""" if pool is None or cls_sha1 is None or method_name is None: return None # 函数内懒 import:VpiReader imports HandlesExprCall,顶层 import 会成环 - i32_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int32(pool) - i8_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, llvmlite.Int8(pool)) + i32_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int32(pool) + i8_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, llvmlite.Int8(pool)) # 按需加载:缓存未命中时直接读 {temp_dir}/{sha1[0:2]}/{sha1}.vpi # 覆盖"模块自身翻译时 stub 尚未注入"(同模块方法调用,定义在后)的场景 if self.Gen.CallGenBase.TempDir is not None and self.Gen.CallGenBase.TempDirLen > 0: @@ -755,12 +755,12 @@ class CallGenBase: # _vpi_resolve_param_annot_ty:解析 vpi 参数注解段为 LLVMType,失败返回 None(调用方以 i8* 兜底) def _vpi_resolve_param_annot_ty(self, pool: rawptr[memhub.MemBuddy], - seg: str) -> llvmlite.LLVMType | t.CPtr: + seg: str) -> rawptr[llvmlite.LLVMType]: """解析单个 vpi 参数注解段为 LLVMType,失败返回 None""" if pool is None or seg is None: return None - i32_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int32(pool) - i8_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, llvmlite.Int8(pool)) + i32_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int32(pool) + i8_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, llvmlite.Int8(pool)) return VpiReader._resolve_vpi_ret_annot_str(pool, seg, i32_ty, i8_ptr_ty) # _special_method_ret_ty:编译器内置特殊方法的固定返回类型——__before_init__/__init__ → void,__new__ → Ptr(StructTy),非特殊返回 None(vpi 无条目,固定即可避免 fail-fast 误报) @@ -768,7 +768,7 @@ class CallGenBase: # ============================================================ def _special_method_ret_ty(self, pool: rawptr[memhub.MemBuddy], class_name: str, - method_name: str) -> llvmlite.LLVMType | t.CPtr: + method_name: str) -> rawptr[llvmlite.LLVMType]: """编译器内置特殊方法的固定返回类型;非特殊返回 None""" if pool is None or method_name is None: return None @@ -777,7 +777,7 @@ class CallGenBase: return llvmlite.Void(pool) if string.strcmp(method_name, "__new__") == 0: if class_name is not None: - sp_struct_ty: llvmlite.LLVMType | t.CPtr = self.Gen.StructGen.get_struct_type(class_name) + sp_struct_ty: rawptr[llvmlite.LLVMType] = self.Gen.StructGen.get_struct_type(class_name) if sp_struct_ty is not None: return llvmlite.Ptr(pool, sp_struct_ty) return None @@ -787,7 +787,7 @@ class CallGenBase: # ============================================================ def _fail_method_ret_ty(self, method_name: str, - node: ast.AST | t.CPtr = None) -> llvmlite.LLVMType | t.CPtr: + node: rawptr[ast.AST] = None) -> rawptr[llvmlite.LLVMType]: """方法返回类型无法精确获取时 fail-fast(ERROR + 错误堆栈) 返回类型来源(按序):当前模块函数 → text.ll define → vpi stub 返回注解缓存。 @@ -821,7 +821,7 @@ class CallGenBase: def _ParseLLVMRetTyStr(self, pool: rawptr[memhub.MemBuddy], buf: bytes, start: sizet, - end: sizet) -> llvmlite.LLVMType | t.CPtr: + end: sizet) -> rawptr[llvmlite.LLVMType]: """将 LLVM IR 返回类型字符串转换为 llvmlite.LLVMType""" if pool is None or buf is None or start >= end: return None @@ -848,8 +848,8 @@ class CallGenBase: # struct 字面量 {T1, T2, ...}(tuple 打包返回类型)必须在 * 检查之前,否则内含 * 会被误判为 i8*(破坏 tuple 解包) if s < e and buf[s] == '{': - th_st: llvmlite.ParamNode | t.CPtr = None - tt_st: llvmlite.ParamNode | t.CPtr = None + th_st: rawptr[llvmlite.Function] = None + tt_st: rawptr[llvmlite.Function] = None tc_st: int = 0 ps_st: sizet = s + 1 while ps_st < e and buf[ps_st] != '}': @@ -862,11 +862,11 @@ class CallGenBase: ps_st += 1 ee_st: sizet = ps_st if ee_st > es_st: - et_st: llvmlite.LLVMType | t.CPtr = self._ParseLLVMRetTyStr( + et_st: rawptr[llvmlite.LLVMType] = self._ParseLLVMRetTyStr( pool, buf, es_st, ee_st) if et_st is None: return None - en_st: llvmlite.ParamNode | t.CPtr = llvmlite.new_param_node( + en_st: rawptr[llvmlite.Function] = llvmlite.new_param_node( pool, et_st) if en_st is None: return None @@ -878,7 +878,7 @@ class CallGenBase: tc_st += 1 if th_st is None or tc_st == 0: return None - st_ty_st: llvmlite.LLVMType | t.CPtr = llvmlite.Struct(pool, th_st, tc_st, None) + st_ty_st: rawptr[llvmlite.LLVMType] = llvmlite.Struct(pool, th_st, tc_st, None) # 指针到 struct({i32, i8}*):返回 Ptr(Struct);纯 tuple 打包 # ({i8*, i16})无尾部 *,返回 Struct 本身。 if ps_st < e and buf[ps_st] == '*': @@ -1043,7 +1043,7 @@ class CallGenBase: class_sha1: str, class_name: str, method_name: str, - use_bare: int = 0) -> llvmlite.LLVMType | t.CPtr: + use_bare: int = 0) -> rawptr[llvmlite.LLVMType]: """从依赖模块的 text.ll 中查找方法返回类型 use_bare: 1=按模块级函数查找(搜索 "{sha1}.{method_name}" define, @@ -1133,7 +1133,7 @@ class CallGenBase: self._CacheModuleRetTyTexts(class_sha1, read_buf, buf_len) pos: sizet = 0 - result_ty: llvmlite.LLVMType | t.CPtr = None + result_ty: rawptr[llvmlite.LLVMType] = None while pos < buf_len and result_ty is None: ls: sizet = pos diff --git a/App/lib/core/Gen/Call/CallGenCBuiltin.vp b/App/lib/core/Gen/Call/CallGenCBuiltin.vp index 8fa499f..d015cb1 100644 --- a/App/lib/core/Gen/Call/CallGenCBuiltin.vp +++ b/App/lib/core/Gen/Call/CallGenCBuiltin.vp @@ -21,7 +21,7 @@ from . import CallGenBase # (镜像 TPC HandlesSpecialCall:转换链包裹 Deref 时允许从赋值注解推断 # 加载宽度;ifexp/binop 包裹不放行,避免 i8* 错 bitcast 成其他位宽读) # ============================================================ -def _IsTypeExpr(node: ast.AST | t.CPtr) -> int: +def _IsTypeExpr(node: rawptr[ast.AST]) -> int: """节点是否为类型表达式(Name/Attribute/Subscript/BinOp|)""" if node is None: return 0 @@ -29,20 +29,20 @@ def _IsTypeExpr(node: ast.AST | t.CPtr) -> int: if k == ast.ASTKind.Name or k == ast.ASTKind.Attribute or k == ast.ASTKind.Subscript: return 1 if k == ast.ASTKind.BinOp: - bop: ast.BinOp | t.CPtr = (ast.BinOp | t.CPtr)(node) + bop: rawptr[ast.BinOp] = rawptr[ast.BinOp](node) if bop.op == ast.OpKind.BitOr: return 1 return 0 -def _IsCastWrappingDeref(rhs: ast.AST | t.CPtr, deref_node: ast.AST | t.CPtr) -> int: +def _IsCastWrappingDeref(rhs: rawptr[ast.AST], deref_node: rawptr[ast.AST]) -> int: """rhs 是否为"类型转换链包裹 c.Deref"(如 (T | t.CPtr)(t.CPtr(c.Deref(p))))""" if rhs is None: return 0 if uint64(rhs) == uint64(deref_node): return 1 if rhs.kind() == ast.ASTKind.Call: - cl: ast.Call | t.CPtr = (ast.Call | t.CPtr)(rhs) + cl: rawptr[ast.Call] = rawptr[ast.Call](rhs) if cl.args is not None and len(cl.args) == 1 and _IsTypeExpr(cl.func) != 0: return _IsCastWrappingDeref(cl.args.get(0), deref_node) return 0 @@ -84,13 +84,13 @@ class CallGenCBuiltin(CallGenBase.CallGenBase): def translate_c_deref(self, 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) -> llvmlite.Value | t.CPtr: + mod: rawptr[llvmlite.LLVMModule], + cl: rawptr[ast.Call], + trans: rawptr[HT.Translator] = None) -> llvmlite.Value | t.CPtr: """c.Deref(ptr) → load 按 ptr 的 pointee 类型""" if cl is None: return None - cargs: list[ast.AST | t.CPtr] | t.CPtr = cl.args + cargs: list[rawptr[ast.AST]] | t.CPtr = cl.args if cargs is None or len(cargs) < 1: return None @@ -101,7 +101,7 @@ class CallGenCBuiltin(CallGenBase.CallGenBase): # 按 pointee 类型读取;非指针参数默认按 i8(保持向后兼容) if self.Gen.ExprGenBase.is_ptr_type(ptr_val.Ty) != 0: - pointee: llvmlite.LLVMType | t.CPtr = ptr_val.Ty.Pointee + pointee: rawptr[llvmlite.LLVMType] = ptr_val.Ty.Pointee if pointee is not None: # i8*(void*)时按赋值目标类型推断读取宽度(对齐 TPC # HandlesSpecialCall._infer_deref_target_type): @@ -126,7 +126,7 @@ class CallGenCBuiltin(CallGenBase.CallGenBase): allow_infer = 1 if pointee_width == 8 and allow_infer != 0 \ and trans is not None and trans.CurAssignAnnot is not None: - dref_ty: llvmlite.LLVMType | t.CPtr = self.Gen.TypeGenResolve.resolve_annotation_type( + dref_ty: rawptr[llvmlite.LLVMType] = self.Gen.TypeGenResolve.resolve_annotation_type( trans.Pool, trans.CurAssignAnnot, trans._imported_modules, trans._from_imports, trans, 0) if dref_ty is not None: @@ -138,7 +138,7 @@ class CallGenCBuiltin(CallGenBase.CallGenBase): dref_ptr: llvmlite.Value | t.CPtr = None if (dref_bits != 0 or dref_fbits != 0 or dref_is_ptr != 0) \ and dref_bits != 8: - dref_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, dref_ty) + dref_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, dref_ty) dref_ptr = llvmlite.build_bitcast( builder, ptr_val, dref_ptr_ty) if dref_ptr is not None: @@ -153,15 +153,15 @@ class CallGenCBuiltin(CallGenBase.CallGenBase): def translate_c_derefas(self, 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) -> llvmlite.Value | t.CPtr: + mod: rawptr[llvmlite.LLVMModule], + cl: rawptr[ast.Call], + trans: rawptr[HT.Translator] = None) -> llvmlite.Value | t.CPtr: """c.DerefAs(ptr, val) → store val to ptr(bitcast 后 store) 单参形式 c.DerefAs(ptr) → 读取 ptr 指向的值(等价 c.Deref(ptr))。 """ if cl is None: return None - cargs: list[ast.AST | t.CPtr] | t.CPtr = cl.args + cargs: list[rawptr[ast.AST]] | t.CPtr = cl.args if cargs is None or len(cargs) < 1: return None # 单参形式:deref 读(paging.vp save_pt_range L263 @@ -185,8 +185,8 @@ class CallGenCBuiltin(CallGenBase.CallGenBase): # 只写入 8 字节指针(tag 字段仍是 0x0),导致运行时读 tag 错乱。 # 对应 TPC HandlesExprCall.py:3696-3701 的 struct 拷贝逻辑。 if self.Gen.ExprGenBase.is_ptr_type(ptr_val.Ty) != 0 and self.Gen.ExprGenBase.is_ptr_type(val.Ty) != 0: - ptr_pointee: llvmlite.LLVMType | t.CPtr = ptr_val.Ty.Pointee - val_pointee: llvmlite.LLVMType | t.CPtr = val.Ty.Pointee + ptr_pointee: rawptr[llvmlite.LLVMType] = ptr_val.Ty.Pointee + val_pointee: rawptr[llvmlite.LLVMType] = val.Ty.Pointee if ptr_pointee is not None and val_pointee is not None: # ptr_pointee 是已注册结构体类型(用 find_struct_by_type 判断) if self.Gen.StructGen.find_struct_by_type(ptr_pointee) is not None: @@ -196,7 +196,7 @@ class CallGenCBuiltin(CallGenBase.CallGenBase): builder, val_pointee, val) if loaded is not None: # bitcast ptr 到结构体指针再 store - struct_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr( + struct_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr( pool, ptr_pointee) casted_ptr: llvmlite.Value | t.CPtr = llvmlite.build_bitcast( builder, ptr_val, struct_ptr_ty) @@ -205,7 +205,7 @@ class CallGenCBuiltin(CallGenBase.CallGenBase): return val # bitcast ptr 到 val.Ty* 再 store - val_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, val.Ty) + val_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, val.Ty) casted_ptr: llvmlite.Value | t.CPtr = llvmlite.build_bitcast(builder, ptr_val, val_ptr_ty) if casted_ptr is None: return None @@ -215,16 +215,16 @@ class CallGenCBuiltin(CallGenBase.CallGenBase): def translate_c_set(self, 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) -> llvmlite.Value | t.CPtr: + mod: rawptr[llvmlite.LLVMModule], + cl: rawptr[ast.Call], + trans: rawptr[HT.Translator] = None) -> llvmlite.Value | t.CPtr: """c.Set(a, b) → a = b(赋值语义,a 为左值)""" if cl is None: return None - cargs: list[ast.AST | t.CPtr] | t.CPtr = cl.args + cargs: list[rawptr[ast.AST]] | t.CPtr = cl.args if cargs is None or len(cargs) < 2: return None - a_node: ast.AST | t.CPtr = cargs.get(0) + a_node: rawptr[ast.AST] = cargs.get(0) b_val: llvmlite.Value | t.CPtr = self.Gen.ExprGen.translate_value( builder, pool, mod, cargs.get(1), None, 0, trans) if b_val is None: @@ -232,11 +232,11 @@ class CallGenCBuiltin(CallGenBase.CallGenBase): # 形态 1: c.Set(c.Deref(ptr), b) → *ptr = b if a_node is not None and a_node.kind() == ast.ASTKind.Call: - d_call: ast.Call | t.CPtr = (ast.Call | t.CPtr)(a_node) + d_call: rawptr[ast.Call] = rawptr[ast.Call](a_node) if d_call.func is not None and d_call.func.kind() == ast.ASTKind.Attribute: - d_at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(d_call.func) + d_at: rawptr[ast.Attribute] = rawptr[ast.Attribute](d_call.func) if d_at.attr is not None and string.strcmp(d_at.attr, "Deref") == 0: - d_args: list[ast.AST | t.CPtr] | t.CPtr = d_call.args + d_args: list[rawptr[ast.AST]] | t.CPtr = d_call.args if d_args is not None and len(d_args) >= 1: ptr_val: llvmlite.Value | t.CPtr = self.Gen.ExprGen.translate_value( builder, pool, mod, d_args.get(0), None, 0, trans) @@ -251,7 +251,7 @@ class CallGenCBuiltin(CallGenBase.CallGenBase): store_ptr: llvmlite.Value | t.CPtr = ptr_val store_val: llvmlite.Value | t.CPtr = b_val typed_elem: int = 0 - elem_ty: llvmlite.LLVMType | t.CPtr = None + elem_ty: rawptr[llvmlite.LLVMType] = None if ptr_val.Ty is not None: elem_ty = ptr_val.Ty.Pointee if elem_ty is not None: @@ -268,7 +268,7 @@ class CallGenCBuiltin(CallGenBase.CallGenBase): store_val = self.Gen.ExprGenBase.coerce_to_type( builder, b_val, elem_ty, a_node) else: - val_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, b_val.Ty) + val_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, b_val.Ty) casted_ptr: llvmlite.Value | t.CPtr = llvmlite.build_bitcast( builder, ptr_val, val_ptr_ty) if casted_ptr is not None: @@ -281,13 +281,13 @@ class CallGenCBuiltin(CallGenBase.CallGenBase): # 形态 2: Name 变量赋值 if a_node is not None and a_node.kind() == ast.ASTKind.Name and trans is not None: - nm_set: ast.Name | t.CPtr = (ast.Name | t.CPtr)(a_node) + nm_set: rawptr[ast.Name] = rawptr[ast.Name](a_node) if nm_set.id is not None: if GenApi.is_global_name(trans, nm_set.id) != 0: mod_alloca: llvmlite.Value | t.CPtr = self.Gen.VarGen.lookup_module_var( trans.SymTab, nm_set.id) if mod_alloca is not None: - tg_ty: llvmlite.LLVMType | t.CPtr = None + tg_ty: rawptr[llvmlite.LLVMType] = None if mod_alloca.Ty is not None: tg_ty = mod_alloca.Ty.Pointee sv: llvmlite.Value | t.CPtr = b_val @@ -299,7 +299,7 @@ class CallGenCBuiltin(CallGenBase.CallGenBase): nl_ptr: llvmlite.Value | t.CPtr = self.Gen.StmtGenDecl.get_nonlocal_var_ptr( trans, nm_set.id) if nl_ptr is not None: - nl_ty: llvmlite.LLVMType | t.CPtr = None + nl_ty: rawptr[llvmlite.LLVMType] = None if nl_ptr.Ty is not None: nl_ty = nl_ptr.Ty.Pointee sv2: llvmlite.Value | t.CPtr = b_val @@ -310,7 +310,7 @@ class CallGenCBuiltin(CallGenBase.CallGenBase): alloca: llvmlite.Value | t.CPtr = self.Gen.VarGen.get_or_create_sym( trans.SymTab, pool, builder, nm_set.id, b_val.Ty) if alloca is not None: - ac_ty: llvmlite.LLVMType | t.CPtr = None + ac_ty: rawptr[llvmlite.LLVMType] = None if alloca.Ty is not None: ac_ty = alloca.Ty.Pointee sv3: llvmlite.Value | t.CPtr = b_val @@ -325,7 +325,7 @@ class CallGenCBuiltin(CallGenBase.CallGenBase): field_ptr: llvmlite.Value | t.CPtr = self.Gen.ExprGenAttr.get_attribute_ptr( builder, pool, mod, a_node, trans) if field_ptr is not None: - fd_ty: llvmlite.LLVMType | t.CPtr = None + fd_ty: rawptr[llvmlite.LLVMType] = None if field_ptr.Ty is not None: fd_ty = field_ptr.Ty.Pointee sv4: llvmlite.Value | t.CPtr = b_val @@ -339,23 +339,23 @@ class CallGenCBuiltin(CallGenBase.CallGenBase): def translate_c_addr(self, 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) -> llvmlite.Value | t.CPtr: + mod: rawptr[llvmlite.LLVMModule], + cl: rawptr[ast.Call], + trans: rawptr[HT.Translator] = None) -> llvmlite.Value | t.CPtr: """c.Addr(var) → 返回变量的 alloca 指针(不 load)""" if cl is None: return None - cargs: list[ast.AST | t.CPtr] | t.CPtr = cl.args + cargs: list[rawptr[ast.AST]] | t.CPtr = cl.args if cargs is None or len(cargs) < 1: return None - arg0: ast.AST | t.CPtr = cargs.get(0) + arg0: rawptr[ast.AST] = cargs.get(0) if arg0 is None: return None # Name 形式: c.Addr(var) → 返回变量的 alloca 指针(不 load) if arg0.kind() == ast.ASTKind.Name: - nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(arg0) + nm: rawptr[ast.Name] = rawptr[ast.Name](arg0) if nm.id is None: return None if trans is not None: @@ -369,7 +369,7 @@ class CallGenCBuiltin(CallGenBase.CallGenBase): case llvmlite.LLVMType.Ptr(inner1): match inner1: case llvmlite.LLVMType.Ptr(inner2): - obj_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, inner2) + obj_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, inner2) return llvmlite.build_load(builder, obj_ty, self_entry.Alloca) case _: pass @@ -396,7 +396,7 @@ class CallGenCBuiltin(CallGenBase.CallGenBase): # Addr(uhci.vp L130、coroutine.vp L133 c.Addr(_coro_entry)、 # sched.vp L209 c.Addr(_thread_entry) 根因)。 if return_var is None and mod is not None: - f_addr_ref: llvmlite.Function | t.CPtr = self.Gen.CallGenBase.find_func_in_module(mod, nm.id) + f_addr_ref: rawptr[llvmlite.Function] = self.Gen.CallGenBase.find_func_in_module(mod, nm.id) if f_addr_ref is not None: f_addr_name: str = llvmlite.function_get_name(f_addr_ref) if f_addr_name is not None: @@ -406,7 +406,7 @@ class CallGenCBuiltin(CallGenBase.CallGenBase): while p_cur_ca is not None: p_cnt_ca += 1 p_cur_ca = llvmlite.param_get_next(p_cur_ca) - fn_ty_ca: llvmlite.LLVMType | t.CPtr = llvmlite.Func( + fn_ty_ca: rawptr[llvmlite.LLVMType] = llvmlite.Func( pool, f_addr_ref.RetTy, p_head_ca, p_cnt_ca) # 函数引用名需按需加引号(数字开头/含 '.' 的 sha1 前缀名 # 必须 @\"...\",否则 llc "expected 'to' after cast value", @@ -428,8 +428,8 @@ class CallGenCBuiltin(CallGenBase.CallGenBase): # 变量 c.Addr(obj) load 一次的语义一致)。 if return_var is not None and return_var.Ty is not None: if self.Gen.CallGenLeafKit.is_closure_name(nm.id) != 0: - i8_ty_cb: llvmlite.LLVMType | t.CPtr = llvmlite.Int8(pool) - i8_ptr_ty_cb: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, i8_ty_cb) + i8_ty_cb: rawptr[llvmlite.LLVMType] = llvmlite.Int8(pool) + i8_ptr_ty_cb: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, i8_ty_cb) return llvmlite.build_load(builder, i8_ptr_ty_cb, return_var) if return_var is not None and return_var.Ty is not None: # 对象指针变量(如 lit_tree = zhuff.zhuff_tree(),alloca 是 @@ -445,7 +445,7 @@ class CallGenCBuiltin(CallGenBase.CallGenBase): case llvmlite.LLVMType.Ptr(addr_inner2): match addr_inner2: case llvmlite.LLVMType.Struct(_, _, _): - addr_obj_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, addr_inner2) + addr_obj_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, addr_inner2) return llvmlite.build_load(builder, addr_obj_ty, return_var) case _: pass @@ -460,17 +460,17 @@ class CallGenCBuiltin(CallGenBase.CallGenBase): if arg0.kind() == ast.ASTKind.Attribute: if trans is None: return None - at_addr: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(arg0) + at_addr: rawptr[ast.Attribute] = rawptr[ast.Attribute](arg0) if at_addr is None or at_addr.attr is None or at_addr.value is None: return None # 跨模块函数地址 c.Addr(serial.puts) → 函数符号本身(@sha1.puts):不可回退 ExprGenAttr 当全局变量处理,否则与 vpi 注入的 puts 函数 declare 同名冲突(llc "redefinition of function") if at_addr.value.kind() == ast.ASTKind.Name and trans is not None \ and trans._imported_modules is not None: - mod_nm2: ast.Name | t.CPtr = (ast.Name | t.CPtr)(at_addr.value) + mod_nm2: rawptr[ast.Name] = rawptr[ast.Name](at_addr.value) if mod_nm2.id is not None: if self.Gen.ImportsGen.is_module_imported( trans._imported_modules, mod_nm2.id) != 0: - f_ref2: llvmlite.Function | t.CPtr = self.Gen.CallGenBase.find_func_in_module( + f_ref2: rawptr[llvmlite.Function] = self.Gen.CallGenBase.find_func_in_module( mod, at_addr.attr) if f_ref2 is not None: fname2: str = llvmlite.function_get_name(f_ref2) @@ -482,7 +482,7 @@ class CallGenCBuiltin(CallGenBase.CallGenBase): while p_cur2 is not None: p_cnt2 += 1 p_cur2 = llvmlite.param_get_next(p_cur2) - fn_ty2: llvmlite.LLVMType | t.CPtr = llvmlite.Func( + fn_ty2: rawptr[llvmlite.LLVMType] = llvmlite.Func( pool, f_ref2.RetTy, p_head2, p_cnt2) # 函数引用名按需加引号(数字开头/含 '.' 的 # sha1 前缀名必须 @\"...\")。 @@ -504,14 +504,14 @@ class CallGenCBuiltin(CallGenBase.CallGenBase): return self.Gen.ExprGenAttr.make_global_ref(pool, g_ref2.Name, g_ref2.Ty) # 解析 base(Name 变量 / Subscript 数组元素)→ 对象指针 obj_ptr: llvmlite.Value | t.CPtr = None - struct_ty: llvmlite.LLVMType | t.CPtr = None + struct_ty: rawptr[llvmlite.LLVMType] = None if at_addr.value.kind() == ast.ASTKind.Subscript: # c.Addr(s.threads[0].rsp):base 是数组元素(Subscript)→ 先取 # 元素指针(GEP 数组),再 GEP 到字段。此前仅支持 Name base, # Subscript 落到下方 return None → 跌落跨模块函数调用生成 # call @Addr(sched.vp L90/L182/L188/L196、coroutine.vp # L99/L106/L112/L120 根因)。 - sub_base: ast.Subscript | t.CPtr = (ast.Subscript | t.CPtr)(at_addr.value) + sub_base: rawptr[ast.Subscript] = rawptr[ast.Subscript](at_addr.value) if sub_base.value is None or sub_base.slice is None: return None bval: llvmlite.Value | t.CPtr = self.Gen.ExprGen.translate_value( @@ -520,7 +520,7 @@ class CallGenCBuiltin(CallGenBase.CallGenBase): builder, pool, mod, sub_base.slice, None, 0, trans) if bval is None or bidx is None or bval.Ty is None: return None - bpointee: llvmlite.LLVMType | t.CPtr = None + bpointee: rawptr[llvmlite.LLVMType] = None if self.Gen.ExprGenBase.is_ptr_type(bval.Ty) != 0: bpointee = bval.Ty.Pointee if bpointee is not None: @@ -534,7 +534,7 @@ class CallGenCBuiltin(CallGenBase.CallGenBase): else: return None elif at_addr.value.kind() == ast.ASTKind.Name: - self_nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(at_addr.value) + self_nm: rawptr[ast.Name] = rawptr[ast.Name](at_addr.value) if self_nm.id is None: return None self_alloca: llvmlite.Value | t.CPtr = self.Gen.VarGen.lookup_var( @@ -556,7 +556,7 @@ class CallGenCBuiltin(CallGenBase.CallGenBase): # self_alloca 是 Ptr(Ptr(Struct)) 时先 load 成 Ptr(Struct) 对象指针 obj_ptr = self_alloca if self_is_ptr_ptr == 1: - self_obj_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, struct_ty) + self_obj_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, struct_ty) obj_ptr = llvmlite.build_load(builder, self_obj_ty, self_alloca) else: return None @@ -585,7 +585,7 @@ class CallGenCBuiltin(CallGenBase.CallGenBase): if elem_ptr_ca is not None: return elem_ptr_ca # 兜底:单层数组基址 GEP(get_subscript_ptr 未命中的形态) - sub_addr: ast.Subscript | t.CPtr = (ast.Subscript | t.CPtr)(arg0) + sub_addr: rawptr[ast.Subscript] = rawptr[ast.Subscript](arg0) if sub_addr is None or sub_addr.value is None or sub_addr.slice is None: return None arr_val: llvmlite.Value | t.CPtr = self.Gen.ExprGen.translate_value( @@ -596,7 +596,7 @@ class CallGenCBuiltin(CallGenBase.CallGenBase): builder, pool, mod, sub_addr.slice, None, 0, trans) if idx_val is None: return None - arr_pointee_ca: llvmlite.LLVMType | t.CPtr = None + arr_pointee_ca: rawptr[llvmlite.LLVMType] = None if self.Gen.ExprGenBase.is_ptr_type(arr_val.Ty) != 0: arr_pointee_ca = arr_val.Ty.Pointee if arr_pointee_ca is not None: @@ -640,13 +640,13 @@ class CallGenCBuiltin(CallGenBase.CallGenBase): def translate_c_load(self, 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) -> llvmlite.Value | t.CPtr: + mod: rawptr[llvmlite.LLVMModule], + cl: rawptr[ast.Call], + trans: rawptr[HT.Translator] = None) -> llvmlite.Value | t.CPtr: """c.Load(a, b) → *a = *b(加载 b 的值,存储到 a)""" if cl is None: return None - cargs: list[ast.AST | t.CPtr] | t.CPtr = cl.args + cargs: list[rawptr[ast.AST]] | t.CPtr = cl.args if cargs is None or len(cargs) < 2: return None @@ -658,7 +658,7 @@ class CallGenCBuiltin(CallGenBase.CallGenBase): return None # 确定 pointee 类型(优先用 src 的 pointee,回退到 dst 的 pointee) - pointee: llvmlite.LLVMType | t.CPtr = None + pointee: rawptr[llvmlite.LLVMType] = None if src_ptr.Ty is not None: pointee = src_ptr.Ty.Pointee if pointee is None and dst_ptr.Ty is not None: @@ -667,7 +667,7 @@ class CallGenCBuiltin(CallGenBase.CallGenBase): return None # bitcast src 到 pointee* 并 load - target_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, pointee) + target_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, pointee) src_cast: llvmlite.Value | t.CPtr = llvmlite.build_bitcast(builder, src_ptr, target_ptr_ty) if src_cast is None: return None @@ -702,7 +702,7 @@ class CallGenCBuiltin(CallGenBase.CallGenBase): def _asm_mangle_global_symbols(self, pool: rawptr[memhub.MemBuddy], asm_text: str, asm_size: sizet, - mod: llvmlite.LLVMModule | t.CPtr) -> str: + mod: rawptr[llvmlite.LLVMModule]) -> str: """asm 模板中裸符号引用模块全局的检查(fail-fast) 内联汇编 `lea rax, [rip + gdt]` 的 gdt 是汇编器符号,若对应模块全局 @@ -908,7 +908,7 @@ class CallGenCBuiltin(CallGenBase.CallGenBase): def _resolve_asm_descr(self, pool: rawptr[memhub.MemBuddy], - node: ast.AST | t.CPtr) -> str: + node: rawptr[ast.AST]) -> str: """递归解析约束表达式,返回约束字符串""" if node is None: return "" @@ -917,7 +917,7 @@ class CallGenCBuiltin(CallGenBase.CallGenBase): # BinOp with BitOr: 拼接左右 if k == ast.ASTKind.BinOp: - bop: ast.BinOp | t.CPtr = (ast.BinOp | t.CPtr)(node) + bop: rawptr[ast.BinOp] = rawptr[ast.BinOp](node) if bop.op == ast.OpKind.BitOr: left_str: str = self._resolve_asm_descr(pool, bop.left) right_str: str = self._resolve_asm_descr(pool, bop.right) @@ -935,25 +935,25 @@ class CallGenCBuiltin(CallGenBase.CallGenBase): # Attribute: t.ASM_DESCR.XXX 或 t.XXX if k == ast.ASTKind.Attribute: - at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(node) + at: rawptr[ast.Attribute] = rawptr[ast.Attribute](node) # t.ASM_DESCR.XXX if at.value is not None and at.value.kind() == ast.ASTKind.Attribute: - inner: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(at.value) + inner: rawptr[ast.Attribute] = rawptr[ast.Attribute](at.value) if inner.value is not None and inner.value.kind() == ast.ASTKind.Name: - mod_nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(inner.value) + mod_nm: rawptr[ast.Name] = rawptr[ast.Name](inner.value) if mod_nm.id is not None and string.strcmp(mod_nm.id, "t") == 0: if inner.attr is not None and string.strcmp(inner.attr, "ASM_DESCR") == 0: return self._resolve_register(at.attr) # t.XXX 简化形式 if at.value is not None and at.value.kind() == ast.ASTKind.Name: - mod_nm2: ast.Name | t.CPtr = (ast.Name | t.CPtr)(at.value) + mod_nm2: rawptr[ast.Name] = rawptr[ast.Name](at.value) if mod_nm2.id is not None and string.strcmp(mod_nm2.id, "t") == 0: return self._resolve_register(at.attr) return "" # Constant: 字符串常量 if k == ast.ASTKind.Constant: - cn: ast.Constant | t.CPtr = (ast.Constant | t.CPtr)(node) + cn: rawptr[ast.Constant] = rawptr[ast.Constant](node) if cn.const_kind == ast.CONST_STR: return cn.str_val return "" @@ -969,16 +969,16 @@ class CallGenCBuiltin(CallGenBase.CallGenBase): return (GenTypes.AsmOperand | t.CPtr)(entry_addr) - def _asm_is_c_call(self, node: ast.Call | t.CPtr) -> str: + def _asm_is_c_call(self, node: rawptr[ast.Call]) -> str: """检查 Call 节点是否是 c.XXX 调用,返回属性名或 None""" if node is None or node.func is None: return None if node.func.kind() != ast.ASTKind.Attribute: return None - at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(node.func) + at: rawptr[ast.Attribute] = rawptr[ast.Attribute](node.func) if at.value is None or at.value.kind() != ast.ASTKind.Name: return None - mod_nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(at.value) + mod_nm: rawptr[ast.Name] = rawptr[ast.Name](at.value) if mod_nm.id is None or string.strcmp(mod_nm.id, "c") != 0: return None return at.attr @@ -1054,14 +1054,14 @@ class CallGenCBuiltin(CallGenBase.CallGenBase): def translate_c_asm(self, 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) -> llvmlite.Value | t.CPtr: + mod: rawptr[llvmlite.LLVMModule], + cl: rawptr[ast.Call], + trans: rawptr[HT.Translator] = None) -> llvmlite.Value | t.CPtr: """翻译 c.Asm 内联汇编,返回结果 Value(无输出时返回 None)""" if cl is None: return None - cargs: list[ast.AST | t.CPtr] | t.CPtr = cl.args + cargs: list[rawptr[ast.AST]] | t.CPtr = cl.args if cargs is None or len(cargs) < 1: return None @@ -1093,7 +1093,7 @@ class CallGenCBuiltin(CallGenBase.CallGenBase): # 首个输出操作数的元素类型缓存(对齐 python 参考 HandlesExprAsm 的 # "收集时即定 ret 类型":不依赖事后从 pool 槽二次读回 Value.Ty.Pointee, # 避免读回不稳定 → ret 静默 Void → 带名 void asm(atom.vp 根因)。 - out_ret_ty_first: llvmlite.LLVMType | t.CPtr = None + out_ret_ty_first: rawptr[llvmlite.LLVMType] = None # 全量输出元素类型按序缓存(多输出如 vrandom rdrand*_step 的 val+ok): # 同样在收集时直接从 alloca 取 Pointee,绕开 AsmOperand 槽读不稳定。 out_ptys: sizet | t.CPtr = pool.alloc(8 * ASM_MAX_OPERANDS) @@ -1111,27 +1111,27 @@ class CallGenCBuiltin(CallGenBase.CallGenBase): # 1. 解析汇编模板(JoinedStr 或 Constant)— 第一遍:收集操作数 # 不生成 asm 文本(占位符 $N 需在重排后才能确定编号) # ============================================================ - tmpl_node: ast.AST | t.CPtr = cargs.get(0) + tmpl_node: rawptr[ast.AST] = cargs.get(0) if tmpl_node is not None: tk: int = tmpl_node.kind() if tk == ast.ASTKind.JoinedStr: js: ast.JoinedStr | t.CPtr = (ast.JoinedStr | t.CPtr)(tmpl_node) - jvalues: list[ast.AST | t.CPtr] | t.CPtr = js.values + jvalues: list[rawptr[ast.AST]] | t.CPtr = js.values if jvalues is not None: jvlen: sizet = len(jvalues) for vi in range(jvlen): - part: ast.AST | t.CPtr = jvalues.get(vi) + part: rawptr[ast.AST] = jvalues.get(vi) if part is None: continue pk: int = part.kind() if pk == ast.ASTKind.FormattedValue: fv: ast.FormattedValue | t.CPtr = (ast.FormattedValue | t.CPtr)(part) - fexpr: ast.AST | t.CPtr = fv.value + fexpr: rawptr[ast.AST] = fv.value if fexpr is None or fexpr.kind() != ast.ASTKind.Call: continue - fcall: ast.Call | t.CPtr = (ast.Call | t.CPtr)(fexpr) + fcall: rawptr[ast.Call] = rawptr[ast.Call](fexpr) attr_nm: str = self._asm_is_c_call(fcall) if attr_nm is None: continue @@ -1144,11 +1144,11 @@ class CallGenCBuiltin(CallGenBase.CallGenBase): else: continue - fargs: list[ast.AST | t.CPtr] | t.CPtr = fcall.args + fargs: list[rawptr[ast.AST]] | t.CPtr = fcall.args if fargs is None or len(fargs) < 1: continue - val_node: ast.AST | t.CPtr = fargs.get(0) + val_node: rawptr[ast.AST] = fargs.get(0) cons_str: str = "" if len(fargs) >= 2: cons_str = self._resolve_asm_descr(pool, fargs.get(1)) @@ -1160,7 +1160,7 @@ class CallGenCBuiltin(CallGenBase.CallGenBase): continue alloca: llvmlite.Value | t.CPtr = None if val_node.kind() == ast.ASTKind.Name: - nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(val_node) + nm: rawptr[ast.Name] = rawptr[ast.Name](val_node) if nm.id is None: continue alloca = self.Gen.VarGen.lookup_var(trans.SymTab, nm.id) @@ -1177,15 +1177,15 @@ class CallGenCBuiltin(CallGenBase.CallGenBase): # GEP 到字段地址(对齐 translate_c_addr Attribute # 分支)。仅 Name 检查时 Attribute 被跳过 → # 空操作数 "mov , cr3"(process.vp L127/L208 根因)。 - at_a: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(val_node) + at_a: rawptr[ast.Attribute] = rawptr[ast.Attribute](val_node) if at_a.attr is not None and at_a.value is not None \ and at_a.value.kind() == ast.ASTKind.Name: - base_nm_a: ast.Name | t.CPtr = (ast.Name | t.CPtr)(at_a.value) + base_nm_a: rawptr[ast.Name] = rawptr[ast.Name](at_a.value) if base_nm_a.id is not None: base_alloca_a: llvmlite.Value | t.CPtr = self.Gen.VarGen.lookup_var( trans.SymTab, base_nm_a.id) if base_alloca_a is not None and base_alloca_a.Ty is not None: - struct_ty_a: llvmlite.LLVMType | t.CPtr = None + struct_ty_a: rawptr[llvmlite.LLVMType] = None self_is_ptr_ptr_a: int = 0 match base_alloca_a.Ty: case llvmlite.LLVMType.Ptr(inner1): @@ -1237,7 +1237,7 @@ class CallGenCBuiltin(CallGenBase.CallGenBase): # ============================================================ # 2. 解析关键字参数 out=/inp=/op=/clobber= # ============================================================ - keywords: list[ast.AST | t.CPtr] | t.CPtr = cl.keywords + keywords: list[rawptr[ast.AST]] | t.CPtr = cl.keywords if keywords is not None: kwlen: sizet = len(keywords) for ki in range(kwlen): @@ -1251,28 +1251,28 @@ class CallGenCBuiltin(CallGenBase.CallGenBase): if kwk != ast.ASTKind.List: continue out_lst: ast.List | t.CPtr = (ast.List | t.CPtr)(kw.value) - out_elts: list[ast.AST | t.CPtr] | t.CPtr = out_lst.elts + out_elts: list[rawptr[ast.AST]] | t.CPtr = out_lst.elts if out_elts is None: continue oelen: sizet = len(out_elts) for oi in range(oelen): - oelt: ast.AST | t.CPtr = out_elts.get(oi) + oelt: rawptr[ast.AST] = out_elts.get(oi) if oelt is None or oelt.kind() != ast.ASTKind.Call: continue - ocall: ast.Call | t.CPtr = (ast.Call | t.CPtr)(oelt) + ocall: rawptr[ast.Call] = rawptr[ast.Call](oelt) oattr: str = self._asm_is_c_call(ocall) if oattr is None or string.strcmp(oattr, "AsmOut") != 0: continue - oargs: list[ast.AST | t.CPtr] | t.CPtr = ocall.args + oargs: list[rawptr[ast.AST]] | t.CPtr = ocall.args if oargs is None or len(oargs) < 1: continue - oval_node: ast.AST | t.CPtr = oargs.get(0) + oval_node: rawptr[ast.AST] = oargs.get(0) ocons: str = "" if len(oargs) >= 2: ocons = self._resolve_asm_descr(pool, oargs.get(1)) if oval_node is None or oval_node.kind() != ast.ASTKind.Name: continue - onm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(oval_node) + onm: rawptr[ast.Name] = rawptr[ast.Name](oval_node) if onm.id is None: continue oalloca: llvmlite.Value | t.CPtr = self.Gen.VarGen.lookup_var(trans.SymTab, onm.id) @@ -1294,22 +1294,22 @@ class CallGenCBuiltin(CallGenBase.CallGenBase): if kwk != ast.ASTKind.List: continue in_lst: ast.List | t.CPtr = (ast.List | t.CPtr)(kw.value) - in_elts: list[ast.AST | t.CPtr] | t.CPtr = in_lst.elts + in_elts: list[rawptr[ast.AST]] | t.CPtr = in_lst.elts if in_elts is None: continue ielen: sizet = len(in_elts) for ii in range(ielen): - ielt: ast.AST | t.CPtr = in_elts.get(ii) + ielt: rawptr[ast.AST] = in_elts.get(ii) if ielt is None or ielt.kind() != ast.ASTKind.Call: continue - icall: ast.Call | t.CPtr = (ast.Call | t.CPtr)(ielt) + icall: rawptr[ast.Call] = rawptr[ast.Call](ielt) iattr: str = self._asm_is_c_call(icall) if iattr is None or string.strcmp(iattr, "AsmInp") != 0: continue - iargs: list[ast.AST | t.CPtr] | t.CPtr = icall.args + iargs: list[rawptr[ast.AST]] | t.CPtr = icall.args if iargs is None or len(iargs) < 1: continue - ival_node: ast.AST | t.CPtr = iargs.get(0) + ival_node: rawptr[ast.AST] = iargs.get(0) icons: str = "" if len(iargs) >= 2: icons = self._resolve_asm_descr(pool, iargs.get(1)) @@ -1325,12 +1325,12 @@ class CallGenCBuiltin(CallGenBase.CallGenBase): if kwk != ast.ASTKind.List: continue cl_lst: ast.List | t.CPtr = (ast.List | t.CPtr)(kw.value) - cl_elts: list[ast.AST | t.CPtr] | t.CPtr = cl_lst.elts + cl_elts: list[rawptr[ast.AST]] | t.CPtr = cl_lst.elts if cl_elts is None: continue clen: sizet = len(cl_elts) for ci in range(clen): - celt: ast.AST | t.CPtr = cl_elts.get(ci) + celt: rawptr[ast.AST] = cl_elts.get(ci) if celt is None: continue cstr: str = self._resolve_asm_descr(pool, celt) @@ -1346,14 +1346,14 @@ class CallGenCBuiltin(CallGenBase.CallGenBase): # 3. 解析第二个位置参数作为破坏列表 # ============================================================ if len(cargs) >= 2: - pos_node: ast.AST | t.CPtr = cargs.get(1) + pos_node: rawptr[ast.AST] = cargs.get(1) if pos_node is not None and pos_node.kind() == ast.ASTKind.List: pos_lst: ast.List | t.CPtr = (ast.List | t.CPtr)(pos_node) - pos_elts: list[ast.AST | t.CPtr] | t.CPtr = pos_lst.elts + pos_elts: list[rawptr[ast.AST]] | t.CPtr = pos_lst.elts if pos_elts is not None: plen: sizet = len(pos_elts) for pi in range(plen): - pelt: ast.AST | t.CPtr = pos_elts.get(pi) + pelt: rawptr[ast.AST] = pos_elts.get(pi) if pelt is None: continue pstr: str = self._resolve_asm_descr(pool, pelt) @@ -1384,28 +1384,28 @@ class CallGenCBuiltin(CallGenBase.CallGenBase): # 多输出(如 vrandom rdrand*_step 的 val+ok 两个 AsmOut)返回 # 匿名 struct {ty1, ty2, ...},元素数 = 输出操作数(LLVM asm # 要求输出约束数 = 返回 struct 元素数)。 - ret_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Void(pool) + ret_ty: rawptr[llvmlite.LLVMType] = llvmlite.Void(pool) if output_count > 0 and first_output_idx >= 0: if output_count > 1: - out_pn_head: llvmlite.ParamNode | t.CPtr = None - out_pn_last: llvmlite.ParamNode | t.CPtr = None + out_pn_head: rawptr[llvmlite.Function] = None + out_pn_last: rawptr[llvmlite.Function] = None out_pn_n: int = 0 out_seq: int = 0 for oi5 in range(operand_count): op5: GenTypes.AsmOperand | t.CPtr = self._asm_get_operand(operands, oi5) if op5 is None or op5.IsOutput == 0: continue - pty5: llvmlite.LLVMType | t.CPtr = None + pty5: rawptr[llvmlite.LLVMType] = None # 优先收集时按序缓存的直接类型,再回退从槽读回 if out_ptys is not None and out_seq < out_pty_n: - pty5 = (llvmlite.LLVMType | t.CPtr)(out_ptys[out_seq]) + pty5 = (rawptr[llvmlite.LLVMType])(out_ptys[out_seq]) elif op5.Value is not None and op5.Value.Ty is not None \ and op5.Value.Ty.Pointee is not None: pty5 = op5.Value.Ty.Pointee out_seq += 1 if pty5 is None: continue - pn5: llvmlite.ParamNode | t.CPtr = llvmlite.new_param_node(pool, pty5) + pn5: rawptr[llvmlite.Function] = llvmlite.new_param_node(pool, pty5) if pn5 is not None: if out_pn_head is None: out_pn_head = pn5 @@ -1421,7 +1421,7 @@ class CallGenCBuiltin(CallGenBase.CallGenBase): ret_ty = llvmlite.Int32(pool) else: out_op: GenTypes.AsmOperand | t.CPtr = self._asm_get_operand(operands, first_output_idx) - out_pt: llvmlite.LLVMType | t.CPtr = None + out_pt: rawptr[llvmlite.LLVMType] = None # 优先用收集时缓存的元素类型(对齐 python 参考),再回退从槽读回 if out_ret_ty_first is not None: out_pt = out_ret_ty_first @@ -1448,7 +1448,7 @@ class CallGenCBuiltin(CallGenBase.CallGenBase): if is_void == 0: match ret_ty: case llvmlite.LLVMType.Void(): - ret_re: llvmlite.LLVMType | t.CPtr = None + ret_re: rawptr[llvmlite.LLVMType] = None for re_i in range(operand_count): re_op: GenTypes.AsmOperand | t.CPtr = self._asm_get_operand( operands, re_i) @@ -1501,17 +1501,17 @@ class CallGenCBuiltin(CallGenBase.CallGenBase): tk2: int = tmpl_node.kind() if tk2 == ast.ASTKind.JoinedStr: js2: ast.JoinedStr | t.CPtr = (ast.JoinedStr | t.CPtr)(tmpl_node) - jvalues2: list[ast.AST | t.CPtr] | t.CPtr = js2.values + jvalues2: list[rawptr[ast.AST]] | t.CPtr = js2.values if jvalues2 is not None: jvlen2: sizet = len(jvalues2) fv_fi: int = 0 for vi2 in range(jvlen2): - part2: ast.AST | t.CPtr = jvalues2.get(vi2) + part2: rawptr[ast.AST] = jvalues2.get(vi2) if part2 is None: continue pk2: int = part2.kind() if pk2 == ast.ASTKind.Constant: - cn3: ast.Constant | t.CPtr = (ast.Constant | t.CPtr)(part2) + cn3: rawptr[ast.Constant] = rawptr[ast.Constant](part2) if cn3.const_kind == ast.CONST_STR and cn3.str_val is not None: self._asm_append_cstr(asm_text, ASM_TEXT_BUF_SIZE, cn3.str_val) elif pk2 == ast.ASTKind.FormattedValue: @@ -1524,7 +1524,7 @@ class CallGenCBuiltin(CallGenBase.CallGenBase): self._asm_append_cstr(asm_text, ASM_TEXT_BUF_SIZE, ph_buf2) fv_fi += 1 elif tk2 == ast.ASTKind.Constant: - cn4: ast.Constant | t.CPtr = (ast.Constant | t.CPtr)(tmpl_node) + cn4: rawptr[ast.Constant] = rawptr[ast.Constant](tmpl_node) if cn4.const_kind == ast.CONST_STR and cn4.str_val is not None: self._asm_append_cstr(asm_text, ASM_TEXT_BUF_SIZE, cn4.str_val) @@ -1684,9 +1684,9 @@ class CallGenCBuiltin(CallGenBase.CallGenBase): def translate_c_llvmir(self, 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) -> llvmlite.Value | t.CPtr: + mod: rawptr[llvmlite.LLVMModule], + cl: rawptr[ast.Call], + trans: rawptr[HT.Translator] = None) -> llvmlite.Value | t.CPtr: """c.LLVMIR 内联 LLVM IR:无返回值,直接嵌入原始 IR 文本 不做指令解析,模板文本(c.LInp/c.LOut 替换后)用 block_append_text @@ -1696,7 +1696,7 @@ class CallGenCBuiltin(CallGenBase.CallGenBase): if cl is None or builder is None or pool is None or trans is None: return None - cargs: list[ast.AST | t.CPtr] | t.CPtr = cl.args + cargs: list[rawptr[ast.AST]] | t.CPtr = cl.args if cargs is None or len(cargs) < 1: self.Gen.TypeGenErr.fatal_error(cl, "c.LLVMIR 缺少模板参数", "TypeError") @@ -1718,7 +1718,7 @@ class CallGenCBuiltin(CallGenBase.CallGenBase): # ============================================================ # 1. 解析 IR 模板(JoinedStr 或 Constant)— 替换 LInp/LOut/表达式为值文本 # ============================================================ - first_arg: ast.AST | t.CPtr = cargs.get(0) + first_arg: rawptr[ast.AST] = cargs.get(0) if first_arg is None: return None @@ -1726,35 +1726,35 @@ class CallGenCBuiltin(CallGenBase.CallGenBase): if tk == ast.ASTKind.JoinedStr: js: ast.JoinedStr | t.CPtr = (ast.JoinedStr | t.CPtr)(first_arg) - jvalues: list[ast.AST | t.CPtr] | t.CPtr = js.values + jvalues: list[rawptr[ast.AST]] | t.CPtr = js.values if jvalues is not None: jvlen: sizet = len(jvalues) for vi in range(jvlen): - part: ast.AST | t.CPtr = jvalues.get(vi) + part: rawptr[ast.AST] = jvalues.get(vi) if part is None: continue pk: int = part.kind() if pk == ast.ASTKind.Constant: # 字符串字面量片段 - cn: ast.Constant | t.CPtr = (ast.Constant | t.CPtr)(part) + cn: rawptr[ast.Constant] = rawptr[ast.Constant](part) if cn.str_val is not None: self._asm_append_cstr(text, LLVMIR_TEMPLATE_BUF, cn.str_val) elif pk == ast.ASTKind.FormattedValue: fv: ast.FormattedValue | t.CPtr = (ast.FormattedValue | t.CPtr)(part) - fexpr: ast.AST | t.CPtr = fv.value + fexpr: rawptr[ast.AST] = fv.value if fexpr is None: continue # 检测 c.LInp / c.LOut if fexpr.kind() == ast.ASTKind.Call: - fcall: ast.Call | t.CPtr = (ast.Call | t.CPtr)(fexpr) + fcall: rawptr[ast.Call] = rawptr[ast.Call](fexpr) attr_nm: str = self._asm_is_c_call(fcall) if attr_nm is not None: - fargs: list[ast.AST | t.CPtr] | t.CPtr = fcall.args + fargs: list[rawptr[ast.AST]] | t.CPtr = fcall.args if fargs is None or len(fargs) < 1: continue - val_node: ast.AST | t.CPtr = fargs.get(0) + val_node: rawptr[ast.AST] = fargs.get(0) if string.strcmp(attr_nm, "LInp") == 0: # 输入操作数:翻译值,替换为 LLVM 值引用文本(%x 或常量文本) @@ -1767,7 +1767,7 @@ class CallGenCBuiltin(CallGenBase.CallGenBase): # 输出操作数:为变量分配唯一 SSA 寄存器 %llvmirN, # 记录写回(模板嵌入后 store 到变量 alloca) if val_node is not None and val_node.kind() == ast.ASTKind.Name: - nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(val_node) + nm: rawptr[ast.Name] = rawptr[ast.Name](val_node) if nm.id is not None: alloca: llvmlite.Value | t.CPtr = self.Gen.VarGen.lookup_var( trans.SymTab, nm.id) @@ -1792,7 +1792,7 @@ class CallGenCBuiltin(CallGenBase.CallGenBase): self._asm_append_cstr(text, LLVMIR_TEMPLATE_BUF, ival.Name) elif tk == ast.ASTKind.Constant: - cn2: ast.Constant | t.CPtr = (ast.Constant | t.CPtr)(first_arg) + cn2: rawptr[ast.Constant] = rawptr[ast.Constant](first_arg) if cn2.str_val is not None: # 裸 strcpy 无界:模板常量串 ≥ LLVMIR_TEMPLATE_BUF 会越界写 pool 块, # 改用与 JoinedStr 分支一致的有界追加 diff --git a/App/lib/core/Gen/Call/CallGenCall.vp b/App/lib/core/Gen/Call/CallGenCall.vp index 2152289..a8401ea 100644 --- a/App/lib/core/Gen/Call/CallGenCall.vp +++ b/App/lib/core/Gen/Call/CallGenCall.vp @@ -41,14 +41,14 @@ class CallGenCall(CallGenBase.CallGenBase): # ============================================================ def _do_virtual_call(self, pool: rawptr[memhub.MemBuddy], builder: llvmlite.IRBuilder | t.CPtr, - mod: llvmlite.LLVMModule | t.CPtr, + mod: rawptr[llvmlite.LLVMModule], class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, args_head: llvmlite.Value | t.CPtr, args_count: int, - found_func: llvmlite.Function | t.CPtr, - ret_ty: llvmlite.LLVMType | t.CPtr, + found_func: rawptr[llvmlite.Function], + ret_ty: rawptr[llvmlite.LLVMType], vtable_base: llvmlite.Value | t.CPtr = None) -> llvmlite.Value | t.CPtr: """通过虚表间接调用虚方法,返回 call 结果(void 方法返回 None) @@ -72,7 +72,7 @@ class CallGenCall(CallGenBase.CallGenBase): # area FAILED 根因)。vtable_base 是接收者静态类型指针(vtable 所在 # 位置),其 VTableMethods 才是最终对象实际存储的完整 vtable 布局。 vc_entry: GenTypes.StructEntry | t.CPtr = None - struct_ty: llvmlite.LLVMType | t.CPtr = None + struct_ty: rawptr[llvmlite.LLVMType] = None if vtable_base is not None and vtable_base.Ty is not None: vc_entry = self.Gen.StructGen.get_struct_type_from_value(vtable_base) if vc_entry is not None: @@ -110,9 +110,9 @@ class CallGenCall(CallGenBase.CallGenBase): return None # 3. 基础类型 - i8_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int8(pool) - i8_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, i8_ty) - i8_ptr_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, i8_ptr_ty) + i8_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int8(pool) + i8_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, i8_ty) + i8_ptr_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, i8_ptr_ty) # 4. bitcast 到 i8** 访问 __vtable__ 字段(索引 0) # vtable 指针总是在对象第一个字段,无需 GEP,直接 bitcast 到 i8** 即可。 @@ -138,10 +138,10 @@ class CallGenCall(CallGenBase.CallGenBase): if method_count <= 0: return None - vt_first: llvmlite.ParamNode | t.CPtr = None - vt_prev: llvmlite.ParamNode | t.CPtr = None + vt_first: rawptr[llvmlite.Function] = None + vt_prev: rawptr[llvmlite.Function] = None for vi in range(method_count): - pn: llvmlite.ParamNode | t.CPtr = llvmlite.new_param_node(pool, i8_ptr_ty) + pn: rawptr[llvmlite.Function] = llvmlite.new_param_node(pool, i8_ptr_ty) if pn is None: continue if vt_first is None: @@ -150,10 +150,10 @@ class CallGenCall(CallGenBase.CallGenBase): llvmlite.paramnode_set_next(vt_prev, pn) vt_prev = pn - vtable_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Struct(pool, vt_first, method_count, None) + vtable_ty: rawptr[llvmlite.LLVMType] = llvmlite.Struct(pool, vt_first, method_count, None) if vtable_ty is None: return None - vtable_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, vtable_ty) + vtable_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, vtable_ty) # 7. bitcast i8* 到 vtable 类型指针 vtable_typed: llvmlite.Value | t.CPtr = llvmlite.build_bitcast( @@ -174,15 +174,15 @@ class CallGenCall(CallGenBase.CallGenBase): # 10. 从 args_head 构造函数类型 RetTy(Param1, Param2, ...) # 直接遍历 Value 链表提取参数类型,避免跨模块访问 found_func(stub 字段偏移问题) - fp_first: llvmlite.ParamNode | t.CPtr = None - fp_prev: llvmlite.ParamNode | t.CPtr = None + fp_first: rawptr[llvmlite.Function] = None + fp_prev: rawptr[llvmlite.Function] = None fp_count: int = 0 cur_val: llvmlite.Value | t.CPtr = args_head for vi in range(args_count): if cur_val is None: break - cur_ty: llvmlite.LLVMType | t.CPtr = llvmlite.value_get_ty(cur_val) - fpn: llvmlite.ParamNode | t.CPtr = llvmlite.new_param_node(pool, cur_ty) + cur_ty: rawptr[llvmlite.LLVMType] = llvmlite.value_get_ty(cur_val) + fpn: rawptr[llvmlite.Function] = llvmlite.new_param_node(pool, cur_ty) if fpn is not None: if fp_first is None: fp_first = fpn @@ -192,10 +192,10 @@ class CallGenCall(CallGenBase.CallGenBase): cur_val = llvmlite.value_get_next(cur_val) fp_count += 1 - func_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Func(pool, ret_ty, fp_first, fp_count) + func_ty: rawptr[llvmlite.LLVMType] = llvmlite.Func(pool, ret_ty, fp_first, fp_count) if func_ty is None: return None - func_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, func_ty) + func_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, func_ty) # 11. bitcast i8* 到函数指针类型 func_ptr: llvmlite.Value | t.CPtr = llvmlite.build_bitcast(builder, func_i8, func_ptr_ty) @@ -214,14 +214,14 @@ class CallGenCall(CallGenBase.CallGenBase): # ============================================================ def _call_method_on_ptr(self, pool: rawptr[memhub.MemBuddy], builder: llvmlite.IRBuilder | t.CPtr, - mod: llvmlite.LLVMModule | t.CPtr, + mod: rawptr[llvmlite.LLVMModule], class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, extra_args: sizet | t.CPtr, extra_count: int, - trans: HT.Translator | t.CPtr, - node: ast.AST | t.CPtr = None) -> llvmlite.Value | t.CPtr: + trans: rawptr[HT.Translator], + node: rawptr[ast.AST] = None) -> llvmlite.Value | t.CPtr: """在结构体指针上调用方法,返回 call 结果(void 方法返回 None) node: 触发本次调用的 AST 节点(如 Subscript 下标节点),用于 fatal_error @@ -234,7 +234,7 @@ class CallGenCall(CallGenBase.CallGenBase): # 提前获取结构体 entry(用 find_struct_by_type 规避跨模块同名 find_struct 找错) # 用于 SHA1 查找和虚表分派 cmop_entry: GenTypes.StructEntry | t.CPtr = None - cmop_struct_ty: llvmlite.LLVMType | t.CPtr = self.Gen.StructGen.get_struct_type_from_value(self_ptr) + cmop_struct_ty: rawptr[llvmlite.LLVMType] = self.Gen.StructGen.get_struct_type_from_value(self_ptr) if cmop_struct_ty is not None: cmop_entry = self.Gen.StructGen.find_struct_by_type(cmop_struct_ty) if cmop_entry is None: @@ -251,7 +251,7 @@ class CallGenCall(CallGenBase.CallGenBase): viperlib.snprintf(lookup_name, 128, "%s.%s", class_name, method_name) # 查找函数(支持 SHA1 后缀匹配) - found_func: llvmlite.Function | t.CPtr = self.find_func_in_module(mod, lookup_name) + found_func: rawptr[llvmlite.Function] = self.find_func_in_module(mod, lookup_name) # 确定调用名 call_name: str = lookup_name @@ -290,10 +290,10 @@ class CallGenCall(CallGenBase.CallGenBase): call_name = mangled2 # 确定返回类型(__before_init__ 和 __init__ 返回 void) - void_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Void(pool) - call_ret_ty: llvmlite.LLVMType | t.CPtr = void_ty + void_ty: rawptr[llvmlite.LLVMType] = llvmlite.Void(pool) + call_ret_ty: rawptr[llvmlite.LLVMType] = void_ty if found_func is not None: - frt: llvmlite.LLVMType | t.CPtr = llvmlite.function_get_ret_ty(found_func) + frt: rawptr[llvmlite.LLVMType] = llvmlite.function_get_ret_ty(found_func) if frt is not None: call_ret_ty = frt elif string.strcmp(method_name, "__getitem__") == 0 or string.strcmp(method_name, "__new__") == 0: @@ -351,7 +351,7 @@ class CallGenCall(CallGenBase.CallGenBase): # operand type for instruction(NumpyTest a+b 根因)。用 text.ll # → vpi 精确解析返回类型(对齐 _translate_method_call L4641); # 都失败则 fail-fast,绝不静默 void。 - ret_cm: llvmlite.LLVMType | t.CPtr = None + ret_cm: rawptr[llvmlite.LLVMType] = None # is_local_mod 豁免(对齐 _translate_method_call mro_ret 段): # 目标模块 sha1 == 当前正在翻译的模块 sha1 时,自己的 text.ll # 尚未生成 → _dep_text_ll_exists 恒 0 → 误判 pending 死锁。 @@ -365,9 +365,9 @@ class CallGenCall(CallGenBase.CallGenBase): viperlib.snprintf(local_lk_cm2, string.strlen(class_name) + string.strlen(method_name) + 2, "%s.%s", class_name, method_name) - local_fn_cm2: llvmlite.Function | t.CPtr = self.find_func_in_module(mod, local_lk_cm2) + local_fn_cm2: rawptr[llvmlite.Function] = self.find_func_in_module(mod, local_lk_cm2) if local_fn_cm2 is not None: - lrt_cm2: llvmlite.LLVMType | t.CPtr = llvmlite.function_get_ret_ty(local_fn_cm2) + lrt_cm2: rawptr[llvmlite.LLVMType] = llvmlite.function_get_ret_ty(local_fn_cm2) if lrt_cm2 is not None: ret_cm = lrt_cm2 if cls_sha1 is not None: @@ -422,7 +422,7 @@ class CallGenCall(CallGenBase.CallGenBase): mdf_default_count: int = 0 mdf_param_count: int = 0 if trans is not None and trans._funcs is not None: - mdf_entry: GenTypes.FuncEntry | t.CPtr = self.Gen.CallGenLeafKit.find_func_entry_in_table( + mdf_entry: rawptr[GenTypes.FuncEntry] = self.Gen.CallGenLeafKit.find_func_entry_in_table( trans._funcs, trans._func_count, lookup_name) if mdf_entry is not None: mdf_defaults = mdf_entry.Defaults @@ -523,7 +523,7 @@ class CallGenCall(CallGenBase.CallGenBase): param_node_z = llvmlite.param_get_next(param_node_z) skip_z += 1 if param_node_z is not None: - zero_ty: llvmlite.LLVMType | t.CPtr = llvmlite.param_get_ty(param_node_z) + zero_ty: rawptr[llvmlite.LLVMType] = llvmlite.param_get_ty(param_node_z) zero_val: llvmlite.Value | t.CPtr = llvmlite.ConstZero(pool, zero_ty) if zero_val is not None: llvmlite.value_set_next(zero_val, None) @@ -547,13 +547,13 @@ class CallGenCall(CallGenBase.CallGenBase): and vpi_pa[seg_start_v + seg_len_v] != '@': seg_len_v += 1 if seg_no_v == seg_idx_v: - pty_v: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, llvmlite.Int8(pool)) + pty_v: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, llvmlite.Int8(pool)) if seg_len_v > 0: seg_buf_v: bytes = stdlib.malloc(seg_len_v + 1) if seg_buf_v is not None: string.strncpy(seg_buf_v, vpi_pa + seg_start_v, seg_len_v) seg_buf_v[seg_len_v] = '\0' - rty_v: llvmlite.LLVMType | t.CPtr = self.Gen.CallGenBase._vpi_resolve_param_annot_ty( + rty_v: rawptr[llvmlite.LLVMType] = self.Gen.CallGenBase._vpi_resolve_param_annot_ty( pool, seg_buf_v) if rty_v is not None: pty_v = rty_v @@ -574,7 +574,7 @@ class CallGenCall(CallGenBase.CallGenBase): param_node = llvmlite.param_get_next(param_node) skip_idx += 1 while param_node is not None: - missing_ty: llvmlite.LLVMType | t.CPtr = llvmlite.param_get_ty(param_node) + missing_ty: rawptr[llvmlite.LLVMType] = llvmlite.param_get_ty(param_node) zero_val2: llvmlite.Value | t.CPtr = llvmlite.ConstZero(pool, missing_ty) if zero_val2 is not None: llvmlite.value_set_next(zero_val2, None) @@ -599,7 +599,7 @@ class CallGenCall(CallGenBase.CallGenBase): pc_next_save: llvmlite.Value | t.CPtr = pc_node.Next coerced_pc: llvmlite.Value | t.CPtr = pc_node if pc_param is not None: - pty_pc: llvmlite.LLVMType | t.CPtr = llvmlite.param_get_ty(pc_param) + pty_pc: rawptr[llvmlite.LLVMType] = llvmlite.param_get_ty(pc_param) if pty_pc is not None: c_pc: llvmlite.Value | t.CPtr = self.Gen.ExprGenBase.coerce_to_type( builder, pc_node, pty_pc, None) @@ -675,12 +675,12 @@ class CallGenCall(CallGenBase.CallGenBase): # ============================================================ def _translate_method_call(self, pool: rawptr[memhub.MemBuddy], builder: llvmlite.IRBuilder | t.CPtr, - mod: llvmlite.LLVMModule | t.CPtr, + mod: rawptr[llvmlite.LLVMModule], class_name: str, method_name: str, obj_ptr: llvmlite.Value | t.CPtr, - cl: ast.Call | t.CPtr, - trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: + cl: rawptr[ast.Call], + trans: rawptr[HT.Translator]) -> llvmlite.Value | t.CPtr: """翻译方法调用,返回 call 结果 Value""" if pool is None or builder is None or class_name is None or method_name is None: return None @@ -691,7 +691,7 @@ class CallGenCall(CallGenBase.CallGenBase): # [D25 分派修复] class_name 可能因注解在 Handle 阶段退化而为空串,使 list 内建拦截(_is_list_builtin_method)与 D25 泛型基类 fail-fast 双双失效 ⇒ 误绑到无关特化。接收者的**实际 struct 名**比退化注解可靠,用它补全判定来源(提升到分支外声明,D25 fail-fast 同样使用) lb_src: str = class_name if lb_src is None or lb_src[0] == '\0': - lb_sty_s: llvmlite.LLVMType | t.CPtr = \ + lb_sty_s: rawptr[llvmlite.LLVMType] = \ self.Gen.StructGen.get_struct_type_from_value(obj_ptr) if lb_sty_s is not None: lb_nm_s: str = llvmlite.get_struct_name(lb_sty_s) @@ -724,7 +724,7 @@ class CallGenCall(CallGenBase.CallGenBase): case _: pass if lb_obj is not None: - lb_cargs: list[ast.AST | t.CPtr] | t.CPtr = cl.args + lb_cargs: list[rawptr[ast.AST]] | t.CPtr = cl.args lb_can: sizet = 0 if lb_cargs is not None: lb_can = len(lb_cargs) @@ -744,20 +744,20 @@ class CallGenCall(CallGenBase.CallGenBase): cm_pfx: int = GenApi.sha1_prefix_len(lb_src) cm_bare = lb_src + cm_pfx if cm_pfx != 0 else lb_src if cm_bare is not None and string.strchr(cm_bare, '[') is None: - cm_tpl: ast.ClassDef | t.CPtr = self.Gen.ClassGenGeneric._find_generic_template(cm_bare) + cm_tpl: rawptr[ast.ClassDef] = self.Gen.ClassGenGeneric._find_generic_template(cm_bare) if cm_tpl is not None: self.Gen.TypeGenErr.fatal_error( cl, f"泛型类 '{cm_bare}' 的方法 '{method_name}' 调用缺少类型实参" f"(接收者静态类型是裸泛型基类,元素类型未知);" f"禁止静默按默认 list[int] 特化(元素按 i32 处理会截断指针)," - f"请让该变量的注解/类型带上实参(如 list[ast.AST | t.CPtr])", + f"请让该变量的注解/类型带上实参(如 list[rawptr[ast.AST]])", "TypeError") # 提前获取结构体 entry(用 find_struct_by_type 规避跨模块同名 find_struct 找错) # 用于继承链遍历、SHA1 查找和虚表分派 mc_entry: GenTypes.StructEntry | t.CPtr = None - mc_struct_ty: llvmlite.LLVMType | t.CPtr = self.Gen.StructGen.get_struct_type_from_value(obj_ptr) + mc_struct_ty: rawptr[llvmlite.LLVMType] = self.Gen.StructGen.get_struct_type_from_value(obj_ptr) if mc_struct_ty is not None: mc_entry = self.Gen.StructGen.find_struct_by_type(mc_struct_ty) if mc_entry is None: @@ -780,7 +780,7 @@ class CallGenCall(CallGenBase.CallGenBase): viperlib.snprintf(lookup_name, lk_cap, "%s.%s", class_name, method_name) # 查找函数(支持 SHA1 后缀匹配) - found_func: llvmlite.Function | t.CPtr = self.find_func_in_module(mod, lookup_name) + found_func: rawptr[llvmlite.Function] = self.find_func_in_module(mod, lookup_name) # 泛型模板类方法:特化函数名带类型参数({sha1}.list[int].get), # "ClassName.method" 短名匹配不到。特化由触发方(通常即调用方)模块完成, @@ -803,7 +803,7 @@ class CallGenCall(CallGenBase.CallGenBase): parent_lookup: str = pool.alloc(128) if parent_lookup is not None: viperlib.snprintf(parent_lookup, 128, "%s.%s", anc, method_name) - parent_func: llvmlite.Function | t.CPtr = self.find_func_in_module(mod, parent_lookup) + parent_func: rawptr[llvmlite.Function] = self.find_func_in_module(mod, parent_lookup) if parent_func is not None: found_func = parent_func mc_anc = anc @@ -813,7 +813,7 @@ class CallGenCall(CallGenBase.CallGenBase): # 兄弟 Mixin 兜底(与 TPC HandlesExprCall 一致):方法不在本类 MRO 链时遍历已注册 struct 表找定义类方法,this 由下方 _adjust_this_for_inherited_method 按组合布局前移 sizeof(定义类)。仅对普通类名兜底——泛型特化类名(list[X]/dict[K,V])必须过滤,否则普通方法在 found_func 未命中时会误绑到 list 特化函数,this 前移错位导致运行期崩溃 # 跨模块兄弟 Mixin 兜底命中(定义类在另一文件、本地 IR 无 define)需经候选类模块 sha1 查 text.ll 返回类型。 mixin_hit: int = 0 - mixin_ret_ty: llvmlite.LLVMType | t.CPtr = None + mixin_ret_ty: rawptr[llvmlite.LLVMType] = None mixin_anc_name: str = None mixin_anc_sha1: str = None if found_func is None: @@ -855,7 +855,7 @@ class CallGenCall(CallGenBase.CallGenBase): cand_lookup: str = pool.alloc(128) if cand_lookup is not None: viperlib.snprintf(cand_lookup, 128, "%s.%s", cand_name, method_name) - cand_func: llvmlite.Function | t.CPtr = self.find_func_in_module( + cand_func: rawptr[llvmlite.Function] = self.find_func_in_module( mod, cand_lookup) if cand_func is not None: found_func = cand_func @@ -871,7 +871,7 @@ class CallGenCall(CallGenBase.CallGenBase): cand_sha1_cx: str = self.Gen.StructGen.get_struct_sha1(cand_name) if cand_sha1_cx is not None \ and self._dep_text_ll_exists(pool, cand_sha1_cx) != 0: - cand_ret_cx: llvmlite.LLVMType | t.CPtr = self._LookupMethodRetTyFromTextLL( + cand_ret_cx: rawptr[llvmlite.LLVMType] = self._LookupMethodRetTyFromTextLL( pool, cand_sha1_cx, cand_name, method_name) if cand_ret_cx is not None: mixin_hit = 1 @@ -890,15 +890,15 @@ class CallGenCall(CallGenBase.CallGenBase): call_name = found_name # 确定返回类型 - i32_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int32(pool) - call_ret_ty: llvmlite.LLVMType | t.CPtr = i32_ty + i32_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int32(pool) + call_ret_ty: rawptr[llvmlite.LLVMType] = i32_ty if found_func is not None: - frt: llvmlite.LLVMType | t.CPtr = llvmlite.function_get_ret_ty(found_func) + frt: rawptr[llvmlite.LLVMType] = llvmlite.function_get_ret_ty(found_func) if frt is not None: call_ret_ty = frt else: # found_func 为 None(stub 未注入):先处理编译器内置特殊方法 - sp_ty2: llvmlite.LLVMType | t.CPtr = self._special_method_ret_ty(pool, class_name, method_name) + sp_ty2: rawptr[llvmlite.LLVMType] = self._special_method_ret_ty(pool, class_name, method_name) if sp_ty2 is not None: call_ret_ty = sp_ty2 # 特殊方法(__before_init__ 等)跨模块调用同样需带 sha1 前缀: @@ -969,7 +969,7 @@ class CallGenCall(CallGenBase.CallGenBase): # 下方回退段不执行,若在此声明则读到未初始化的池内存垃圾(非 NULL), # 把已正确解析的 call_ret_ty(特化 define 的 i32)覆盖成垃圾零值 # LLVMType → build_call 输出 call i0(llc bitwidth out of range)。 - looked_up_ty: llvmlite.LLVMType | t.CPtr = None + looked_up_ty: rawptr[llvmlite.LLVMType] = None if class_name is not None: lbkt_g: str = string.strchr(class_name, '[') if lbkt_g is not None: @@ -1025,9 +1025,9 @@ class CallGenCall(CallGenBase.CallGenBase): viperlib.snprintf(spec_lk_g, string.strlen(class_name) + string.strlen(method_name) + 2, "%s.%s", class_name, method_name) - spec_found_g: llvmlite.Function | t.CPtr = self.find_func_in_module(mod, spec_lk_g) + spec_found_g: rawptr[llvmlite.Function] = self.find_func_in_module(mod, spec_lk_g) if spec_found_g is not None: - frt_g: llvmlite.LLVMType | t.CPtr = llvmlite.function_get_ret_ty(spec_found_g) + frt_g: rawptr[llvmlite.LLVMType] = llvmlite.function_get_ret_ty(spec_found_g) if frt_g is not None: call_ret_ty = frt_g found_func = spec_found_g @@ -1055,9 +1055,9 @@ class CallGenCall(CallGenBase.CallGenBase): viperlib.snprintf(local_lk_lm, string.strlen(ret_anc_name) + string.strlen(method_name) + 2, "%s.%s", ret_anc_name, method_name) - local_fn_lm: llvmlite.Function | t.CPtr = self.find_func_in_module(mod, local_lk_lm) + local_fn_lm: rawptr[llvmlite.Function] = self.find_func_in_module(mod, local_lk_lm) if local_fn_lm is not None: - lrt_lm: llvmlite.LLVMType | t.CPtr = llvmlite.function_get_ret_ty(local_fn_lm) + lrt_lm: rawptr[llvmlite.LLVMType] = llvmlite.function_get_ret_ty(local_fn_lm) if lrt_lm is not None: call_ret_ty = lrt_lm gen_done = 1 @@ -1087,7 +1087,7 @@ class CallGenCall(CallGenBase.CallGenBase): call_ret_ty = looked_up_ty elif gen_done == 0: # 精确查找:vpi stub 返回注解缓存(方法定义处,不硬编码白名单) - vpi_ret_ty: llvmlite.LLVMType | t.CPtr = self._lookup_method_ret_ty_via_vpi( + vpi_ret_ty: rawptr[llvmlite.LLVMType] = self._lookup_method_ret_ty_via_vpi( pool, ret_anc_sha1, ret_anc_name, method_name) # vpi 同样沿 MRO 祖先链重试(基类方法注解,用祖先类自身 sha1) if vpi_ret_ty is None: @@ -1191,11 +1191,11 @@ class CallGenCall(CallGenBase.CallGenBase): "TypeError") # 翻译调用参数 - cargs: list[ast.AST | t.CPtr] | t.CPtr = cl.args + cargs: list[rawptr[ast.AST]] | t.CPtr = cl.args can: sizet = 0 if cargs is not None: can = len(cargs) - kw_calls: list[ast.AST | t.CPtr] | t.CPtr = cl.keywords + kw_calls: list[rawptr[ast.AST]] | t.CPtr = cl.keywords kwc: sizet = 0 if kw_calls is not None: kwc = len(kw_calls) @@ -1245,15 +1245,15 @@ class CallGenCall(CallGenBase.CallGenBase): pool, sub_entry_th, sub_field_th.Index) delta_th: int = sub_off_th - anc_off_th if delta_th > 0: - i8_ty_th: llvmlite.LLVMType | t.CPtr = llvmlite.Int8(pool) - i8_ptr_th: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, i8_ty_th) + i8_ty_th: rawptr[llvmlite.LLVMType] = llvmlite.Int8(pool) + i8_ptr_th: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, i8_ty_th) obj_i8_th: llvmlite.Value | t.CPtr = llvmlite.build_bitcast( builder, obj_ptr, i8_ptr_th) delta_val_th: llvmlite.Value | t.CPtr = llvmlite.const_int32(pool, delta_th) adj_th: llvmlite.Value | t.CPtr = llvmlite.build_gep( builder, i8_ty_th, obj_i8_th, delta_val_th) if adj_th is not None: - anc_ptr_ty_th: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, anc_entry_th.Ty) + anc_ptr_ty_th: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, anc_entry_th.Ty) # 跨模块基类(如 Generator → ClassGenBase)的完整定义不在本模块, # bitcast 引用 %"sha1.ClassGenBase" 前必须确保 opaque 声明存在, # 否则 llc 报 "use of undefined type"(PrintModule 只扫函数签名, @@ -1270,8 +1270,8 @@ class CallGenCall(CallGenBase.CallGenBase): # 调用永远编译不过(NoVTableCrossMixinTest BaseB.caller 根因)。 anc_size_th: int = self.Gen.ClassGenEnum._get_type_size(anc_entry_th.Ty) if anc_size_th > 0: - i8_ty_th2: llvmlite.LLVMType | t.CPtr = llvmlite.Int8(pool) - i8_ptr_th2: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, i8_ty_th2) + i8_ty_th2: rawptr[llvmlite.LLVMType] = llvmlite.Int8(pool) + i8_ptr_th2: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, i8_ty_th2) obj_i8_th2: llvmlite.Value | t.CPtr = llvmlite.build_bitcast( builder, obj_ptr, i8_ptr_th2) sib_delta_th: llvmlite.Value | t.CPtr = llvmlite.const_int32( @@ -1279,7 +1279,7 @@ class CallGenCall(CallGenBase.CallGenBase): adj_th2: llvmlite.Value | t.CPtr = llvmlite.build_gep( builder, i8_ty_th2, obj_i8_th2, sib_delta_th) if adj_th2 is not None: - anc_ptr_ty_th2: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr( + anc_ptr_ty_th2: rawptr[llvmlite.LLVMType] = llvmlite.Ptr( pool, anc_entry_th.Ty) llvmlite.module_ensure_opaque_for_type( mod, pool, anc_ptr_ty_th2) @@ -1326,7 +1326,7 @@ class CallGenCall(CallGenBase.CallGenBase): if found_func is not None: pp_self: llvmlite.Param | t.CPtr = llvmlite.function_get_param_head(found_func) if pp_self is not None: - pty_self: llvmlite.LLVMType | t.CPtr = llvmlite.param_get_ty(pp_self) + pty_self: rawptr[llvmlite.LLVMType] = llvmlite.param_get_ty(pp_self) if pty_self is not None: cself_tm: llvmlite.Value | t.CPtr = self.Gen.ExprGenBase.coerce_to_type( builder, self_arg, pty_self, None) @@ -1347,7 +1347,7 @@ class CallGenCall(CallGenBase.CallGenBase): cur_param_k = llvmlite.param_get_next(cur_param_k) # 跳过 self pi_k: int = 0 while cur_param_k is not None: - arg_node_k: ast.AST | t.CPtr = None + arg_node_k: rawptr[ast.AST] = None if pi_k < can: arg_node_k = cargs.get(pi_k) else: @@ -1364,7 +1364,7 @@ class CallGenCall(CallGenBase.CallGenBase): arg_val_k: llvmlite.Value | t.CPtr = None if arg_node_k is not None: # 先取形参类型(char 字面量 → str 形参需物化字符串,见 translate_constant) - pty_k0: llvmlite.LLVMType | t.CPtr = llvmlite.param_get_ty(cur_param_k) + pty_k0: rawptr[llvmlite.LLVMType] = llvmlite.param_get_ty(cur_param_k) arg_val_k = self.Gen.ExprGen.translate_value( builder, pool, mod, arg_node_k, None, 0, trans, pty_k0) if arg_val_k is None: @@ -1381,11 +1381,11 @@ class CallGenCall(CallGenBase.CallGenBase): # (b)/(c) 关键字/位置都未提供该形参:按形参类型补占位零值以保持 # 参数序列位置(避免后续实参左移错位)。此占位不是"表达式翻译 # 失败"的兜底(那条通路已在上方 fail-fast)。 - pty_k: llvmlite.LLVMType | t.CPtr = llvmlite.param_get_ty(cur_param_k) + pty_k: rawptr[llvmlite.LLVMType] = llvmlite.param_get_ty(cur_param_k) if pty_k is not None: arg_val_k = llvmlite.ConstZero(pool, pty_k) if arg_val_k is not None: - pty_k2: llvmlite.LLVMType | t.CPtr = llvmlite.param_get_ty(cur_param_k) + pty_k2: rawptr[llvmlite.LLVMType] = llvmlite.param_get_ty(cur_param_k) if pty_k2 is not None: arg_val_k = self.Gen.ExprGenBase.coerce_to_type( builder, arg_val_k, pty_k2, arg_node_k) @@ -1398,7 +1398,7 @@ class CallGenCall(CallGenBase.CallGenBase): else: # 位置参数(原逻辑) for ai in range(can): - arg_node: ast.AST | t.CPtr = cargs.get(ai) + arg_node: rawptr[ast.AST] = cargs.get(ai) if arg_node is None: # (a) 实参节点缺失(AST 参数列表空洞)→ fail-fast,禁止静默跳过 # (跳过会减少 arg_count_eff,随后被"缺参默认填充"用零值补齐)。 @@ -1412,7 +1412,7 @@ class CallGenCall(CallGenBase.CallGenBase): # 形参时需物化 1 字符字符串(translate_constant 依据 target_ty 判定), # 否则 coerce inttoptr 把字符值当指针 → strlen 访问低地址崩溃。 pp: llvmlite.Param | t.CPtr = None - pty: llvmlite.LLVMType | t.CPtr = None + pty: rawptr[llvmlite.LLVMType] = None if found_func is not None: pp = llvmlite.function_get_param_head(found_func) pi: int = 0 @@ -1450,7 +1450,7 @@ class CallGenCall(CallGenBase.CallGenBase): # _ensure_method_declare 用 [N x ty]* 实参类型建 declare, # 与定义侧元素指针(如 md5.final 的 i8*)类型不匹配。 if arg_val.Ty is not None and self.Gen.ExprGenBase.is_ptr_type(arg_val.Ty) != 0: - arr_pointee_ma: llvmlite.LLVMType | t.CPtr = arg_val.Ty.Pointee + arr_pointee_ma: rawptr[llvmlite.LLVMType] = arg_val.Ty.Pointee if arr_pointee_ma is not None: match arr_pointee_ma: case llvmlite.LLVMType.Array(arr_et_ma, _): @@ -1474,7 +1474,7 @@ class CallGenCall(CallGenBase.CallGenBase): mdf_default_count: int = 0 mdf_param_count: int = 0 if trans is not None and trans._funcs is not None: - mdf_entry: GenTypes.FuncEntry | t.CPtr = self.Gen.CallGenLeafKit.find_func_entry_in_table( + mdf_entry: rawptr[GenTypes.FuncEntry] = self.Gen.CallGenLeafKit.find_func_entry_in_table( trans._funcs, trans._func_count, lookup_name) if mdf_entry is not None: mdf_defaults = mdf_entry.Defaults @@ -1590,7 +1590,7 @@ class CallGenCall(CallGenBase.CallGenBase): param_node_z = llvmlite.param_get_next(param_node_z) skip_z += 1 if param_node_z is not None: - zero_ty: llvmlite.LLVMType | t.CPtr = llvmlite.param_get_ty(param_node_z) + zero_ty: rawptr[llvmlite.LLVMType] = llvmlite.param_get_ty(param_node_z) zero_val: llvmlite.Value | t.CPtr = llvmlite.ConstZero(pool, zero_ty) if zero_val is not None: llvmlite.value_set_next(zero_val, None) @@ -1614,13 +1614,13 @@ class CallGenCall(CallGenBase.CallGenBase): and vpi_pa[seg_start_v + seg_len_v] != '@': seg_len_v += 1 if seg_no_v == seg_idx_v: - pty_v: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, llvmlite.Int8(pool)) + pty_v: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, llvmlite.Int8(pool)) if seg_len_v > 0: seg_buf_v: bytes = stdlib.malloc(seg_len_v + 1) if seg_buf_v is not None: string.strncpy(seg_buf_v, vpi_pa + seg_start_v, seg_len_v) seg_buf_v[seg_len_v] = '\0' - rty_v: llvmlite.LLVMType | t.CPtr = self.Gen.CallGenBase._vpi_resolve_param_annot_ty( + rty_v: rawptr[llvmlite.LLVMType] = self.Gen.CallGenBase._vpi_resolve_param_annot_ty( pool, seg_buf_v) if rty_v is not None: pty_v = rty_v @@ -1685,27 +1685,27 @@ class CallGenCall(CallGenBase.CallGenBase): # ============================================================ def _translate_list_builtin_call(self, pool: rawptr[memhub.MemBuddy], builder: llvmlite.IRBuilder | t.CPtr, - mod: llvmlite.LLVMModule | t.CPtr, - cl: ast.Call | t.CPtr, + mod: rawptr[llvmlite.LLVMModule], + cl: rawptr[ast.Call], lm_name: str, lm_obj: llvmlite.Value | t.CPtr, - cargs: list[ast.AST | t.CPtr] | t.CPtr, + cargs: list[rawptr[ast.AST]] | t.CPtr, can: sizet, - trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: + trans: rawptr[HT.Translator]) -> llvmlite.Value | t.CPtr: """翻译 list 内置方法调用,返回 call 结果 Value(void 方法返回 None)""" if pool is None or builder is None or lm_obj is None or lm_name is None: return None - i64_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int64(pool) - i8_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int8(pool) - i8_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, i8_ty) + i64_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int64(pool) + i8_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int8(pool) + i8_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, i8_ty) # 元素类型 T:从 list 特化类型名解析(list[int]→i32、list[str]→i8*、 # 未知/指针元素→i8*),与 CallGenDispatch 尾部 list 分支一致 - lm_esty: llvmlite.LLVMType | t.CPtr = \ + lm_esty: rawptr[llvmlite.LLVMType] = \ self.Gen.StructGen.get_struct_type_from_value(lm_obj) lm_ename: str = None if lm_esty is not None: lm_ename = llvmlite.get_struct_name(lm_esty) - lm_elem_ty: llvmlite.LLVMType | t.CPtr = None + lm_elem_ty: rawptr[llvmlite.LLVMType] = None if lm_ename is not None: lm_elem_ty = self.Gen.ExprGenName._list_elem_type_from_name( pool, lm_ename) @@ -1724,7 +1724,7 @@ class CallGenCall(CallGenBase.CallGenBase): g_epp: llvmlite.Value | t.CPtr = llvmlite.build_gep(builder, i64_ty, lm_obj, g_idx4) g_esize: llvmlite.Value | t.CPtr = llvmlite.build_load(builder, i64_ty, g_epp) # 翻译 index - g_idx_node: ast.AST | t.CPtr = cargs.get(0) + g_idx_node: rawptr[ast.AST] = cargs.get(0) g_idx_val: llvmlite.Value | t.CPtr = self.Gen.ExprGen.translate_value( builder, pool, mod, g_idx_node, None, 0, trans) if g_data is not None and g_esize is not None and g_idx_val is not None: @@ -1747,8 +1747,8 @@ class CallGenCall(CallGenBase.CallGenBase): s_idx4: llvmlite.Value | t.CPtr = llvmlite.const_int64(pool, 4) s_epp: llvmlite.Value | t.CPtr = llvmlite.build_gep(builder, i64_ty, lm_obj, s_idx4) s_esize: llvmlite.Value | t.CPtr = llvmlite.build_load(builder, i64_ty, s_epp) - s_idx_node: ast.AST | t.CPtr = cargs.get(0) - s_val_node: ast.AST | t.CPtr = cargs.get(1) + s_idx_node: rawptr[ast.AST] = cargs.get(0) + s_val_node: rawptr[ast.AST] = cargs.get(1) s_idx_val: llvmlite.Value | t.CPtr = self.Gen.ExprGen.translate_value( builder, pool, mod, s_idx_node, None, 0, trans) s_val_val: llvmlite.Value | t.CPtr = self.Gen.ExprGen.translate_value( @@ -1828,7 +1828,7 @@ class CallGenCall(CallGenBase.CallGenBase): # {sha1}.list.append。lm_obj 类型即特化结构体 Ptr(list[...]), # 从类型解析特化类名拼接调用名,否则 ld.lld undefined symbol ap_spec_nm: str = None - ap_struct_ty: llvmlite.LLVMType | t.CPtr = \ + ap_struct_ty: rawptr[llvmlite.LLVMType] = \ self.Gen.StructGen.get_struct_type_from_value(lm_obj) if ap_struct_ty is not None: ap_spec_nm = self.Gen.StructGen.get_class_name_by_type( @@ -1877,14 +1877,14 @@ class CallGenCall(CallGenBase.CallGenBase): if ap_mangled is not None: viperlib.snprintf(ap_mangled, ap_mlen, "%s.%s.append", ap_sha1, ap_spec_nm) - ap_item_node: ast.AST | t.CPtr = cargs.get(0) + ap_item_node: rawptr[ast.AST] = cargs.get(0) ap_item_val: llvmlite.Value | t.CPtr = self.Gen.ExprGen.translate_value( builder, pool, mod, ap_item_node, None, 0, trans) if ap_item_val is not None: llvmlite.value_set_next(lm_obj, None) llvmlite.value_set_next(ap_item_val, None) llvmlite.value_set_next(lm_obj, ap_item_val) - ap_ret_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int32(pool) + ap_ret_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int32(pool) self._ensure_method_declare(pool, mod, ap_mangled, ap_ret_ty, lm_obj, 2) return llvmlite.build_call(builder, ap_mangled, lm_obj, 2, ap_ret_ty, 0) @@ -1905,10 +1905,10 @@ class CallGenCall(CallGenBase.CallGenBase): # ============================================================ def _translate_super_call(self, pool: rawptr[memhub.MemBuddy], builder: llvmlite.IRBuilder | t.CPtr, - mod: llvmlite.LLVMModule | t.CPtr, - cl: ast.Call | t.CPtr, + mod: rawptr[llvmlite.LLVMModule], + cl: rawptr[ast.Call], method_name: str, - trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: + trans: rawptr[HT.Translator]) -> llvmlite.Value | t.CPtr: """super().method(args) → 父类方法静态调用,返回 call 结果 Value""" if pool is None or builder is None or cl is None or method_name is None: return None @@ -1961,7 +1961,7 @@ class CallGenCall(CallGenBase.CallGenBase): case llvmlite.LLVMType.Ptr(inner1): match inner1: case llvmlite.LLVMType.Ptr(inner2): - obj_ty_sp: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, inner2) + obj_ty_sp: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, inner2) self_ptr = llvmlite.build_load(builder, obj_ty_sp, self_entry.Alloca) case _: self_ptr = llvmlite.build_load(builder, self_entry.Alloca.Ty, self_entry.Alloca) @@ -2000,15 +2000,15 @@ class CallGenCall(CallGenBase.CallGenBase): pool, sub_entry_sp, sub_field_sp.Index) delta_sp: int = sub_off_sp - anc_off_sp if delta_sp > 0: - i8_ty_sp: llvmlite.LLVMType | t.CPtr = llvmlite.Int8(pool) - i8_ptr_sp: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, i8_ty_sp) + i8_ty_sp: rawptr[llvmlite.LLVMType] = llvmlite.Int8(pool) + i8_ptr_sp: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, i8_ty_sp) obj_i8_sp: llvmlite.Value | t.CPtr = llvmlite.build_bitcast( builder, self_ptr, i8_ptr_sp) dval_sp: llvmlite.Value | t.CPtr = llvmlite.const_int32(pool, delta_sp) adj_sp: llvmlite.Value | t.CPtr = llvmlite.build_gep( builder, i8_ty_sp, obj_i8_sp, dval_sp) if adj_sp is not None: - anc_ptr_sp: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, anc_entry_sp.Ty) + anc_ptr_sp: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, anc_entry_sp.Ty) # 同上:跨模块祖先类型 bitcast 前确保 opaque 声明, # 否则 llc 报 "use of undefined type" llvmlite.module_ensure_opaque_for_type(mod, pool, anc_ptr_sp) @@ -2018,7 +2018,7 @@ class CallGenCall(CallGenBase.CallGenBase): if anc_lookup is None: return None viperlib.snprintf(anc_lookup, 160, "%s.%s", anc, method_name) - found_func: llvmlite.Function | t.CPtr = self.find_func_in_module(mod, anc_lookup) + found_func: rawptr[llvmlite.Function] = self.find_func_in_module(mod, anc_lookup) call_name: str = anc_lookup anc_sha1_sp: str = self.Gen.StructGen.get_struct_sha1(anc) if anc_sha1_sp is None: @@ -2033,7 +2033,7 @@ class CallGenCall(CallGenBase.CallGenBase): if mangled_sp is not None: call_name = mangled_sp # 5. 翻译参数 + 按形参 coerce(self 是形参 0,第 ai 个实参对应形参 ai+1) - cargs_sp: list[ast.AST | t.CPtr] | t.CPtr = cl.args + cargs_sp: list[rawptr[ast.AST]] | t.CPtr = cl.args can_sp: sizet = 0 if cargs_sp is not None: can_sp = len(cargs_sp) @@ -2042,12 +2042,12 @@ class CallGenCall(CallGenBase.CallGenBase): tail: llvmlite.Value | t.CPtr = self_arg arg_count_sp: int = 1 for ai_sp in range(can_sp): - arg_node_sp: ast.AST | t.CPtr = cargs_sp.get(ai_sp) + arg_node_sp: rawptr[ast.AST] = cargs_sp.get(ai_sp) if arg_node_sp is None: continue # 先取形参类型(char 字面量 → str 形参需物化字符串,见 translate_constant) pp_sp: llvmlite.Param | t.CPtr = None - pty_sp: llvmlite.LLVMType | t.CPtr = None + pty_sp: rawptr[llvmlite.LLVMType] = None if found_func is not None: pp_sp = llvmlite.function_get_param_head(found_func) pi_sp: int = 0 @@ -2069,7 +2069,7 @@ class CallGenCall(CallGenBase.CallGenBase): # found_func=None:数组实参按 C 语义衰减为元素指针 # (与 _translate_method_call 一致,避免 declare 类型不匹配) if arg_val_sp.Ty is not None and self.Gen.ExprGenBase.is_ptr_type(arg_val_sp.Ty) != 0: - arr_pointee_sp: llvmlite.LLVMType | t.CPtr = arg_val_sp.Ty.Pointee + arr_pointee_sp: rawptr[llvmlite.LLVMType] = arg_val_sp.Ty.Pointee if arr_pointee_sp is not None: match arr_pointee_sp: case llvmlite.LLVMType.Array(arr_et_sp, _): @@ -2085,22 +2085,22 @@ class CallGenCall(CallGenBase.CallGenBase): tail = arg_val_sp arg_count_sp += 1 # 6. 返回类型:found_func → 特殊方法 → text.ll/vpi - ret_ty_sp: llvmlite.LLVMType | t.CPtr = llvmlite.Int32(pool) + ret_ty_sp: rawptr[llvmlite.LLVMType] = llvmlite.Int32(pool) if found_func is not None: - frt_sp: llvmlite.LLVMType | t.CPtr = llvmlite.function_get_ret_ty(found_func) + frt_sp: rawptr[llvmlite.LLVMType] = llvmlite.function_get_ret_ty(found_func) if frt_sp is not None: ret_ty_sp = frt_sp else: - sp_ty_sp: llvmlite.LLVMType | t.CPtr = self._special_method_ret_ty(pool, anc, method_name) + sp_ty_sp: rawptr[llvmlite.LLVMType] = self._special_method_ret_ty(pool, anc, method_name) if sp_ty_sp is not None: ret_ty_sp = sp_ty_sp else: - looked_sp: llvmlite.LLVMType | t.CPtr = self._LookupMethodRetTyFromTextLL( + looked_sp: rawptr[llvmlite.LLVMType] = self._LookupMethodRetTyFromTextLL( pool, anc_sha1_sp, anc, method_name) if looked_sp is not None: ret_ty_sp = looked_sp else: - vpi_ret_sp: llvmlite.LLVMType | t.CPtr = self._lookup_method_ret_ty_via_vpi( + vpi_ret_sp: rawptr[llvmlite.LLVMType] = self._lookup_method_ret_ty_via_vpi( pool, anc_sha1_sp, anc, method_name) if vpi_ret_sp is not None: ret_ty_sp = vpi_ret_sp @@ -2139,11 +2139,11 @@ class CallGenCall(CallGenBase.CallGenBase): # packed(@c.Attribute(t.attr.packed))结构体无字段填充: # 偏移 = 前序字段尺寸之和(LLVM packed struct 布局)。 is_packed_fb: int = entry.IsPacked - cur_fb: llvmlite.ParamNode | t.CPtr = fields + cur_fb: rawptr[llvmlite.Function] = fields i_fb: int = 0 while cur_fb is not None and i_fb < field_index: if cur_fb.Ty is not None: - fty_fb: llvmlite.LLVMType | t.CPtr = (llvmlite.LLVMType | t.CPtr)(cur_fb.Ty) + fty_fb: rawptr[llvmlite.LLVMType] = (rawptr[llvmlite.LLVMType])(cur_fb.Ty) fsize_fb: int = self.Gen.ClassGenEnum._get_type_size(fty_fb) falign_fb: int = self.Gen.ClassGenEnum._get_type_align(fty_fb) if is_packed_fb == 0 and falign_fb > 1: @@ -2155,7 +2155,7 @@ class CallGenCall(CallGenBase.CallGenBase): i_fb += 1 # 字段自身对齐 if cur_fb is not None and cur_fb.Ty is not None: - fty2_fb: llvmlite.LLVMType | t.CPtr = (llvmlite.LLVMType | t.CPtr)(cur_fb.Ty) + fty2_fb: rawptr[llvmlite.LLVMType] = (rawptr[llvmlite.LLVMType])(cur_fb.Ty) falign2_fb: int = self.Gen.ClassGenEnum._get_type_align(fty2_fb) if is_packed_fb == 0 and falign2_fb > 1: rem2_fb: int = offset_fb % falign2_fb diff --git a/App/lib/core/Gen/Call/CallGenCtor.vp b/App/lib/core/Gen/Call/CallGenCtor.vp index 37f80ae..910aa38 100644 --- a/App/lib/core/Gen/Call/CallGenCtor.vp +++ b/App/lib/core/Gen/Call/CallGenCtor.vp @@ -34,11 +34,11 @@ class CallGenCtor(CallGenBase.CallGenBase): # ============================================================ def _apply_struct_defaults(self, pool: rawptr[memhub.MemBuddy], builder: llvmlite.IRBuilder | t.CPtr, - mod: llvmlite.LLVMModule | t.CPtr, - struct_ty: llvmlite.LLVMType | t.CPtr, + mod: rawptr[llvmlite.LLVMModule], + struct_ty: rawptr[llvmlite.LLVMType], class_name: str, tmp: llvmlite.Value | t.CPtr, - trans: HT.Translator | t.CPtr): + trans: rawptr[HT.Translator]): """应用结构体字段的默认值""" # 用类型指针定位 entry,规避跨模块同名 find_struct 找错 entry: GenTypes.StructEntry | t.CPtr = self.Gen.StructGen.find_struct_by_type(struct_ty) @@ -108,12 +108,12 @@ class CallGenCtor(CallGenBase.CallGenBase): # ============================================================ def _translate_struct_ctor(self, pool: rawptr[memhub.MemBuddy], builder: llvmlite.IRBuilder | t.CPtr, - mod: llvmlite.LLVMModule | t.CPtr, - struct_ty: llvmlite.LLVMType | t.CPtr, + mod: rawptr[llvmlite.LLVMModule], + struct_ty: rawptr[llvmlite.LLVMType], class_name: str, - cargs: list[ast.AST | t.CPtr] | t.CPtr, + cargs: list[rawptr[ast.AST]] | t.CPtr, can: sizet, - trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: + trans: rawptr[HT.Translator]) -> llvmlite.Value | t.CPtr: """结构体构造函数:按字段顺序 store 参数值,返回结构体值 OOP 结构体:alloca → call __before_init__(ptr) → call __init__(ptr, args) 或 store 参数 → load @@ -127,7 +127,7 @@ class CallGenCtor(CallGenBase.CallGenBase): return llvmlite.ConstZero(pool, struct_ty) # 诊断节点:取第一个构造实参(有行号),供 _call_method_on_ptr 的 # fatal_error 显示构造调用行号(本函数无 cl 参数,实参节点最接近调用点) - diag_node_ct: ast.AST | t.CPtr = None + diag_node_ct: rawptr[ast.AST] = None if cargs is not None and len(cargs) > 0: diag_node_ct = cargs.get(0) @@ -145,7 +145,7 @@ class CallGenCtor(CallGenBase.CallGenBase): if init_lookup_name is not None: viperlib.snprintf(init_lookup_name, 128, "%s.__init__", class_name) # 方案1: 检查当前模块的函数声明 - init_found_func: llvmlite.Function | t.CPtr = self.find_func_in_module(mod, init_lookup_name) + init_found_func: rawptr[llvmlite.Function] = self.find_func_in_module(mod, init_lookup_name) if init_found_func is not None: is_oop = 1 if ctor_entry is not None: @@ -176,7 +176,7 @@ class CallGenCtor(CallGenBase.CallGenBase): string.memset(new_arg_vals, 0, 8 * 32) new_arg_count: int = 0 for nai in range(can): - new_arg_node: ast.AST | t.CPtr = cargs.get(nai) + new_arg_node: rawptr[ast.AST] = cargs.get(nai) if new_arg_node is None: continue new_av: llvmlite.Value | t.CPtr = self.Gen.ExprGen.translate_value( @@ -198,7 +198,7 @@ class CallGenCtor(CallGenBase.CallGenBase): # 查不到类名,误报"跨模块调用 'parser.add_argument' 找不到模块 SHA1"。 # bitcast 只改类型层视图,运行时零开销(指针位不变)。 if new_ptr.Ty is not None: - nw_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, struct_ty) + nw_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, struct_ty) if uint64(new_ptr.Ty) != uint64(nw_ty): nw_bc: llvmlite.Value | t.CPtr = llvmlite.build_bitcast(builder, new_ptr, nw_ty) if nw_bc is not None: @@ -221,7 +221,7 @@ class CallGenCtor(CallGenBase.CallGenBase): string.memset(arg_vals, 0, 8 * 32) real_arg_count: int = 0 for ai in range(can): - arg_node: ast.AST | t.CPtr = cargs.get(ai) + arg_node: rawptr[ast.AST] = cargs.get(ai) if arg_node is None: continue av: llvmlite.Value | t.CPtr = self.Gen.ExprGen.translate_value( @@ -237,7 +237,7 @@ class CallGenCtor(CallGenBase.CallGenBase): # 无 __init__ 且无 __new__:逐字段 store 参数值 # (有 __new__ 时参数已由 __new__ 消费,不应存入字段) for ai in range(can): - arg: ast.AST | t.CPtr = cargs.get(ai) + arg: rawptr[ast.AST] = cargs.get(ai) if arg is None: continue # 先取字段(fe.Ty 用于 char 字面量 → str 字段的物化判定, @@ -297,7 +297,7 @@ class CallGenCtor(CallGenBase.CallGenBase): # 逐字段 store 参数值(覆盖默认值) for ai in range(can): - arg: ast.AST | t.CPtr = cargs.get(ai) + arg: rawptr[ast.AST] = cargs.get(ai) if arg is None: continue # 先取字段(fe.Ty 用于 char 字面量 → str 字段的物化判定,见 translate_constant) @@ -357,13 +357,13 @@ class CallGenCtor(CallGenBase.CallGenBase): # ============================================================ def _translate_renum_construct(self, pool: rawptr[memhub.MemBuddy], builder: llvmlite.IRBuilder | t.CPtr, - mod: llvmlite.LLVMModule | t.CPtr, + mod: rawptr[llvmlite.LLVMModule], class_name: str, variant_name: str, tag_value: int, - cargs: list[ast.AST | t.CPtr] | t.CPtr, + cargs: list[rawptr[ast.AST]] | t.CPtr, can: sizet, - trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: + trans: rawptr[HT.Translator]) -> llvmlite.Value | t.CPtr: """构造 REnum 变体实例,返回指向 alloca 的指针 class_name: REnum 类名(如 "LLVMType") @@ -385,7 +385,7 @@ class CallGenCtor(CallGenBase.CallGenBase): VLogger.error(f"REnum construct: type {class_name} not registered", "RENUM") return None - renum_ty: llvmlite.LLVMType | t.CPtr = renum_entry.Ty + renum_ty: rawptr[llvmlite.LLVMType] = renum_entry.Ty if renum_ty is None: return None @@ -401,7 +401,7 @@ class CallGenCtor(CallGenBase.CallGenBase): llvmlite.build_store(builder, zero, tmp) # 写入 __tag 字段(索引 0) - i32_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int32(pool) + i32_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int32(pool) tag_name_buf: str = pool.alloc(32) if tag_name_buf is not None: viperlib.snprintf(tag_name_buf, 32, "%d", tag_value) @@ -409,7 +409,7 @@ class CallGenCtor(CallGenBase.CallGenBase): pool, i32_ty, tag_value, tag_name_buf if tag_name_buf is not None else "0") tag_field: GenTypes.FieldEntry | t.CPtr = self.Gen.StructGen._get_field_entry(renum_entry, 0) - tag_field_ty: llvmlite.LLVMType | t.CPtr = i32_ty + tag_field_ty: rawptr[llvmlite.LLVMType] = i32_ty if tag_field is not None and tag_field.Ty is not None: tag_field_ty = tag_field.Ty tag_ptr: llvmlite.Value | t.CPtr = llvmlite.build_gep_struct( @@ -420,7 +420,7 @@ class CallGenCtor(CallGenBase.CallGenBase): # 写入 payload 字段(索引 1, 2, ... 对应 _p1, _p2, ...) # 参数按位置顺序填充 payload,跳过 __tag(索引 0) for ai in range(can): - arg: ast.AST | t.CPtr = cargs.get(ai) + arg: rawptr[ast.AST] = cargs.get(ai) if arg is None: continue # payload 字段索引 = ai + 1(跳过 __tag);先取字段(pfe.Ty 用于 @@ -459,14 +459,14 @@ class CallGenCtor(CallGenBase.CallGenBase): # ============================================================ def _translate_struct_ctor_kw(self, pool: rawptr[memhub.MemBuddy], builder: llvmlite.IRBuilder | t.CPtr, - mod: llvmlite.LLVMModule | t.CPtr, - struct_ty: llvmlite.LLVMType | t.CPtr, + mod: rawptr[llvmlite.LLVMModule], + struct_ty: rawptr[llvmlite.LLVMType], class_name: str, - cargs: list[ast.AST | t.CPtr] | t.CPtr, + cargs: list[rawptr[ast.AST]] | t.CPtr, can: sizet, - keywords: list[ast.AST | t.CPtr] | t.CPtr, + keywords: list[rawptr[ast.AST]] | t.CPtr, kw_count: sizet, - trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: + trans: rawptr[HT.Translator]) -> llvmlite.Value | t.CPtr: """结构体构造函数(关键字参数版本)""" # 创建临时 alloca # 确保跨模块结构体的完整定义在当前模块中可用(供 alloca 分配空间) @@ -476,7 +476,7 @@ class CallGenCtor(CallGenBase.CallGenBase): return llvmlite.ConstZero(pool, struct_ty) # 诊断节点:取第一个构造实参(有行号),供 _call_method_on_ptr 的 # fatal_error 显示构造调用行号(本函数无 cl 参数,实参节点最接近调用点) - diag_node_ct: ast.AST | t.CPtr = None + diag_node_ct: rawptr[ast.AST] = None if cargs is not None and len(cargs) > 0: diag_node_ct = cargs.get(0) @@ -495,7 +495,7 @@ class CallGenCtor(CallGenBase.CallGenBase): if kw_init_lookup is not None: viperlib.snprintf(kw_init_lookup, 128, "%s.__init__", class_name) # 方案1: 检查当前模块的函数声明 - kw_init_found: llvmlite.Function | t.CPtr = self.find_func_in_module(mod, kw_init_lookup) + kw_init_found: rawptr[llvmlite.Function] = self.find_func_in_module(mod, kw_init_lookup) if kw_init_found is not None: is_oop = 1 if kw_entry is not None: @@ -545,7 +545,7 @@ class CallGenCtor(CallGenBase.CallGenBase): string.memset(new_arg_vals, 0, 8 * 32) new_arg_count: int = 0 for nai in range(can): - new_arg_node: ast.AST | t.CPtr = cargs.get(nai) + new_arg_node: rawptr[ast.AST] = cargs.get(nai) if new_arg_node is None: continue new_av: llvmlite.Value | t.CPtr = self.Gen.ExprGen.translate_value( @@ -577,7 +577,7 @@ class CallGenCtor(CallGenBase.CallGenBase): # 查不到类名,误报"跨模块调用 'parser.add_argument' 找不到模块 SHA1"。 # bitcast 只改类型层视图,运行时零开销(指针位不变)。 if new_ptr.Ty is not None: - nw_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, struct_ty) + nw_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, struct_ty) if uint64(new_ptr.Ty) != uint64(nw_ty): nw_bc: llvmlite.Value | t.CPtr = llvmlite.build_bitcast(builder, new_ptr, nw_ty) if nw_bc is not None: @@ -590,7 +590,7 @@ class CallGenCtor(CallGenBase.CallGenBase): init_arg_count: int = 0 # 位置参数 for ai_init in range(can): - arg_node_init: ast.AST | t.CPtr = cargs.get(ai_init) + arg_node_init: rawptr[ast.AST] = cargs.get(ai_init) if arg_node_init is None: continue av_init: llvmlite.Value | t.CPtr = self.Gen.ExprGen.translate_value( @@ -621,7 +621,7 @@ class CallGenCtor(CallGenBase.CallGenBase): # 无 __init__(或非 OOP):逐字段 store 参数值 # 先处理位置参数(按字段索引,覆盖默认值) for ai in range(can): - arg: ast.AST | t.CPtr = cargs.get(ai) + arg: rawptr[ast.AST] = cargs.get(ai) if arg is None: continue # 先取字段(fe.Ty 用于 char 字面量 → str 字段的物化判定,见 translate_constant) @@ -693,9 +693,9 @@ class CallGenCtor(CallGenBase.CallGenBase): def _translate_t_type_cast(self, pool: rawptr[memhub.MemBuddy], builder: llvmlite.IRBuilder | t.CPtr, val: llvmlite.Value | t.CPtr, - target_ty: llvmlite.LLVMType | t.CPtr, - src_node: ast.AST | t.CPtr = None, - trans: HT.Translator | t.CPtr = None) -> llvmlite.Value | t.CPtr: + target_ty: rawptr[llvmlite.LLVMType], + src_node: rawptr[ast.AST] = None, + trans: rawptr[HT.Translator] = None) -> llvmlite.Value | t.CPtr: """类型转换:根据参数类型和目标类型选择转换方式 整数 → 整数拓宽:拓宽方向由**源**的符号性决定(与 coerce_to_type 的 @@ -769,7 +769,7 @@ class CallGenCtor(CallGenBase.CallGenBase): # HandlesExprCall 通过 HandlesType._get_type_name_from_annotation 调用 def _extract_type_args_from_slice(self, pool: rawptr[memhub.MemBuddy], - slice_node: ast.AST | t.CPtr, + slice_node: rawptr[ast.AST], from_imports: str = None) -> list[str] | t.CPtr: """从 Subscript.slice 提取类型实参名列表 @@ -790,13 +790,13 @@ class CallGenCtor(CallGenBase.CallGenBase): tn_raw: str = None tn: str = None if k == ast.ASTKind.Tuple: - tp: ast.Tuple | t.CPtr = (ast.Tuple | t.CPtr)(slice_node) - elts: list[ast.AST | t.CPtr] | t.CPtr = tp.elts + tp: rawptr[ast.Tuple] = rawptr[ast.Tuple](slice_node) + elts: list[rawptr[ast.AST]] | t.CPtr = tp.elts if elts is not None: n: sizet = len(elts) i: sizet for i in range(n): - elt: ast.AST | t.CPtr = elts.get(i) + elt: rawptr[ast.AST] = elts.get(i) tn_raw = self.Gen.TypeGenResolve._get_type_name_from_annotation(pool, elt) tn = self.Gen.TypeGenResolve._norm_type_arg_name(pool, tn_raw, from_imports) if tn is not None: @@ -811,9 +811,9 @@ class CallGenCtor(CallGenBase.CallGenBase): # ============================================================ def _infer_generic_ctor_type_arg(self, pool: rawptr[memhub.MemBuddy], - arg_node: ast.AST | t.CPtr, + arg_node: rawptr[ast.AST], class_name: str, - trans: HT.Translator | t.CPtr) -> str: + trans: rawptr[HT.Translator]) -> str: """从构造实参 AST 推断泛型类型实参名 裸名泛型类构造(Box(42) → Box[int])需要从实参推断类型实参。 @@ -831,7 +831,7 @@ class CallGenCtor(CallGenBase.CallGenBase): k: int = arg_node.kind() # 常量: 42→int, 3.14→double, "abc"→str, 'x'→char if k == ast.ASTKind.Constant: - cn: ast.Constant | t.CPtr = (ast.Constant | t.CPtr)(arg_node) + cn: rawptr[ast.Constant] = rawptr[ast.Constant](arg_node) if cn.const_kind == ast.CONST_FLOAT: return "double" if cn.const_kind == ast.CONST_CHAR: @@ -842,10 +842,10 @@ class CallGenCtor(CallGenBase.CallGenBase): return "int" # 类型转换调用: int(...)/float(...)/int(...)/t.CDouble(...) if k == ast.ASTKind.Call: - cl_f: ast.Call | t.CPtr = (ast.Call | t.CPtr)(arg_node) + cl_f: rawptr[ast.Call] = rawptr[ast.Call](arg_node) if cl_f.func is not None: if cl_f.func.kind() == ast.ASTKind.Name: - fn_nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(cl_f.func) + fn_nm: rawptr[ast.Name] = rawptr[ast.Name](cl_f.func) if fn_nm.id is not None: # 与下方 Attribute 分支的 strstr 匹配一致:from t import CInt # 后 `CInt(0)` 的 func 是 Name("CInt"),仅精确匹配 int/float @@ -864,7 +864,7 @@ class CallGenCtor(CallGenBase.CallGenBase): or string.strstr(fn_nm.id, "Long") is not None: return "int" elif cl_f.func.kind() == ast.ASTKind.Attribute: - fn_at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(cl_f.func) + fn_at: rawptr[ast.Attribute] = rawptr[ast.Attribute](cl_f.func) if fn_at.attr is not None: if string.strstr(fn_at.attr, "Float") is not None or string.strstr(fn_at.attr, "Double") is not None: return "double" @@ -886,7 +886,7 @@ class CallGenCtor(CallGenBase.CallGenBase): # 静默特化成 Box[int](元素按 4 字节/i32 处理)。 # 仅查表(Spec.SourceName),不发 IR、无副作用 ⇒ 构造特化阶段可安全调用。 if k == ast.ASTKind.Name: - nm_i: ast.Name | t.CPtr = (ast.Name | t.CPtr)(arg_node) + nm_i: rawptr[ast.Name] = rawptr[ast.Name](arg_node) if nm_i.id is not None and trans is not None: ve_i: GenTypes.VarEntry | t.CPtr = self.Gen.VarGen.lookup_var_entry( trans.SymTab, nm_i.id) @@ -899,7 +899,7 @@ class CallGenCtor(CallGenBase.CallGenBase): return self.Gen.ExprGenAttr._resolve_attr_field_class(pool, trans, arg_node) return None - def _annotation_refers_type_param(self, node: ast.AST | t.CPtr, + def _annotation_refers_type_param(self, node: rawptr[ast.AST], tp_name: str) -> int: """注解是否引用类型形参 tp_name(1=是 / 0=否) @@ -911,18 +911,18 @@ class CallGenCtor(CallGenBase.CallGenBase): return 0 k: int = node.kind() if k == ast.ASTKind.Name: - nm_a: ast.Name | t.CPtr = (ast.Name | t.CPtr)(node) + nm_a: rawptr[ast.Name] = rawptr[ast.Name](node) if nm_a.id is not None and string.strcmp(nm_a.id, tp_name) == 0: return 1 return 0 if k == ast.ASTKind.BinOp: - bop_a: ast.BinOp | t.CPtr = (ast.BinOp | t.CPtr)(node) + bop_a: rawptr[ast.BinOp] = rawptr[ast.BinOp](node) if self._annotation_refers_type_param(bop_a.left, tp_name) != 0: return 1 return self._annotation_refers_type_param(bop_a.right, tp_name) return 0 - def _get_ctor_init_params(self, class_name: str) -> list[ast.AST | t.CPtr] | t.CPtr: + def _get_ctor_init_params(self, class_name: str) -> list[rawptr[ast.AST]] | t.CPtr: """取泛型类模板 __init__ 的形参列表(含 self,形参 0) 模板不存在 / 无 __init__ / args 形态不可用 → None。 @@ -934,22 +934,22 @@ class CallGenCtor(CallGenBase.CallGenBase): """ if class_name is None: return None - template_cd: ast.ClassDef | t.CPtr = self.Gen.ClassGenGeneric._find_generic_template(class_name) + template_cd: rawptr[ast.ClassDef] = self.Gen.ClassGenGeneric._find_generic_template(class_name) if template_cd is None or template_cd.children is None: return None - children: list[ast.AST | t.CPtr] | t.CPtr = template_cd.children + children: list[rawptr[ast.AST]] | t.CPtr = template_cd.children cn: sizet = len(children) ci: sizet for ci in range(cn): - child: ast.AST | t.CPtr = children.get(ci) + child: rawptr[ast.AST] = children.get(ci) if child is None or child.kind() != ast.ASTKind.FunctionDef: continue - fd: ast.FunctionDef | t.CPtr = (ast.FunctionDef | t.CPtr)(child) + fd: rawptr[ast.FunctionDef] = rawptr[ast.FunctionDef](child) if fd.name is None or string.strcmp(fd.name, "__init__") != 0: continue if fd.args is None or fd.args.kind() != ast.ASTKind.Arguments: return None - fargs: ast.Arguments | t.CPtr = (ast.Arguments | t.CPtr)(fd.args) + fargs: rawptr[ast.Arguments] = rawptr[ast.Arguments](fd.args) if fargs.args is None: return None return fargs.args @@ -967,7 +967,7 @@ class CallGenCtor(CallGenBase.CallGenBase): """ if class_name is None or tp_name is None: return -1 - plist: list[ast.AST | t.CPtr] | t.CPtr = self._get_ctor_init_params(class_name) + plist: list[rawptr[ast.AST]] | t.CPtr = self._get_ctor_init_params(class_name) if plist is None: return -1 pn: sizet = len(plist) @@ -975,10 +975,10 @@ class CallGenCtor(CallGenBase.CallGenBase): for pi in range(pn): if pi == 0: continue # self:位置实参下标 = 形参序号 - 1 - pa: ast.AST | t.CPtr = plist.get(pi) + pa: rawptr[ast.AST] = plist.get(pi) if pa is None or pa.kind() != ast.ASTKind.Arg: continue - ag: ast.Arg | t.CPtr = (ast.Arg | t.CPtr)(pa) + ag: rawptr[ast.Arg] = rawptr[ast.Arg](pa) if self._annotation_refers_type_param(ag.annotation, tp_name) != 0: return int(pi) return -1 @@ -1011,7 +1011,7 @@ class CallGenCtor(CallGenBase.CallGenBase): """ if class_name is None or kw_name is None: return -1 - plist_sb: list[ast.AST | t.CPtr] | t.CPtr = self._get_ctor_init_params(class_name) + plist_sb: list[rawptr[ast.AST]] | t.CPtr = self._get_ctor_init_params(class_name) if plist_sb is None: return -1 pn_sb: sizet = len(plist_sb) @@ -1019,17 +1019,17 @@ class CallGenCtor(CallGenBase.CallGenBase): for pi_sb in range(pn_sb): if pi_sb == 0: continue # self 不是实参槽位 - pa_sb: ast.AST | t.CPtr = plist_sb.get(pi_sb) + pa_sb: rawptr[ast.AST] = plist_sb.get(pi_sb) if pa_sb is None or pa_sb.kind() != ast.ASTKind.Arg: continue - ag_sb: ast.Arg | t.CPtr = (ast.Arg | t.CPtr)(pa_sb) + ag_sb: rawptr[ast.Arg] = rawptr[ast.Arg](pa_sb) if ag_sb.arg is not None and string.strcmp(ag_sb.arg, kw_name) == 0: return int(pi_sb) - 1 return -1 def _find_ctor_type_param_kw_arg_index(self, class_name: str, tp_name: str, - keywords: list[ast.AST | t.CPtr] | t.CPtr, + keywords: list[rawptr[ast.AST]] | t.CPtr, kw_count: sizet, pos_count: int) -> int: """仅关键字实参的泛型构造:类型形参 tp_name 对应的关键字实参下标 @@ -1051,13 +1051,13 @@ class CallGenCtor(CallGenBase.CallGenBase): return -1 # 未找到,或落在 self 位(0 不是实参) if pi_kw - 1 < pos_count: return -1 # 该形参位已被位置实参占用 - plist_kw: list[ast.AST | t.CPtr] | t.CPtr = self._get_ctor_init_params(class_name) + plist_kw: list[rawptr[ast.AST]] | t.CPtr = self._get_ctor_init_params(class_name) if plist_kw is None: return -1 - pa_kw: ast.AST | t.CPtr = plist_kw.get(sizet(pi_kw)) + pa_kw: rawptr[ast.AST] = plist_kw.get(sizet(pi_kw)) if pa_kw is None or pa_kw.kind() != ast.ASTKind.Arg: return -1 - ag_kw: ast.Arg | t.CPtr = (ast.Arg | t.CPtr)(pa_kw) + ag_kw: rawptr[ast.Arg] = rawptr[ast.Arg](pa_kw) if ag_kw.arg is None: return -1 ki_kw: sizet @@ -1070,10 +1070,10 @@ class CallGenCtor(CallGenBase.CallGenBase): return -1 def _infer_ctor_type_args_from_ctx(self, pool: rawptr[memhub.MemBuddy], - trans: HT.Translator | t.CPtr, + trans: rawptr[HT.Translator], class_name: str, tp_count: int, - cl: ast.Call | t.CPtr) -> list[str] | t.CPtr: + cl: rawptr[ast.Call]) -> list[str] | t.CPtr: """从「赋值目标注解 / 函数返回注解」上下文取泛型构造的类型实参 场景:`s: Stack[int] = Stack()`(__init__ 无参 ⇒ 实参推断不到 T)、 @@ -1095,7 +1095,7 @@ class CallGenCtor(CallGenBase.CallGenBase): return None if tp_count <= 0: return None - ctx_annot: ast.AST | t.CPtr = None + ctx_annot: rawptr[ast.AST] = None if trans.CurAssignNode is not None and uint64(cl) == uint64(trans.CurAssignNode): ctx_annot = trans.CurAssignAnnot if ctx_annot is None and trans.CurRetNode is not None \ @@ -1105,23 +1105,23 @@ class CallGenCtor(CallGenBase.CallGenBase): return None # 取注解里的泛型 Subscript 一侧(与 _prespecialize_generic_annotation 同构: # 支持 `X[T]` 与 `X[T] | t.CPtr` 两种形态) - spec_annot: ast.Subscript | t.CPtr = None + spec_annot: rawptr[ast.Subscript] = None if ctx_annot.kind() == ast.ASTKind.Subscript: - spec_annot = (ast.Subscript | t.CPtr)(ctx_annot) + spec_annot = rawptr[ast.Subscript](ctx_annot) elif ctx_annot.kind() == ast.ASTKind.BinOp: - bop_ctx: ast.BinOp | t.CPtr = (ast.BinOp | t.CPtr)(ctx_annot) + bop_ctx: rawptr[ast.BinOp] = rawptr[ast.BinOp](ctx_annot) if bop_ctx.op == ast.OpKind.BitOr: if bop_ctx.left is not None and bop_ctx.left.kind() == ast.ASTKind.Subscript: - spec_annot = (ast.Subscript | t.CPtr)(bop_ctx.left) + spec_annot = rawptr[ast.Subscript](bop_ctx.left) elif bop_ctx.right is not None and bop_ctx.right.kind() == ast.ASTKind.Subscript: - spec_annot = (ast.Subscript | t.CPtr)(bop_ctx.right) + spec_annot = rawptr[ast.Subscript](bop_ctx.right) if spec_annot is None: return None # 注解必须与本次构造是同一个泛型类(不同类 ⇒ 上下文与本次构造无关) - sv_ctx: ast.AST | t.CPtr = spec_annot.value + sv_ctx: rawptr[ast.AST] = spec_annot.value if sv_ctx is None or sv_ctx.kind() != ast.ASTKind.Name: return None - sn_ctx: ast.Name | t.CPtr = (ast.Name | t.CPtr)(sv_ctx) + sn_ctx: rawptr[ast.Name] = rawptr[ast.Name](sv_ctx) if sn_ctx.id is None or string.strcmp(sn_ctx.id, class_name) != 0: return None type_args_ctx: list[str] | t.CPtr = self._extract_type_args_from_slice( @@ -1135,10 +1135,10 @@ class CallGenCtor(CallGenBase.CallGenBase): def _translate_generic_ctor_call(self, pool: rawptr[memhub.MemBuddy], builder: llvmlite.IRBuilder | t.CPtr, - mod: llvmlite.LLVMModule | t.CPtr, + mod: rawptr[llvmlite.LLVMModule], spec_name: str, - cl: ast.Call | t.CPtr, - trans: HT.Translator | t.CPtr, + cl: rawptr[ast.Call], + trans: rawptr[HT.Translator], tmpl_name: str = None) -> llvmlite.Value | t.CPtr: """泛型类构造调用: list[str](pool, 8) → __new__ + __before_init__ + __init__""" if pool is None or builder is None or mod is None or spec_name is None or cl is None: @@ -1149,7 +1149,7 @@ class CallGenCtor(CallGenBase.CallGenBase): if struct_entry is None: self.Gen.TypeGenErr.fatal_error(cl, "泛型类构造调用: 特化类未注册") return None - struct_ty: llvmlite.LLVMType | t.CPtr = struct_entry.Ty + struct_ty: rawptr[llvmlite.LLVMType] = struct_entry.Ty if struct_ty is None: return None @@ -1162,11 +1162,11 @@ class CallGenCtor(CallGenBase.CallGenBase): return None # 翻译实参为参数指针数组(extra_args[slot] = Value 指针):位置实参 → 槽 0..can-1;关键字实参 → 按 __init__ 形参名定位槽位(与 _find_ctor_type_param_kw_arg_index 共用同一套形参遍历)。位置实参优先,关键字不可按出现顺序追加——乱序会串位 - cargs: list[ast.AST | t.CPtr] | t.CPtr = cl.args + cargs: list[rawptr[ast.AST]] | t.CPtr = cl.args can: sizet = 0 if cargs is not None: can = len(cargs) - keywords: list[ast.AST | t.CPtr] | t.CPtr = cl.keywords + keywords: list[rawptr[ast.AST]] | t.CPtr = cl.keywords kw_count: sizet = 0 if keywords is not None: kw_count = len(keywords) @@ -1187,7 +1187,7 @@ class CallGenCtor(CallGenBase.CallGenBase): self.Gen.TypeGenErr.fatal_error( cl, "泛型构造实参超过 32 个上限", "TypeError") break - arg_node: ast.AST | t.CPtr = cargs.get(ai) + arg_node: rawptr[ast.AST] = cargs.get(ai) if arg_node is not None: arg_val: llvmlite.Value | t.CPtr = self.Gen.ExprGen.translate_value( builder, pool, mod, arg_node, None, 0, trans) @@ -1263,7 +1263,7 @@ class CallGenCtor(CallGenBase.CallGenBase): # 查不到类名,误报"跨模块调用 'parser.add_argument' 找不到模块 SHA1"。 # bitcast 只改类型层视图,运行时零开销(指针位不变)。 if new_ptr.Ty is not None: - nw_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, struct_ty) + nw_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, struct_ty) if uint64(new_ptr.Ty) != uint64(nw_ty): nw_bc: llvmlite.Value | t.CPtr = llvmlite.build_bitcast(builder, new_ptr, nw_ty) if nw_bc is not None: diff --git a/App/lib/core/Gen/Call/CallGenDispatch.vp b/App/lib/core/Gen/Call/CallGenDispatch.vp index 37251bb..030a22a 100644 --- a/App/lib/core/Gen/Call/CallGenDispatch.vp +++ b/App/lib/core/Gen/Call/CallGenDispatch.vp @@ -35,13 +35,13 @@ class CallGenDispatch(CallGenBase.CallGenBase): def _tc_h1_super_ctraits(self, pool: rawptr[memhub.MemBuddy], builder: llvmlite.IRBuilder | t.CPtr, - mod: llvmlite.LLVMModule | t.CPtr, - cl: ast.Call | t.CPtr, + mod: rawptr[llvmlite.LLVMModule], + cl: rawptr[ast.Call], funcs_ptr: t.CPtr, func_count: int, - trans: HT.Translator | t.CPtr, + trans: rawptr[HT.Translator], func_name: str, - cargs: list[ast.AST | t.CPtr] | t.CPtr, + cargs: list[rawptr[ast.AST]] | t.CPtr, can: sizet, hit_box: t.CPtr = None) -> llvmlite.Value | t.CPtr: """super()/ctraits 编译期检测(未命中返回 None) @@ -57,11 +57,11 @@ class CallGenDispatch(CallGenBase.CallGenBase): # 必须在 Attribute 分派前拦截——否则 value 的 Call(super) 被 translate_value # 当作普通函数调用报错,且走普通属性调用会命中自身/虚分派而非父类实现。 if func_name is not None and cl.func is not None and cl.func.kind() == ast.ASTKind.Attribute: - sup_at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(cl.func) + sup_at: rawptr[ast.Attribute] = rawptr[ast.Attribute](cl.func) if sup_at.value is not None and sup_at.value.kind() == ast.ASTKind.Call: - sup_cl: ast.Call | t.CPtr = (ast.Call | t.CPtr)(sup_at.value) + sup_cl: rawptr[ast.Call] = rawptr[ast.Call](sup_at.value) if sup_cl.func is not None and sup_cl.func.kind() == ast.ASTKind.Name: - sup_nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(sup_cl.func) + sup_nm: rawptr[ast.Name] = rawptr[ast.Name](sup_cl.func) if sup_nm.id is not None and string.strcmp(sup_nm.id, "super") == 0: if hit_box is not None: hit_box[0] = 1 @@ -72,16 +72,16 @@ class CallGenDispatch(CallGenBase.CallGenBase): # 直接按变量存储类型返回编译期常量(CIf 求值失败回退或非 CIf 上下文时兜底, # 避免生成跨模块调用 ctraits.isptr 触发"模块未注册 SHA1"误导性报错) if func_name is not None and cl.func is not None and cl.func.kind() == ast.ASTKind.Attribute: - ct_at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(cl.func) + ct_at: rawptr[ast.Attribute] = rawptr[ast.Attribute](cl.func) if ct_at.value is not None and ct_at.value.kind() == ast.ASTKind.Name: - ct_nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(ct_at.value) + ct_nm: rawptr[ast.Name] = rawptr[ast.Name](ct_at.value) if ct_nm.id is not None and string.strcmp(ct_nm.id, "ctraits") == 0 \ and string.strcmp(func_name, "isptr") == 0: - ct_args: list[ast.AST | t.CPtr] | t.CPtr = cl.args + ct_args: list[rawptr[ast.AST]] | t.CPtr = cl.args if ct_args is not None and len(ct_args) >= 1: - ct_arg0: ast.AST | t.CPtr = ct_args.get(0) + ct_arg0: rawptr[ast.AST] = ct_args.get(0) if ct_arg0 is not None and ct_arg0.kind() == ast.ASTKind.Name: - ct_nm0: ast.Name | t.CPtr = (ast.Name | t.CPtr)(ct_arg0) + ct_nm0: rawptr[ast.Name] = rawptr[ast.Name](ct_arg0) if ct_nm0.id is not None and trans is not None: ct_r: int = self.Gen.StmtGenCif._eval_ctraits_isptr(trans.SymTab, ct_nm0.id) if ct_r > 0: @@ -91,13 +91,13 @@ class CallGenDispatch(CallGenBase.CallGenBase): def _tc_h2_c_special(self, pool: rawptr[memhub.MemBuddy], builder: llvmlite.IRBuilder | t.CPtr, - mod: llvmlite.LLVMModule | t.CPtr, - cl: ast.Call | t.CPtr, + mod: rawptr[llvmlite.LLVMModule], + cl: rawptr[ast.Call], funcs_ptr: t.CPtr, func_count: int, - trans: HT.Translator | t.CPtr, + trans: rawptr[HT.Translator], func_name: str, - cargs: list[ast.AST | t.CPtr] | t.CPtr, + cargs: list[rawptr[ast.AST]] | t.CPtr, can: sizet, hit_box: t.CPtr = None) -> llvmlite.Value | t.CPtr: """c.Deref/Asm/LLVMIR 等特殊调用(未命中返回 None) @@ -110,9 +110,9 @@ class CallGenDispatch(CallGenBase.CallGenBase): # 检测 c.Deref / c.DerefAs / c.Addr 等特殊调用(内联 IR,不生成 call) # 及 coro.* 协程库拦截(coro.coro_run 内联翻译,TPV-M1) if cl.func is not None and cl.func.kind() == ast.ASTKind.Attribute: - at_node: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(cl.func) + at_node: rawptr[ast.Attribute] = rawptr[ast.Attribute](cl.func) if at_node.value is not None and at_node.value.kind() == ast.ASTKind.Name: - mod_nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(at_node.value) + mod_nm: rawptr[ast.Name] = rawptr[ast.Name](at_node.value) is_coro_mod: int = 0 if mod_nm.id is not None and string.strcmp(mod_nm.id, "coro") == 0: is_coro_mod = 1 @@ -146,7 +146,7 @@ class CallGenDispatch(CallGenBase.CallGenBase): elif string.strcmp(func_name, "CIf") == 0: # 运行时 c.CIf(expr)(编译期求值失败回退):expr 与 0 比较得到 i1 # 对齐 TPC HandlesExprCall.py L2434-2444 - cif_args: list[ast.AST | t.CPtr] | t.CPtr = cl.args + cif_args: list[rawptr[ast.AST]] | t.CPtr = cl.args if cif_args is not None and len(cif_args) >= 1: cif_arg_val: llvmlite.Value | t.CPtr = self.Gen.ExprGen.translate_value( builder, pool, mod, cif_args.get(0), funcs_ptr, func_count, trans) @@ -195,13 +195,13 @@ class CallGenDispatch(CallGenBase.CallGenBase): def _tc_h3_stdarg_cast(self, pool: rawptr[memhub.MemBuddy], builder: llvmlite.IRBuilder | t.CPtr, - mod: llvmlite.LLVMModule | t.CPtr, - cl: ast.Call | t.CPtr, + mod: rawptr[llvmlite.LLVMModule], + cl: rawptr[ast.Call], funcs_ptr: t.CPtr, func_count: int, - trans: HT.Translator | t.CPtr, + trans: rawptr[HT.Translator], func_name: str, - cargs: list[ast.AST | t.CPtr] | t.CPtr, + cargs: list[rawptr[ast.AST]] | t.CPtr, can: sizet) -> llvmlite.Value | t.CPtr: """stdarg 糖 + str/int/bool 内置强转(未命中返回 None)""" # stdarg 糖函数处理: va_arg / arg / va_start / va_end @@ -240,7 +240,7 @@ class CallGenDispatch(CallGenBase.CallGenBase): cast_arg: llvmlite.Value | t.CPtr = self.Gen.ExprGen.translate_value( builder, pool, mod, cargs.get(0), funcs_ptr, func_count, trans) if cast_arg is not None: - i8_ptr_ty_builtin: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, llvmlite.Int8(pool)) + i8_ptr_ty_builtin: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, llvmlite.Int8(pool)) return self.Gen.CallGenCtor._translate_t_type_cast(pool, builder, cast_arg, i8_ptr_ty_builtin) return None elif string.strcmp(cast_fn_name, "int") == 0: @@ -248,7 +248,7 @@ class CallGenDispatch(CallGenBase.CallGenBase): cast_arg_int: llvmlite.Value | t.CPtr = self.Gen.ExprGen.translate_value( builder, pool, mod, cargs.get(0), funcs_ptr, func_count, trans) if cast_arg_int is not None: - i32_ty_builtin: llvmlite.LLVMType | t.CPtr = llvmlite.Int32(pool) + i32_ty_builtin: rawptr[llvmlite.LLVMType] = llvmlite.Int32(pool) return self.Gen.CallGenCtor._translate_t_type_cast(pool, builder, cast_arg_int, i32_ty_builtin) return None elif string.strcmp(cast_fn_name, "bool") == 0: @@ -269,7 +269,7 @@ class CallGenDispatch(CallGenBase.CallGenBase): return None # 浮点: fcmp one x, 0.0 if arg_fbits != 0: - zero_ty: llvmlite.LLVMType | t.CPtr = cast_arg_bool.Ty + zero_ty: rawptr[llvmlite.LLVMType] = cast_arg_bool.Ty zero_flt: llvmlite.Value | t.CPtr = llvmlite.ConstFloat(pool, zero_ty, 0.0) if zero_flt is not None: return llvmlite.build_fcmp(builder, llvmlite.FCMP_ONE, cast_arg_bool, zero_flt) @@ -284,13 +284,13 @@ class CallGenDispatch(CallGenBase.CallGenBase): def _tc_h4_type_casts(self, pool: rawptr[memhub.MemBuddy], builder: llvmlite.IRBuilder | t.CPtr, - mod: llvmlite.LLVMModule | t.CPtr, - cl: ast.Call | t.CPtr, + mod: rawptr[llvmlite.LLVMModule], + cl: rawptr[ast.Call], funcs_ptr: t.CPtr, func_count: int, - trans: HT.Translator | t.CPtr, + trans: rawptr[HT.Translator], func_name: str, - cargs: list[ast.AST | t.CPtr] | t.CPtr, + cargs: list[rawptr[ast.AST]] | t.CPtr, can: sizet) -> llvmlite.Value | t.CPtr: """t.XXX / typedef 类型转换(未命中返回 None)""" # 检测 t.XXX 类型转换: uint64(ptr), t.CPtr(val), int(val) 等 @@ -300,9 +300,9 @@ class CallGenDispatch(CallGenBase.CallGenBase): # 双参数: int(val, t.CPtr) → 目标类型 = Ptr(map_t_type(func_name)) # t 是内部库,一旦确认为类型转换,绝不跌落到跨模块调用 FATAL 路径 if cl.func is not None and cl.func.kind() == ast.ASTKind.Attribute: - tc_at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(cl.func) + tc_at: rawptr[ast.Attribute] = rawptr[ast.Attribute](cl.func) if tc_at.value is not None and tc_at.value.kind() == ast.ASTKind.Name: - tc_mod_nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(tc_at.value) + tc_mod_nm: rawptr[ast.Name] = rawptr[ast.Name](tc_at.value) if tc_mod_nm.id is not None and string.strcmp(tc_mod_nm.id, "t") == 0: # t.CType 特殊形式:t.CType(value, TypeName, t.CPtr) → # 把 value 转为 TypeName|t.CPtr(TypeName* 指针)。TypeName @@ -311,8 +311,8 @@ class CallGenDispatch(CallGenBase.CallGenBase): # (VKernel mm.vp merge_blocks 根因)。CType 不是 map_t_type # 的具名类型,须在此显式处理,否则跌落到跨模块 FATAL。 if string.strcmp(func_name, "CType") == 0 and can >= 2: - cty_node: ast.AST | t.CPtr = cargs.get(1) - ctype_target: llvmlite.LLVMType | t.CPtr = None + cty_node: rawptr[ast.AST] = cargs.get(1) + ctype_target: rawptr[llvmlite.LLVMType] = None if cty_node is not None: cti_imp: str = None cti_fi: str = None @@ -323,20 +323,20 @@ class CallGenDispatch(CallGenBase.CallGenBase): pool, cty_node, cti_imp, cti_fi, trans, 0) if ctype_target is not None: if can == 3: - cty_arg3: ast.AST | t.CPtr = cargs.get(2) + cty_arg3: rawptr[ast.AST] = cargs.get(2) cty_is_cptr: int = 0 if cty_arg3 is not None: # 形式 1: t.CPtr(Attribute) if cty_arg3.kind() == ast.ASTKind.Attribute: - cty_at3: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(cty_arg3) + cty_at3: rawptr[ast.Attribute] = rawptr[ast.Attribute](cty_arg3) if cty_at3.attr is not None and string.strcmp(cty_at3.attr, "CPtr") == 0: if cty_at3.value is not None and cty_at3.value.kind() == ast.ASTKind.Name: - cty_nm3: ast.Name | t.CPtr = (ast.Name | t.CPtr)(cty_at3.value) + cty_nm3: rawptr[ast.Name] = rawptr[ast.Name](cty_at3.value) if cty_nm3.id is not None and string.strcmp(cty_nm3.id, "t") == 0: cty_is_cptr = 1 # 形式 2: 裸名 CPtr elif cty_arg3.kind() == ast.ASTKind.Name: - cty_bn3: ast.Name | t.CPtr = (ast.Name | t.CPtr)(cty_arg3) + cty_bn3: rawptr[ast.Name] = rawptr[ast.Name](cty_arg3) if cty_bn3.id is not None and string.strcmp(cty_bn3.id, "CPtr") == 0: cty_is_cptr = 1 if cty_is_cptr != 0: @@ -347,7 +347,7 @@ class CallGenDispatch(CallGenBase.CallGenBase): case _: pass ctype_target = llvmlite.Ptr(pool, ctype_target) - cty_arg0: ast.AST | t.CPtr = cargs.get(0) + cty_arg0: rawptr[ast.AST] = cargs.get(0) if cty_arg0 is not None: cty_val: llvmlite.Value | t.CPtr = self.Gen.ExprGen.translate_value( builder, pool, mod, cty_arg0, funcs_ptr, func_count, trans) @@ -367,7 +367,7 @@ class CallGenDispatch(CallGenBase.CallGenBase): # 直接返回原值。 if string.strcmp(func_name, "CConst") == 0: if can >= 2: - cconst_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr( + cconst_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr( pool, llvmlite.Int8(pool)) cconst_arg: llvmlite.Value | t.CPtr = self.Gen.ExprGen.translate_value( builder, pool, mod, cargs.get(0), funcs_ptr, func_count, trans) @@ -379,26 +379,26 @@ class CallGenDispatch(CallGenBase.CallGenBase): return self.Gen.ExprGen.translate_value( builder, pool, mod, cargs.get(0), funcs_ptr, func_count, trans) return None - target_ty: llvmlite.LLVMType | t.CPtr = self.Gen.TypeGenResolve.map_t_type(pool, func_name) + target_ty: rawptr[llvmlite.LLVMType] = self.Gen.TypeGenResolve.map_t_type(pool, func_name) if target_ty is not None: tc_effective_can: sizet = can # 双参数形式: int(val, t.CPtr) → Ptr(target_ty) # 注意: void* 在 LLVM 中非法,CVoid* 应表示为 i8* if can == 2: - tc_arg2_node: ast.AST | t.CPtr = cargs.get(1) + tc_arg2_node: rawptr[ast.AST] = cargs.get(1) tc_arg2_is_cptr: int = 0 if tc_arg2_node is not None: # 形式 1: t.CPtr(Attribute 形式) if tc_arg2_node.kind() == ast.ASTKind.Attribute: - tc_arg2_at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(tc_arg2_node) + tc_arg2_at: rawptr[ast.Attribute] = rawptr[ast.Attribute](tc_arg2_node) if tc_arg2_at.attr is not None and string.strcmp(tc_arg2_at.attr, "CPtr") == 0: if tc_arg2_at.value is not None and tc_arg2_at.value.kind() == ast.ASTKind.Name: - tc_arg2_nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(tc_arg2_at.value) + tc_arg2_nm: rawptr[ast.Name] = rawptr[ast.Name](tc_arg2_at.value) if tc_arg2_nm.id is not None and string.strcmp(tc_arg2_nm.id, "t") == 0: tc_arg2_is_cptr = 1 # 形式 2: 裸名 CPtr(from t import CPtr 后直接使用,如 t.CXXX(x, CPtr)) elif tc_arg2_node.kind() == ast.ASTKind.Name: - tc_arg2_bn: ast.Name | t.CPtr = (ast.Name | t.CPtr)(tc_arg2_node) + tc_arg2_bn: rawptr[ast.Name] = rawptr[ast.Name](tc_arg2_node) if tc_arg2_bn.id is not None and string.strcmp(tc_arg2_bn.id, "CPtr") == 0: tc_arg2_is_cptr = 1 if tc_arg2_is_cptr != 0: @@ -411,7 +411,7 @@ class CallGenDispatch(CallGenBase.CallGenBase): target_ty = llvmlite.Ptr(pool, target_ty) tc_effective_can = 1 if tc_effective_can == 1: - tc_arg_node: ast.AST | t.CPtr = cargs.get(0) + tc_arg_node: rawptr[ast.AST] = cargs.get(0) if tc_arg_node is not None: # 第 8 参 target_ty 必须下传:否则常量在 # translate_constant 里按「是否超出 i32 范围」选位宽, @@ -432,17 +432,17 @@ class CallGenDispatch(CallGenBase.CallGenBase): # L130 posix.mode_t(mode) 根因)。typedef 名做类型转换(与裸名 BYTEPTR(x) # 对齐);非 typedef 名继续走模块函数调用。 if cl.func is not None and cl.func.kind() == ast.ASTKind.Attribute: - mt_at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(cl.func) + mt_at: rawptr[ast.Attribute] = rawptr[ast.Attribute](cl.func) if mt_at.value is not None and mt_at.value.kind() == ast.ASTKind.Name: - mt_mod_nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(mt_at.value) + mt_mod_nm: rawptr[ast.Name] = rawptr[ast.Name](mt_at.value) if mt_mod_nm.id is not None and string.strcmp(mt_mod_nm.id, "t") != 0 \ and string.strcmp(mt_mod_nm.id, "c") != 0: - mod_td_ty: llvmlite.LLVMType | t.CPtr = self.Gen.TypeGenResolve.map_t_type( + mod_td_ty: rawptr[llvmlite.LLVMType] = self.Gen.TypeGenResolve.map_t_type( pool, func_name) if mod_td_ty is None: mod_td_str: str = self.Gen.TypeGenCType.lookup_ctypedef(func_name) if mod_td_str is not None and self.Gen.TypeGenCType.is_ctypedef_found() != 0: - mod_td_ast: ast.AST | t.CPtr = self.Gen.TypeGenResolve._parse_type_string( + mod_td_ast: rawptr[ast.AST] = self.Gen.TypeGenResolve._parse_type_string( pool, mod_td_str, 0) if mod_td_ast is not None: mod_imp_td: str = None @@ -469,7 +469,7 @@ class CallGenDispatch(CallGenBase.CallGenBase): # self.value = T(v)、combine[T1,T2] 的 T1(b) 依赖此路径) if cl.func is not None and cl.func.kind() == ast.ASTKind.Name: bare_fn_name: str = self.Gen.TypeGenBase.resolve_generic_type_name(func_name) - bare_ty: llvmlite.LLVMType | t.CPtr = None + bare_ty: rawptr[llvmlite.LLVMType] = None # 泛型上下文解析出的内建名(如 T→"double"/"float"):map_t_type 只认 t.CDouble, # 且 float 必须映射 t.CFloat(f32)而非 f64(与注解语义一致) if string.strcmp(bare_fn_name, "double") == 0: @@ -490,7 +490,7 @@ class CallGenDispatch(CallGenBase.CallGenBase): # 回退用 resolve_annotation_type 解析(支持 t.CXxx / 结构体类名 / 别名等)。 # GenericTest4 Box[int].__init__ 的 self.value = T(v) 依赖此路径。 if bare_ty is None and string.strcmp(bare_fn_name, func_name) != 0: - gp_ast: ast.AST | t.CPtr = self.Gen.TypeGenResolve._parse_type_string(pool, bare_fn_name, 0) + gp_ast: rawptr[ast.AST] = self.Gen.TypeGenResolve._parse_type_string(pool, bare_fn_name, 0) if gp_ast is not None: imp_gp: str = None fi_gp: str = None @@ -504,20 +504,20 @@ class CallGenDispatch(CallGenBase.CallGenBase): # typed_ptr = T(offset, t.CPtr) 依赖此路径,否则双参数不进 # can==1 单参数分支 → 跌落到"裸名调用未定义"误报) if bare_ty is not None and can == 2: - bare_arg2_node: ast.AST | t.CPtr = cargs.get(1) + bare_arg2_node: rawptr[ast.AST] = cargs.get(1) bare_arg2_is_cptr: int = 0 if bare_arg2_node is not None: # 形式 1: t.CPtr(Attribute 形式) if bare_arg2_node.kind() == ast.ASTKind.Attribute: - bare_arg2_at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(bare_arg2_node) + bare_arg2_at: rawptr[ast.Attribute] = rawptr[ast.Attribute](bare_arg2_node) if bare_arg2_at.attr is not None and string.strcmp(bare_arg2_at.attr, "CPtr") == 0: if bare_arg2_at.value is not None and bare_arg2_at.value.kind() == ast.ASTKind.Name: - bare_arg2_nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(bare_arg2_at.value) + bare_arg2_nm: rawptr[ast.Name] = rawptr[ast.Name](bare_arg2_at.value) if bare_arg2_nm.id is not None and string.strcmp(bare_arg2_nm.id, "t") == 0: bare_arg2_is_cptr = 1 # 形式 2: 裸名 CPtr(from t import CPtr 后直接使用) elif bare_arg2_node.kind() == ast.ASTKind.Name: - bare_arg2_bn: ast.Name | t.CPtr = (ast.Name | t.CPtr)(bare_arg2_node) + bare_arg2_bn: rawptr[ast.Name] = rawptr[ast.Name](bare_arg2_node) if bare_arg2_bn.id is not None and string.strcmp(bare_arg2_bn.id, "CPtr") == 0: bare_arg2_is_cptr = 1 if bare_arg2_is_cptr != 0: @@ -528,7 +528,7 @@ class CallGenDispatch(CallGenBase.CallGenBase): case _: pass bare_ty = llvmlite.Ptr(pool, bare_ty) - bare_arg_node: ast.AST | t.CPtr = cargs.get(0) + bare_arg_node: rawptr[ast.AST] = cargs.get(0) if bare_arg_node is not None: bare_arg_val: llvmlite.Value | t.CPtr = self.Gen.ExprGen.translate_value( builder, pool, mod, bare_arg_node, None, 0, trans, bare_ty) @@ -537,7 +537,7 @@ class CallGenDispatch(CallGenBase.CallGenBase): pool, builder, bare_arg_val, bare_ty, bare_arg_node, trans) if bare_ty is not None and can == 1: - bare_arg_node: ast.AST | t.CPtr = cargs.get(0) + bare_arg_node: rawptr[ast.AST] = cargs.get(0) if bare_arg_node is not None: # 第 8 参 target_ty 下传:裸名 typedef 强转(如 uint64(x))的 # 目标位宽必须参与常量物化(N1)。 @@ -552,36 +552,36 @@ class CallGenDispatch(CallGenBase.CallGenBase): def _tc_h5_sizeof_len_isinst(self, pool: rawptr[memhub.MemBuddy], builder: llvmlite.IRBuilder | t.CPtr, - mod: llvmlite.LLVMModule | t.CPtr, - cl: ast.Call | t.CPtr, + mod: rawptr[llvmlite.LLVMModule], + cl: rawptr[ast.Call], funcs_ptr: t.CPtr, func_count: int, - trans: HT.Translator | t.CPtr, + trans: rawptr[HT.Translator], func_name: str, - cargs: list[ast.AST | t.CPtr] | t.CPtr, + cargs: list[rawptr[ast.AST]] | t.CPtr, can: sizet) -> llvmlite.Value | t.CPtr: """__sizeof__/len/isinstance 内置(未命中返回 None)""" # 检测 ClassName.__sizeof__() — 返回结构体大小常量(i64) # __sizeof__ 是内置方法,不走跨模块调用路径 # 支持: Argument.__sizeof__() 和 w32.win32file.WIN32_FIND_DATAA.__sizeof__() if cl.func is not None and cl.func.kind() == ast.ASTKind.Attribute: - sz_at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(cl.func) + sz_at: rawptr[ast.Attribute] = rawptr[ast.Attribute](cl.func) if sz_at.attr is not None and string.strcmp(sz_at.attr, "__sizeof__") == 0: if sz_at.value is not None and can == 0: sz_cls_name: str = None sz_vk: int = sz_at.value.kind() if sz_vk == ast.ASTKind.Name: - sz_cls_nm2: ast.Name | t.CPtr = (ast.Name | t.CPtr)(sz_at.value) + sz_cls_nm2: rawptr[ast.Name] = rawptr[ast.Name](sz_at.value) sz_cls_name = sz_cls_nm2.id elif sz_vk == ast.ASTKind.Attribute: - sz_inner_at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(sz_at.value) + sz_inner_at: rawptr[ast.Attribute] = rawptr[ast.Attribute](sz_at.value) sz_cls_name = sz_inner_at.attr # 保留完整模块路径(w32.win32base.SECURITY_ATTRIBUTES): # 仅取 attr 会在后续 get_struct_type 裸名全局匹配时误命中 # 跨模块同名类(SECURITY_ATTRIBUTES FieldCount=0 根因)。 if sz_inner_at.value is not None and sz_inner_at.attr is not None: if sz_inner_at.value.kind() == ast.ASTKind.Name: - sz_inner_nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(sz_inner_at.value) + sz_inner_nm: rawptr[ast.Name] = rawptr[ast.Name](sz_inner_at.value) if sz_inner_nm.id is not None: sz_full_len: sizet = string.strlen(sz_inner_nm.id) + 1 + string.strlen(sz_inner_at.attr) + 1 sz_full_buf: str = pool.alloc(sz_full_len) @@ -603,7 +603,7 @@ class CallGenDispatch(CallGenBase.CallGenBase): string.strcat(sz_full_buf2, sz_inner_at.attr) sz_cls_name = sz_full_buf2 # 最终解析出的结构体类型:类型名命中 → 泛型特化(Stack[T])→ 实例接收者类型(self/obj) - sz_resolved_ty: llvmlite.LLVMType | t.CPtr = None + sz_resolved_ty: rawptr[llvmlite.LLVMType] = None sz_resolved_name: str = sz_cls_name if sz_cls_name is not None: # 泛型类型参数 T 替换: T.__sizeof__() → int.__sizeof__() @@ -730,9 +730,9 @@ class CallGenDispatch(CallGenBase.CallGenBase): # 回退 1: 泛型类引用接收者 Stack[T].__sizeof__() — Subscript → 特化后计算大小 # (GenericTest2 Stack.type_size 依赖此路径) if sz_resolved_ty is None and trans is not None and sz_vk == ast.ASTKind.Subscript: - sub_sz: ast.Subscript | t.CPtr = (ast.Subscript | t.CPtr)(sz_at.value) + sub_sz: rawptr[ast.Subscript] = rawptr[ast.Subscript](sz_at.value) if sub_sz.value is not None and sub_sz.value.kind() == ast.ASTKind.Name: - gen_nm_sz: ast.Name | t.CPtr = (ast.Name | t.CPtr)(sub_sz.value) + gen_nm_sz: rawptr[ast.Name] = rawptr[ast.Name](sub_sz.value) if gen_nm_sz.id is not None: gen_args_sz: list[str] | t.CPtr = self.Gen.CallGenCtor._extract_type_args_from_slice(pool, sub_sz.slice, trans._from_imports) if gen_args_sz is not None and len(gen_args_sz) > 0: @@ -798,7 +798,7 @@ class CallGenDispatch(CallGenBase.CallGenBase): # 可能是 Attribute 节点(如 md_ags.args),translate_name_value 只处理 Name 节点, # 对 Attribute 会错误返回 i32 0,导致 GEP base 不是指针(base of getelementptr must be a pointer) if cl.func is not None and cl.func.kind() == ast.ASTKind.Attribute: - len_at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(cl.func) + len_at: rawptr[ast.Attribute] = rawptr[ast.Attribute](cl.func) if len_at.attr is not None and string.strcmp(len_at.attr, "__len__") == 0: if len_at.value is not None and can == 0: obj_val: llvmlite.Value | t.CPtr = self.Gen.ExprGen.translate_value( @@ -812,7 +812,7 @@ class CallGenDispatch(CallGenBase.CallGenBase): # 类型推断失败(非指针/结构体):fail-fast,绝不返回 0 掩盖错误 self.Gen.TypeGenErr.fatal_error( len_at.value, "len() 参数类型推断失败(非指针/结构体)", "TypeError") - i64_ty_len: llvmlite.LLVMType | t.CPtr = llvmlite.Int64(pool) + i64_ty_len: rawptr[llvmlite.LLVMType] = llvmlite.Int64(pool) # 注意: 必须用 const_int64 而非 ConstInt(...,"0") # ConstInt 的 name 参数 "0" 会被当作 IR 文本值输出 i64 0 # 导致 GEP 索引为 0(访问 __data__)而非 1(访问 __count__) @@ -827,7 +827,7 @@ class CallGenDispatch(CallGenBase.CallGenBase): if cl.func is not None and cl.func.kind() == ast.ASTKind.Name: if func_name is not None and string.strcmp(func_name, "len") == 0: if can == 1: - len_arg_node: ast.AST | t.CPtr = cargs.get(0) + len_arg_node: rawptr[ast.AST] = cargs.get(0) if len_arg_node is not None: len_val: llvmlite.Value | t.CPtr = self.Gen.ExprGen.translate_value( builder, pool, mod, len_arg_node, None, 0, trans) @@ -841,7 +841,7 @@ class CallGenDispatch(CallGenBase.CallGenBase): len_arr_n: int = 0 if len_val.Ty is not None: if self.Gen.ExprGenBase.is_ptr_type(len_val.Ty) != 0: - len_ap: llvmlite.LLVMType | t.CPtr = len_val.Ty.Pointee + len_ap: rawptr[llvmlite.LLVMType] = len_val.Ty.Pointee if len_ap is not None: match len_ap: case llvmlite.LLVMType.Array(_, len_arr_cnt): @@ -866,7 +866,7 @@ class CallGenDispatch(CallGenBase.CallGenBase): # - 普通类:调用 {Class}.__len__ 函数 # - 都没有:fatal_error # str(Ptr(Int8))保持 strlen(内建语义)。 - len_struct_ty: llvmlite.LLVMType | t.CPtr = \ + len_struct_ty: rawptr[llvmlite.LLVMType] = \ self.Gen.StructGen.get_struct_type_from_value(len_val) if len_struct_ty is not None: len_cls_nm: str = self.Gen.StructGen.get_class_name_by_type( @@ -879,7 +879,7 @@ class CallGenDispatch(CallGenBase.CallGenBase): # 判据优先取接收者实际类型(_is_list_builtin_receiver) if self.Gen.CallGenProp._is_list_builtin_receiver( pool, len_val, len_cls_nm, "__len__", len_arg_node) != 0: - i64_ty_lb: llvmlite.LLVMType | t.CPtr = llvmlite.Int64(pool) + i64_ty_lb: rawptr[llvmlite.LLVMType] = llvmlite.Int64(pool) idx_one_lb: llvmlite.Value | t.CPtr = llvmlite.const_int64(pool, 1) cnt_ptr_lb: llvmlite.Value | t.CPtr = llvmlite.build_gep( builder, i64_ty_lb, len_val, idx_one_lb) @@ -888,10 +888,10 @@ class CallGenDispatch(CallGenBase.CallGenBase): len_lookup: str = pool.alloc(128) if len_lookup is not None: viperlib.snprintf(len_lookup, 128, "%s.__len__", len_cls_nm) - len_fn2: llvmlite.Function | t.CPtr = self.find_func_in_module( + len_fn2: rawptr[llvmlite.Function] = self.find_func_in_module( mod, len_lookup) if len_fn2 is not None: - len_ret_ty2: llvmlite.LLVMType | t.CPtr = \ + len_ret_ty2: rawptr[llvmlite.LLVMType] = \ llvmlite.function_get_ret_ty(len_fn2) len_fn_name2: str = \ llvmlite.function_get_name(len_fn2) @@ -901,7 +901,7 @@ class CallGenDispatch(CallGenBase.CallGenBase): len_first_param2: llvmlite.Param | t.CPtr = \ llvmlite.function_get_param_head(len_fn2) if len_first_param2 is not None: - len_self_ty2: llvmlite.LLVMType | t.CPtr = \ + len_self_ty2: rawptr[llvmlite.LLVMType] = \ llvmlite.param_get_ty(len_first_param2) if len_self_ty2 is not None and len_val.Ty is not None: len_self_arg2 = llvmlite.build_bitcast( @@ -928,7 +928,7 @@ class CallGenDispatch(CallGenBase.CallGenBase): if len_mangled_x is not None: viperlib.snprintf(len_mangled_x, len_ml_x, "%s.%s.__len__", len_cls_sha1_x, len_cls_nm) - len_ret_x: llvmlite.LLVMType | t.CPtr = \ + len_ret_x: rawptr[llvmlite.LLVMType] = \ self._LookupMethodRetTyFromTextLL( pool, len_cls_sha1_x, len_cls_nm, "__len__") if len_ret_x is None: @@ -952,7 +952,7 @@ class CallGenDispatch(CallGenBase.CallGenBase): f"len() 参数类型 '{len_cls_nm}' 没有 __len__ 方法", "TypeError") # 非结构体:str(Ptr(Int8))走 strlen;其它类型 fail-fast - len_arg_ty: llvmlite.LLVMType | t.CPtr = llvmlite.value_get_ty(len_val) + len_arg_ty: rawptr[llvmlite.LLVMType] = llvmlite.value_get_ty(len_val) len_is_str: int = 0 if len_arg_ty is not None and self.Gen.ExprGenBase.is_ptr_type(len_arg_ty) != 0: match len_arg_ty: @@ -968,21 +968,21 @@ class CallGenDispatch(CallGenBase.CallGenBase): pass if len_is_str != 0: # 确保 strlen 在模块中有声明 - strlen_fn: llvmlite.Function | t.CPtr = self.find_func_in_module(mod, "strlen") + strlen_fn: rawptr[llvmlite.Function] = self.find_func_in_module(mod, "strlen") if strlen_fn is None: - i64_ty_ln: llvmlite.LLVMType | t.CPtr = llvmlite.Int64(pool) - i8_ptr_ty_ln: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, llvmlite.Int8(pool)) + i64_ty_ln: rawptr[llvmlite.LLVMType] = llvmlite.Int64(pool) + i8_ptr_ty_ln: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, llvmlite.Int8(pool)) strlen_fn = llvmlite.create_declare(pool, mod, "strlen", i64_ty_ln) if strlen_fn is not None: llvmlite.add_param(pool, strlen_fn, i8_ptr_ty_ln, "s") # 参数类型转换为 i8* - i8_ptr_ty_ln2: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, llvmlite.Int8(pool)) + i8_ptr_ty_ln2: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, llvmlite.Int8(pool)) len_coerced: llvmlite.Value | t.CPtr = len_val if self.Gen.ExprGenBase.is_ptr_type(len_arg_ty) != 0: len_coerced = llvmlite.build_bitcast(builder, len_val, i8_ptr_ty_ln2) # 构建单参数链表并调用 strlen len_coerced.Next = None - i64_ty_ln2: llvmlite.LLVMType | t.CPtr = llvmlite.Int64(pool) + i64_ty_ln2: rawptr[llvmlite.LLVMType] = llvmlite.Int64(pool) return llvmlite.build_call(builder, "strlen", len_coerced, 1, i64_ty_ln2, 0) # fail-fast:非字符串/数组/对象,无法求长度 self.Gen.TypeGenErr.fatal_error( @@ -1004,13 +1004,13 @@ class CallGenDispatch(CallGenBase.CallGenBase): def _tc_h6_method_dispatch(self, pool: rawptr[memhub.MemBuddy], builder: llvmlite.IRBuilder | t.CPtr, - mod: llvmlite.LLVMModule | t.CPtr, - cl: ast.Call | t.CPtr, + mod: rawptr[llvmlite.LLVMModule], + cl: rawptr[ast.Call], funcs_ptr: t.CPtr, func_count: int, - trans: HT.Translator | t.CPtr, + trans: rawptr[HT.Translator], func_name: str, - cargs: list[ast.AST | t.CPtr] | t.CPtr, + cargs: list[rawptr[ast.AST]] | t.CPtr, can: sizet, hit_box: t.CPtr = None) -> llvmlite.Value | t.CPtr: """静态类/方法调用/表达式接收者/self.field/list 内置(未命中返回 None) @@ -1026,17 +1026,17 @@ class CallGenDispatch(CallGenBase.CallGenBase): # 兜底误绑到 ast.AST.kind(this 偏移,语义错误)。此处直接翻译为 # bitcast obj 到 i32* + load —— 零函数调用,返回变体 tag。 if cl.func is not None and cl.func.kind() == ast.ASTKind.Attribute: - rk_at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(cl.func) + rk_at: rawptr[ast.Attribute] = rawptr[ast.Attribute](cl.func) if rk_at is not None and rk_at.attr is not None \ and string.strcmp(rk_at.attr, "kind") == 0: rk_obj: llvmlite.Value | t.CPtr = self.Gen.ExprGen.translate_value( builder, pool, mod, rk_at.value, None, 0, trans) if rk_obj is not None and rk_obj.Ty is not None: - rk_ty: llvmlite.LLVMType | t.CPtr = rk_obj.Ty + rk_ty: rawptr[llvmlite.LLVMType] = rk_obj.Ty rk_load: int = 0 rk_cls: str = None if self.Gen.ExprGenBase.is_ptr_type(rk_ty) != 0: - rk_pointee: llvmlite.LLVMType | t.CPtr = rk_ty.Pointee + rk_pointee: rawptr[llvmlite.LLVMType] = rk_ty.Pointee # 联合简化双指针(Ptr(Ptr(Struct)))→ 解一层 + load if rk_pointee is not None \ and self.Gen.ExprGenBase.is_ptr_type(rk_pointee) != 0: @@ -1047,12 +1047,12 @@ class CallGenDispatch(CallGenBase.CallGenBase): and self.Gen.ClassGenEnum._is_renum_class_name(rk_cls) == 0: rk_cls = None # 注解兜底:联合简化/退化后运行时类型丢失(如 - # resolved: llvmlite.LLVMType | t.CPtr 存 i8*,pointee 非 + # resolved: rawptr[llvmlite.LLVMType] 存 i8*,pointee 非 # 结构体),用变量注解类名识别 REnum 类(kind() 语义: # 读 __tag,bitcast 对象到 i32* + load)。 if rk_cls is None and rk_at.value is not None \ and rk_at.value.kind() == ast.ASTKind.Name and trans is not None: - rk_nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(rk_at.value) + rk_nm: rawptr[ast.Name] = rawptr[ast.Name](rk_at.value) if rk_nm.id is not None: rk_ve: GenTypes.VarEntry | t.CPtr = self.Gen.VarGen.lookup_var_entry( trans.SymTab, rk_nm.id) @@ -1082,7 +1082,7 @@ class CallGenDispatch(CallGenBase.CallGenBase): if rk_val is not None: if hit_box is not None: hit_box[0] = 1 - rk_i32p: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr( + rk_i32p: rawptr[llvmlite.LLVMType] = llvmlite.Ptr( pool, llvmlite.Int32(pool)) rk_cast: llvmlite.Value | t.CPtr = llvmlite.build_bitcast( builder, rk_val, rk_i32p) @@ -1091,10 +1091,10 @@ class CallGenDispatch(CallGenBase.CallGenBase): # 当 cl.func 是 Attribute、value 是已注册结构体类名(非普通变量)时, # 且方法带 @staticmethod/@classmethod 元数据,走静态调用路径 if cl.func is not None and cl.func.kind() == ast.ASTKind.Attribute: - st_at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(cl.func) + st_at: rawptr[ast.Attribute] = rawptr[ast.Attribute](cl.func) if st_at is not None and st_at.value is not None and trans is not None: if st_at.value.kind() == ast.ASTKind.Name: - st_nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(st_at.value) + st_nm: rawptr[ast.Name] = rawptr[ast.Name](st_at.value) if st_nm.id is not None: st_var: llvmlite.Value | t.CPtr = self.Gen.VarGen.lookup_var( trans.SymTab, st_nm.id) @@ -1141,7 +1141,7 @@ class CallGenDispatch(CallGenBase.CallGenBase): # 此前未检测 → 走通用路径把 method_name 当裸函数解析, # 生成 call i32 @from_long(无类名/SHA1 前缀)→ 链接 # undefined reference(CPythonTest PyLongObj.from_long 根因) - st_at2: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(st_at.value) + st_at2: rawptr[ast.Attribute] = rawptr[ast.Attribute](st_at.value) if st_at2 is not None and st_at2.attr is not None and st_at2.value is not None: if st_at2.value.kind() == ast.ASTKind.Name: # ClassName 是已注册结构体类名时尝试静态/类方法 @@ -1154,7 +1154,7 @@ class CallGenDispatch(CallGenBase.CallGenBase): # 检测方法调用: obj.method(args) # 当 cl.func 是 Attribute 且 obj 是已注册的结构体变量时,翻译为方法调用 if cl.func is not None and cl.func.kind() == ast.ASTKind.Attribute: - method_at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(cl.func) + method_at: rawptr[ast.Attribute] = rawptr[ast.Attribute](cl.func) if method_at is not None and method_at.value is not None: # 链式方法调用: a.b().c() —— value 是内层 Call(如 gfx.vp 的 # eye.Sub(target).Norm())。此前未处理 → 外层 .Norm() 的 value @@ -1164,7 +1164,7 @@ class CallGenDispatch(CallGenBase.CallGenBase): recv_val_c: llvmlite.Value | t.CPtr = self.Gen.ExprGen.translate_value( builder, pool, mod, method_at.value, None, 0, trans) if recv_val_c is not None and recv_val_c.Ty is not None: - recv_ty_c: llvmlite.LLVMType | t.CPtr = recv_val_c.Ty + recv_ty_c: rawptr[llvmlite.LLVMType] = recv_val_c.Ty if self.Gen.ExprGenBase.is_ptr_type(recv_ty_c) != 0: recv_ty_c = recv_ty_c.Pointee # 堆对象(@t.Object)双指针 → 再解一层取 struct @@ -1188,7 +1188,7 @@ class CallGenDispatch(CallGenBase.CallGenBase): pool, builder, mod, recv_cls_c, method_at.attr, obj_ptr_c, cl, trans) if method_at.value.kind() == ast.ASTKind.Name and trans is not None: - method_obj_nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(method_at.value) + method_obj_nm: rawptr[ast.Name] = rawptr[ast.Name](method_at.value) if method_obj_nm.id is not None: # nonlocal 对象:提升函数内从 env 读对象指针(load_nonlocal_var), # 不能 lookup_var 跨函数命中父函数 alloca(SSA 编号错乱 → @@ -1205,7 +1205,7 @@ class CallGenDispatch(CallGenBase.CallGenBase): builder, nl_obj) if nl_deref is None: nl_deref = nl_obj - nl_struct: llvmlite.LLVMType | t.CPtr = \ + nl_struct: rawptr[llvmlite.LLVMType] = \ self.Gen.StructGen.get_struct_type_from_value(nl_deref) if nl_struct is not None: nl_cls: str = self.Gen.StructGen.get_class_name_by_type( @@ -1324,7 +1324,7 @@ class CallGenDispatch(CallGenBase.CallGenBase): if self.Gen.CallGenProp._is_list_builtin_receiver( pool, obj_var, cls_nm2, func_name, cl) == 0: # 结构体已注册:load obj_ptr 走方法调用 - i8_ptr_ty2: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr( + i8_ptr_ty2: rawptr[llvmlite.LLVMType] = llvmlite.Ptr( pool, llvmlite.Int8(pool)) obj_ptr2: llvmlite.Value | t.CPtr = llvmlite.build_load( builder, i8_ptr_ty2, obj_var) @@ -1359,7 +1359,7 @@ class CallGenDispatch(CallGenBase.CallGenBase): if mangled3 is not None: viperlib.snprintf(mangled3, mlen3, "%s.%s.%s", sha1_fc, cls_nm2, func_name) # load obj_ptr (self) - i8_ptr_ty3: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr( + i8_ptr_ty3: rawptr[llvmlite.LLVMType] = llvmlite.Ptr( pool, llvmlite.Int8(pool)) obj_ptr3: llvmlite.Value | t.CPtr = llvmlite.build_load( builder, i8_ptr_ty3, obj_var) @@ -1369,7 +1369,7 @@ class CallGenDispatch(CallGenBase.CallGenBase): head3: llvmlite.Value | t.CPtr = obj_ptr3 tail3: llvmlite.Value | t.CPtr = obj_ptr3 for ai3 in range(can): - arg3: ast.AST | t.CPtr = cargs.get(ai3) + arg3: rawptr[ast.AST] = cargs.get(ai3) if arg3 is not None: arg_val3: llvmlite.Value | t.CPtr = self.Gen.ExprGen.translate_value( builder, pool, mod, arg3, None, 0, trans) @@ -1378,7 +1378,7 @@ class CallGenDispatch(CallGenBase.CallGenBase): llvmlite.value_set_next(tail3, arg_val3) tail3 = arg_val3 total3: int = 1 + can - ret_ty3: llvmlite.LLVMType | t.CPtr = self._special_method_ret_ty( + ret_ty3: rawptr[llvmlite.LLVMType] = self._special_method_ret_ty( pool, cls_nm2, func_name) if ret_ty3 is None: ret_ty3 = self._LookupMethodRetTyFromTextLL( @@ -1414,10 +1414,10 @@ class CallGenDispatch(CallGenBase.CallGenBase): # 绝不掉出返回 None 让 translate_call 把对象名当模块名 # 报"跨模块调用 'buf.__before_init__' 找不到模块 SHA1" # (memhub.alloc_buf buf.__before_init__() 根因)。 - sp_ty4: llvmlite.LLVMType | t.CPtr = self._special_method_ret_ty( + sp_ty4: rawptr[llvmlite.LLVMType] = self._special_method_ret_ty( pool, cls_nm2, func_name) if sp_ty4 is not None: - i8_ptr_ty4: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr( + i8_ptr_ty4: rawptr[llvmlite.LLVMType] = llvmlite.Ptr( pool, llvmlite.Int8(pool)) obj_ptr4: llvmlite.Value | t.CPtr = llvmlite.build_load( builder, i8_ptr_ty4, obj_var) @@ -1436,7 +1436,7 @@ class CallGenDispatch(CallGenBase.CallGenBase): # 再从值的 LLVM 类型(Ptr(Struct))解析类名,走方法调用路径。 # ============================================================ if cl.func is not None and cl.func.kind() == ast.ASTKind.Attribute: - expr_method_at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(cl.func) + expr_method_at: rawptr[ast.Attribute] = rawptr[ast.Attribute](cl.func) if expr_method_at is not None and expr_method_at.value is not None and trans is not None: evk: int = expr_method_at.value.kind() # Attribute 接收者区分两种形态: @@ -1448,11 +1448,11 @@ class CallGenDispatch(CallGenBase.CallGenBase): # SHA1"(zdeflate.vp write_fixed_block 根因) is_mod_path_expr: int = 0 if evk == ast.ASTKind.Attribute: - expr_root: ast.AST | t.CPtr = expr_method_at.value + expr_root: rawptr[ast.AST] = expr_method_at.value while expr_root is not None and expr_root.kind() == ast.ASTKind.Attribute: - expr_root = (ast.Attribute | t.CPtr)(expr_root).value + expr_root = rawptr[ast.Attribute](expr_root).value if expr_root is not None and expr_root.kind() == ast.ASTKind.Name: - expr_root_nm: str = (ast.Name | t.CPtr)(expr_root).id + expr_root_nm: str = rawptr[ast.Name](expr_root).id if expr_root_nm is not None: if string.strcmp(expr_root_nm, "t") == 0 or \ string.strcmp(expr_root_nm, "c") == 0: @@ -1470,7 +1470,7 @@ class CallGenDispatch(CallGenBase.CallGenBase): # 递归解 Ptr:识别 X|t.CPtr 联合简化的 Ptr(Ptr(Struct)) # (如 (a*2.0 - b) 中 __mul__ 返回 Vec3**),否则方法 # 调用被当裸函数 @dot 解析 → 链接 undefined symbol - expr_struct_ty: llvmlite.LLVMType | t.CPtr = \ + expr_struct_ty: rawptr[llvmlite.LLVMType] = \ self.Gen.StructGen.get_struct_type_from_value(expr_obj) if expr_struct_ty is not None: expr_cls_nm = self.Gen.StructGen.get_class_name_by_type( @@ -1523,10 +1523,10 @@ class CallGenDispatch(CallGenBase.CallGenBase): # 路径2: 从字段的 AnnotClassName 回退查找(字段类型被简化为 Ptr(i8) 时) # ============================================================ if cl.func is not None and cl.func.kind() == ast.ASTKind.Attribute: - attr_method_at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(cl.func) + attr_method_at: rawptr[ast.Attribute] = rawptr[ast.Attribute](cl.func) if attr_method_at is not None and attr_method_at.value is not None: if attr_method_at.value.kind() == ast.ASTKind.Attribute and trans is not None: - inner_attr: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(attr_method_at.value) + inner_attr: rawptr[ast.Attribute] = rawptr[ast.Attribute](attr_method_at.value) if inner_attr is not None and inner_attr.attr is not None: # 翻译 self.__pool__ 获取字段值(已 load 的对象指针) field_obj: llvmlite.Value | t.CPtr = self.Gen.ExprGen.translate_value( @@ -1541,7 +1541,7 @@ class CallGenDispatch(CallGenBase.CallGenBase): # 路径2: 从字段注解类名回退查找 if field_cls_nm is None: if inner_attr.value is not None and inner_attr.value.kind() == ast.ASTKind.Name: - inner_name_node: ast.Name | t.CPtr = (ast.Name | t.CPtr)(inner_attr.value) + inner_name_node: rawptr[ast.Name] = rawptr[ast.Name](inner_attr.value) if inner_name_node is not None and inner_name_node.id is not None: inner_var: llvmlite.Value | t.CPtr = self.Gen.VarGen.lookup_var( trans.SymTab, inner_name_node.id) @@ -1589,7 +1589,7 @@ class CallGenDispatch(CallGenBase.CallGenBase): # __data__(0) __count__(8) __capacity__(16) __pool__(24) __elem_size__(32) __iter_index__(40) # ============================================================ if cl.func is not None and cl.func.kind() == ast.ASTKind.Attribute: - lm_at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(cl.func) + lm_at: rawptr[ast.Attribute] = rawptr[ast.Attribute](cl.func) if lm_at is not None and lm_at.attr is not None and lm_at.value is not None: lm_name: str = lm_at.attr # 判断是否是 list 方法名 @@ -1623,7 +1623,7 @@ class CallGenDispatch(CallGenBase.CallGenBase): # 普通类未注册场景)跳过本分支,避免按 list 布局 GEP 生成 # 错误 IR(dict 的 get 被当 list.get 按 __data__/__elem_size__ # 偏移读写垃圾)。 - lm_conf_ty: llvmlite.LLVMType | t.CPtr = \ + lm_conf_ty: rawptr[llvmlite.LLVMType] = \ self.Gen.StructGen.get_struct_type_from_value(lm_obj) lm_conf_nm: str = None if lm_conf_ty is not None: @@ -1643,9 +1643,9 @@ class CallGenDispatch(CallGenBase.CallGenBase): # 调用点的 hit_box 置位模式)。 if hit_box is not None: hit_box[0] = 1 - i64_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int64(pool) - i8_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int8(pool) - i8_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, i8_ty) + i64_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int64(pool) + i8_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int8(pool) + i8_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, i8_ty) # 元素类型 T:从 list 特化类型名解析(list[int]→i32、 # list[str]→i8*、未知/指针元素→i8*)。此前 get/set/pop # 固定 i8*(8 字节)读写:set 的 8 字节 store 覆盖相邻元素 @@ -1653,12 +1653,12 @@ class CallGenDispatch(CallGenBase.CallGenBase): # pop 读回 0 → ListTest "pop FAILED expect 30" 根因。 # subscript 路径(list_getitem_inline 调用方)已用 # _list_elem_type_from_name 修正,方法调用路径漏改。 - lm_esty: llvmlite.LLVMType | t.CPtr = \ + lm_esty: rawptr[llvmlite.LLVMType] = \ self.Gen.StructGen.get_struct_type_from_value(lm_obj) lm_ename: str = None if lm_esty is not None: lm_ename = llvmlite.get_struct_name(lm_esty) - lm_elem_ty: llvmlite.LLVMType | t.CPtr = None + lm_elem_ty: rawptr[llvmlite.LLVMType] = None if lm_ename is not None: lm_elem_ty = self.Gen.ExprGenName._list_elem_type_from_name( pool, lm_ename) @@ -1677,7 +1677,7 @@ class CallGenDispatch(CallGenBase.CallGenBase): g_epp: llvmlite.Value | t.CPtr = llvmlite.build_gep(builder, i64_ty, lm_obj, g_idx4) g_esize: llvmlite.Value | t.CPtr = llvmlite.build_load(builder, i64_ty, g_epp) # 翻译 index - g_idx_node: ast.AST | t.CPtr = cargs.get(0) + g_idx_node: rawptr[ast.AST] = cargs.get(0) g_idx_val: llvmlite.Value | t.CPtr = self.Gen.ExprGen.translate_value( builder, pool, mod, g_idx_node, None, 0, trans) if g_data is not None and g_esize is not None and g_idx_val is not None: @@ -1700,8 +1700,8 @@ class CallGenDispatch(CallGenBase.CallGenBase): s_idx4: llvmlite.Value | t.CPtr = llvmlite.const_int64(pool, 4) s_epp: llvmlite.Value | t.CPtr = llvmlite.build_gep(builder, i64_ty, lm_obj, s_idx4) s_esize: llvmlite.Value | t.CPtr = llvmlite.build_load(builder, i64_ty, s_epp) - s_idx_node: ast.AST | t.CPtr = cargs.get(0) - s_val_node: ast.AST | t.CPtr = cargs.get(1) + s_idx_node: rawptr[ast.AST] = cargs.get(0) + s_val_node: rawptr[ast.AST] = cargs.get(1) s_idx_val: llvmlite.Value | t.CPtr = self.Gen.ExprGen.translate_value( builder, pool, mod, s_idx_node, None, 0, trans) s_val_val: llvmlite.Value | t.CPtr = self.Gen.ExprGen.translate_value( @@ -1775,7 +1775,7 @@ class CallGenDispatch(CallGenBase.CallGenBase): # Ptr(list[AST|CPtr]),从类型解析特化类名拼接调用名, # 否则 ld.lld undefined symbol(定义端是特化名)。 ap_spec_nm: str = None - ap_struct_ty: llvmlite.LLVMType | t.CPtr = \ + ap_struct_ty: rawptr[llvmlite.LLVMType] = \ self.Gen.StructGen.get_struct_type_from_value(lm_obj) if ap_struct_ty is not None: ap_spec_nm = self.Gen.StructGen.get_class_name_by_type( @@ -1829,14 +1829,14 @@ class CallGenDispatch(CallGenBase.CallGenBase): if ap_mangled is not None: viperlib.snprintf(ap_mangled, ap_mlen, "%s.%s.append", ap_sha1, ap_spec_nm) - ap_item_node: ast.AST | t.CPtr = cargs.get(0) + ap_item_node: rawptr[ast.AST] = cargs.get(0) ap_item_val: llvmlite.Value | t.CPtr = self.Gen.ExprGen.translate_value( builder, pool, mod, ap_item_node, None, 0, trans) if ap_item_val is not None: llvmlite.value_set_next(lm_obj, None) llvmlite.value_set_next(ap_item_val, None) llvmlite.value_set_next(lm_obj, ap_item_val) - ap_ret_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int32(pool) + ap_ret_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int32(pool) self._ensure_method_declare(pool, mod, ap_mangled, ap_ret_ty, lm_obj, 2) return llvmlite.build_call(builder, ap_mangled, lm_obj, 2, ap_ret_ty, 0) diff --git a/App/lib/core/Gen/Call/CallGenFd.vp b/App/lib/core/Gen/Call/CallGenFd.vp index 74615cc..1bb1166 100644 --- a/App/lib/core/Gen/Call/CallGenFd.vp +++ b/App/lib/core/Gen/Call/CallGenFd.vp @@ -28,11 +28,11 @@ class CallGenFd(CallGenBase.CallGenBase): # ============================================================ def _translate_fakeduck_call(self, pool: rawptr[memhub.MemBuddy], builder: llvmlite.IRBuilder | t.CPtr, - mod: llvmlite.LLVMModule | t.CPtr, + mod: rawptr[llvmlite.LLVMModule], cls_name: str, method_name: str, - cl: ast.Call | t.CPtr, - trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: + cl: rawptr[ast.Call], + trans: rawptr[HT.Translator]) -> llvmlite.Value | t.CPtr: """FakeDuck: str 变量方法调用解析到扩展类 _Type/_str,返回 call 结果或 None""" if pool is None or builder is None or cl is None or trans is None: return None @@ -44,13 +44,13 @@ class CallGenFd(CallGenBase.CallGenBase): return None if cl.func is None or cl.func.kind() != ast.ASTKind.Attribute: return None - fd_at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(cl.func) + fd_at: rawptr[ast.Attribute] = rawptr[ast.Attribute](cl.func) if fd_at is None or fd_at.value is None or fd_at.attr is None: return None if string.strcmp(fd_at.attr, method_name) != 0: return None # 候选扩展类:先 _Type(a.type_id())后 _str(a.upper() 等) - fd_func: llvmlite.Function | t.CPtr = None + fd_func: rawptr[llvmlite.Function] = None fd_cls: str = None fd_key: str = pool.alloc(160) if fd_key is not None: @@ -66,7 +66,7 @@ class CallGenFd(CallGenBase.CallGenBase): if fd_func is None or fd_cls is None: return None # 扩展类结构体必须已注册(GEP/临时影子需要类型) - fd_sty: llvmlite.LLVMType | t.CPtr = self.Gen.StructGen.get_struct_type(fd_cls) + fd_sty: rawptr[llvmlite.LLVMType] = self.Gen.StructGen.get_struct_type(fd_cls) if fd_sty is None: return None # 扩展类字段数:有字段(_str)时 self 用影子结构体指针; @@ -78,7 +78,7 @@ class CallGenFd(CallGenBase.CallGenBase): # self 参数:优先使用已有影子 {var}__meta__(fd2 创建,仅当扩展类有字段时) fd_self: llvmlite.Value | t.CPtr = None if fd_at.value.kind() == ast.ASTKind.Name: - fd_onm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(fd_at.value) + fd_onm: rawptr[ast.Name] = rawptr[ast.Name](fd_at.value) if fd_onm.id is not None: # pool 持久缓冲(f-string 栈缓冲在函数返回后失效) fd_mn: str = pool.alloc(256) @@ -132,12 +132,12 @@ class CallGenFd(CallGenBase.CallGenBase): llvmlite.value_set_next(fd_self, None) fd_head: llvmlite.Value | t.CPtr = fd_self fd_tail: llvmlite.Value | t.CPtr = fd_self - fd_args: list[ast.AST | t.CPtr] | t.CPtr = cl.args + fd_args: list[rawptr[ast.AST]] | t.CPtr = cl.args fd_can: int = 0 if fd_args is not None: fd_can = len(fd_args) for fd_ai in range(fd_can): - fd_arg: ast.AST | t.CPtr = fd_args.get(fd_ai) + fd_arg: rawptr[ast.AST] = fd_args.get(fd_ai) if fd_arg is not None: fd_av: llvmlite.Value | t.CPtr = self.Gen.ExprGen.translate_value( builder, pool, mod, fd_arg, None, 0, trans) @@ -145,7 +145,7 @@ class CallGenFd(CallGenBase.CallGenBase): # 如 s1.split(','):',' 是 i32 值 44,传给 str 参数须先字符串化, # 否则运行时 strlen/strncmp 解引用 44 崩溃) if fd_arg.kind() == ast.ASTKind.Constant: - fd_ac: ast.Constant | t.CPtr = (ast.Constant | t.CPtr)(fd_arg) + fd_ac: rawptr[ast.Constant] = rawptr[ast.Constant](fd_arg) if fd_ac.const_kind == ast.CONST_CHAR: ch_buf: str = pool.alloc(2) if ch_buf is not None: @@ -158,7 +158,7 @@ class CallGenFd(CallGenBase.CallGenBase): llvmlite.value_set_next(fd_tail, fd_av) fd_tail = fd_av # 返回类型与调用名(来自 find_func_in_module 命中的函数定义) - fd_ret_ty: llvmlite.LLVMType | t.CPtr = llvmlite.function_get_ret_ty(fd_func) + fd_ret_ty: rawptr[llvmlite.LLVMType] = llvmlite.function_get_ret_ty(fd_func) if fd_ret_ty is None: fd_ret_ty = llvmlite.Int32(pool) fd_fname: str = llvmlite.function_get_name(fd_func) @@ -170,7 +170,7 @@ class CallGenFd(CallGenBase.CallGenBase): if fd_sha1 is not None: string.strncpy(fd_sha1, fd_fname, 16) fd_sha1[16] = '\0' - fd_exact: llvmlite.LLVMType | t.CPtr = self._LookupMethodRetTyFromTextLL( + fd_exact: rawptr[llvmlite.LLVMType] = self._LookupMethodRetTyFromTextLL( pool, fd_sha1, fd_cls, method_name) if fd_exact is not None: fd_ret_ty = fd_exact @@ -188,10 +188,10 @@ class CallGenFd(CallGenBase.CallGenBase): # ============================================================ # ============================================================ - def _inject_requires_fields(self, trans: HT.Translator | t.CPtr, + def _inject_requires_fields(self, trans: rawptr[HT.Translator], pool: rawptr[memhub.MemBuddy], builder: llvmlite.IRBuilder | t.CPtr, - mod: llvmlite.LLVMModule | t.CPtr, + mod: rawptr[llvmlite.LLVMModule], meta_ptr: llvmlite.Value | t.CPtr, class_name: str) -> int: """在 with 上下文注入 requires 字段,返回注入字段数""" @@ -204,7 +204,7 @@ class CallGenFd(CallGenBase.CallGenBase): # (Gen.functions.get('_find_provider') 不存在则跳过)——否则非 with # 项目(如 HashTableTest 未 import _withcontent)也会为每个 _str(...) # 构造发射 {sha1}._find_provider 调用 → ld.lld undefined symbol。 - fd_fn_probe: llvmlite.Function | t.CPtr = self.find_func_in_module( + fd_fn_probe: rawptr[llvmlite.Function] = self.find_func_in_module( mod, "_find_provider") if fd_fn_probe is None: return 0 @@ -215,16 +215,16 @@ class CallGenFd(CallGenBase.CallGenBase): GenTypes.CLASS_META_REQUIRES, class_name) if cnt <= 0: return 0 - sty: llvmlite.LLVMType | t.CPtr = self.Gen.StructGen.get_struct_type(class_name) + sty: rawptr[llvmlite.LLVMType] = self.Gen.StructGen.get_struct_type(class_name) if sty is None: return 0 - i8_ty_j: llvmlite.LLVMType | t.CPtr = llvmlite.Int8(pool) + i8_ty_j: rawptr[llvmlite.LLVMType] = llvmlite.Int8(pool) if i8_ty_j is None: return 0 - i8_ptr_ty_j: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, i8_ty_j) + i8_ptr_ty_j: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, i8_ty_j) if i8_ptr_ty_j is None: return 0 - cur_func: llvmlite.Function | t.CPtr = trans._cur_func + cur_func: rawptr[llvmlite.Function] = trans._cur_func if cur_func is None: return 0 injected: int = 0 @@ -299,10 +299,10 @@ class CallGenFd(CallGenBase.CallGenBase): # ============================================================ # ============================================================ - def _emit_provider_push(self, trans: HT.Translator | t.CPtr, + def _emit_provider_push(self, trans: rawptr[HT.Translator], pool: rawptr[memhub.MemBuddy], builder: llvmlite.IRBuilder | t.CPtr, - mod: llvmlite.LLVMModule | t.CPtr, + mod: rawptr[llvmlite.LLVMModule], cls_name: str, ctx_val: llvmlite.Value | t.CPtr) -> int: """生成 _push_provider(field, ctx_i8) 调用(每提供字段一次),返回字段数""" @@ -316,20 +316,20 @@ class CallGenFd(CallGenBase.CallGenBase): return 0 # _withcontent._push_provider(跨模块,同 _find_provider 的可见性守卫: # 本模块未 import _withcontent 时跳过,避免 undefined symbol) - fd_pfn_probe: llvmlite.Function | t.CPtr = self.find_func_in_module( + fd_pfn_probe: rawptr[llvmlite.Function] = self.find_func_in_module( mod, "_push_provider") if fd_pfn_probe is None: return 0 fd_pfn: str = llvmlite.function_get_name(fd_pfn_probe) if fd_pfn is None: return 0 - i8_ty_p: llvmlite.LLVMType | t.CPtr = llvmlite.Int8(pool) + i8_ty_p: rawptr[llvmlite.LLVMType] = llvmlite.Int8(pool) if i8_ty_p is None: return 0 - i8_ptr_ty_p: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, i8_ty_p) + i8_ptr_ty_p: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, i8_ty_p) if i8_ptr_ty_p is None: return 0 - ret_i32_p: llvmlite.LLVMType | t.CPtr = llvmlite.Int32(pool) + ret_i32_p: rawptr[llvmlite.LLVMType] = llvmlite.Int32(pool) if ret_i32_p is None: return 0 # ctx 值 bitcast 到 i8*(provider 栈存 void*) @@ -352,10 +352,10 @@ class CallGenFd(CallGenBase.CallGenBase): pool, mod, fd_pfn, ret_i32_p, fd_fstr, 2) llvmlite.build_call(builder, fd_pfn, fd_fstr, 2, ret_i32_p, 0) return fd_pc - def _emit_provider_pop(self, trans: HT.Translator | t.CPtr, + def _emit_provider_pop(self, trans: rawptr[HT.Translator], pool: rawptr[memhub.MemBuddy], builder: llvmlite.IRBuilder | t.CPtr, - mod: llvmlite.LLVMModule | t.CPtr, + mod: rawptr[llvmlite.LLVMModule], cls_name: str) -> int: """生成 _pop_provider() 调用(每提供字段一次),返回字段数""" if trans is None or pool is None or builder is None or mod is None: @@ -368,14 +368,14 @@ class CallGenFd(CallGenBase.CallGenBase): return 0 # _withcontent._pop_provider(跨模块,同 _find_provider 的可见性守卫: # 本模块未 import _withcontent 时跳过,避免 undefined symbol) - fd_pon_probe: llvmlite.Function | t.CPtr = self.find_func_in_module( + fd_pon_probe: rawptr[llvmlite.Function] = self.find_func_in_module( mod, "_pop_provider") if fd_pon_probe is None: return 0 fd_pon: str = llvmlite.function_get_name(fd_pon_probe) if fd_pon is None: return 0 - ret_i32_q: llvmlite.LLVMType | t.CPtr = llvmlite.Int32(pool) + ret_i32_q: rawptr[llvmlite.LLVMType] = llvmlite.Int32(pool) if ret_i32_q is None: return 0 self._ensure_method_declare(pool, mod, fd_pon, ret_i32_q, None, 0) diff --git a/App/lib/core/Gen/Call/CallGenLeafKit.vp b/App/lib/core/Gen/Call/CallGenLeafKit.vp index c51fe4c..c4b5eb7 100644 --- a/App/lib/core/Gen/Call/CallGenLeafKit.vp +++ b/App/lib/core/Gen/Call/CallGenLeafKit.vp @@ -79,7 +79,7 @@ def _gfn_idx_slot(idx_base: sizet | t.CPtr, si: sizet) -> sizet | t.CPtr: return (sizet | t.CPtr)(uint64(idx_base) + uint64(si) * 8) -def _gfn_idx_find(funcs: GenTypes.FuncEntry | t.CPtr, +def _gfn_idx_find(funcs: rawptr[GenTypes.FuncEntry], idx_base: sizet | t.CPtr, cap: int, name: str) -> int: """在全局函数表名索引中探测 name,返回命中槽下标(>=0);未命中/不可用返回 -1""" if funcs is None or idx_base is None or cap <= 0 or name is None: @@ -96,7 +96,7 @@ def _gfn_idx_find(funcs: GenTypes.FuncEntry | t.CPtr, return -1 se: int = int(sv) - 1 entry_addr: uint64 = uint64(funcs) + se * entry_size - entry: GenTypes.FuncEntry | t.CPtr = (GenTypes.FuncEntry | t.CPtr)(entry_addr) + entry: rawptr[GenTypes.FuncEntry] = rawptr[GenTypes.FuncEntry](entry_addr) if entry is not None and entry.Name is not None: if string.strcmp(entry.Name, name) == 0: return se @@ -137,7 +137,7 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin): # EH 参数(%__eh_msg_out__/__eh_code_out__)由 translate_function_def/ # _translate_method 在含 raise 的函数签名末尾注入(main 除外)。 # ============================================================ - def _func_has_eh_params(self, func: llvmlite.Function | t.CPtr) -> int: + def _func_has_eh_params(self, func: rawptr[llvmlite.Function]) -> int: """返回 1=函数带 EH 输出参数 / 0=不带""" if func is None: return 0 @@ -170,21 +170,21 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin): # ============================================================ def _emit_eh_guarded_call(self, builder: llvmlite.IRBuilder | t.CPtr, pool: rawptr[memhub.MemBuddy], - mod: llvmlite.LLVMModule | t.CPtr, - trans: HT.Translator | t.CPtr, - func: llvmlite.Function | t.CPtr, + mod: rawptr[llvmlite.LLVMModule], + trans: rawptr[HT.Translator], + func: rawptr[llvmlite.Function], call_name: str, head: llvmlite.Value | t.CPtr, count: int, - ret_ty: llvmlite.LLVMType | t.CPtr, + ret_ty: rawptr[llvmlite.LLVMType], is_variadic: int) -> llvmlite.Value | t.CPtr: """带 try-except EH 检测的函数调用,返回 call 结果(检查后位于 ok 块)""" if trans is None or self._func_has_eh_params(func) == 0: return llvmlite.build_call(builder, call_name, head, count, ret_ty, is_variadic) # ---- 1. 确定输出指针 ---- - i8_ty_g: llvmlite.LLVMType | t.CPtr = llvmlite.Int8(pool) - i8_ptr_ty_g: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, i8_ty_g) - i32_ty_g: llvmlite.LLVMType | t.CPtr = llvmlite.Int32(pool) + i8_ty_g: rawptr[llvmlite.LLVMType] = llvmlite.Int8(pool) + i8_ptr_ty_g: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, i8_ty_g) + i32_ty_g: rawptr[llvmlite.LLVMType] = llvmlite.Int32(pool) if i8_ty_g is None or i8_ptr_ty_g is None or i32_ty_g is None: return llvmlite.build_call(builder, call_name, head, count, ret_ty, is_variadic) msg_ptr: llvmlite.Value | t.CPtr = None @@ -220,7 +220,7 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin): # ---- 4. 调用 + 检查 ---- result: llvmlite.Value | t.CPtr = llvmlite.build_call( builder, call_name, head, count, ret_ty, is_variadic) - cur_func_g: llvmlite.Function | t.CPtr = trans._cur_func + cur_func_g: rawptr[llvmlite.Function] = trans._cur_func if cur_func_g is None or null_msg_g is None: return result msg_val_g: llvmlite.Value | t.CPtr = llvmlite.build_load( @@ -255,7 +255,7 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin): # 非 try:异常已写入本函数 out 参数(复用)或局部 alloca(吞掉), # 仅返回默认值,由调用方检测本函数 out 参数 if llvmlite.builder_cur_block_is_terminated(builder) == 0: - ret_ty_g2: llvmlite.LLVMType | t.CPtr = llvmlite.function_get_ret_ty( + ret_ty_g2: rawptr[llvmlite.LLVMType] = llvmlite.function_get_ret_ty( cur_func_g) if ret_ty_g2 is not None: match ret_ty_g2: @@ -295,10 +295,10 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin): def _translate_isinstance(self, pool: rawptr[memhub.MemBuddy], builder: llvmlite.IRBuilder | t.CPtr, - mod: llvmlite.LLVMModule | t.CPtr, - obj_node: ast.AST | t.CPtr, - cls_node: ast.AST | t.CPtr, - trans: HT.Translator | t.CPtr = None) -> llvmlite.Value | t.CPtr: + mod: rawptr[llvmlite.LLVMModule], + obj_node: rawptr[ast.AST], + cls_node: rawptr[ast.AST], + trans: rawptr[HT.Translator] = None) -> llvmlite.Value | t.CPtr: """isinstance(obj, Cls):运行时 vtable 子类集合比较,返回 i1""" if obj_node is None or cls_node is None: # 参数缺失即调用错误:fail-fast,绝不返回 True 掩盖 @@ -321,9 +321,9 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin): case _: pass obj_is_ptr: int = self.Gen.ExprGenBase.is_ptr_type(obj_ptr.Ty) - i8_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int8(pool) - i8_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, i8_ty) - i8_ptr_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, i8_ptr_ty) + i8_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int8(pool) + i8_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, i8_ty) + i8_ptr_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, i8_ptr_ty) # 对象 vtable 指针惰性读取(首个 CVTable 类比较时执行一次) vtable_ptr: llvmlite.Value | t.CPtr = None vtable_ready: int = 0 @@ -379,7 +379,7 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin): def _extract_isinstance_class_names(self, pool: rawptr[memhub.MemBuddy], - node: ast.AST | t.CPtr) -> sizet | t.CPtr: + node: rawptr[ast.AST]) -> sizet | t.CPtr: """从 isinstance 第二参数提取类名数组(Name→id / Attribute→attr / Tuple→遍历)""" arr: sizet | t.CPtr = pool.alloc(8 * 16) if arr is None: @@ -393,32 +393,32 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin): count: int = 0 k: int = node.kind() if k == ast.ASTKind.Name: - nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(node) + nm: rawptr[ast.Name] = rawptr[ast.Name](node) if nm.id is not None: arr[0] = sizet(nm.id) elif k == ast.ASTKind.Attribute: - at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(node) + at: rawptr[ast.Attribute] = rawptr[ast.Attribute](node) if at.attr is not None: arr[0] = sizet(at.attr) elif k == ast.ASTKind.Tuple: - tp: ast.Tuple | t.CPtr = (ast.Tuple | t.CPtr)(node) - elts: list[ast.AST | t.CPtr] | t.CPtr = tp.elts + tp: rawptr[ast.Tuple] = rawptr[ast.Tuple](node) + elts: list[rawptr[ast.AST]] | t.CPtr = tp.elts if elts is not None: n: sizet = len(elts) for i in range(n): if count >= 15: break - elt: ast.AST | t.CPtr = elts.get(i) + elt: rawptr[ast.AST] = elts.get(i) if elt is None: continue ek: int = elt.kind() if ek == ast.ASTKind.Name: - enm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(elt) + enm: rawptr[ast.Name] = rawptr[ast.Name](elt) if enm.id is not None: arr[count] = sizet(enm.id) count += 1 elif ek == ast.ASTKind.Attribute: - eat: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(elt) + eat: rawptr[ast.Attribute] = rawptr[ast.Attribute](elt) if eat.attr is not None: arr[count] = sizet(eat.attr) count += 1 @@ -493,14 +493,14 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin): def _make_vtable_ref_i8(self, pool: rawptr[memhub.MemBuddy], builder: llvmlite.IRBuilder | t.CPtr, - mod: llvmlite.LLVMModule | t.CPtr, + mod: rawptr[llvmlite.LLVMModule], class_name: str, - trans: HT.Translator | t.CPtr = None) -> llvmlite.Value | t.CPtr: + trans: rawptr[HT.Translator] = None) -> llvmlite.Value | t.CPtr: """构造类 vtable 地址引用(i8*):本模块已定义直接引用,跨模块声明 external""" if class_name is None: return None - i8_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int8(pool) - i8_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, i8_ty) + i8_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int8(pool) + i8_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, i8_ty) buf: str = pool.alloc(256) if buf is None: return None @@ -520,7 +520,7 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin): # vtable 名含 sha1 点号前缀,一律 @"..." 引号形式 viperlib.snprintf(ref_name, 256, "@\"%s\"", mangled) gv: llvmlite.GlobalVariable | t.CPtr = self.Gen.ExprGenAttr.find_global_in_module(mod, mangled) - ref_ty: llvmlite.LLVMType | t.CPtr = None + ref_ty: rawptr[llvmlite.LLVMType] = None if gv is not None: # 本模块已定义 vtable(constant {i8* x N})→ 引用类型 Ptr(struct) ref_ty = llvmlite.Ptr(pool, gv.Ty) @@ -572,18 +572,18 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin): def translate_closure_call(self, pool: rawptr[memhub.MemBuddy], builder: llvmlite.IRBuilder | t.CPtr, - mod: llvmlite.LLVMModule | t.CPtr, + mod: rawptr[llvmlite.LLVMModule], closure_alloca: llvmlite.Value | t.CPtr, - cargs: list[ast.AST | t.CPtr] | t.CPtr, + cargs: list[rawptr[ast.AST]] | t.CPtr, can: sizet, - trans: HT.Translator | t.CPtr = None) -> llvmlite.Value | t.CPtr: + trans: rawptr[HT.Translator] = None) -> llvmlite.Value | t.CPtr: """通过闭包指针间接调用(支持带参 lambda:i32(i8*, args...))""" if builder is None or closure_alloca is None: return None - i8_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int8(pool) - i8_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, i8_ty) - i32_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int32(pool) + i8_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int8(pool) + i8_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, i8_ty) + i32_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int32(pool) # 1. 加载闭包指针 (i8*) closure_ptr: llvmlite.Value | t.CPtr = llvmlite.build_load(builder, i8_ptr_ty, closure_alloca) @@ -611,11 +611,11 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin): total_args: int = 1 arg_head: llvmlite.Value | t.CPtr = env_ptr arg_tail: llvmlite.Value | t.CPtr = env_ptr - param_node: llvmlite.ParamNode | t.CPtr = llvmlite.new_param_node(pool, i8_ptr_ty) - pn_tail: llvmlite.ParamNode | t.CPtr = param_node + param_node: rawptr[llvmlite.Function] = llvmlite.new_param_node(pool, i8_ptr_ty) + pn_tail: rawptr[llvmlite.Function] = param_node if can > 0 and cargs is not None and trans is not None: for ai in range(can): - arg: ast.AST | t.CPtr = cargs.get(ai) + arg: rawptr[ast.AST] = cargs.get(ai) if arg is None: continue arg_val: llvmlite.Value | t.CPtr = self.Gen.ExprGen.translate_value( @@ -626,7 +626,7 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin): if arg_tail is not None: arg_tail.Next = arg_val arg_tail = arg_val - pn_new: llvmlite.ParamNode | t.CPtr = llvmlite.new_param_node(pool, arg_val.Ty) + pn_new: rawptr[llvmlite.Function] = llvmlite.new_param_node(pool, arg_val.Ty) if pn_new is not None: pn_tail.Next = pn_new pn_tail = pn_new @@ -635,8 +635,8 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin): env_ptr.Next = None # 5. bitcast fn_raw 到函数指针类型 i32(i8*, [args...])* - func_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Func(pool, i32_ty, param_node, total_args) - func_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, func_ty) + func_ty: rawptr[llvmlite.LLVMType] = llvmlite.Func(pool, i32_ty, param_node, total_args) + func_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, func_ty) fn_typed: llvmlite.Value | t.CPtr = llvmlite.build_bitcast(builder, fn_raw, func_ptr_ty) if fn_typed is None: return None @@ -651,10 +651,10 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin): return 0 if self.Gen.ExprGenBase.is_ptr_type(alloca.Ty) == 0: return 0 - pointee: llvmlite.LLVMType | t.CPtr = alloca.Ty.Pointee + pointee: rawptr[llvmlite.LLVMType] = alloca.Ty.Pointee if pointee is None or self.Gen.ExprGenBase.is_ptr_type(pointee) == 0: return 0 - inner: llvmlite.LLVMType | t.CPtr = pointee.Pointee + inner: rawptr[llvmlite.LLVMType] = pointee.Pointee if inner is None or self.Gen.ExprGenBase.is_ptr_type(inner) != 0: return 0 return 1 @@ -704,7 +704,7 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin): def register_func_ptr_sig(self, name: str, - ret_ty: llvmlite.LLVMType | t.CPtr) -> int: + ret_ty: rawptr[llvmlite.LLVMType]) -> int: """注册函数指针变量的返回类型签名,0 成功""" if name is None or ret_ty is None: return 1 @@ -717,7 +717,7 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin): string.strncpy(self.FuncptrNames + idx, name, 63) # ret_ty 是调用方 pool 分配的裸 LLVMType,1a 每文件 reset 后悬空; # 深拷贝到 perm_pool(lookup_func_ptr_ret 跨文件读取) - ret_copy_fp: llvmlite.LLVMType | t.CPtr = llvmlite.DeepCopyType( + ret_copy_fp: rawptr[llvmlite.LLVMType] = llvmlite.DeepCopyType( CompilerFactory.factory.PermPool, ret_ty) if ret_copy_fp is not None: self.FuncptrRets[self.FuncptrCount] = uint64(ret_copy_fp) @@ -727,31 +727,31 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin): return 0 - def lookup_func_ptr_ret(self, name: str) -> llvmlite.LLVMType | t.CPtr: + def lookup_func_ptr_ret(self, name: str) -> rawptr[llvmlite.LLVMType]: """查函数指针变量的返回类型,None=未注册(调用时默认 i32)""" if name is None or self.FuncptrNames is None: return None for i in range(self.FuncptrCount): idx: sizet = sizet(i) * 64 if string.strcmp(self.FuncptrNames + idx, name) == 0: - return (llvmlite.LLVMType | t.CPtr)(self.FuncptrRets[i]) + return (rawptr[llvmlite.LLVMType])(self.FuncptrRets[i]) return None def _translate_func_ptr_call(self, pool: rawptr[memhub.MemBuddy], builder: llvmlite.IRBuilder | t.CPtr, - mod: llvmlite.LLVMModule | t.CPtr, + mod: rawptr[llvmlite.LLVMModule], fp_alloca: llvmlite.Value | t.CPtr, func_name: str, - cargs: list[ast.AST | t.CPtr] | t.CPtr, + cargs: list[rawptr[ast.AST]] | t.CPtr, can: sizet, - trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: + trans: rawptr[HT.Translator]) -> llvmlite.Value | t.CPtr: """函数指针变量间接调用,返回结果 Value""" if builder is None or fp_alloca is None: return None - i8_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int8(pool) - i8_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, i8_ty) - i32_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int32(pool) + i8_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int8(pool) + i8_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, i8_ty) + i32_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int32(pool) # 1. load 函数地址 (i8*) fn_i8: llvmlite.Value | t.CPtr = llvmlite.build_load(builder, i8_ptr_ty, fp_alloca) @@ -764,7 +764,7 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin): arg_count: int = 0 ai: sizet for ai in range(can): - arg: ast.AST | t.CPtr = cargs.get(ai) + arg: rawptr[ast.AST] = cargs.get(ai) if arg is not None: arg_val: llvmlite.Value | t.CPtr = self.Gen.ExprGen.translate_value( builder, pool, mod, arg, None, 0, trans) @@ -778,21 +778,21 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin): arg_count += 1 # 3. 按实参类型 + 注册的返回类型构造签名(未注册即 t.Callable 注解缺失,fail-fast) - ret_ty: llvmlite.LLVMType | t.CPtr = self.lookup_func_ptr_ret(func_name) + ret_ty: rawptr[llvmlite.LLVMType] = self.lookup_func_ptr_ret(func_name) if ret_ty is None: self.Gen.TypeGenErr.fatal_error( None, f"函数指针变量 '{func_name}' 的返回类型未注册(t.Callable 注解缺失)", "TypeError") ret_ty = i32_ty - fp_first: llvmlite.ParamNode | t.CPtr = None - fp_prev: llvmlite.ParamNode | t.CPtr = None + fp_first: rawptr[llvmlite.Function] = None + fp_prev: rawptr[llvmlite.Function] = None cur_v: llvmlite.Value | t.CPtr = head for pi in range(arg_count): if cur_v is None: break - cur_ty: llvmlite.LLVMType | t.CPtr = llvmlite.value_get_ty(cur_v) - pn2: llvmlite.ParamNode | t.CPtr = llvmlite.new_param_node(pool, cur_ty) + cur_ty: rawptr[llvmlite.LLVMType] = llvmlite.value_get_ty(cur_v) + pn2: rawptr[llvmlite.Function] = llvmlite.new_param_node(pool, cur_ty) if pn2 is not None: if fp_first is None: fp_first = pn2 @@ -801,10 +801,10 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin): fp_prev = pn2 cur_v = llvmlite.value_get_next(cur_v) - func_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Func(pool, ret_ty, fp_first, arg_count) + func_ty: rawptr[llvmlite.LLVMType] = llvmlite.Func(pool, ret_ty, fp_first, arg_count) if func_ty is None: return None - func_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, func_ty) + func_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, func_ty) # 4. bitcast i8* → 函数指针类型,间接调用 fn_typed: llvmlite.Value | t.CPtr = llvmlite.build_bitcast(builder, fn_i8, func_ptr_ty) @@ -815,25 +815,25 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin): def translate_printf_call(self, 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) -> None: + mod: rawptr[llvmlite.LLVMModule], + cl: rawptr[ast.Call], + trans: rawptr[HT.Translator] = None) -> None: """翻译 printf 调用(特殊处理格式字符串)""" - cargs: list[ast.AST | t.CPtr] | t.CPtr = cl.args + cargs: list[rawptr[ast.AST]] | t.CPtr = cl.args if cargs is None: return can: sizet = len(cargs) if can == 0: return - arg0: ast.AST | t.CPtr = cargs.get(0) + arg0: rawptr[ast.AST] = cargs.get(0) if arg0 is None: return fmt_str: str = None arg0_kind: int = arg0.kind() if arg0_kind == ast.ASTKind.Constant: - cn: ast.Constant | t.CPtr = (ast.Constant | t.CPtr)(arg0) + cn: rawptr[ast.Constant] = rawptr[ast.Constant](arg0) if cn.const_kind == ast.CONST_STR: fmt_str = cn.str_val @@ -845,12 +845,12 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin): if fmt_ptr is None: return - i32_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int32(pool) + i32_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int32(pool) # 翻译额外参数并链接 prev: llvmlite.Value | t.CPtr = fmt_ptr for ai in range(1, can): - arg: ast.AST | t.CPtr = cargs.get(ai) + arg: rawptr[ast.AST] = cargs.get(ai) if arg is not None: arg_val: llvmlite.Value | t.CPtr = self.Gen.ExprGen.translate_value( builder, pool, mod, arg, None, 0, trans) @@ -862,7 +862,7 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin): # C ABI float promotion: float → double(printf 变参函数要求) arg_fbits: int = self.Gen.ExprGenBase.get_llvm_float_bits(arg_val.Ty) if arg_fbits != 0 and arg_fbits < 64: - double_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Double(pool) + double_ty: rawptr[llvmlite.LLVMType] = llvmlite.Double(pool) arg_val = self.Gen.ExprGenBase.coerce_to_type(builder, arg_val, double_ty, arg) arg_val.Next = None prev.Next = arg_val @@ -876,11 +876,11 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin): def translate_print_call(self, 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) -> None: + mod: rawptr[llvmlite.LLVMModule], + cl: rawptr[ast.Call], + trans: rawptr[HT.Translator] = None) -> None: """翻译 print 调用(类型感知格式化 + 默认换行)""" - cargs: list[ast.AST | t.CPtr] | t.CPtr = cl.args + cargs: list[rawptr[ast.AST]] | t.CPtr = cl.args if cargs is None: return @@ -890,9 +890,9 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin): return fmt_buf[0] = '\0' - i32_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int32(pool) - i64_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int64(pool) - dbl_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Double(pool) + i32_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int32(pool) + i64_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int64(pool) + dbl_ty: rawptr[llvmlite.LLVMType] = llvmlite.Double(pool) can: sizet = len(cargs) arg_head: llvmlite.Value | t.CPtr = None @@ -900,7 +900,7 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin): arg_count: int = 1 # 格式串本身是第 1 个 printf 参数 for ai in range(can): - arg: ast.AST | t.CPtr = cargs.get(ai) + arg: rawptr[ast.AST] = cargs.get(ai) if arg is None: continue arg_val: llvmlite.Value | t.CPtr = self.Gen.ExprGen.translate_value( @@ -919,13 +919,13 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin): array_ptr: llvmlite.Value | t.CPtr = None array_elem_bits: int = 0 if arg.kind() == ast.ASTKind.Name and trans is not None: - anm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(arg) + anm: rawptr[ast.Name] = rawptr[ast.Name](arg) if anm.id is not None: arr_alloca: llvmlite.Value | t.CPtr = self.Gen.VarGen.lookup_var( trans.SymTab, anm.id) if arr_alloca is not None and arr_alloca.Ty is not None \ and self.Gen.ExprGenBase.is_ptr_type(arr_alloca.Ty) != 0: - arr_pointee: llvmlite.LLVMType | t.CPtr = arr_alloca.Ty.Pointee + arr_pointee: rawptr[llvmlite.LLVMType] = arr_alloca.Ty.Pointee if arr_pointee is not None: match arr_pointee: case llvmlite.LLVMType.Array(arr_et, arr_n): @@ -942,7 +942,7 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin): if array_ptr is not None: # 数组退化:字符数组 → %s(bitcast [N x i8]* 到 i8*);其他 → 0x%llx if array_elem_bits == 8: - i8_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr( + i8_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr( pool, llvmlite.Int8(pool)) token = "%s" arg_val = llvmlite.build_bitcast(builder, array_ptr, i8_ptr_ty) @@ -951,7 +951,7 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin): arg_val = llvmlite.build_ptrtoint(builder, array_ptr, i64_ty) elif self.Gen.ExprGenBase.is_ptr_type(arg_val.Ty) != 0: # i8*(str/bytes)→ %s;其他指针 → 0x%llx - pointee: llvmlite.LLVMType | t.CPtr = arg_val.Ty.Pointee + pointee: rawptr[llvmlite.LLVMType] = arg_val.Ty.Pointee if pointee is not None and self.Gen.ExprGenBase.get_llvm_type_bits(pointee) == 8: token = "%s" else: @@ -1008,19 +1008,19 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin): def init_func_table(self, pool: rawptr[memhub.MemBuddy], - max_count: int) -> GenTypes.FuncEntry | t.CPtr: + max_count: int) -> rawptr[GenTypes.FuncEntry]: """分配并清零函数表数组""" size: sizet = max_count * GenTypes.FuncEntry.__sizeof__() - funcs_ptr: GenTypes.FuncEntry | t.CPtr = pool.alloc(size) + funcs_ptr: rawptr[GenTypes.FuncEntry] = pool.alloc(size) if funcs_ptr is not None: string.memset(funcs_ptr, 0, size) return funcs_ptr - def find_func_in_table(self, funcs: GenTypes.FuncEntry | t.CPtr, + def find_func_in_table(self, funcs: rawptr[GenTypes.FuncEntry], func_count: int, name: str, - owner_sha1: str = None) -> llvmlite.Function | t.CPtr: + owner_sha1: str = None) -> rawptr[llvmlite.Function]: """在函数表中按名称查找,返回 Function 指针或 None owner_sha1: 当前模块 SHA1。非 None 时"本模块函数优先"——表里同名条目 @@ -1046,7 +1046,7 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin): fi_t: int = _gfn_idx_find(self.GlobalFuncs, self.GlobalFuncNameIdx, self.GlobalFuncNameIdxCap, name) if fi_t >= 0: - fe_t: GenTypes.FuncEntry | t.CPtr = (GenTypes.FuncEntry | t.CPtr)((uint64(self.GlobalFuncs) + fi_t * entry_size)) + fe_t: rawptr[GenTypes.FuncEntry] = rawptr[GenTypes.FuncEntry]((uint64(self.GlobalFuncs) + fi_t * entry_size)) if fe_t is not None: return fe_t.Func # 索引可信(Built==GlobalFuncCount | 查询名非空)⇒ 未命中即"确无同名条目": @@ -1055,10 +1055,10 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin): # "首个同名条目的 Func",未命中必为 None。索引不可信时回退下方线性扫描。 return None # 单遍扫描(合并原 owner 优先遍 + 通用遍,语义完全一致但省一半遍历):扫描中同时记录"首个同裸名条目"作通用兜底;一旦发现本模块条目(mangled 名以 "{owner_sha1}." 开头,16 位前缀 + '.')立即返回 - fallback_entry: GenTypes.FuncEntry | t.CPtr = None + fallback_entry: rawptr[GenTypes.FuncEntry] = None for i in range(func_count): entry_addr: uint64 = uint64(funcs) + i * entry_size - entry: GenTypes.FuncEntry | t.CPtr = (GenTypes.FuncEntry | t.CPtr)(entry_addr) + entry: rawptr[GenTypes.FuncEntry] = rawptr[GenTypes.FuncEntry](entry_addr) if entry is not None and entry.Name is not None: # 快速路径:同名要求首字符相等(strcmp 判等蕴含首字符相等), # 首字符不同者直接跳过 strcmp,避免全表每槽一次函数调用。 @@ -1075,10 +1075,10 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin): return None - def add_func_to_table(self, funcs: GenTypes.FuncEntry | t.CPtr, + def add_func_to_table(self, funcs: rawptr[GenTypes.FuncEntry], func_count: int, name: str, - func: llvmlite.Function | t.CPtr, + func: rawptr[llvmlite.Function], max_count: int, defaults: t.CPtr = None, default_count: int = 0, @@ -1099,7 +1099,7 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin): return 1 entry_size: sizet = GenTypes.FuncEntry.__sizeof__() entry_addr: uint64 = uint64(funcs) + func_count * entry_size - entry: GenTypes.FuncEntry | t.CPtr = (GenTypes.FuncEntry | t.CPtr)(entry_addr) + entry: rawptr[GenTypes.FuncEntry] = rawptr[GenTypes.FuncEntry](entry_addr) entry.Name = name entry.Func = func entry.Defaults = defaults @@ -1141,7 +1141,7 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin): return 1 - def _register_global_func(self, name: str, func: llvmlite.Function | t.CPtr, + def _register_global_func(self, name: str, func: rawptr[llvmlite.Function], pool: rawptr[memhub.MemBuddy] = None) -> int: """注册函数到全局表(已存在则跳过),返回 0 成功 @@ -1159,7 +1159,7 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin): # 直接写入全局表(不调用 add_func_to_table,避免递归) entry_size: sizet = GenTypes.FuncEntry.__sizeof__() entry_addr: uint64 = uint64(self.GlobalFuncs) + self.GlobalFuncCount * entry_size - entry: GenTypes.FuncEntry | t.CPtr = (GenTypes.FuncEntry | t.CPtr)(entry_addr) + entry: rawptr[GenTypes.FuncEntry] = rawptr[GenTypes.FuncEntry](entry_addr) # Name 深拷贝到 stdlib 区:全局表跨文件永久存活,pool 内名字会被 1b 每文件 # reset_to(mark1) 回收导致悬空(vtable 生成 find_func_global 后 strcmp 崩溃) name_len: sizet = string.strlen(name) @@ -1186,7 +1186,7 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin): def update_global_func_spec(self, name: str, - func: llvmlite.Function | t.CPtr) -> int: + func: rawptr[llvmlite.Function]) -> int: """更新全局函数表的 Spec(在函数参数全部添加完成后调用) 调用时机:add_func_to_table 注册后、llvmlite.add_param 全部执行完。 @@ -1195,7 +1195,7 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin): """ if name is None or func is None: return 1 - entry: GenTypes.FuncEntry | t.CPtr = self.find_func_entry_global(name) + entry: rawptr[GenTypes.FuncEntry] = self.find_func_entry_global(name) if entry is None: return 1 entry.Spec = self._build_func_spec(func) @@ -1203,7 +1203,7 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin): # _build_func_spec:由函数对象构造整签名 TypeSpec(S3 条目双写)——Kind=TS_FUNC,含 Ret + 形参 Spec 数组 + ParamCount + IsVarArg,必须在形参全部 add_param 完成后调用。参数沿 function_get_param_head 的 Param 链表两遍遍历(先计数再填充,llvmlite 无按下标取参且无法预知长度)。与 TSpec.SpecFromLLVMType 的 Func 分支不同:后者不含变参信息(恒置 IsVarArg=0),故此处直接用 NewTypeFunc(..., func.IsVarArg)。失败返回 None,调用方保留 None 不造伪 spec - def _build_func_spec(self, func: llvmlite.Function | t.CPtr) -> TSpec.TypeSpec | t.CPtr: + def _build_func_spec(self, func: rawptr[llvmlite.Function]) -> TSpec.TypeSpec | t.CPtr: """由函数对象构造整签名 TypeSpec,失败返回 None""" if func is None: return None @@ -1242,14 +1242,14 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin): return TSpec.NewTypeFunc(arena, ret_s, params_arr, cnt, func.IsVarArg) - def find_func_global(self, name: str) -> llvmlite.Function | t.CPtr: + def find_func_global(self, name: str) -> rawptr[llvmlite.Function]: """在全局函数表中按名称查找,返回 Function 指针或 None""" if name is None or self.GlobalFuncs is None: return None return self.find_func_in_table(self.GlobalFuncs, self.GlobalFuncCount, name) - def find_func_entry_global(self, name: str) -> GenTypes.FuncEntry | t.CPtr: + def find_func_entry_global(self, name: str) -> rawptr[GenTypes.FuncEntry]: """在全局函数表中按名称查找,返回完整 FuncEntry(含 Spec)或 None""" if name is None or self.GlobalFuncs is None: return None @@ -1263,12 +1263,12 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin): gi: int = _gfn_idx_find(self.GlobalFuncs, self.GlobalFuncNameIdx, self.GlobalFuncNameIdxCap, name) if gi >= 0: - entry_g: GenTypes.FuncEntry | t.CPtr = (GenTypes.FuncEntry | t.CPtr)(uint64(self.GlobalFuncs) + gi * entry_size) + entry_g: rawptr[GenTypes.FuncEntry] = rawptr[GenTypes.FuncEntry](uint64(self.GlobalFuncs) + gi * entry_size) return entry_g return None for i in range(self.GlobalFuncCount): entry_addr: uint64 = uint64(self.GlobalFuncs) + i * entry_size - entry: GenTypes.FuncEntry | t.CPtr = (GenTypes.FuncEntry | t.CPtr)(entry_addr) + entry: rawptr[GenTypes.FuncEntry] = rawptr[GenTypes.FuncEntry](entry_addr) if entry.Name is not None: # 快速路径:同名要求首字符相等(strcmp 判等蕴含首字符相等), # 首字符不同者直接跳过 strcmp。 @@ -1359,12 +1359,12 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin): string.memset(kinds, 0, default_count * 4) string.memset(ints, 0, default_count * 8) string.memset(strs, 0, default_count * 8) - dl: list[ast.AST | t.CPtr] | t.CPtr = (list[ast.AST | t.CPtr] | t.CPtr)(uint64(defaults)) + dl: list[rawptr[ast.AST]] | t.CPtr = (list[rawptr[ast.AST]] | t.CPtr)(uint64(defaults)) di: int for di in range(default_count): - dnode: ast.AST | t.CPtr = dl.get(di) + dnode: rawptr[ast.AST] = dl.get(di) if dnode is not None and dnode.kind() == ast.ASTKind.Constant: - dcn: ast.Constant | t.CPtr = (ast.Constant | t.CPtr)(dnode) + dcn: rawptr[ast.Constant] = rawptr[ast.Constant](dnode) kinds[di] = dcn.const_kind ints[di] = dcn.int_val if dcn.const_kind == ast.CONST_STR and dcn.str_val is not None: @@ -1379,7 +1379,7 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin): # → "跨模块默认参数无法重建"(FileIoTest File.__init__ 根因)。 # 仅支持已注册的整型 CDefine;未注册保持 kinds=0(重建时 # 仍 fail-fast,绝不静默回退)。 - dnm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(dnode) + dnm: rawptr[ast.Name] = rawptr[ast.Name](dnode) if dnm.id is not None: cdef_v: int = self.Gen.TypeGenCDef.lookup_cdefine_constant(dnm.id) if self.Gen.TypeGenCDef.is_cdefine_found() != 0: @@ -1392,9 +1392,9 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin): # 重建(快照缺失,默认值需为简单常量)"(AppGui.top_index # 的 ex3 = -1 根因)。只对"操作数是整型 Constant"求值, # 其它(浮点取负 / 取负变量)保持 kinds=0 → 重建时 fail-fast。 - du: ast.UnaryOp | t.CPtr = (ast.UnaryOp | t.CPtr)(dnode) + du: rawptr[ast.UnaryOp] = rawptr[ast.UnaryOp](dnode) if du.operand is not None and du.operand.kind() == ast.ASTKind.Constant: - doc: ast.Constant | t.CPtr = (ast.Constant | t.CPtr)(du.operand) + doc: rawptr[ast.Constant] = rawptr[ast.Constant](du.operand) if doc.const_kind == ast.CONST_INT: if du.op == ast.OpKind.USub: kinds[di] = ast.CONST_INT @@ -1439,10 +1439,10 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin): def _build_const_from_snapshot(self, pool: rawptr[memhub.MemBuddy], - mod: llvmlite.LLVMModule | t.CPtr, + mod: rawptr[llvmlite.LLVMModule], gd_entry: GenTypes.FuncDefaultsEntry | t.CPtr, di: int, - trans: HT.Translator | t.CPtr, + trans: rawptr[HT.Translator], builder: llvmlite.IRBuilder | t.CPtr) -> llvmlite.Value | t.CPtr: """从快照重建第 di 个默认值常量 IR""" if gd_entry is None or gd_entry.ConstKinds is None or gd_entry.ConstInts is None: @@ -1460,8 +1460,8 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin): return llvmlite.const_int32(pool, 1) return llvmlite.const_int32(pool, 0) elif kind == ast.CONST_NONE: - i8_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int8(pool) - i8_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, i8_ty) + i8_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int8(pool) + i8_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, i8_ty) return llvmlite.ConstNull(pool, i8_ptr_ty, "null") elif kind == ast.CONST_STR: if gd_entry.ConstStrs is not None and gd_entry.ConstStrs[di] != 0: @@ -1471,26 +1471,26 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin): return None - def find_func_entry_in_table(self, funcs: GenTypes.FuncEntry | t.CPtr, + def find_func_entry_in_table(self, funcs: rawptr[GenTypes.FuncEntry], func_count: int, - name: str) -> GenTypes.FuncEntry | t.CPtr: + name: str) -> rawptr[GenTypes.FuncEntry]: """在函数表中按名称查找,返回完整 FuncEntry 或 None""" if name is None or funcs is None: return None entry_size: sizet = GenTypes.FuncEntry.__sizeof__() for i in range(func_count): entry_addr: uint64 = uint64(funcs) + i * entry_size - entry: GenTypes.FuncEntry | t.CPtr = (GenTypes.FuncEntry | t.CPtr)(entry_addr) + entry: rawptr[GenTypes.FuncEntry] = rawptr[GenTypes.FuncEntry](entry_addr) if entry.Name is not None: # 快速路径:strcmp 判等蕴含首字符相等,首字符不同者跳过 strcmp if entry.Name[0] == name[0] and string.strcmp(entry.Name, name) == 0: return entry return None - def find_func_entry_in_table_owned(self, funcs: GenTypes.FuncEntry | t.CPtr, + def find_func_entry_in_table_owned(self, funcs: rawptr[GenTypes.FuncEntry], func_count: int, name: str, - owner_sha1: str) -> GenTypes.FuncEntry | t.CPtr: + owner_sha1: str) -> rawptr[GenTypes.FuncEntry]: """按「裸名 + 定义模块 SHA1」查找函数表条目,返回 FuncEntry 或 None 函数表以**裸名**登记,且 LoadDepVpiIntoModule 会把依赖模块的同名函数 @@ -1506,7 +1506,7 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin): entry_size: sizet = GenTypes.FuncEntry.__sizeof__() for i in range(func_count): entry_addr: uint64 = uint64(funcs) + i * entry_size - entry: GenTypes.FuncEntry | t.CPtr = (GenTypes.FuncEntry | t.CPtr)(entry_addr) + entry: rawptr[GenTypes.FuncEntry] = rawptr[GenTypes.FuncEntry](entry_addr) if entry is None or entry.Name is None: continue # 快速路径:strcmp 判等要求首字符相等,首字符不同者跳过 strcmp @@ -1524,7 +1524,7 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin): def NewExprCallHandle(self, pool: rawptr[memhub.MemBuddy], - trans: HT.Translator | t.CPtr) -> ExprCallHandle | t.CPtr: + trans: rawptr[HT.Translator]) -> ExprCallHandle | t.CPtr: h: ExprCallHandle | t.CPtr = pool.alloc(ExprCallHandle.__sizeof__()) if h is None: return None @@ -1543,13 +1543,13 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin): class ExprCallHandle(HT.Mixin): """函数调用处理器:继承 Mixin 获得 Trans 回指针""" - def __init__(self, trans: HT.Translator | t.CPtr): + def __init__(self, trans: rawptr[HT.Translator]): self.Trans = trans # ============================================================ # HandleCall - 翻译函数调用,返回 call 结果 Value # ============================================================ - def HandleCall(self, node: ast.AST | t.CPtr) -> llvmlite.Value | t.CPtr: + def HandleCall(self, node: rawptr[ast.AST]) -> llvmlite.Value | t.CPtr: """翻译函数调用,从 self.Trans 获取共享状态""" return GenApi.translate_call( self.Trans.Pool, self.Trans._cur_builder, self.Trans.Module, @@ -1559,7 +1559,7 @@ class ExprCallHandle(HT.Mixin): # ============================================================ # HandlePrintfCall - 翻译 printf 调用 # ============================================================ - def HandlePrintfCall(self, cl: ast.Call | t.CPtr): + def HandlePrintfCall(self, cl: rawptr[ast.Call]): """翻译 printf 调用,从 self.Trans 获取共享状态""" GenApi.translate_printf_call( self.Trans.Pool, self.Trans._cur_builder, self.Trans.Module, @@ -1568,7 +1568,7 @@ class ExprCallHandle(HT.Mixin): # ============================================================ # HandlePrintCall - 翻译 print 调用 # ============================================================ - def HandlePrintCall(self, cl: ast.Call | t.CPtr): + def HandlePrintCall(self, cl: rawptr[ast.Call]): """翻译 print 调用(类型感知格式化 + 默认换行)""" GenApi.translate_print_call( self.Trans.Pool, self.Trans._cur_builder, self.Trans.Module, diff --git a/App/lib/core/Gen/Call/CallGenLib.vp b/App/lib/core/Gen/Call/CallGenLib.vp index 63e9189..5c88c38 100644 --- a/App/lib/core/Gen/Call/CallGenLib.vp +++ b/App/lib/core/Gen/Call/CallGenLib.vp @@ -25,18 +25,18 @@ class CallGenLib(CallGenBase.CallGenBase): """C 库声明 / 返回类型推断 / kwargs 调用辅助(继承 Base)""" def _ensure_c_lib_declare(self, pool: rawptr[memhub.MemBuddy], - mod: llvmlite.LLVMModule | t.CPtr, - name: str) -> llvmlite.Function | t.CPtr: + mod: rawptr[llvmlite.LLVMModule], + name: str) -> rawptr[llvmlite.Function]: """为已知的 C 库函数创建 declare 声明""" if pool is None or mod is None or name is None: return None - i8_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int8(pool) - i32_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int32(pool) - i64_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int64(pool) - i8_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, i8_ty) + i8_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int8(pool) + i32_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int32(pool) + i64_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int64(pool) + i8_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, i8_ty) - ret_ty: llvmlite.LLVMType | t.CPtr = None + ret_ty: rawptr[llvmlite.LLVMType] = None params: int = 0 # 参数数量 if string.strcmp(name, "strlen") == 0 or string.strcmp(name, "strlength") == 0: @@ -88,7 +88,7 @@ class CallGenLib(CallGenBase.CallGenBase): return None # 创建 declare - fn: llvmlite.Function | t.CPtr = llvmlite.create_declare(pool, mod, name, ret_ty) + fn: rawptr[llvmlite.Function] = llvmlite.create_declare(pool, mod, name, ret_ty) if fn is None: return None # 添加参数 @@ -115,7 +115,7 @@ class CallGenLib(CallGenBase.CallGenBase): def _promote_clib_call_args(self, pool: rawptr[memhub.MemBuddy], builder: llvmlite.IRBuilder | t.CPtr, - mod: llvmlite.LLVMModule | t.CPtr, + mod: rawptr[llvmlite.LLVMModule], call_name: str, head: llvmlite.Value | t.CPtr, count: int) -> llvmlite.Value | t.CPtr: @@ -153,7 +153,7 @@ class CallGenLib(CallGenBase.CallGenBase): idx += 1 if cur is None or cur.Ty is None: return head - i64_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int64(pool) + i64_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int64(pool) promoted: llvmlite.Value | t.CPtr = None match cur.Ty: case llvmlite.LLVMType.Int(bits): @@ -193,9 +193,9 @@ class CallGenLib(CallGenBase.CallGenBase): call_name: str, head: llvmlite.Value | t.CPtr, count: int, - cargs: list[ast.AST | t.CPtr] | t.CPtr = None, + cargs: list[rawptr[ast.AST]] | t.CPtr = None, self_off: int = 0, - trans: HT.Translator | t.CPtr = None) -> llvmlite.Value | t.CPtr: + trans: rawptr[HT.Translator] = None) -> llvmlite.Value | t.CPtr: """把跨模块调用实参 coerce 到 vpi 定义侧形参类型,返回重建的实参链 cargs/self_off/trans:实参 AST 列表与其在实参链中的偏移(模块级函数 0、 @@ -249,15 +249,15 @@ class CallGenLib(CallGenBase.CallGenBase): if cls_nm is not None: stdlib.free(cls_nm) return head - i32_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int32(pool) - i8_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, llvmlite.Int8(pool)) + i32_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int32(pool) + i8_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, llvmlite.Int8(pool)) new_head: llvmlite.Value | t.CPtr = None new_tail: llvmlite.Value | t.CPtr = None cur: llvmlite.Value | t.CPtr = head idx: int = 0 while cur is not None and idx < count: node_v: llvmlite.Value | t.CPtr = cur - tgt_ty: llvmlite.LLVMType | t.CPtr = None + tgt_ty: rawptr[llvmlite.LLVMType] = None if tpl_src != 0: tgt_ty = VpiReader._resolve_vpi_param_annot_seg_template( pool, sha1_buf, cls_nm, meth_nm, idx, i32_ty, i8_ptr_ty) @@ -267,7 +267,7 @@ class CallGenLib(CallGenBase.CallGenBase): if tgt_ty is not None and cur.Ty is not None: # 实参 AST(源符号性判定用):链下标 idx 减 self 偏移即 AST 下标 arg_idx: int = idx - self_off - arg_node: ast.AST | t.CPtr = None + arg_node: rawptr[ast.AST] = None if cargs is not None and arg_idx >= 0 and arg_idx < len(cargs): arg_node = cargs.get(arg_idx) node_v = self._coerce_arg_value_to_ty( @@ -288,9 +288,9 @@ class CallGenLib(CallGenBase.CallGenBase): def _coerce_arg_value_to_ty(self, pool: rawptr[memhub.MemBuddy], builder: llvmlite.IRBuilder | t.CPtr, val: llvmlite.Value | t.CPtr, - tgt_ty: llvmlite.LLVMType | t.CPtr, - node: ast.AST | t.CPtr = None, - trans: HT.Translator | t.CPtr = None, + tgt_ty: rawptr[llvmlite.LLVMType], + node: rawptr[ast.AST] = None, + trans: rawptr[HT.Translator] = None, tpl_src: int = 0) -> llvmlite.Value | t.CPtr: """把单个实参 Value 转换到目标形参类型,无法安全转换时原样返回 @@ -389,8 +389,8 @@ class CallGenLib(CallGenBase.CallGenBase): def _infer_external_func_ret_ty(self, pool: rawptr[memhub.MemBuddy], func_name: str, - node: ast.AST | t.CPtr, - fatal_if_unknown: int) -> llvmlite.LLVMType | t.CPtr: + node: rawptr[ast.AST], + fatal_if_unknown: int) -> rawptr[llvmlite.LLVMType]: """根据函数名推断外部 includes 函数的返回类型 支持三种函数名形式: @@ -415,7 +415,7 @@ class CallGenLib(CallGenBase.CallGenBase): # '.' 后的部分是裸函数名 bare_name = dot_pos + 1 - i8_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, llvmlite.Int8(pool)) + i8_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, llvmlite.Int8(pool)) # 返回 i8* 的函数(指针返回值,截断会导致错误) if string.strcmp(bare_name, "strchr") == 0 or string.strcmp(func_name, "strchr") == 0: @@ -489,7 +489,7 @@ class CallGenLib(CallGenBase.CallGenBase): # Win32 API 返回指针(VOIDPTR/HANDLE)的函数 # stubs 翻译时未注入,需推断返回 i8* 避免指针被截断为 i32 导致解引用崩溃 - i8_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, llvmlite.Int8(pool)) + i8_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, llvmlite.Int8(pool)) if string.strcmp(func_name, "VirtualAlloc") == 0: return i8_ptr_ty if string.strcmp(func_name, "HeapAlloc") == 0: @@ -586,7 +586,7 @@ class CallGenLib(CallGenBase.CallGenBase): return llvmlite.Int32(pool) def _get_external_func_param_ty(self, pool: rawptr[memhub.MemBuddy], func_name: str, - param_idx: int) -> llvmlite.LLVMType | t.CPtr: + param_idx: int) -> rawptr[llvmlite.LLVMType]: """获取外部函数第 param_idx 个参数的期望类型,None 表示用字面量原类型 对 Win32 API 函数的所有非指针参数返回 i64,匹配 declare 中 @@ -595,7 +595,7 @@ class CallGenLib(CallGenBase.CallGenBase): if pool is None or func_name is None: return None - i64_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int64(pool) + i64_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int64(pool) # Win32 API 函数列表:所有非指针参数在 declare 中都是 i64 # (因为 ULONG/DWORD/SIZE_T 在 LLVM stubs 翻译时都被映射为 i64) @@ -646,7 +646,7 @@ class CallGenLib(CallGenBase.CallGenBase): return 0 def _emit_llvm_memcpy_intrinsic(self, pool: rawptr[memhub.MemBuddy], builder: llvmlite.IRBuilder | t.CPtr, - mod: llvmlite.LLVMModule | t.CPtr, + mod: rawptr[llvmlite.LLVMModule], dst_val: llvmlite.Value | t.CPtr, src_val: llvmlite.Value | t.CPtr, num_val: llvmlite.Value | t.CPtr) -> llvmlite.Value | t.CPtr: @@ -661,16 +661,16 @@ class CallGenLib(CallGenBase.CallGenBase): return None # 在函数顶部声明 void_ty,避免后续遮蔽 - void_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Void(pool) + void_ty: rawptr[llvmlite.LLVMType] = llvmlite.Void(pool) # 声明 @llvm.memcpy(如未声明) - memcpy_func: llvmlite.Function | t.CPtr = self.find_func_in_module(mod, "llvm.memcpy") + memcpy_func: rawptr[llvmlite.Function] = self.find_func_in_module(mod, "llvm.memcpy") if memcpy_func is None: memcpy_func = llvmlite.create_declare(pool, mod, "llvm.memcpy", void_ty) if memcpy_func is not None: - i8_ptr_ty_d: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, llvmlite.Int8(pool)) - i64_ty_d: llvmlite.LLVMType | t.CPtr = llvmlite.Int64(pool) - i1_ty_d: llvmlite.LLVMType | t.CPtr = llvmlite.Int1(pool) + i8_ptr_ty_d: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, llvmlite.Int8(pool)) + i64_ty_d: rawptr[llvmlite.LLVMType] = llvmlite.Int64(pool) + i1_ty_d: rawptr[llvmlite.LLVMType] = llvmlite.Int1(pool) llvmlite.add_param(pool, memcpy_func, i8_ptr_ty_d, "dst") llvmlite.add_param(pool, memcpy_func, i8_ptr_ty_d, "src") llvmlite.add_param(pool, memcpy_func, i64_ty_d, "len") @@ -678,12 +678,12 @@ class CallGenLib(CallGenBase.CallGenBase): # 类型转换: dst, src → i8*; num → i64 # 注意: 使用 value_get_ty 访问器获取 Ty,避免本地 Value 类型字段索引偏移 - i8_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, llvmlite.Int8(pool)) - i64_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int64(pool) + i8_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, llvmlite.Int8(pool)) + i64_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int64(pool) # dst → i8* dst_coerced: llvmlite.Value | t.CPtr = dst_val - dst_ty: llvmlite.LLVMType | t.CPtr = llvmlite.value_get_ty(dst_val) + dst_ty: rawptr[llvmlite.LLVMType] = llvmlite.value_get_ty(dst_val) if self.Gen.ExprGenBase.is_ptr_type(dst_ty) != 0: dst_coerced = llvmlite.build_bitcast(builder, dst_val, i8_ptr_ty) else: @@ -695,7 +695,7 @@ class CallGenLib(CallGenBase.CallGenBase): # src → i8* src_coerced: llvmlite.Value | t.CPtr = src_val - src_ty: llvmlite.LLVMType | t.CPtr = llvmlite.value_get_ty(src_val) + src_ty: rawptr[llvmlite.LLVMType] = llvmlite.value_get_ty(src_val) if self.Gen.ExprGenBase.is_ptr_type(src_ty) != 0: src_coerced = llvmlite.build_bitcast(builder, src_val, i8_ptr_ty) else: @@ -735,14 +735,14 @@ class CallGenLib(CallGenBase.CallGenBase): # ============================================================ def _translate_call_with_kwargs(self, pool: rawptr[memhub.MemBuddy], builder: llvmlite.IRBuilder | t.CPtr, - mod: llvmlite.LLVMModule | t.CPtr, + mod: rawptr[llvmlite.LLVMModule], func_name: str, - found_func: llvmlite.Function | t.CPtr, - cargs: list[ast.AST | t.CPtr] | t.CPtr, + found_func: rawptr[llvmlite.Function], + cargs: list[rawptr[ast.AST]] | t.CPtr, can: sizet, - keywords: list[ast.AST | t.CPtr] | t.CPtr, + keywords: list[rawptr[ast.AST]] | t.CPtr, kw_count: sizet, - trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: + trans: rawptr[HT.Translator]) -> llvmlite.Value | t.CPtr: """带关键字参数的函数调用,按参数顺序构建调用链表 使用 llvmlite 访问器函数绕过 stub 类型限制: @@ -763,10 +763,10 @@ class CallGenLib(CallGenBase.CallGenBase): while cur_param is not None: arg_val: llvmlite.Value | t.CPtr = None - param_ty: llvmlite.LLVMType | t.CPtr = llvmlite.param_get_ty(cur_param) + param_ty: rawptr[llvmlite.LLVMType] = llvmlite.param_get_ty(cur_param) if param_idx < can: # 优先使用位置参数 - arg: ast.AST | t.CPtr = cargs.get(param_idx) + arg: rawptr[ast.AST] = cargs.get(param_idx) if arg is not None: # 传形参类型(char 字面量 → str 形参需物化字符串,见 translate_constant) arg_val = self.Gen.ExprGen.translate_value( @@ -813,7 +813,7 @@ class CallGenLib(CallGenBase.CallGenBase): call_name = found_name # 返回类型(使用访问器) - call_ret_ty: llvmlite.LLVMType | t.CPtr = llvmlite.function_get_ret_ty(found_func) + call_ret_ty: rawptr[llvmlite.LLVMType] = llvmlite.function_get_ret_ty(found_func) if call_ret_ty is None: # found_func 已有 declare 却读不到返回类型(访问器异常,罕见防御): # 白名单未命中也不 fail-fast,保持默认 i32(有声明即有类型来源)。 diff --git a/App/lib/core/Gen/Call/CallGenMixin.vp b/App/lib/core/Gen/Call/CallGenMixin.vp index 48edd8c..7c9f648 100644 --- a/App/lib/core/Gen/Call/CallGenMixin.vp +++ b/App/lib/core/Gen/Call/CallGenMixin.vp @@ -63,19 +63,19 @@ class CallGenMixin(CallGenBase.CallGenBase): # ============================================================ def translate_call(self, pool: rawptr[memhub.MemBuddy], builder: llvmlite.IRBuilder | t.CPtr, - mod: llvmlite.LLVMModule | t.CPtr, - node: ast.AST | t.CPtr, + mod: rawptr[llvmlite.LLVMModule], + node: rawptr[ast.AST], funcs_ptr: t.CPtr, func_count: int, - trans: HT.Translator | t.CPtr = None) -> llvmlite.Value | t.CPtr: + trans: rawptr[HT.Translator] = None) -> llvmlite.Value | t.CPtr: """翻译函数调用,返回 call 结果 Value""" - cl: ast.Call | t.CPtr = (ast.Call | t.CPtr)(node) + cl: rawptr[ast.Call] = rawptr[ast.Call](node) if cl is None: return None func_name: str = self.Gen.ExprGenBase.get_func_name(cl.func) - cargs: list[ast.AST | t.CPtr] | t.CPtr = cl.args + cargs: list[rawptr[ast.AST]] | t.CPtr = cl.args can: sizet = 0 if cargs is not None: can = len(cargs) @@ -103,12 +103,12 @@ class CallGenMixin(CallGenBase.CallGenBase): # 检查是否是 list[int](pool) 形式的泛型实例化调用 # Subscript 节点作为 Call func: 泛型类构造函数 if cl.func is not None and cl.func.kind() == ast.ASTKind.Subscript and trans is not None: - sub_node: ast.Subscript | t.CPtr = (ast.Subscript | t.CPtr)(cl.func) + sub_node: rawptr[ast.Subscript] = rawptr[ast.Subscript](cl.func) if sub_node.value is not None and sub_node.value.kind() == ast.ASTKind.Name: - gen_nm_node: ast.Name | t.CPtr = (ast.Name | t.CPtr)(sub_node.value) + gen_nm_node: rawptr[ast.Name] = rawptr[ast.Name](sub_node.value) gen_class_name: str = gen_nm_node.id # 检查是否是泛型类模板 - template_cd: ast.ClassDef | t.CPtr = self.Gen.ClassGenGeneric._find_generic_template(gen_class_name) + template_cd: rawptr[ast.ClassDef] = self.Gen.ClassGenGeneric._find_generic_template(gen_class_name) if template_cd is not None: # 提取类型实参 gen_type_args: list[str] | t.CPtr = self.Gen.CallGenCtor._extract_type_args_from_slice(pool, sub_node.slice, trans._from_imports) @@ -137,7 +137,7 @@ class CallGenMixin(CallGenBase.CallGenBase): # CArray 不是泛型类模板,是类型注解下标。先按注解解析出 # 类型再单参转换(ast/base.vp L392 ops_list 行根因)。 if cl.args is not None and len(cl.args) == 1: - sub_cast_ty: llvmlite.LLVMType | t.CPtr = self.Gen.TypeGenResolve.resolve_annotation_type( + sub_cast_ty: rawptr[llvmlite.LLVMType] = self.Gen.TypeGenResolve.resolve_annotation_type( pool, cl.func, trans._imported_modules, trans._from_imports, trans, 0) if sub_cast_ty is not None: sub_cast_arg: llvmlite.Value | t.CPtr = self.Gen.ExprGen.translate_value( @@ -156,10 +156,10 @@ class CallGenMixin(CallGenBase.CallGenBase): # 检查是否是 (A | t.CPtr)(value) 形式的类型转换 # BinOp 节点作为 Call func: 联合类型注解用作类型转换 if cl.func is not None and cl.func.kind() == ast.ASTKind.BinOp and trans is not None: - binop_ty: llvmlite.LLVMType | t.CPtr = self.Gen.TypeGenResolve.resolve_annotation_type( + binop_ty: rawptr[llvmlite.LLVMType] = self.Gen.TypeGenResolve.resolve_annotation_type( pool, cl.func, trans._imported_modules, trans._from_imports, trans, 0) if binop_ty is not None: - binop_args: list[ast.AST | t.CPtr] | t.CPtr = cl.args + binop_args: list[rawptr[ast.AST]] | t.CPtr = cl.args if binop_args is not None and len(binop_args) == 1: binop_arg_val: llvmlite.Value | t.CPtr = self.Gen.ExprGen.translate_value( builder, pool, mod, binop_args.get(0), funcs_ptr, func_count, trans) @@ -223,7 +223,7 @@ class CallGenMixin(CallGenBase.CallGenBase): return None # 获取关键字参数 - keywords: list[ast.AST | t.CPtr] | t.CPtr = cl.keywords + keywords: list[rawptr[ast.AST]] | t.CPtr = cl.keywords kw_count: sizet = 0 if keywords is not None: kw_count = len(keywords) @@ -233,7 +233,7 @@ class CallGenMixin(CallGenBase.CallGenBase): # - 裸名 Class(): 需要 from X import Class 或本地定义 # - 模块限定 Module.Class(): 需要 import Module # 用 find_struct_by_module 规避跨模块同名 find_struct 找错 - struct_ty: llvmlite.LLVMType | t.CPtr = None + struct_ty: rawptr[llvmlite.LLVMType] = None gen_ctor_entry: GenTypes.StructEntry | t.CPtr = None # 模块限定构造 Module.Class(...) 优先:按模块名解析 SHA1 精确命中类。 # 必须在裸名可见性分支之前——跨模块同名类(VKernel gfx 与 App gfx 都 @@ -242,10 +242,10 @@ class CallGenMixin(CallGenBase.CallGenBase): # symbol,Scene3D 根因)。模块解析成功即锁定,跳过下方裸名回退。 mod_qual_done: int = 0 if trans is not None and cl.func is not None and cl.func.kind() == ast.ASTKind.Attribute: - at_qc0: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(cl.func) + at_qc0: rawptr[ast.Attribute] = rawptr[ast.Attribute](cl.func) mod_path0: str = None if at_qc0.value is not None and at_qc0.value.kind() == ast.ASTKind.Name: - mod_nm0: ast.Name | t.CPtr = (ast.Name | t.CPtr)(at_qc0.value) + mod_nm0: rawptr[ast.Name] = rawptr[ast.Name](at_qc0.value) if mod_nm0.id is not None: mod_path0 = mod_nm0.id elif at_qc0.value is not None and at_qc0.value.kind() == ast.ASTKind.Attribute: @@ -266,9 +266,9 @@ class CallGenMixin(CallGenBase.CallGenBase): if gen_ctor_entry is not None: struct_ty = gen_ctor_entry.Ty elif trans is not None and cl.func is not None and cl.func.kind() == ast.ASTKind.Attribute: - at_qc: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(cl.func) + at_qc: rawptr[ast.Attribute] = rawptr[ast.Attribute](cl.func) if at_qc.value is not None and at_qc.value.kind() == ast.ASTKind.Name: - mod_nm_qc: ast.Name | t.CPtr = (ast.Name | t.CPtr)(at_qc.value) + mod_nm_qc: rawptr[ast.Name] = rawptr[ast.Name](at_qc.value) imp_ok: int = self.Gen.ImportsGen.is_module_imported_or_known(trans._imported_modules, mod_nm_qc.id) if imp_ok != 0: # 模块限定构造 Module.Class(...):按模块名解析 SHA1 精确命中类。 @@ -395,14 +395,14 @@ class CallGenMixin(CallGenBase.CallGenBase): if cl.func is not None and cl.func.kind() == ast.ASTKind.Name: is_gen_bare = 1 elif cl.func is not None and cl.func.kind() == ast.ASTKind.Attribute: - at_gb: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(cl.func) + at_gb: rawptr[ast.Attribute] = rawptr[ast.Attribute](cl.func) if at_gb.value is not None and at_gb.value.kind() == ast.ASTKind.Name: - am_gb: ast.Name | t.CPtr = (ast.Name | t.CPtr)(at_gb.value) + am_gb: rawptr[ast.Name] = rawptr[ast.Name](at_gb.value) if am_gb.id is not None: if self.Gen.ImportsGen.is_module_imported(trans._imported_modules, am_gb.id) != 0: is_gen_bare = 1 if is_gen_bare != 0: - template_cd_bare: ast.ClassDef | t.CPtr = self.Gen.ClassGenGeneric._find_generic_template(func_name) + template_cd_bare: rawptr[ast.ClassDef] = self.Gen.ClassGenGeneric._find_generic_template(func_name) if template_cd_bare is not None and template_cd_bare.type_params is not None: tp_bare: list[str] | t.CPtr = template_cd_bare.type_params tp_count_bare: sizet = len(tp_bare) @@ -465,9 +465,9 @@ class CallGenMixin(CallGenBase.CallGenBase): # 必须在跨模块调用查找之前,否则 ClassName 会被误判为模块名 # 对应 TPC HandlesExprCall.py:585-644 的三条检测路径之一 if cl.func is not None and cl.func.kind() == ast.ASTKind.Attribute: - rc_at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(cl.func) + rc_at: rawptr[ast.Attribute] = rawptr[ast.Attribute](cl.func) if rc_at.value is not None and rc_at.value.kind() == ast.ASTKind.Name: - rc_cls_node: ast.Name | t.CPtr = (ast.Name | t.CPtr)(rc_at.value) + rc_cls_node: rawptr[ast.Name] = rawptr[ast.Name](rc_at.value) if rc_cls_node.id is not None: rc_cls_name: str = rc_cls_node.id # 检查 ClassName 是否是已注册的 REnum 类 @@ -541,15 +541,15 @@ class CallGenMixin(CallGenBase.CallGenBase): viperlib.snprintf(can_buf, 64, "create_%s", func_name) create_an: str = self.Gen.FuncGenBase._mangle_func_name( trans, can_buf, 0) - create_fn_an: llvmlite.Function | t.CPtr = self.find_func_in_module( + create_fn_an: rawptr[llvmlite.Function] = self.find_func_in_module( mod, create_an) if create_fn_an is not None: - frame_ty_an: llvmlite.LLVMType | t.CPtr = self.Gen.AsyncGen._lookup_coro_frame( + frame_ty_an: rawptr[llvmlite.LLVMType] = self.Gen.AsyncGen._lookup_coro_frame( trans, func_name) if frame_ty_an is not None: - ret_ptr_ty_an: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr( + ret_ptr_ty_an: rawptr[llvmlite.LLVMType] = llvmlite.Ptr( pool, frame_ty_an) - i8_ptr_ty_an: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr( + i8_ptr_ty_an: rawptr[llvmlite.LLVMType] = llvmlite.Ptr( pool, llvmlite.Int8(pool)) # M2:async 调用参数(task(5, 6) → create_task(5, 6)) arg_head_an: llvmlite.Value | t.CPtr = None @@ -589,12 +589,12 @@ class CallGenMixin(CallGenBase.CallGenBase): # stubs 在翻译后才注入,翻译时跨模块函数 found_func 通常为 None, # 此时根据函数名推断 includes 库函数的返回类型(如 strchr 返回 i8*) # 如果调用方未传 funcs_ptr/func_count(如 AnnAssign 路径),从 trans 获取 - actual_funcs: GenTypes.FuncEntry | t.CPtr = funcs_ptr + actual_funcs: rawptr[GenTypes.FuncEntry] = funcs_ptr actual_func_count: int = func_count if actual_funcs is None and trans is not None: actual_funcs = trans._funcs actual_func_count = trans._func_count - found_func: llvmlite.Function | t.CPtr = None + found_func: rawptr[llvmlite.Function] = None if cl.func is not None and cl.func.kind() == ast.ASTKind.Name: # 裸名调用:允许精确 + 后缀匹配 # 自定义装饰器 wrapper 重写:原函数名 → __decor_wrap_{name} @@ -605,7 +605,7 @@ class CallGenMixin(CallGenBase.CallGenBase): found_func = self.find_func_in_module(mod, decor_wrap_nm) else: # 本模块已定义函数名的裸名调用:先按裸名在模块函数表(FuncEntry 数组,forward_declare_functions 已把所有模块级函数以 Name=裸名、Func=其 declare/define 登记进 trans._funcs)精确命中,再回落 find_func_in_module 的 LLVM 模块链表扫描。函数表才是同模块函数名的权威注册表(链表扫描漏掉本模块定义时会误走 C 库自动 declare / from_imports 回退)。模块表只含模块级函数(无方法),CExport 条目 Func 名即裸名,复用不改变既有符号语义 - mod_fn_tb: llvmlite.Function | t.CPtr = None + mod_fn_tb: rawptr[llvmlite.Function] = None if actual_funcs is not None: # 同模块函数优先:_funcs 表在 forward_declare_functions 之前 # 已被 LoadDepVpiIntoModule 注入的依赖模块 stub 污染——外来 @@ -691,7 +691,7 @@ class CallGenMixin(CallGenBase.CallGenBase): # 误命中 subprocess.run → call 到错误符号 → 参数错位解引用崩溃, # SysLibTest 0xC0000005 根因)。误命中时拒绝(found_func=None), # 落到下方跨模块模块限定解析用模块自身 SHA1 构造正确符号。 - xm_at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(cl.func) + xm_at: rawptr[ast.Attribute] = rawptr[ast.Attribute](cl.func) if xm_at is not None and xm_at.value is not None and trans is not None \ and trans._imported_modules is not None: # 模块路径:单层 Name(syslibtest_impl.run)或嵌套 Attribute @@ -700,7 +700,7 @@ class CallGenMixin(CallGenBase.CallGenBase): # 无限递归栈溢出(SysLibTest 0xC00000FD 根因)。 xm_mod_path: str = None if xm_at.value.kind() == ast.ASTKind.Name: - xm_nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(xm_at.value) + xm_nm: rawptr[ast.Name] = rawptr[ast.Name](xm_at.value) if xm_nm.id is not None: xm_mod_path = xm_nm.id elif xm_at.value.kind() == ast.ASTKind.Attribute: @@ -778,9 +778,9 @@ class CallGenMixin(CallGenBase.CallGenBase): if found_func is None: bi_sha1: str = self._lookup_module_sha1("builtins") if bi_sha1 is not None: - bi_ret: llvmlite.LLVMType | t.CPtr = None - bi_p1: llvmlite.LLVMType | t.CPtr = None - bi_p2: llvmlite.LLVMType | t.CPtr = None + bi_ret: rawptr[llvmlite.LLVMType] = None + bi_p1: rawptr[llvmlite.LLVMType] = None + bi_p2: rawptr[llvmlite.LLVMType] = None if string.strcmp(func_name, "ord") == 0: bi_ret = llvmlite.Int32(pool) bi_p1 = llvmlite.Int8(pool) @@ -801,7 +801,7 @@ class CallGenMixin(CallGenBase.CallGenBase): if bi_sym_buf is not None: viperlib.snprintf(bi_sym_buf, bi_sym_len, "%s.%s", bi_sha1, func_name) bi_sym = bi_sym_buf - bi_decl: llvmlite.Function | t.CPtr = llvmlite.create_declare( + bi_decl: rawptr[llvmlite.Function] = llvmlite.create_declare( pool, mod, bi_sym, bi_ret) if bi_decl is not None: llvmlite.add_param(pool, bi_decl, bi_p1, "v") @@ -809,13 +809,13 @@ class CallGenMixin(CallGenBase.CallGenBase): llvmlite.add_param(pool, bi_decl, bi_p2, "w") found_func = bi_decl # 使用访问器绕过 stub 类型限制 - found_ret_ty: llvmlite.LLVMType | t.CPtr = None + found_ret_ty: rawptr[llvmlite.LLVMType] = None found_params: t.CPtr = None if found_func is not None: found_ret_ty = llvmlite.function_get_ret_ty(found_func) found_params = llvmlite.function_get_params(found_func) if found_ret_ty is not None: - call_ret_ty: llvmlite.LLVMType | t.CPtr = found_ret_ty + call_ret_ty: rawptr[llvmlite.LLVMType] = found_ret_ty else: # found_func=None(跨模块 stub 未注入):先从 vpi stub 返回注解 # 缓存精确获取返回类型(含 tuple[T1,T2] → 匿名结构体,如 @@ -826,7 +826,7 @@ class CallGenMixin(CallGenBase.CallGenBase): # 与定义侧 {i8*, i16} 不匹配 → HandlesAssign 的 tuple 解包 # (依赖 rhs_val.Ty 是 Struct)静默跳过 → 目标变量从未赋值 → # free 未初始化栈垃圾指针崩溃(HashLibTest hqx 段)。 - vpi_ret_ty: llvmlite.LLVMType | t.CPtr = None + vpi_ret_ty: rawptr[llvmlite.LLVMType] = None # 跨模块返回类型解析的来源模块 SHA1:仅在下方 cl.func 是 # Attribute(模块.函数) 分支赋值。必须显式初始化 None——此前声明在 # if 块内、elif mod_ret_sha1 is not None 在外层读取,裸名调用 @@ -836,14 +836,14 @@ class CallGenMixin(CallGenBase.CallGenBase): # (llvmlite/__init__.vp CreateGlobalInt 翻译时 0xC0000005 根因)。 mod_ret_sha1: str = None if cl.func is not None and cl.func.kind() == ast.ASTKind.Attribute: - at_ret: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(cl.func) + at_ret: rawptr[ast.Attribute] = rawptr[ast.Attribute](cl.func) # 解析调用模块路径:单层(stdlib.free,value 是 Name)与多层 # (w32.win32file.CreatePipe,value 是嵌套 Attribute)都支持。 # 缺失多层路径 → mod_ret_sha1=None → 误走裸名外部函数路径, # fail-fast 误杀可收敛的模块限定调用(CreatePipe 根因)。 mod_path_ret: str = None if at_ret.value is not None and at_ret.value.kind() == ast.ASTKind.Name: - mod_ret_nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(at_ret.value) + mod_ret_nm: rawptr[ast.Name] = rawptr[ast.Name](at_ret.value) mod_path_ret = mod_ret_nm.id elif at_ret.value is not None and at_ret.value.kind() == ast.ASTKind.Attribute: mod_path_ret = self.Gen.ExprGenAttr._attr_module_path_str(pool, at_ret.value) @@ -907,7 +907,7 @@ class CallGenMixin(CallGenBase.CallGenBase): # 且 vpi 返回注解缓存未命中时,仍从依赖模块 text.ll/vpi 精确解析 # 返回类型(对齐 mangled 路径),避免静默默认 i32 截断指针/i64 # (uhci.vp mm.malloc 根因:call i32 @malloc 截断 0xbb69000 → null)。 - cross_ret: llvmlite.LLVMType | t.CPtr = None + cross_ret: rawptr[llvmlite.LLVMType] = None if trans is not None and trans._declare_only == 0: cross_ret = self._LookupMethodRetTyFromTextLL( pool, mod_ret_sha1, None, func_name, 1) @@ -947,8 +947,8 @@ class CallGenMixin(CallGenBase.CallGenBase): # translate_closure_call 期望 i8** 存储(load 一次得闭包 # 对象指针);load_nonlocal_var 已返回对象指针 → 临时 # alloca 暂存 - i8_ty_nl: llvmlite.LLVMType | t.CPtr = llvmlite.Int8(pool) - i8_ptr_ty_nl: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, i8_ty_nl) + i8_ty_nl: rawptr[llvmlite.LLVMType] = llvmlite.Int8(pool) + i8_ptr_ty_nl: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, i8_ty_nl) tmp_alloca_nl: llvmlite.Value | t.CPtr = self.Gen.VarGen._alloca_at_entry( builder, i8_ptr_ty_nl) if tmp_alloca_nl is not None: @@ -1006,14 +1006,14 @@ class CallGenMixin(CallGenBase.CallGenBase): mc_src2: llvmlite.Value | t.CPtr = None mc_num2: llvmlite.Value | t.CPtr = None for ai in range(can): - arg: ast.AST | t.CPtr = cargs.get(ai) + arg: rawptr[ast.AST] = cargs.get(ai) if arg is not None: # 先取形参类型:单引号单字符字面量(CONST_CHAR)传给 str/指针 # 形参时需物化 1 字符字符串(translate_constant 依据 target_ty # 判定),否则 coerce inttoptr 把字符值当指针(如 '"'=0x22)→ # strlen 访问低地址 ASan 崩溃(二代编 StringTest PyI 生成根因)。 fp: llvmlite.Param | t.CPtr = None - fpty: llvmlite.LLVMType | t.CPtr = None + fpty: rawptr[llvmlite.LLVMType] = None if found_func is not None: fp = llvmlite.function_get_param_head(found_func) fpi: int = 0 @@ -1032,7 +1032,7 @@ class CallGenMixin(CallGenBase.CallGenBase): # 数组实参按 C 语义衰减为元素指针(对齐 TPC # _decay_array_to_ptr),与 _translate_method_call 一致。 if self.Gen.ExprGenBase.is_ptr_type(arg_val.Ty) != 0: - arr_pointee_fc: llvmlite.LLVMType | t.CPtr = arg_val.Ty.Pointee + arr_pointee_fc: rawptr[llvmlite.LLVMType] = arg_val.Ty.Pointee if arr_pointee_fc is not None: match arr_pointee_fc: case llvmlite.LLVMType.Array(arr_et_fc, _): @@ -1048,11 +1048,11 @@ class CallGenMixin(CallGenBase.CallGenBase): # 参数类型是 C ABI 硬约束(snprintf size 为 i64),不提升 # 则 call(i32 1024) 与 declare(i64 size) 不匹配,且 Win64 # 变参槽高 4 字节残留栈垃圾(clean 日志 0x7ff700000052 根因)。 - kvc_ty: llvmlite.LLVMType | t.CPtr = self.Gen.CallGenVa._get_known_vararg_cfunc_param_ty( + kvc_ty: rawptr[llvmlite.LLVMType] = self.Gen.CallGenVa._get_known_vararg_cfunc_param_ty( pool, func_name, ai) if kvc_ty is not None: arg_val = self.Gen.ExprGenBase.coerce_to_type(builder, arg_val, kvc_ty, arg) - ext_param_ty: llvmlite.LLVMType | t.CPtr = self.Gen.CallGenLib._get_external_func_param_ty( + ext_param_ty: rawptr[llvmlite.LLVMType] = self.Gen.CallGenLib._get_external_func_param_ty( pool, func_name, ai) if ext_param_ty is not None: val_bits_ap: int = self.Gen.ExprGenBase.get_llvm_type_bits(arg_val.Ty) @@ -1077,7 +1077,7 @@ class CallGenMixin(CallGenBase.CallGenBase): # 对齐 TPC FuncGen/Python-llvmlite 的 ABI 自动提升。 ab_va: int = self.Gen.ExprGenBase.get_llvm_type_bits(arg_val.Ty) af_va: int = self.Gen.ExprGenBase.get_llvm_float_bits(arg_val.Ty) - i64_va: llvmlite.LLVMType | t.CPtr = llvmlite.Int64(pool) + i64_va: rawptr[llvmlite.LLVMType] = llvmlite.Int64(pool) if ab_va != 0 and ab_va < 64: arg_val = llvmlite.build_sext(builder, arg_val, i64_va) elif af_va == 32: @@ -1110,9 +1110,9 @@ class CallGenMixin(CallGenBase.CallGenBase): # 必须先算(模块表查找也要用它限定定义模块 → 见下)。 dfx_callee_sha: str = None if cl.func is not None and cl.func.kind() == ast.ASTKind.Attribute: - dfx_at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(cl.func) + dfx_at: rawptr[ast.Attribute] = rawptr[ast.Attribute](cl.func) if dfx_at.value is not None and dfx_at.value.kind() == ast.ASTKind.Name: - dfx_mn: ast.Name | t.CPtr = (ast.Name | t.CPtr)(dfx_at.value) + dfx_mn: rawptr[ast.Name] = rawptr[ast.Name](dfx_at.value) if dfx_mn.id is not None: dfx_callee_sha = self._lookup_module_sha1(dfx_mn.id) if dfx_callee_sha is None and self.Gen.TypeGenBase is not None: @@ -1127,7 +1127,7 @@ class CallGenMixin(CallGenBase.CallGenBase): # 且本项改动已足以修掉 N17(受限查找命中本模块/同定义模块条目, # Defaults 为 None 或本模块池内 AST)。 if trans is not None and trans._funcs is not None: - df_entry: GenTypes.FuncEntry | t.CPtr = self.Gen.CallGenLeafKit.find_func_entry_in_table_owned( + df_entry: rawptr[GenTypes.FuncEntry] = self.Gen.CallGenLeafKit.find_func_entry_in_table_owned( trans._funcs, trans._func_count, func_name, dfx_callee_sha) if df_entry is not None: df_defaults = df_entry.Defaults @@ -1173,8 +1173,8 @@ class CallGenMixin(CallGenBase.CallGenBase): df_arg_val = self.Gen.CallGenLeafKit._build_const_from_snapshot( pool, mod, gd_entry, df_di, trans, builder) if df_arg_val is None: - df_defaults_list: list[ast.AST | t.CPtr] | t.CPtr = (list[ast.AST | t.CPtr] | t.CPtr)(uint64(df_defaults)) - df_default_node: ast.AST | t.CPtr = df_defaults_list.get(df_di) + df_defaults_list: list[rawptr[ast.AST]] | t.CPtr = (list[rawptr[ast.AST]] | t.CPtr)(uint64(df_defaults)) + df_default_node: rawptr[ast.AST] = df_defaults_list.get(df_di) if df_default_node is not None: df_arg_val = self.Gen.ExprGen.translate_value( builder, pool, mod, df_default_node, None, 0, trans) @@ -1204,7 +1204,7 @@ class CallGenMixin(CallGenBase.CallGenBase): fp_z = llvmlite.param_get_next(fp_z) fpi_z += 1 while fp_z is not None and fpi_z < fc_cnt: - zero_ty_z: llvmlite.LLVMType | t.CPtr = llvmlite.param_get_ty(fp_z) + zero_ty_z: rawptr[llvmlite.LLVMType] = llvmlite.param_get_ty(fp_z) zero_val_z: llvmlite.Value | t.CPtr = llvmlite.ConstZero(pool, zero_ty_z) if zero_val_z is not None: zero_val_z.Next = None @@ -1252,7 +1252,7 @@ class CallGenMixin(CallGenBase.CallGenBase): # 跨模块函数调用:found_func 为 None 时,检查是否是模块限定调用 # 如 string.strchr(...) → @{sha1_of_string}.strchr if cl.func is not None and cl.func.kind() == ast.ASTKind.Attribute: - xmod_at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(cl.func) + xmod_at: rawptr[ast.Attribute] = rawptr[ast.Attribute](cl.func) if xmod_at.value is not None and (xmod_at.value.kind() == ast.ASTKind.Name or xmod_at.value.kind() == ast.ASTKind.Attribute): # 模块路径:单层 Name(string.strchr)或嵌套 Attribute @@ -1263,7 +1263,7 @@ class CallGenMixin(CallGenBase.CallGenBase): # L7344 对齐,SysLibTest 0xC00000FD 根因)。 xmod_path: str = None if xmod_at.value.kind() == ast.ASTKind.Name: - xmod_nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(xmod_at.value) + xmod_nm: rawptr[ast.Name] = rawptr[ast.Name](xmod_at.value) if xmod_nm.id is not None: xmod_path = xmod_nm.id else: @@ -1511,7 +1511,7 @@ class CallGenMixin(CallGenBase.CallGenBase): # 别名附加尝试:仅作为 mangled 精确解析前的临时推断(fatal_if_unknown=0)。 # 若 call_name 是 mangled,L1272 起的 text.ll/vpi 精确解析会覆盖并 fail-fast; # 未命中时保持白名单/默认 i32 由后续路径兜底。 - re_inferred_ty: llvmlite.LLVMType | t.CPtr = self.Gen.CallGenLib._infer_external_func_ret_ty(pool, orig_func_name, node, 0) + re_inferred_ty: rawptr[llvmlite.LLVMType] = self.Gen.CallGenLib._infer_external_func_ret_ty(pool, orig_func_name, node, 0) if re_inferred_ty is not None: call_ret_ty = re_inferred_ty # ============================================================ @@ -1548,16 +1548,16 @@ class CallGenMixin(CallGenBase.CallGenBase): if string.strncmp(cf_sha1, trans.ModuleSha1, 16) == 0: is_local_mod = 1 if is_local_mod != 0: - local_fn: llvmlite.Function | t.CPtr = self.find_func_in_module(mod, call_name) + local_fn: rawptr[llvmlite.Function] = self.find_func_in_module(mod, call_name) if local_fn is not None and local_fn.RetTy is not None: call_ret_ty = local_fn.RetTy else: - cf_ret: llvmlite.LLVMType | t.CPtr = self._LookupMethodRetTyFromTextLL( + cf_ret: rawptr[llvmlite.LLVMType] = self._LookupMethodRetTyFromTextLL( pool, cf_sha1, None, cf_bare, 1) if cf_ret is not None: call_ret_ty = cf_ret else: - cf_vpi: llvmlite.LLVMType | t.CPtr = self._lookup_method_ret_ty_via_vpi( + cf_vpi: rawptr[llvmlite.LLVMType] = self._lookup_method_ret_ty_via_vpi( pool, cf_sha1, None, cf_bare) if cf_vpi is not None: call_ret_ty = cf_vpi diff --git a/App/lib/core/Gen/Call/CallGenProp.vp b/App/lib/core/Gen/Call/CallGenProp.vp index cdb421f..7799b17 100644 --- a/App/lib/core/Gen/Call/CallGenProp.vp +++ b/App/lib/core/Gen/Call/CallGenProp.vp @@ -51,12 +51,12 @@ class CallGenProp(CallGenBase.CallGenBase): # ============================================================ def _translate_property_call(self, pool: rawptr[memhub.MemBuddy], builder: llvmlite.IRBuilder | t.CPtr, - mod: llvmlite.LLVMModule | t.CPtr, + mod: rawptr[llvmlite.LLVMModule], class_name: str, method_name: str, call_head: llvmlite.Value | t.CPtr, call_count: int, - trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: + trans: rawptr[HT.Translator]) -> llvmlite.Value | t.CPtr: """翻译属性/静态方法调用,返回 call 结果 Value""" if pool is None or builder is None or class_name is None or method_name is None: return None @@ -68,7 +68,7 @@ class CallGenProp(CallGenBase.CallGenBase): viperlib.snprintf(lookup_name, 128, "%s.%s", class_name, method_name) # 查找函数(精确/后缀匹配) - found_func: llvmlite.Function | t.CPtr = self.find_func_in_module(mod, lookup_name) + found_func: rawptr[llvmlite.Function] = self.find_func_in_module(mod, lookup_name) # 确定调用名 call_name: str = lookup_name @@ -87,25 +87,25 @@ class CallGenProp(CallGenBase.CallGenBase): call_name = mangled_pc # 确定返回类型 - i32_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int32(pool) - call_ret_ty: llvmlite.LLVMType | t.CPtr = i32_ty + i32_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int32(pool) + call_ret_ty: rawptr[llvmlite.LLVMType] = i32_ty if found_func is not None: - frt: llvmlite.LLVMType | t.CPtr = llvmlite.function_get_ret_ty(found_func) + frt: rawptr[llvmlite.LLVMType] = llvmlite.function_get_ret_ty(found_func) if frt is not None: call_ret_ty = frt else: - sp_ty1: llvmlite.LLVMType | t.CPtr = self._special_method_ret_ty(pool, class_name, method_name) + sp_ty1: rawptr[llvmlite.LLVMType] = self._special_method_ret_ty(pool, class_name, method_name) if sp_ty1 is not None: call_ret_ty = sp_ty1 else: cls_sha1_rt: str = self.Gen.StructGen.get_struct_sha1(class_name) - looked_up_ty: llvmlite.LLVMType | t.CPtr = self._LookupMethodRetTyFromTextLL( + looked_up_ty: rawptr[llvmlite.LLVMType] = self._LookupMethodRetTyFromTextLL( pool, cls_sha1_rt, class_name, method_name) if looked_up_ty is not None: call_ret_ty = looked_up_ty else: # 精确查找:vpi stub 返回注解缓存(方法定义处,不硬编码白名单) - vpi_ret_ty: llvmlite.LLVMType | t.CPtr = self._lookup_method_ret_ty_via_vpi( + vpi_ret_ty: rawptr[llvmlite.LLVMType] = self._lookup_method_ret_ty_via_vpi( pool, cls_sha1_rt, class_name, method_name) if vpi_ret_ty is not None: call_ret_ty = vpi_ret_ty @@ -122,7 +122,7 @@ class CallGenProp(CallGenBase.CallGenBase): # 一致)。例如 from_long(10) 的 i32 字面量 → i64 形参(v: t.CLong), # 不转换则 call(i32) 与 declare(i64) 不匹配,llc 报参数类型错误。 # 目标函数优先用已找到的 found_func,否则按 mangled 调用名查模块 declare。 - tgt_func_pc: llvmlite.Function | t.CPtr = found_func + tgt_func_pc: rawptr[llvmlite.Function] = found_func if tgt_func_pc is None: tgt_func_pc = self.find_func_in_module(mod, call_name) if tgt_func_pc is not None: @@ -130,7 +130,7 @@ class CallGenProp(CallGenBase.CallGenBase): cur_arg_pc: llvmlite.Value | t.CPtr = call_head cur_param_pc: llvmlite.Param | t.CPtr = llvmlite.function_get_param_head(tgt_func_pc) while cur_arg_pc is not None and cur_param_pc is not None: - param_ty_pc: llvmlite.LLVMType | t.CPtr = llvmlite.param_get_ty(cur_param_pc) + param_ty_pc: rawptr[llvmlite.LLVMType] = llvmlite.param_get_ty(cur_param_pc) if param_ty_pc is not None and cur_arg_pc.Ty is not None: coerced_pc: llvmlite.Value | t.CPtr = self.Gen.ExprGenBase.coerce_to_type( builder, cur_arg_pc, param_ty_pc) @@ -159,13 +159,13 @@ class CallGenProp(CallGenBase.CallGenBase): # ============================================================ def _resolve_obj_class_name(self, pool: rawptr[memhub.MemBuddy], - trans: HT.Translator | t.CPtr, - obj_node: ast.AST | t.CPtr) -> str: + trans: rawptr[HT.Translator], + obj_node: rawptr[ast.AST]) -> str: """解析对象表达式的类名(短名),失败返回 None""" if pool is None or trans is None or obj_node is None: return None if obj_node.kind() == ast.ASTKind.Name: - obj_nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(obj_node) + obj_nm: rawptr[ast.Name] = rawptr[ast.Name](obj_node) if obj_nm.id is not None: var_entry: GenTypes.VarEntry | t.CPtr = self.Gen.VarGen.lookup_var_entry( trans.SymTab, obj_nm.id) @@ -203,10 +203,10 @@ class CallGenProp(CallGenBase.CallGenBase): # ============================================================ def _try_property_getter_attr(self, pool: rawptr[memhub.MemBuddy], builder: llvmlite.IRBuilder | t.CPtr, - mod: llvmlite.LLVMModule | t.CPtr, - at_node: ast.Attribute | t.CPtr, + mod: rawptr[llvmlite.LLVMModule], + at_node: rawptr[ast.Attribute], obj_ptr: llvmlite.Value | t.CPtr, - trans: HT.Translator | t.CPtr, + trans: rawptr[HT.Translator], fallback_class_name: str = None) -> llvmlite.Value | t.CPtr: """尝试 property getter 属性访问,返回调用结果 Value;非 getter 返回 None @@ -236,10 +236,10 @@ class CallGenProp(CallGenBase.CallGenBase): # ============================================================ def _try_property_setter(self, pool: rawptr[memhub.MemBuddy], builder: llvmlite.IRBuilder | t.CPtr, - mod: llvmlite.LLVMModule | t.CPtr, - target_attr: ast.Attribute | t.CPtr, + mod: rawptr[llvmlite.LLVMModule], + target_attr: rawptr[ast.Attribute], rhs_val: llvmlite.Value | t.CPtr, - trans: HT.Translator | t.CPtr) -> int: + trans: rawptr[HT.Translator]) -> int: """尝试 property setter 赋值,返回 1=已处理(生成调用)""" if pool is None or builder is None or mod is None or trans is None: return 0 @@ -278,9 +278,9 @@ class CallGenProp(CallGenBase.CallGenBase): # ============================================================ def _try_property_deleter(self, pool: rawptr[memhub.MemBuddy], builder: llvmlite.IRBuilder | t.CPtr, - mod: llvmlite.LLVMModule | t.CPtr, - target_attr: ast.Attribute | t.CPtr, - trans: HT.Translator | t.CPtr) -> int: + mod: rawptr[llvmlite.LLVMModule], + target_attr: rawptr[ast.Attribute], + trans: rawptr[HT.Translator]) -> int: """尝试 property deleter 删除,返回 1=已处理(生成调用)""" if pool is None or builder is None or mod is None or trans is None: return 0 @@ -316,11 +316,11 @@ class CallGenProp(CallGenBase.CallGenBase): # ============================================================ def _translate_static_class_call(self, pool: rawptr[memhub.MemBuddy], builder: llvmlite.IRBuilder | t.CPtr, - mod: llvmlite.LLVMModule | t.CPtr, + mod: rawptr[llvmlite.LLVMModule], class_name: str, method_name: str, - cl: ast.Call | t.CPtr, - trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: + cl: rawptr[ast.Call], + trans: rawptr[HT.Translator]) -> llvmlite.Value | t.CPtr: """翻译类名静态/类方法调用,返回 call 结果 Value;非静态/类方法返回 None""" if pool is None or builder is None or mod is None or trans is None: return None @@ -342,7 +342,7 @@ class CallGenProp(CallGenBase.CallGenBase): # @classmethod: 插入栈上分配的类实例指针作为 cls 参数 if is_class != 0: - struct_ty_cc: llvmlite.LLVMType | t.CPtr = self.Gen.StructGen.get_struct_type(class_name) + struct_ty_cc: rawptr[llvmlite.LLVMType] = self.Gen.StructGen.get_struct_type(class_name) if struct_ty_cc is None: return None cls_ptr: llvmlite.Value | t.CPtr = self.Gen.VarGen._alloca_at_entry(builder, struct_ty_cc) @@ -353,13 +353,13 @@ class CallGenProp(CallGenBase.CallGenBase): total_count = 1 # 翻译调用参数 - cargs: list[ast.AST | t.CPtr] | t.CPtr = cl.args + cargs: list[rawptr[ast.AST]] | t.CPtr = cl.args can: sizet = 0 if cargs is not None: can = len(cargs) tail: llvmlite.Value | t.CPtr = head for ai in range(can): - arg_node: ast.AST | t.CPtr = cargs.get(ai) + arg_node: rawptr[ast.AST] = cargs.get(ai) if arg_node is None: continue arg_val: llvmlite.Value | t.CPtr = self.Gen.ExprGen.translate_value( @@ -432,9 +432,9 @@ class CallGenProp(CallGenBase.CallGenBase): # _resolve_generic_receiver_name:解析接收者实际泛型特化名(IR 真值)——接收者实际 LLVM 结构体类型名比可能退化的注解/注册名可靠,故泛型判定以此为准:去 sha1 前缀取 '[' 前基名,基名是已注册泛型模板时含类型实参 ⇒ 返回实际特化名,无类型实参 ⇒ fail-fast(D25);基名非泛型模板或实际类型不可得 ⇒ 返回 None(调用方各自回退)。与 CallGenCall._translate_method_call 的 D25 分派修复共用本函数(唯一口径) def _resolve_generic_receiver_name(self, pool: rawptr[memhub.MemBuddy], - struct_ty: llvmlite.LLVMType | t.CPtr, + struct_ty: rawptr[llvmlite.LLVMType], method_name: str, - cl: ast.Call | t.CPtr) -> str: + cl: rawptr[ast.Call]) -> str: """返回实际泛型特化名(去 sha1)或 None;裸泛型基类 fail-fast""" if struct_ty is None: return None @@ -466,7 +466,7 @@ class CallGenProp(CallGenBase.CallGenBase): f"方法 '{method_name}' 的接收者实际结构体类型是裸泛型基类 " f"'{short_nm}*'(丢失类型实参),元素类型未知;" f"禁止静默按默认元素类型处理(元素按 i32 处理会截断指针)," - f"请让该变量的注解/类型带上实参(如 list[ast.AST | t.CPtr])", + f"请让该变量的注解/类型带上实参(如 list[rawptr[ast.AST]])", "TypeError") return None @@ -475,9 +475,9 @@ class CallGenProp(CallGenBase.CallGenBase): recv_val: llvmlite.Value | t.CPtr, fallback_name: str, method_name: str, - cl: ast.Call | t.CPtr) -> int: + cl: rawptr[ast.Call]) -> int: """基于接收者实际类型判定 list 内建方法(实际类型不可得回退注解名)""" - sty: llvmlite.LLVMType | t.CPtr = \ + sty: rawptr[llvmlite.LLVMType] = \ self.Gen.StructGen.get_struct_type_from_value(recv_val) if sty is not None: ty_nm: str = llvmlite.get_struct_name(sty) diff --git a/App/lib/core/Gen/Call/CallGenVa.vp b/App/lib/core/Gen/Call/CallGenVa.vp index bc30ade..e27ca32 100644 --- a/App/lib/core/Gen/Call/CallGenVa.vp +++ b/App/lib/core/Gen/Call/CallGenVa.vp @@ -29,11 +29,11 @@ class CallGenVa(CallGenBase.CallGenBase): def _va_arg_get_alloca_ptr(self, pool: rawptr[memhub.MemBuddy], builder: llvmlite.IRBuilder | t.CPtr, - mod: llvmlite.LLVMModule | t.CPtr, - arg_node: ast.AST | t.CPtr, + mod: rawptr[llvmlite.LLVMModule], + arg_node: rawptr[ast.AST], funcs_ptr: t.CPtr, func_count: int, - trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: + trans: rawptr[HT.Translator]) -> llvmlite.Value | t.CPtr: """获取 va_list 变量的 alloca 指针(不 load) va_arg/va_start/va_end 需要的是 va_list 对象的地址(alloca 指针), @@ -44,7 +44,7 @@ class CallGenVa(CallGenBase.CallGenBase): return None # Name 节点:直接查符号表获取 alloca 指针(不 load) if arg_node.kind() == ast.ASTKind.Name: - nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(arg_node) + nm: rawptr[ast.Name] = rawptr[ast.Name](arg_node) if nm.id is not None: alloca: llvmlite.Value | t.CPtr = self.Gen.VarGen.lookup_var(trans.SymTab, nm.id) if alloca is not None: @@ -52,8 +52,8 @@ class CallGenVa(CallGenBase.CallGenBase): # 回退:translate_value(可能返回 load 后的值,仅适用于已是指针的情况) return self.Gen.ExprGen.translate_value(builder, pool, mod, arg_node, funcs_ptr, func_count, trans) def _resolve_va_arg_type(self, pool: rawptr[memhub.MemBuddy], - type_node: ast.AST | t.CPtr, - trans: HT.Translator | t.CPtr) -> llvmlite.LLVMType | t.CPtr: + type_node: rawptr[ast.AST], + trans: rawptr[HT.Translator]) -> rawptr[llvmlite.LLVMType]: """解析 va_arg/arg 的类型参数为 LLVMType 支持的类型表达式: @@ -67,7 +67,7 @@ class CallGenVa(CallGenBase.CallGenBase): if type_node is None: return llvmlite.Int32(pool) # 使用 HandlesType.resolve_annotation_type 解析类型表达式 - resolved: llvmlite.LLVMType | t.CPtr = self.Gen.TypeGenResolve.resolve_annotation_type( + resolved: rawptr[llvmlite.LLVMType] = self.Gen.TypeGenResolve.resolve_annotation_type( pool, type_node, trans._imported_modules, trans._from_imports, trans, 0) if resolved is not None: return resolved @@ -76,13 +76,13 @@ class CallGenVa(CallGenBase.CallGenBase): return llvmlite.Int32(pool) def _translate_va_arg_sugar(self, pool: rawptr[memhub.MemBuddy], builder: llvmlite.IRBuilder | t.CPtr, - mod: llvmlite.LLVMModule | t.CPtr, - cl: ast.Call | t.CPtr, - cargs: list[ast.AST | t.CPtr] | t.CPtr, + mod: rawptr[llvmlite.LLVMModule], + cl: rawptr[ast.Call], + cargs: list[rawptr[ast.AST]] | t.CPtr, can: sizet, funcs_ptr: t.CPtr, func_count: int, - trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: + trans: rawptr[HT.Translator]) -> llvmlite.Value | t.CPtr: """va_arg(ap, type) / va_arg(ap) → %N = va_arg , 生成 LLVM va_arg 指令,从 va_list 读取下一个变长参数。 @@ -93,7 +93,7 @@ class CallGenVa(CallGenBase.CallGenBase): # 第一个参数:va_list(求值为 i8* 地址值,对齐 TPC _HandleVaArgLlvm) # 当前函数 *args:translate_value 经 vararg 名映射直接返回 va_list 缓冲区地址; # 转发场景(sprintf → vsnprintf 的 ap 参数):translate_value load 参数得到地址值。 - ap_node: ast.AST | t.CPtr = cargs.get(0) + ap_node: rawptr[ast.AST] = cargs.get(0) ap_val: llvmlite.Value | t.CPtr = self.Gen.ExprGen.translate_value( builder, pool, mod, ap_node, None, 0, trans) if ap_val is None: @@ -101,16 +101,16 @@ class CallGenVa(CallGenBase.CallGenBase): ap_ptr: llvmlite.Value | t.CPtr = ap_val # 第二个参数:目标类型(可选,默认 i32) - arg_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int32(pool) + arg_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int32(pool) if can >= 2: - type_node: ast.AST | t.CPtr = cargs.get(1) + type_node: rawptr[ast.AST] = cargs.get(1) arg_ty = self._resolve_va_arg_type(pool, type_node, trans) # Win64 变参槽位为 8 字节:<64 位整数按 i64 读取(对齐 TPC emit_va_arg L72-73), # 再 trunc 回目标宽度——否则返回 8 字节含高位垃圾,%d/%i 语义错误 # (viperlib vsnprintf %d 非 long 分支 `int64(va_arg(ap, int))` # 编译成直接 va_arg i64,高 32 位未定义 → 负数当大正数 A6 根因)。 - read_ty: llvmlite.LLVMType | t.CPtr = arg_ty + read_ty: rawptr[llvmlite.LLVMType] = arg_ty abits_va: int = self.Gen.ExprGenBase.get_llvm_type_bits(arg_ty) if abits_va != 0 and abits_va < 64: read_ty = llvmlite.Int64(pool) @@ -124,13 +124,13 @@ class CallGenVa(CallGenBase.CallGenBase): return llvmlite.build_va_arg(builder, ap_ptr, read_ty) def _translate_arg_sugar(self, pool: rawptr[memhub.MemBuddy], builder: llvmlite.IRBuilder | t.CPtr, - mod: llvmlite.LLVMModule | t.CPtr, - cl: ast.Call | t.CPtr, - cargs: list[ast.AST | t.CPtr] | t.CPtr, + mod: rawptr[llvmlite.LLVMModule], + cl: rawptr[ast.Call], + cargs: list[rawptr[ast.AST]] | t.CPtr, can: sizet, funcs_ptr: t.CPtr, func_count: int, - trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: + trans: rawptr[HT.Translator]) -> llvmlite.Value | t.CPtr: """arg(type) → %N = va_arg , 使用当前函数的隐式 va_list(trans._va_list_ptr), @@ -140,14 +140,14 @@ class CallGenVa(CallGenBase.CallGenBase): return llvmlite.const_int32(pool, 0) # 第一个参数:目标类型(可选,默认 i32) - arg_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int32(pool) + arg_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int32(pool) if can >= 1 and cargs is not None: - type_node: ast.AST | t.CPtr = cargs.get(0) + type_node: rawptr[ast.AST] = cargs.get(0) arg_ty = self._resolve_va_arg_type(pool, type_node, trans) # Win64 变参槽位为 8 字节:<64 位整数按 i64 读取(与 _translate_va_arg_sugar 一致), # 再 trunc 回目标宽度(%d/%i 高位垃圾 A6 修复,见 _translate_va_arg_sugar) - read_ty: llvmlite.LLVMType | t.CPtr = arg_ty + read_ty: rawptr[llvmlite.LLVMType] = arg_ty abits_arg: int = self.Gen.ExprGenBase.get_llvm_type_bits(arg_ty) if abits_arg != 0 and abits_arg < 64: read_ty = llvmlite.Int64(pool) @@ -160,12 +160,12 @@ class CallGenVa(CallGenBase.CallGenBase): return llvmlite.build_va_arg(builder, trans._va_list_ptr, read_ty) def _translate_va_start_sugar(self, pool: rawptr[memhub.MemBuddy], builder: llvmlite.IRBuilder | t.CPtr, - mod: llvmlite.LLVMModule | t.CPtr, - cargs: list[ast.AST | t.CPtr] | t.CPtr, + mod: rawptr[llvmlite.LLVMModule], + cargs: list[rawptr[ast.AST]] | t.CPtr, can: sizet, funcs_ptr: t.CPtr, func_count: int, - trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: + trans: rawptr[HT.Translator]) -> llvmlite.Value | t.CPtr: """va_start(ap, last_arg) → call void @llvm.va_start(i8* %ap) 初始化 va_list。第二个参数 last_arg 在 LLVM intrinsic 中不使用(C 宏兼容)。 @@ -174,30 +174,30 @@ class CallGenVa(CallGenBase.CallGenBase): return llvmlite.const_int32(pool, 0) # 第一个参数:va_list 指针(获取 alloca,不 load) - ap_node: ast.AST | t.CPtr = cargs.get(0) + ap_node: rawptr[ast.AST] = cargs.get(0) ap_ptr: llvmlite.Value | t.CPtr = self._va_arg_get_alloca_ptr( pool, builder, mod, ap_node, funcs_ptr, func_count, trans) if ap_ptr is None: return llvmlite.const_int32(pool, 0) # bitcast 到 i8*(@llvm.va_start 接受 i8*) - i8_ty_vs: llvmlite.LLVMType | t.CPtr = llvmlite.Int8(pool) - i8_ptr_ty_vs: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, i8_ty_vs) + i8_ty_vs: rawptr[llvmlite.LLVMType] = llvmlite.Int8(pool) + i8_ptr_ty_vs: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, i8_ty_vs) ap_i8: llvmlite.Value | t.CPtr = llvmlite.build_bitcast(builder, ap_ptr, i8_ptr_ty_vs) if ap_i8 is None: return llvmlite.const_int32(pool, 0) - void_ty_vs: llvmlite.LLVMType | t.CPtr = llvmlite.Void(pool) + void_ty_vs: rawptr[llvmlite.LLVMType] = llvmlite.Void(pool) llvmlite.build_call(builder, "llvm.va_start", ap_i8, 1, void_ty_vs, 0) return llvmlite.const_int32(pool, 0) def _translate_va_end_sugar(self, pool: rawptr[memhub.MemBuddy], builder: llvmlite.IRBuilder | t.CPtr, - mod: llvmlite.LLVMModule | t.CPtr, - cargs: list[ast.AST | t.CPtr] | t.CPtr, + mod: rawptr[llvmlite.LLVMModule], + cargs: list[rawptr[ast.AST]] | t.CPtr, can: sizet, funcs_ptr: t.CPtr, func_count: int, - trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: + trans: rawptr[HT.Translator]) -> llvmlite.Value | t.CPtr: """va_end(ap) → call void @llvm.va_end(i8* %ap) 清理 va_list。在大多数平台上是 no-op,但调用它是良好的 C ABI 习惯。 @@ -206,23 +206,23 @@ class CallGenVa(CallGenBase.CallGenBase): return llvmlite.const_int32(pool, 0) # 第一个参数:va_list 指针(获取 alloca,不 load) - ap_node: ast.AST | t.CPtr = cargs.get(0) + ap_node: rawptr[ast.AST] = cargs.get(0) ap_ptr: llvmlite.Value | t.CPtr = self._va_arg_get_alloca_ptr( pool, builder, mod, ap_node, funcs_ptr, func_count, trans) if ap_ptr is None: return llvmlite.const_int32(pool, 0) # bitcast 到 i8*(@llvm.va_end 接受 i8*) - i8_ty_ve: llvmlite.LLVMType | t.CPtr = llvmlite.Int8(pool) - i8_ptr_ty_ve: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, i8_ty_ve) + i8_ty_ve: rawptr[llvmlite.LLVMType] = llvmlite.Int8(pool) + i8_ptr_ty_ve: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, i8_ty_ve) ap_i8: llvmlite.Value | t.CPtr = llvmlite.build_bitcast(builder, ap_ptr, i8_ptr_ty_ve) if ap_i8 is None: return llvmlite.const_int32(pool, 0) - void_ty_ve: llvmlite.LLVMType | t.CPtr = llvmlite.Void(pool) + void_ty_ve: rawptr[llvmlite.LLVMType] = llvmlite.Void(pool) llvmlite.build_call(builder, "llvm.va_end", ap_i8, 1, void_ty_ve, 0) return llvmlite.const_int32(pool, 0) - def _get_func_fixed_param_count(self, func: llvmlite.Function | t.CPtr) -> int: + def _get_func_fixed_param_count(self, func: rawptr[llvmlite.Function]) -> int: """获取函数的固定参数数量(遍历 Params 链表)""" if func is None: return 0 @@ -251,7 +251,7 @@ class CallGenVa(CallGenBase.CallGenBase): return -1 def _get_known_vararg_cfunc_param_ty(self, pool: rawptr[memhub.MemBuddy], - name: str, idx: int) -> llvmlite.LLVMType | t.CPtr: + name: str, idx: int) -> rawptr[llvmlite.LLVMType]: """已知变参 C 库函数第 idx 个固定参数类型(变参位置/未知返回 None) 固定参数类型是 C ABI 硬约束(snprintf 的 size 为 i64),stub 未注入 @@ -259,8 +259,8 @@ class CallGenVa(CallGenBase.CallGenBase): """ if pool is None or name is None or idx < 0: return None - i8_ptr_kv: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, llvmlite.Int8(pool)) - i64_kv: llvmlite.LLVMType | t.CPtr = llvmlite.Int64(pool) + i8_ptr_kv: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, llvmlite.Int8(pool)) + i64_kv: rawptr[llvmlite.LLVMType] = llvmlite.Int64(pool) if string.strcmp(name, "snprintf") == 0: if idx == 0: return i8_ptr_kv @@ -278,13 +278,13 @@ class CallGenVa(CallGenBase.CallGenBase): return None def _check_and_promote_variadic_call(self, pool: rawptr[memhub.MemBuddy], builder: llvmlite.IRBuilder | t.CPtr, - mod: llvmlite.LLVMModule | t.CPtr, + mod: rawptr[llvmlite.LLVMModule], call_name: str, head: llvmlite.Value | t.CPtr, can: sizet, - arg_nodes: list[ast.AST | t.CPtr] | t.CPtr = None, + arg_nodes: list[rawptr[ast.AST]] | t.CPtr = None, self_offset: int = 0, - trans: HT.Translator | t.CPtr = None) -> int: + trans: rawptr[HT.Translator] = None) -> int: """检查被调用函数是否为变长函数,若是则对变长参数进行 C ABI 提升 返回: is_variadic (1=变长调用, 0=普通调用) @@ -297,7 +297,7 @@ class CallGenVa(CallGenBase.CallGenBase): if mod is None or call_name is None or head is None: return 0 # 查找函数对象 - func: llvmlite.Function | t.CPtr = self.find_func_in_module(mod, call_name) + func: rawptr[llvmlite.Function] = self.find_func_in_module(mod, call_name) fixed_count: int = -1 if func is not None and func.IsVarArg == 1: fixed_count = self._get_func_fixed_param_count(func) @@ -322,8 +322,8 @@ class CallGenVa(CallGenBase.CallGenBase): # cur 指向第 fixed_count+1 个节点(第一个变长参数) # 对变长参数进行 C ABI 提升 - i32_ty_promote: llvmlite.LLVMType | t.CPtr = llvmlite.Int32(pool) - double_ty_promote: llvmlite.LLVMType | t.CPtr = llvmlite.Double(pool) + i32_ty_promote: rawptr[llvmlite.LLVMType] = llvmlite.Int32(pool) + double_ty_promote: rawptr[llvmlite.LLVMType] = llvmlite.Double(pool) v_idx: int = fixed_count while cur is not None: next_node: llvmlite.Value | t.CPtr = cur.Next @@ -338,7 +338,7 @@ class CallGenVa(CallGenBase.CallGenBase): if arg_nodes is not None and trans is not None: ast_idx_va: int = v_idx - self_offset if ast_idx_va >= 0 and ast_idx_va < len(arg_nodes): - an_va: ast.AST | t.CPtr = arg_nodes.get(ast_idx_va) + an_va: rawptr[ast.AST] = arg_nodes.get(ast_idx_va) if an_va is not None: if self.Gen.ExprGenOps._node_type_unsigned(pool, an_va, trans) != 0: is_u_va = 1 @@ -371,7 +371,7 @@ class CallGenVa(CallGenBase.CallGenBase): # 调用方必须写满 8 字节槽,否则高 4 字节残留旧栈数据,%d 读到 # 0x7ff700000052 类垃圾(clean 日志根因;对齐 CallGenMixin # L798-811 的 found_func.IsVarArg 提升)。 - i64_ty_promote: llvmlite.LLVMType | t.CPtr = llvmlite.Int64(pool) + i64_ty_promote: rawptr[llvmlite.LLVMType] = llvmlite.Int64(pool) pb_va: int = self.Gen.ExprGenBase.get_llvm_type_bits(promoted.Ty) if pb_va != 0 and pb_va < 64: promoted_va2: llvmlite.Value | t.CPtr = None @@ -379,7 +379,7 @@ class CallGenVa(CallGenBase.CallGenBase): if arg_nodes is not None and trans is not None: ast_idx_va2: int = v_idx - self_offset if ast_idx_va2 >= 0 and ast_idx_va2 < len(arg_nodes): - an_va2: ast.AST | t.CPtr = arg_nodes.get(ast_idx_va2) + an_va2: rawptr[ast.AST] = arg_nodes.get(ast_idx_va2) if an_va2 is not None: if self.Gen.ExprGenOps._node_type_unsigned(pool, an_va2, trans) != 0: is_u_va2 = 1 diff --git a/App/lib/core/Gen/Call/CallGenVt.vp b/App/lib/core/Gen/Call/CallGenVt.vp index cfbca92..ee4d537 100644 --- a/App/lib/core/Gen/Call/CallGenVt.vp +++ b/App/lib/core/Gen/Call/CallGenVt.vp @@ -27,12 +27,12 @@ class CallGenVt(CallGenBase.CallGenBase): # ============================================================ def _write_vtable_slot(self, pool: rawptr[memhub.MemBuddy], builder: llvmlite.IRBuilder | t.CPtr, - mod: llvmlite.LLVMModule | t.CPtr, + mod: rawptr[llvmlite.LLVMModule], obj_ptr: llvmlite.Value | t.CPtr, class_name: str, method_index: int, func_val: llvmlite.Value | t.CPtr, - trans: HT.Translator | t.CPtr) -> int: + trans: rawptr[HT.Translator]) -> int: """生成 vtable 槽位写入(写时复制),成功返回 1""" if pool is None or builder is None or mod is None or trans is None: return 0 @@ -40,23 +40,23 @@ class CallGenVt(CallGenBase.CallGenBase): return 0 if method_index < 0 or trans._cur_func is None: return 0 - i8_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int8(pool) + i8_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int8(pool) if i8_ty is None: return 0 - i8_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, i8_ty) + i8_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, i8_ty) if i8_ptr_ty is None: return 0 - i8_ptr_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, i8_ptr_ty) + i8_ptr_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, i8_ptr_ty) if i8_ptr_ptr_ty is None: return 0 method_count: int = self.Gen.StructGen.get_vtable_method_count(class_name) if method_count <= 0: return 0 # 构造 vtable 类型 { i8*, i8*, ... } - vt_first: llvmlite.ParamNode | t.CPtr = None - vt_prev: llvmlite.ParamNode | t.CPtr = None + vt_first: rawptr[llvmlite.Function] = None + vt_prev: rawptr[llvmlite.Function] = None for vi in range(method_count): - pn: llvmlite.ParamNode | t.CPtr = llvmlite.new_param_node(pool, i8_ptr_ty) + pn: rawptr[llvmlite.Function] = llvmlite.new_param_node(pool, i8_ptr_ty) if pn is None: continue if vt_first is None: @@ -64,7 +64,7 @@ class CallGenVt(CallGenBase.CallGenBase): if vt_prev is not None: llvmlite.paramnode_set_next(vt_prev, pn) vt_prev = pn - vtable_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Struct(pool, vt_first, method_count, None) + vtable_ty: rawptr[llvmlite.LLVMType] = llvmlite.Struct(pool, vt_first, method_count, None) if vtable_ty is None: return 0 # 对象 vtable 槽位(对象头 → i8**,vtable 指针总是第一个字段) @@ -163,22 +163,22 @@ class CallGenVt(CallGenBase.CallGenBase): return 1 def _write_vtable_attr(self, builder: llvmlite.IRBuilder | t.CPtr, pool: rawptr[memhub.MemBuddy], - mod: llvmlite.LLVMModule | t.CPtr, - node: ast.AST | t.CPtr, + mod: rawptr[llvmlite.LLVMModule], + node: rawptr[ast.AST], rhs_val: llvmlite.Value | t.CPtr, - trans: HT.Translator | t.CPtr) -> int: + trans: rawptr[HT.Translator]) -> int: """属性写入 obj.method = func:检测 vtable 方法并生成槽位写入(成功返回 1)""" if node is None or builder is None or pool is None or mod is None: return 0 if rhs_val is None or trans is None: return 0 - at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(node) + at: rawptr[ast.Attribute] = rawptr[ast.Attribute](node) if at is None or at.value is None or at.attr is None: return 0 # 解析类名(AnnotClassName;去模块前缀) class_nm_v: str = None if at.value.kind() == ast.ASTKind.Name: - nm_v: ast.Name | t.CPtr = (ast.Name | t.CPtr)(at.value) + nm_v: rawptr[ast.Name] = rawptr[ast.Name](at.value) if nm_v.id is not None: ve_v: GenTypes.VarEntry | t.CPtr = self.Gen.VarGen.lookup_var_entry( trans.SymTab, nm_v.id) @@ -201,7 +201,7 @@ class CallGenVt(CallGenBase.CallGenBase): obj_ptr_v: llvmlite.Value | t.CPtr = None if at.value.kind() == ast.ASTKind.Name: obj_ptr_v = self.Gen.VarGen.lookup_var( - trans.SymTab, ((ast.Name | t.CPtr)(at.value)).id) + trans.SymTab, (rawptr[ast.Name](at.value)).id) else: obj_ptr_v = self.Gen.ExprGen.translate_value( builder, pool, mod, at.value, None, 0, trans) diff --git a/App/lib/core/Gen/Class/ClassGenBase.vp b/App/lib/core/Gen/Class/ClassGenBase.vp index 8c86d8b..7c50750 100644 --- a/App/lib/core/Gen/Class/ClassGenBase.vp +++ b/App/lib/core/Gen/Class/ClassGenBase.vp @@ -125,7 +125,7 @@ class ClassGenBase: # --- 泛型模板表(原 HandlesClassDef._generic_class_names/ # _generic_class_nodes/_generic_class_sha1s) --- GenericClassNames: list[str] | t.CPtr - GenericClassNodes: list[ast.ClassDef | t.CPtr] | t.CPtr + GenericClassNodes: list[rawptr[ast.ClassDef]] | t.CPtr GenericClassSha1s: list[str] | t.CPtr # 泛型模板来源文件路径(与上面三表同序)。特化翻译模板方法体时 node.lineno 是模板 # 文件行号,若 CurrentFile 仍是调用方文件,fatal_error 会把模板行号套到调用方文件上 @@ -149,15 +149,15 @@ class ClassGenBase: # 本模块函数调用改 self.,外部模块调用保留模块前缀) # ============================================================ - def _is_cenum_base(self, base_node: ast.AST | t.CPtr, - trans: HT.Translator | t.CPtr = None) -> int: + def _is_cenum_base(self, base_node: rawptr[ast.AST], + trans: rawptr[HT.Translator] = None) -> int: """检查 base 节点是否为 t.CEnum,返回 1=是 / 0=否""" if base_node is None: return 0 k: int = base_node.kind() # Name('CEnum') 形式(from t import CEnum) if k == ast.ASTKind.Name: - nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(base_node) + nm: rawptr[ast.Name] = rawptr[ast.Name](base_node) if nm.id is None: return 0 if string.strcmp(nm.id, "CEnum") == 0: @@ -176,13 +176,13 @@ class ClassGenBase: return 0 # Attribute(t.CEnum) 形式 if k == ast.ASTKind.Attribute: - at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(base_node) + at: rawptr[ast.Attribute] = rawptr[ast.Attribute](base_node) if at.attr is not None and string.strcmp(at.attr, "CEnum") == 0: return 1 return 0 return 0 - def _is_enum_class(self, cd: ast.ClassDef | t.CPtr, - trans: HT.Translator | t.CPtr = None) -> int: + def _is_enum_class(self, cd: rawptr[ast.ClassDef], + trans: rawptr[HT.Translator] = None) -> int: """检查 ClassDef 是否为 CEnum:继承自 t.CEnum 或 @t.CEnum 装饰器形式""" if cd is None: return 0 @@ -192,26 +192,26 @@ class ClassGenBase: return 1 if cd.bases is None: return 0 - bases: list[ast.AST | t.CPtr] | t.CPtr = cd.bases + bases: list[rawptr[ast.AST]] | t.CPtr = cd.bases bn: sizet = len(bases) if bn == 0: return 0 for bi in range(bn): - base_node: ast.AST | t.CPtr = bases.get(bi) + base_node: rawptr[ast.AST] = bases.get(bi) if base_node is None: continue if self._is_cenum_base(base_node, trans) == 1: return 1 return 0 - def _is_cunion_base(self, base_node: ast.AST | t.CPtr, - trans: HT.Translator | t.CPtr = None) -> int: + def _is_cunion_base(self, base_node: rawptr[ast.AST], + trans: rawptr[HT.Translator] = None) -> int: """检查 base 节点是否为 t.CUnion,返回 1=是 / 0=否""" if base_node is None: return 0 k: int = base_node.kind() # Name('CUnion') 形式(from t import CUnion) if k == ast.ASTKind.Name: - nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(base_node) + nm: rawptr[ast.Name] = rawptr[ast.Name](base_node) if nm.id is None: return 0 if string.strcmp(nm.id, "CUnion") == 0: @@ -229,13 +229,13 @@ class ClassGenBase: return 0 # Attribute(t.CUnion) 形式 if k == ast.ASTKind.Attribute: - at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(base_node) + at: rawptr[ast.Attribute] = rawptr[ast.Attribute](base_node) if at.attr is not None and string.strcmp(at.attr, "CUnion") == 0: return 1 return 0 return 0 - def _is_union_class(self, cd: ast.ClassDef | t.CPtr, - trans: HT.Translator | t.CPtr = None) -> int: + def _is_union_class(self, cd: rawptr[ast.ClassDef], + trans: rawptr[HT.Translator] = None) -> int: """检查 ClassDef 是否为 CUnion:继承自 t.CUnion 或 @t.CUnion 装饰器形式""" if cd is None: return 0 @@ -245,26 +245,26 @@ class ClassGenBase: return 1 if cd.bases is None: return 0 - bases: list[ast.AST | t.CPtr] | t.CPtr = cd.bases + bases: list[rawptr[ast.AST]] | t.CPtr = cd.bases bn: sizet = len(bases) if bn == 0: return 0 for bi in range(bn): - base_node: ast.AST | t.CPtr = bases.get(bi) + base_node: rawptr[ast.AST] = bases.get(bi) if base_node is None: continue if self._is_cunion_base(base_node, trans) == 1: return 1 return 0 - def _is_crenum_base(self, base_node: ast.AST | t.CPtr, - trans: HT.Translator | t.CPtr = None) -> int: + def _is_crenum_base(self, base_node: rawptr[ast.AST], + trans: rawptr[HT.Translator] = None) -> int: """检查 base 节点是否为 t.REnum,返回 1=是 / 0=否""" if base_node is None: return 0 k: int = base_node.kind() # Name('REnum') 形式(from t import REnum) if k == ast.ASTKind.Name: - nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(base_node) + nm: rawptr[ast.Name] = rawptr[ast.Name](base_node) if nm.id is None: return 0 if string.strcmp(nm.id, "REnum") == 0: @@ -282,13 +282,13 @@ class ClassGenBase: return 0 # Attribute(t.REnum) 形式 if k == ast.ASTKind.Attribute: - at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(base_node) + at: rawptr[ast.Attribute] = rawptr[ast.Attribute](base_node) if at.attr is not None and string.strcmp(at.attr, "REnum") == 0: return 1 return 0 return 0 - def _is_renum_class(self, cd: ast.ClassDef | t.CPtr, - trans: HT.Translator | t.CPtr = None) -> int: + def _is_renum_class(self, cd: rawptr[ast.ClassDef], + trans: rawptr[HT.Translator] = None) -> int: """检查 ClassDef 是否为 REnum:继承自 t.REnum 或 @t.REnum 装饰器形式""" if cd is None: return 0 @@ -298,18 +298,18 @@ class ClassGenBase: return 1 if cd.bases is None: return 0 - bases: list[ast.AST | t.CPtr] | t.CPtr = cd.bases + bases: list[rawptr[ast.AST]] | t.CPtr = cd.bases bn: sizet = len(bases) if bn == 0: return 0 for bi in range(bn): - base_node: ast.AST | t.CPtr = bases.get(bi) + base_node: rawptr[ast.AST] = bases.get(bi) if base_node is None: continue if self._is_crenum_base(base_node, trans) == 1: return 1 return 0 - def _has_decorator(self, decorator_list: list[ast.AST | t.CPtr] | t.CPtr, + def _has_decorator(self, decorator_list: list[rawptr[ast.AST]] | t.CPtr, deco_name: str) -> int: """检查 decorator_list 中是否有指定装饰器名""" if decorator_list is None: @@ -318,27 +318,27 @@ class ClassGenBase: if dn == 0: return 0 for di in range(dn): - deco: ast.AST | t.CPtr = decorator_list.get(di) + deco: rawptr[ast.AST] = decorator_list.get(di) if deco is None: continue k: int = deco.kind() # @t.NoVTable 形式(Attribute) if k == ast.ASTKind.Attribute: - at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(deco) + at: rawptr[ast.Attribute] = rawptr[ast.Attribute](deco) if at.attr is not None and string.strcmp(at.attr, deco_name) == 0: # 检查 value 是 Name('t') if at.value is not None and at.value.kind() == ast.ASTKind.Name: - vn: ast.Name | t.CPtr = (ast.Name | t.CPtr)(at.value) + vn: rawptr[ast.Name] = rawptr[ast.Name](at.value) if vn.id is not None and string.strcmp(vn.id, "t") == 0: return 1 return 0 # @NoVTable 形式(Name,from t import NoVTable) if k == ast.ASTKind.Name: - nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(deco) + nm: rawptr[ast.Name] = rawptr[ast.Name](deco) if nm.id is not None and string.strcmp(nm.id, deco_name) == 0: return 1 return 0 - def _tattr_name(self, node: ast.AST | t.CPtr, attr_name: str) -> int: + def _tattr_name(self, node: rawptr[ast.AST], attr_name: str) -> int: """从 t.attr. / t.attr.(args) 节点提取最外层属性名并比较。 Call(t.attr.aligned(16))→ 递归取 func;Attribute(t.attr.packed)→ 取 attr。 @@ -346,17 +346,17 @@ class ClassGenBase: if node is None: return 0 if node.kind() == ast.ASTKind.Call: - cl2: ast.Call | t.CPtr = (ast.Call | t.CPtr)(node) + cl2: rawptr[ast.Call] = rawptr[ast.Call](node) if cl2.func is None: return 0 return self._tattr_name(cl2.func, attr_name) if node.kind() == ast.ASTKind.Attribute: - at2: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(node) + at2: rawptr[ast.Attribute] = rawptr[ast.Attribute](node) if at2.attr is None: return 0 return 1 if string.strcmp(at2.attr, attr_name) == 0 else 0 return 0 - def _class_has_tattr(self, decorator_list: list[ast.AST | t.CPtr] | t.CPtr, + def _class_has_tattr(self, decorator_list: list[rawptr[ast.AST]] | t.CPtr, attr_name: str) -> int: """检查装饰器列表是否含 t.attr.(@c.Attribute(t.attr.xxx) 或 @t.attr.xxx)。 @@ -368,23 +368,23 @@ class ClassGenBase: if dn == 0: return 0 for di in range(dn): - deco: ast.AST | t.CPtr = decorator_list.get(di) + deco: rawptr[ast.AST] = decorator_list.get(di) if deco is None: continue k: int = deco.kind() if k == ast.ASTKind.Call: - cl: ast.Call | t.CPtr = (ast.Call | t.CPtr)(deco) + cl: rawptr[ast.Call] = rawptr[ast.Call](deco) # @c.Attribute(t.attr.xxx) 形式:func 是 Attribute(c, "Attribute") if cl.func is None or cl.func.kind() != ast.ASTKind.Attribute: continue - at0: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(cl.func) + at0: rawptr[ast.Attribute] = rawptr[ast.Attribute](cl.func) if at0.attr is None or string.strcmp(at0.attr, "Attribute") != 0: continue if cl.args is None: continue an: sizet = len(cl.args) for ai in range(an): - ag: ast.AST | t.CPtr = cl.args.get(ai) + ag: rawptr[ast.AST] = cl.args.get(ai) if ag is not None and self._tattr_name(ag, attr_name) != 0: return 1 else: @@ -392,28 +392,28 @@ class ClassGenBase: if self._tattr_name(deco, attr_name) != 0: return 1 return 0 - def _tattr_aligned_int(self, node: ast.AST | t.CPtr) -> int: + def _tattr_aligned_int(self, node: rawptr[ast.AST]) -> int: """t.attr.aligned(N) → N(整数参数),非 aligned 或无参返回 0""" if node is None: return 0 if node.kind() == ast.ASTKind.Call: - cl2: ast.Call | t.CPtr = (ast.Call | t.CPtr)(node) + cl2: rawptr[ast.Call] = rawptr[ast.Call](node) if cl2.func is None or cl2.func.kind() != ast.ASTKind.Attribute: return 0 - at2: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(cl2.func) + at2: rawptr[ast.Attribute] = rawptr[ast.Attribute](cl2.func) if at2.attr is None or string.strcmp(at2.attr, "aligned") != 0: return 0 if cl2.args is None or len(cl2.args) == 0: return 0 - a0: ast.AST | t.CPtr = cl2.args.get(0) + a0: rawptr[ast.AST] = cl2.args.get(0) if a0 is None or a0.kind() != ast.ASTKind.Constant: return 0 - cn: ast.Constant | t.CPtr = (ast.Constant | t.CPtr)(a0) + cn: rawptr[ast.Constant] = rawptr[ast.Constant](a0) if cn.const_kind != ast.CONST_INT: return 0 return int(cn.int_val) return 0 - def _class_aligned_value(self, decorator_list: list[ast.AST | t.CPtr] | t.CPtr) -> int: + def _class_aligned_value(self, decorator_list: list[rawptr[ast.AST]] | t.CPtr) -> int: """取 @c.Attribute(t.attr.aligned(N)) 的对齐字节数,无 aligned 返回 0""" if decorator_list is None: return 0 @@ -421,21 +421,21 @@ class ClassGenBase: if dn == 0: return 0 for di in range(dn): - deco: ast.AST | t.CPtr = decorator_list.get(di) + deco: rawptr[ast.AST] = decorator_list.get(di) if deco is None: continue if deco.kind() == ast.ASTKind.Call: - cl: ast.Call | t.CPtr = (ast.Call | t.CPtr)(deco) + cl: rawptr[ast.Call] = rawptr[ast.Call](deco) if cl.func is None or cl.func.kind() != ast.ASTKind.Attribute: continue - at0: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(cl.func) + at0: rawptr[ast.Attribute] = rawptr[ast.Attribute](cl.func) if at0.attr is None or string.strcmp(at0.attr, "Attribute") != 0: continue if cl.args is None: continue an: sizet = len(cl.args) for ai in range(an): - ag: ast.AST | t.CPtr = cl.args.get(ai) + ag: rawptr[ast.AST] = cl.args.get(ai) if ag is not None: av: int = self._tattr_aligned_int(ag) if av > 0: @@ -445,7 +445,7 @@ class ClassGenBase: if av2 > 0: return av2 return 0 - def _extract_func_meta(self, decorator_list: list[ast.AST | t.CPtr] | t.CPtr) -> int: + def _extract_func_meta(self, decorator_list: list[rawptr[ast.AST]] | t.CPtr) -> int: """从装饰器列表提取元数据位掩码,返回 0=无装饰器元数据""" meta: int = 0 if decorator_list is None: @@ -454,12 +454,12 @@ class ClassGenBase: if dn == 0: return meta for di in range(dn): - deco: ast.AST | t.CPtr = decorator_list.get(di) + deco: rawptr[ast.AST] = decorator_list.get(di) if deco is None: continue k: int = deco.kind() if k == ast.ASTKind.Name: - nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(deco) + nm: rawptr[ast.Name] = rawptr[ast.Name](deco) if nm.id is not None: if string.strcmp(nm.id, "staticmethod") == 0: meta |= GenTypes.META_STATIC @@ -470,10 +470,10 @@ class ClassGenBase: elif string.strcmp(nm.id, "TLS") == 0: meta |= META_TLS elif k == ast.ASTKind.Attribute: - at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(deco) + at: rawptr[ast.Attribute] = rawptr[ast.Attribute](deco) if at.attr is not None and at.value is not None: if at.value.kind() == ast.ASTKind.Name: - vn: ast.Name | t.CPtr = (ast.Name | t.CPtr)(at.value) + vn: rawptr[ast.Name] = rawptr[ast.Name](at.value) is_prop_name: int = 0 if vn.id is not None and string.strcmp(vn.id, "property") == 0: is_prop_name = 1 @@ -730,21 +730,21 @@ class ClassGenBase: if pname_e is not None and pname_e[0] != '\0': if string.strcmp(pname_e, name) == 0: self._collect_desc_codes_rec(cname_e, out_codes, max_codes, depth + 1) - def _is_exception_class_def(self, cd: ast.ClassDef | t.CPtr) -> int: + def _is_exception_class_def(self, cd: rawptr[ast.ClassDef]) -> int: """类定义是否是异常类:基类是 Exception 或已注册异常类(1=是)""" if cd is None or cd.bases is None: return 0 - bases_e: list[ast.AST | t.CPtr] | t.CPtr = cd.bases + bases_e: list[rawptr[ast.AST]] | t.CPtr = cd.bases bn_e: sizet = len(bases_e) for bi_e in range(bn_e): - base_e: ast.AST | t.CPtr = bases_e.get(bi_e) + base_e: rawptr[ast.AST] = bases_e.get(bi_e) if base_e is None: continue base_name_e: str = None if base_e.kind() == ast.ASTKind.Name: - base_name_e = ((ast.Name | t.CPtr)(base_e)).id + base_name_e = (rawptr[ast.Name](base_e)).id elif base_e.kind() == ast.ASTKind.Attribute: - base_at_e: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(base_e) + base_at_e: rawptr[ast.Attribute] = rawptr[ast.Attribute](base_e) if base_at_e.attr is not None: base_name_e = base_at_e.attr if base_name_e is None: @@ -754,21 +754,21 @@ class ClassGenBase: if self.is_exception_name(base_name_e) != 0: return 1 return 0 - def _get_exception_parent_name(self, cd: ast.ClassDef | t.CPtr) -> str: + def _get_exception_parent_name(self, cd: rawptr[ast.ClassDef]) -> str: """返回异常类定义的真实父类名(第一个非 Exception 的已注册异常类),无则 None""" if cd is None or cd.bases is None: return None - bases_e2: list[ast.AST | t.CPtr] | t.CPtr = cd.bases + bases_e2: list[rawptr[ast.AST]] | t.CPtr = cd.bases bn_e2: sizet = len(bases_e2) for bi_e2 in range(bn_e2): - base_e2: ast.AST | t.CPtr = bases_e2.get(bi_e2) + base_e2: rawptr[ast.AST] = bases_e2.get(bi_e2) if base_e2 is None: continue base_name_e2: str = None if base_e2.kind() == ast.ASTKind.Name: - base_name_e2 = ((ast.Name | t.CPtr)(base_e2)).id + base_name_e2 = (rawptr[ast.Name](base_e2)).id elif base_e2.kind() == ast.ASTKind.Attribute: - base_at_e2: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(base_e2) + base_at_e2: rawptr[ast.Attribute] = rawptr[ast.Attribute](base_e2) if base_at_e2.attr is not None: base_name_e2 = base_at_e2.attr if base_name_e2 is None: @@ -777,8 +777,8 @@ class ClassGenBase: and self.is_exception_name(base_name_e2) != 0: return base_name_e2 return None - def _register_exception_class_def(self, trans: HT.Translator | t.CPtr, - cd: ast.ClassDef | t.CPtr) -> int: + def _register_exception_class_def(self, trans: rawptr[HT.Translator], + cd: rawptr[ast.ClassDef]) -> int: """注册异常类(分配编码 + 记录父类),不生成 struct,返回 0""" if cd is None or cd.name is None: return 0 @@ -786,7 +786,7 @@ class ClassGenBase: self.register_exception(cd.name, parent_e) return 0 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: rawptr[ast.AST]) -> None: """解析类体 __provides__/__requires__ 的 list[str] 字面量并注册""" if value_node is None or cls is None: return @@ -795,13 +795,13 @@ class ClassGenBase: lst_rcm: ast.List | t.CPtr = (ast.List | t.CPtr)(value_node) if lst_rcm.elts is None: return - elts_rcm: list[ast.AST | t.CPtr] | t.CPtr = lst_rcm.elts + elts_rcm: list[rawptr[ast.AST]] | t.CPtr = lst_rcm.elts en_rcm: sizet = len(elts_rcm) for ei_rcm in range(en_rcm): - el_rcm: ast.AST | t.CPtr = elts_rcm.get(ei_rcm) + el_rcm: rawptr[ast.AST] = elts_rcm.get(ei_rcm) if el_rcm is None or el_rcm.kind() != ast.ASTKind.Constant: continue - ec_rcm: ast.Constant | t.CPtr = (ast.Constant | t.CPtr)(el_rcm) + ec_rcm: rawptr[ast.Constant] = rawptr[ast.Constant](el_rcm) if ec_rcm.str_val is not None: self.register_class_meta(pool, kind, cls, ec_rcm.str_val) def register_method_meta(self, class_name: str, method_name: str, @@ -899,7 +899,7 @@ class ClassGenBase: if string.strcmp(base_name, "REnum") == 0: return 1 return 0 - def _get_base_name(self, base_node: ast.AST | t.CPtr, + def _get_base_name(self, base_node: rawptr[ast.AST], pool: rawptr[memhub.MemBuddy] = None) -> str: """从 base AST 节点提取基类名,返回 None=失败 @@ -911,15 +911,15 @@ class ClassGenBase: k: int = base_node.kind() # Name(id) 形式 if k == ast.ASTKind.Name: - nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(base_node) + nm: rawptr[ast.Name] = rawptr[ast.Name](base_node) return nm.id # Attribute(attr) 形式 if k == ast.ASTKind.Attribute: - at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(base_node) + at: rawptr[ast.Attribute] = rawptr[ast.Attribute](base_node) return at.attr # Subscript(value, slice) 形式 — 如 GSListNode[Value] if k == ast.ASTKind.Subscript: - sub: ast.Subscript | t.CPtr = (ast.Subscript | t.CPtr)(base_node) + sub: rawptr[ast.Subscript] = rawptr[ast.Subscript](base_node) if sub is None or sub.value is None or sub.slice is None: return None # 提取基类名(如 "GSListNode") @@ -930,7 +930,7 @@ class ClassGenBase: slice_k: int = sub.slice.kind() arg_nm: str = None if slice_k == ast.ASTKind.Name: - sl_nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(sub.slice) + sl_nm: rawptr[ast.Name] = rawptr[ast.Name](sub.slice) arg_nm = sl_nm.id # 如果无法提取类型实参,返回基类名(降级) if arg_nm is None: @@ -952,20 +952,20 @@ class ClassGenBase: string.strcat(mangled, "]") return mangled return None - def _get_parent_class(self, cd: ast.ClassDef | t.CPtr, - trans: HT.Translator | t.CPtr = None) -> str: + def _get_parent_class(self, cd: rawptr[ast.ClassDef], + trans: rawptr[HT.Translator] = None) -> str: """获取 ClassDef 的真实父类名,返回 None=无真实父类""" if cd is None or cd.bases is None: return None pool: rawptr[memhub.MemBuddy] = None if trans is not None: pool = trans.Pool - bases: list[ast.AST | t.CPtr] | t.CPtr = cd.bases + bases: list[rawptr[ast.AST]] | t.CPtr = cd.bases bn: sizet = len(bases) if bn == 0: return None for bi in range(bn): - base_node: ast.AST | t.CPtr = bases.get(bi) + base_node: rawptr[ast.AST] = bases.get(bi) if base_node is None: continue bname: str = self._get_base_name(base_node, pool) @@ -977,7 +977,7 @@ class ClassGenBase: return bname return None def _resolve_base_alias(self, base_name: str, - trans: HT.Translator | t.CPtr = None) -> str: + trans: rawptr[HT.Translator] = None) -> str: """解析基类别名:from t import CStruct as cs → 基类 cs 实际是 CStruct。 别名不解析时 "cs" 会被当作真实父类名 → find_struct("cs") 失败 → @@ -1005,20 +1005,20 @@ class ClassGenBase: return og_buf return base_name def _collect_parents(self, pool: rawptr[memhub.MemBuddy], - cd: ast.ClassDef | t.CPtr, + cd: rawptr[ast.ClassDef], parents_buf: sizet | t.CPtr, max_parents: int, - trans: HT.Translator | t.CPtr = None) -> int: + trans: rawptr[HT.Translator] = None) -> int: """收集所有非 marker 父类名到 parents_buf,返回数量""" if pool is None or cd is None or cd.bases is None or parents_buf is None: return 0 - bases: list[ast.AST | t.CPtr] | t.CPtr = cd.bases + bases: list[rawptr[ast.AST]] | t.CPtr = cd.bases bn: sizet = len(bases) count: int = 0 for bi in range(bn): if count >= max_parents: break - base_node: ast.AST | t.CPtr = bases.get(bi) + base_node: rawptr[ast.AST] = bases.get(bi) if base_node is None: continue bname: str = self._get_base_name(base_node, pool) @@ -1041,36 +1041,36 @@ class ClassGenBase: if existing is not None and string.strcmp(existing, name) == 0: return 1 return 0 - def _class_body_has_field(self, cd: ast.ClassDef | t.CPtr) -> int: + def _class_body_has_field(self, cd: rawptr[ast.ClassDef]) -> int: """检查类体是否声明了字段(AnnAssign),0=纯方法/无字段类""" if cd is None or cd.children is None: return 0 cn: sizet = len(cd.children) for ci in range(cn): - stmt: ast.AST | t.CPtr = cd.children.get(ci) + stmt: rawptr[ast.AST] = cd.children.get(ci) if stmt is None: continue if stmt.kind() == ast.ASTKind.AnnAssign: return 1 return 0 - def _trigger_base_specialization(self, trans: HT.Translator | t.CPtr, - cd: ast.ClassDef | t.CPtr): + def _trigger_base_specialization(self, trans: rawptr[HT.Translator], + cd: rawptr[ast.ClassDef]): """触发 base 中 Subscript 的泛型特化(如 GSListNode[Value])""" if trans is None or cd is None or cd.bases is None: return pool: rawptr[memhub.MemBuddy] = trans.Pool - bases: list[ast.AST | t.CPtr] | t.CPtr = cd.bases + bases: list[rawptr[ast.AST]] | t.CPtr = cd.bases bn: sizet = len(bases) if bn == 0: return for bi in range(bn): - base_node: ast.AST | t.CPtr = bases.get(bi) + base_node: rawptr[ast.AST] = bases.get(bi) if base_node is None: continue bk: int = base_node.kind() if bk != ast.ASTKind.Subscript: continue - sub: ast.Subscript | t.CPtr = (ast.Subscript | t.CPtr)(base_node) + sub: rawptr[ast.Subscript] = rawptr[ast.Subscript](base_node) if sub is None or sub.value is None or sub.slice is None: continue # 提取泛型类名(如 "GSListNode") @@ -1084,7 +1084,7 @@ class ClassGenBase: slice_k: int = sub.slice.kind() arg_nm: str = None if slice_k == ast.ASTKind.Name: - sl_nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(sub.slice) + sl_nm: rawptr[ast.Name] = rawptr[ast.Name](sub.slice) arg_nm = sl_nm.id if arg_nm is None: continue @@ -1095,19 +1095,19 @@ class ClassGenBase: type_args.append(arg_nm) # 触发特化(_specialize_generic_class 有缓存,重复调用安全) self.Gen.ClassGenGeneric._specialize_generic_class(trans, gen_class_name, type_args) - def _has_any_func_cvtable(self, cd: ast.ClassDef | t.CPtr) -> int: + def _has_any_func_cvtable(self, cd: rawptr[ast.ClassDef]) -> int: """检查类中是否有任何函数标记了 @t.CVTable,返回 1=有 / 0=无""" if cd is None or cd.children is None: return 0 - children: list[ast.AST | t.CPtr] | t.CPtr = cd.children + children: list[rawptr[ast.AST]] | t.CPtr = cd.children cn: sizet = len(children) for ci in range(cn): - stmt: ast.AST | t.CPtr = children.get(ci) + stmt: rawptr[ast.AST] = children.get(ci) if stmt is None: continue if stmt.kind() != ast.ASTKind.FunctionDef: continue - fd: ast.FunctionDef | t.CPtr = (ast.FunctionDef | t.CPtr)(stmt) + fd: rawptr[ast.FunctionDef] = rawptr[ast.FunctionDef](stmt) if fd is None or fd.name is None: continue # 跳过构造函数 @@ -1121,9 +1121,9 @@ class ClassGenBase: if self._has_decorator(fd.decorator_list, "CVTable") == 1: return 1 return 0 - def _should_method_be_virtual(self, cd: ast.ClassDef | t.CPtr, - fd: ast.FunctionDef | t.CPtr, - trans: HT.Translator | t.CPtr = None) -> int: + def _should_method_be_virtual(self, cd: rawptr[ast.ClassDef], + fd: rawptr[ast.FunctionDef], + trans: rawptr[HT.Translator] = None) -> int: """判断方法是否应该进入虚表,返回 1=包含 / 0=排除""" if fd is None: return 0 @@ -1168,8 +1168,8 @@ class ClassGenBase: # 5. 默认排除 return 0 - def _detect_vtable_status(self, cd: ast.ClassDef | t.CPtr, - trans: HT.Translator | t.CPtr = None) -> int: + def _detect_vtable_status(self, cd: rawptr[ast.ClassDef], + trans: rawptr[HT.Translator] = None) -> int: """检测类是否应该启用虚表""" if cd is None: return 0 diff --git a/App/lib/core/Gen/Class/ClassGenDef.vp b/App/lib/core/Gen/Class/ClassGenDef.vp index 886a64a..93f3fff 100644 --- a/App/lib/core/Gen/Class/ClassGenDef.vp +++ b/App/lib/core/Gen/Class/ClassGenDef.vp @@ -28,13 +28,13 @@ class ClassGenDef(ClassGenBase.ClassGenBase): # ============================================================ # translate_class_def — 翻译 class 定义(簇 D) # ============================================================ - def translate_class_def(self, trans: HT.Translator | t.CPtr, - node: ast.AST | t.CPtr) -> int: + def translate_class_def(self, trans: rawptr[HT.Translator], + node: rawptr[ast.AST]) -> int: """翻译 class 定义,返回 0""" if node is None or trans is None: return 0 - cd: ast.ClassDef | t.CPtr = (ast.ClassDef | t.CPtr)(node) + cd: rawptr[ast.ClassDef] = rawptr[ast.ClassDef](node) if cd is None or cd.name is None: return 0 @@ -112,7 +112,7 @@ class ClassGenDef(ClassGenBase.ClassGenBase): # _ensure_field_types_in_module 遍历悬空字段 ParamNode 链表 # 读悬空挂起(G3 LinkedNode.prepend 挂起根因)。DeepCopyType # 递归深拷贝字段链表/子类型/Name 到 stdlib(深度上限+链守卫)。 - ty_deep: llvmlite.LLVMType | t.CPtr = llvmlite.DeepCopyType( + ty_deep: rawptr[llvmlite.LLVMType] = llvmlite.DeepCopyType( CompilerFactory.factory.PermPool, existing.Ty) if ty_deep is not None: existing.Ty = ty_deep @@ -259,8 +259,8 @@ class ClassGenDef(ClassGenBase.ClassGenBase): if self.Gen.ClassGenBase._field_name_exists(field_names_buf, field_count, pfn) != 0: continue if field_count < GenTypes.FIELD_MAX: - pft: llvmlite.LLVMType | t.CPtr = self.Gen.StructGen.get_field_type_ptr(pfe) - pfd: ast.AST | t.CPtr = self.Gen.StructGen.get_field_default_ptr(pfe) + pft: rawptr[llvmlite.LLVMType] = self.Gen.StructGen.get_field_type_ptr(pfe) + pfd: rawptr[ast.AST] = self.Gen.StructGen.get_field_default_ptr(pfe) pfa: str = self.Gen.StructGen.get_field_annot_class_name(pfe) field_names_buf[field_count] = sizet(pfn) field_types_buf[field_count] = sizet(pft) @@ -275,13 +275,13 @@ class ClassGenDef(ClassGenBase.ClassGenBase): field_annot_buf[field_count] = 0 field_count += 1 - children: list[ast.AST | t.CPtr] | t.CPtr = cd.children + children: list[rawptr[ast.AST]] | t.CPtr = cd.children if children is None: return 0 cn: sizet = len(children) for ci in range(cn): - stmt: ast.AST | t.CPtr = children.get(ci) + stmt: rawptr[ast.AST] = children.get(ci) if stmt is None: continue sk: int = stmt.kind() @@ -289,14 +289,14 @@ class ClassGenDef(ClassGenBase.ClassGenBase): if sk != ast.ASTKind.AnnAssign: continue # AnnAssign(target=Name(id), annotation=type, value=...) - aa: ast.AnnAssign | t.CPtr = (ast.AnnAssign | t.CPtr)(stmt) + aa: rawptr[ast.AnnAssign] = rawptr[ast.AnnAssign](stmt) if aa is None or aa.target is None: continue # 获取字段名 if aa.target.kind() != ast.ASTKind.Name: continue - tgt: ast.Name | t.CPtr = (ast.Name | t.CPtr)(aa.target) + tgt: rawptr[ast.Name] = rawptr[ast.Name](aa.target) if tgt.id is None: continue @@ -313,7 +313,7 @@ class ClassGenDef(ClassGenBase.ClassGenBase): # 该路径的实例)Phase B 会 NameError: 't.CDefine' is not defined。 # 与类头常量(MRO_MAX 等)的 i32 字段语义保持一致。 if field_count < GenTypes.FIELD_MAX: - cdef_ty_l: llvmlite.LLVMType | t.CPtr = llvmlite.Int32(pool) + cdef_ty_l: rawptr[llvmlite.LLVMType] = llvmlite.Int32(pool) if cdef_ty_l is not None: field_names_buf[field_count] = sizet(tgt.id) field_types_buf[field_count] = sizet(cdef_ty_l) @@ -339,7 +339,7 @@ class ClassGenDef(ClassGenBase.ClassGenBase): continue # 解析字段类型 - field_ty: llvmlite.LLVMType | t.CPtr = self.Gen.TypeGenResolve.resolve_annotation_type( + field_ty: rawptr[llvmlite.LLVMType] = self.Gen.TypeGenResolve.resolve_annotation_type( pool, aa.annotation, trans._imported_modules, trans._from_imports, trans, 0) # 单参 t.CArray[elem] + 列表字面量 → 静态数组 [N x elem] # (与局部 AnnAssign 路径一致,对齐 TPC ParseListAnnotation 语义): @@ -363,15 +363,15 @@ class ClassGenDef(ClassGenBase.ClassGenBase): # 元素类型未就绪时若回退 Ptr(i8) 会注册成退化字段布局,Phase B 复用该 entry # 后 GEP 元素成 i8、字段访问/赋值全部失效。仅真正的泛型类(list[T]/Vector[T] # 等堆对象)未特化才回退 Ptr(i8)(AnnotClassName 携带 mangled name 供后续恢复)。 - sub_g: ast.Subscript | t.CPtr = (ast.Subscript | t.CPtr)(aa.annotation) + sub_g: rawptr[ast.Subscript] = rawptr[ast.Subscript](aa.annotation) is_carray_sub_g: int = 0 if sub_g is not None and sub_g.value is not None: if sub_g.value.kind() == ast.ASTKind.Attribute: - svg_at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(sub_g.value) + svg_at: rawptr[ast.Attribute] = rawptr[ast.Attribute](sub_g.value) if svg_at.attr is not None and string.strcmp(svg_at.attr, "CArray") == 0: is_carray_sub_g = 1 elif sub_g.value.kind() == ast.ASTKind.Name: - svg_nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(sub_g.value) + svg_nm: rawptr[ast.Name] = rawptr[ast.Name](sub_g.value) if svg_nm.id is not None and (string.strcmp(svg_nm.id, "CArray") == 0 or string.strcmp(svg_nm.id, "rawarray") == 0): is_carray_sub_g = 1 if is_carray_sub_g == 0: @@ -430,14 +430,14 @@ class ClassGenDef(ClassGenBase.ClassGenBase): # 2. 创建 LLVM StructType # ============================================================ # 构建 ParamNode 链表 - first_node: llvmlite.ParamNode | t.CPtr = None - prev_node: llvmlite.ParamNode | t.CPtr = None + first_node: rawptr[llvmlite.Function] = None + prev_node: rawptr[llvmlite.Function] = None total_field_count: int = field_count # 如果有虚表,首字段添加 i8* vtable 指针 if has_vtable == 1: - i8_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, llvmlite.Int8(pool)) - vtable_node: llvmlite.ParamNode | t.CPtr = pool.alloc(llvmlite.ParamNode.__sizeof__()) + i8_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, llvmlite.Int8(pool)) + vtable_node: rawptr[llvmlite.Function] = pool.alloc(llvmlite.ParamNode.__sizeof__()) if vtable_node is None: VLogger.error(f"failed to alloc vtable node for {class_name}", "CLASS") return 0 @@ -451,10 +451,10 @@ class ClassGenDef(ClassGenBase.ClassGenBase): fty_addr: sizet = field_types_buf[fi] if fty_addr == 0: continue - fty: llvmlite.LLVMType | t.CPtr = (llvmlite.LLVMType | t.CPtr)(fty_addr) + fty: rawptr[llvmlite.LLVMType] = (rawptr[llvmlite.LLVMType])(fty_addr) # 创建 ParamNode - pnode: llvmlite.ParamNode | t.CPtr = pool.alloc(llvmlite.ParamNode.__sizeof__()) + pnode: rawptr[llvmlite.Function] = pool.alloc(llvmlite.ParamNode.__sizeof__()) if pnode is None: continue string.memset(pnode, 0, llvmlite.ParamNode.__sizeof__()) @@ -484,7 +484,7 @@ class ClassGenDef(ClassGenBase.ClassGenBase): type_name = tn_copy # 创建 StructType(命名结构体) - struct_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Struct(pool, first_node, total_field_count, type_name) + struct_ty: rawptr[llvmlite.LLVMType] = llvmlite.Struct(pool, first_node, total_field_count, type_name) if struct_ty is None: VLogger.error(f"failed to create StructType for {class_name}", "CLASS") return 0 @@ -499,7 +499,7 @@ class ClassGenDef(ClassGenBase.ClassGenBase): # 后续文件字段类型引用(resolve → Ptr(entry.Ty))→ opaque 扫描遍历悬空 fields # 崩溃(LoopTest _scan_type_for_cross_module_refs 0xFFFF 根因)。 if trans._declare_only == 0 or self.Gen.StructGen.get_stdlib_alloc() != 0: - st_copy: llvmlite.LLVMType | t.CPtr = llvmlite.DeepCopyType( + st_copy: rawptr[llvmlite.LLVMType] = llvmlite.DeepCopyType( CompilerFactory.factory.PermPool, struct_ty) if st_copy is not None: struct_ty = st_copy @@ -522,7 +522,7 @@ class ClassGenDef(ClassGenBase.ClassGenBase): fty_addr_op: sizet = field_types_buf[fi] if fty_addr_op == 0: continue - fty_op: llvmlite.LLVMType | t.CPtr = (llvmlite.LLVMType | t.CPtr)(fty_addr_op) + fty_op: rawptr[llvmlite.LLVMType] = (rawptr[llvmlite.LLVMType])(fty_addr_op) llvmlite.module_ensure_opaque_for_type(trans.Module, pool, fty_op) # ============================================================ @@ -567,7 +567,7 @@ class ClassGenDef(ClassGenBase.ClassGenBase): # 添加字段信息 # 如果有虚表,先添加 __vtable__ 字段占位(索引 0),用户字段从索引 1 开始 if has_vtable == 1: - i8_ptr_ty2: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, llvmlite.Int8(pool)) + i8_ptr_ty2: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, llvmlite.Int8(pool)) self.Gen.StructGen.add_field(pool, entry, "__vtable__", i8_ptr_ty2, None, None) for fi in range(field_count): @@ -578,12 +578,12 @@ class ClassGenDef(ClassGenBase.ClassGenBase): fty_addr2: sizet = field_types_buf[fi] if fty_addr2 == 0: continue - fty2: llvmlite.LLVMType | t.CPtr = (llvmlite.LLVMType | t.CPtr)(fty_addr2) + fty2: rawptr[llvmlite.LLVMType] = (rawptr[llvmlite.LLVMType])(fty_addr2) # 恢复默认值 AST 指针 fdef_addr: sizet = field_defaults_buf[fi] - fdef: ast.AST | t.CPtr = None + fdef: rawptr[ast.AST] = None if fdef_addr != 0: - fdef = (ast.AST | t.CPtr)(fdef_addr) + fdef = (rawptr[ast.AST])(fdef_addr) # 恢复注解类名指针 fannot_addr: sizet = field_annot_buf[fi] fannot: str = None diff --git a/App/lib/core/Gen/Class/ClassGenEnum.vp b/App/lib/core/Gen/Class/ClassGenEnum.vp index 7048f6b..9928d7f 100644 --- a/App/lib/core/Gen/Class/ClassGenEnum.vp +++ b/App/lib/core/Gen/Class/ClassGenEnum.vp @@ -35,9 +35,9 @@ class ClassGenEnum(ClassGenBase.ClassGenBase): """enum/union/renum 定义与变体表""" def _resolve_enum_member_type(self, pool: rawptr[memhub.MemBuddy], - ann_node: ast.AST | t.CPtr, + ann_node: rawptr[ast.AST], imported_modules: str, - from_imports: str) -> llvmlite.LLVMType | t.CPtr: + from_imports: str) -> rawptr[llvmlite.LLVMType]: """解析枚举成员的类型注解为 LLVM 整数类型""" if ann_node is None: return llvmlite.Int32(pool) @@ -46,7 +46,7 @@ class ClassGenEnum(ClassGenBase.ClassGenBase): # Attribute 节点: t.State / int / int8 等 if k == ast.ASTKind.Attribute: - at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(ann_node) + at: rawptr[ast.Attribute] = rawptr[ast.Attribute](ann_node) if at.attr is None: # [S4 fail-fast] Attribute 缺失成员名(AST 损坏),不再静默回退 i32 self.Gen.TypeGenErr.fatal_error( @@ -56,7 +56,7 @@ class ClassGenEnum(ClassGenBase.ClassGenBase): if string.strcmp(at.attr, "State") == 0: return llvmlite.Int32(pool) # 其他 t.CXxx 类型:统一口径(CTypedef 动态表优先,miss 回退 map_t_type) - ty: llvmlite.LLVMType | t.CPtr = self.Gen.TypeGenResolve.resolve_typedef_or_map( + ty: rawptr[llvmlite.LLVMType] = self.Gen.TypeGenResolve.resolve_typedef_or_map( pool, at.attr, imported_modules, from_imports) if ty is not None: return ty @@ -67,7 +67,7 @@ class ClassGenEnum(ClassGenBase.ClassGenBase): # Name 节点: from-import 形式(State / CInt) if k == ast.ASTKind.Name: - nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(ann_node) + nm: rawptr[ast.Name] = rawptr[ast.Name](ann_node) if nm.id is None: # [S4 fail-fast] Name 缺失标识符(AST 损坏),不再静默回退 i32 self.Gen.TypeGenErr.fatal_error( @@ -75,7 +75,7 @@ class ClassGenEnum(ClassGenBase.ClassGenBase): return llvmlite.Int32(pool) # 不可达(fatal_error 已退出) if string.strcmp(nm.id, "State") == 0: return llvmlite.Int32(pool) - ty2: llvmlite.LLVMType | t.CPtr = self.Gen.TypeGenResolve.resolve_typedef_or_map( + ty2: rawptr[llvmlite.LLVMType] = self.Gen.TypeGenResolve.resolve_typedef_or_map( pool, nm.id, imported_modules, from_imports) if ty2 is not None: return ty2 @@ -86,15 +86,15 @@ class ClassGenEnum(ClassGenBase.ClassGenBase): # BinOp 节点: t.State | int8(递归查找实际类型) if k == ast.ASTKind.BinOp: - bop: ast.BinOp | t.CPtr = (ast.BinOp | t.CPtr)(ann_node) + bop: rawptr[ast.BinOp] = rawptr[ast.BinOp](ann_node) if bop.op == ast.OpKind.BitOr: - left_ty: llvmlite.LLVMType | t.CPtr = self._resolve_enum_member_type( + left_ty: rawptr[llvmlite.LLVMType] = self._resolve_enum_member_type( pool, bop.left, imported_modules, from_imports) # 跳过 t.State(i32 默认),优先返回具体类型 left_bits: int = self.Gen.TypeGenErr.get_llvm_type_bits(left_ty) if left_bits != 0 and not self._is_state_annotation(bop.left): return left_ty - right_ty: llvmlite.LLVMType | t.CPtr = self._resolve_enum_member_type( + right_ty: rawptr[llvmlite.LLVMType] = self._resolve_enum_member_type( pool, bop.right, imported_modules, from_imports) if right_ty is not None and not self._is_state_annotation(bop.right): return right_ty @@ -112,41 +112,41 @@ class ClassGenEnum(ClassGenBase.ClassGenBase): self.Gen.TypeGenErr.fatal_error( ann_node, f"枚举成员类型注解解析失败: {self.Gen.TypeGenResolve.annotation_to_str(ann_node)}", "TypeError") return llvmlite.Int32(pool) # 不可达(fatal_error 已退出) - def _is_state_annotation(self, node: ast.AST | t.CPtr) -> int: + def _is_state_annotation(self, node: rawptr[ast.AST]) -> int: """检查注解节点是否为 t.State,返回 1=是 / 0=否""" if node is None: return 0 k: int = node.kind() if k == ast.ASTKind.Attribute: - at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(node) + at: rawptr[ast.Attribute] = rawptr[ast.Attribute](node) if at.attr is not None and string.strcmp(at.attr, "State") == 0: return 1 return 0 if k == ast.ASTKind.Name: - nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(node) + nm: rawptr[ast.Name] = rawptr[ast.Name](node) if nm.id is not None and string.strcmp(nm.id, "State") == 0: return 1 return 0 return 0 - def _extract_int_value(self, node: ast.AST | t.CPtr) -> int64: + def _extract_int_value(self, node: rawptr[ast.AST]) -> int64: """从 AST 节点提取整数值,失败返回 0""" if node is None: return 0 k: int = node.kind() if k == ast.ASTKind.Constant: - cn: ast.Constant | t.CPtr = (ast.Constant | t.CPtr)(node) + cn: rawptr[ast.Constant] = rawptr[ast.Constant](node) if cn.const_kind == ast.CONST_INT: return cn.int_val return 0 if k == ast.ASTKind.UnaryOp: - uo: ast.UnaryOp | t.CPtr = (ast.UnaryOp | t.CPtr)(node) + uo: rawptr[ast.UnaryOp] = rawptr[ast.UnaryOp](node) if uo.op == ast.OpKind.USub: inner: int64 = self._extract_int_value(uo.operand) return -inner return 0 return 0 - def _translate_enum_def(self, trans: HT.Translator | t.CPtr, - cd: ast.ClassDef | t.CPtr) -> int: + def _translate_enum_def(self, trans: rawptr[HT.Translator], + cd: rawptr[ast.ClassDef]) -> int: """翻译枚举类定义,返回 0""" if cd is None or cd.name is None or trans is None: return 0 @@ -159,7 +159,7 @@ class ClassGenEnum(ClassGenBase.ClassGenBase): # 成员缺失(FR_OK 找不到)。register_enum 幂等返回已有 entry, # add_enum_member 成员名去重,重复处理安全合并。 - children: list[ast.AST | t.CPtr] | t.CPtr = cd.children + children: list[rawptr[ast.AST]] | t.CPtr = cd.children if children is None: VLogger.warning(f"{class_name} has no body", "ENUM") return 0 @@ -180,25 +180,25 @@ class ClassGenEnum(ClassGenBase.ClassGenBase): next_val: int64 = 0 for ci in range(cn): - stmt: ast.AST | t.CPtr = children.get(ci) + stmt: rawptr[ast.AST] = children.get(ci) if stmt is None: continue sk: int = stmt.kind() if sk == ast.ASTKind.AnnAssign: - aa: ast.AnnAssign | t.CPtr = (ast.AnnAssign | t.CPtr)(stmt) + aa: rawptr[ast.AnnAssign] = rawptr[ast.AnnAssign](stmt) if aa is None or aa.target is None: continue # 获取成员名 if aa.target.kind() != ast.ASTKind.Name: continue - tgt: ast.Name | t.CPtr = (ast.Name | t.CPtr)(aa.target) + tgt: rawptr[ast.Name] = rawptr[ast.Name](aa.target) if tgt.id is None: continue # 解析成员类型 - member_ty: llvmlite.LLVMType | t.CPtr = self._resolve_enum_member_type( + member_ty: rawptr[llvmlite.LLVMType] = self._resolve_enum_member_type( pool, aa.annotation, trans._imported_modules, trans._from_imports) # 解析成员值 @@ -223,23 +223,23 @@ class ClassGenEnum(ClassGenBase.ClassGenBase): elif sk == ast.ASTKind.Assign: # 处理 Assign 形式的枚举成员: DEBUG = 0, INFO = 1 等 # CEnum 子类中无类型注释的赋值也视为枚举成员 - ag: ast.Assign | t.CPtr = (ast.Assign | t.CPtr)(stmt) + ag: rawptr[ast.Assign] = rawptr[ast.Assign](stmt) if ag is None or ag.targets is None: continue - tgts: list[ast.AST | t.CPtr] | t.CPtr = ag.targets + tgts: list[rawptr[ast.AST]] | t.CPtr = ag.targets tn: sizet = len(tgts) if tn == 0: continue # 取第一个 target 作为成员名 - t0: ast.AST | t.CPtr = tgts.get(0) + t0: rawptr[ast.AST] = tgts.get(0) if t0 is None or t0.kind() != ast.ASTKind.Name: continue - tgt_a: ast.Name | t.CPtr = (ast.Name | t.CPtr)(t0) + tgt_a: rawptr[ast.Name] = rawptr[ast.Name](t0) if tgt_a.id is None: continue # Assign 无类型注释,默认使用 i32 - member_ty_a: llvmlite.LLVMType | t.CPtr = llvmlite.Int32(pool) + member_ty_a: rawptr[llvmlite.LLVMType] = llvmlite.Int32(pool) # 解析成员值 cur_val_a: int64 = 0 @@ -263,13 +263,13 @@ class ClassGenEnum(ClassGenBase.ClassGenBase): return 0 # 确定基准类型:所有成员类型中 Bits 最大的 - base_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int32(pool) + base_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int32(pool) max_bits: int = 0 for mi in range(member_count): ty_addr: sizet = member_types_buf[mi] if ty_addr == 0: continue - mty: llvmlite.LLVMType | t.CPtr = (llvmlite.LLVMType | t.CPtr)(ty_addr) + mty: rawptr[llvmlite.LLVMType] = (rawptr[llvmlite.LLVMType])(ty_addr) bits: int = self.Gen.TypeGenErr.get_llvm_type_bits(mty) if bits > max_bits: max_bits = bits @@ -291,7 +291,7 @@ class ClassGenEnum(ClassGenBase.ClassGenBase): fty_addr2: sizet = member_types_buf[mi] if fty_addr2 == 0: continue - mty2: llvmlite.LLVMType | t.CPtr = (llvmlite.LLVMType | t.CPtr)(fty_addr2) + mty2: rawptr[llvmlite.LLVMType] = (rawptr[llvmlite.LLVMType])(fty_addr2) mval: int64 = member_values_buf[mi] if mname is not None and mty2 is not None: self.Gen.StmtGenDecl.add_enum_member(pool, entry, mname, mval, mty2) @@ -299,7 +299,7 @@ class ClassGenEnum(ClassGenBase.ClassGenBase): VLogger.info(f"registered {class_name} with {member_count} members, base_bits={max_bits}", "ENUM") return 0 - def _get_type_size(self, ty: llvmlite.LLVMType | t.CPtr) -> int: + def _get_type_size(self, ty: rawptr[llvmlite.LLVMType]) -> int: """计算 LLVM 类型的字节大小(含对齐 padding)""" if ty is None: return 0 @@ -322,11 +322,11 @@ class ClassGenEnum(ClassGenBase.ClassGenBase): is_packed: int = self.Gen.StructGen.struct_type_is_packed(ty) total: int = 0 max_align: int = 1 - cur: llvmlite.ParamNode | t.CPtr = fields + cur: rawptr[llvmlite.Function] = fields i: int = 0 while cur is not None and i < fcount: if cur.Ty is not None: - fty: llvmlite.LLVMType | t.CPtr = (llvmlite.LLVMType | t.CPtr)(cur.Ty) + fty: rawptr[llvmlite.LLVMType] = (rawptr[llvmlite.LLVMType])(cur.Ty) fsize: int = self._get_type_size(fty) falign: int = self._get_type_align(fty) # 对齐当前偏移到字段对齐边界(packed 不插填充) @@ -348,7 +348,7 @@ class ClassGenEnum(ClassGenBase.ClassGenBase): return total case _: return 8 - def _get_type_align(self, ty: llvmlite.LLVMType | t.CPtr) -> int: + def _get_type_align(self, ty: rawptr[llvmlite.LLVMType]) -> int: """返回类型的自然对齐(字节)""" if ty is None: return 1 @@ -377,11 +377,11 @@ class ClassGenEnum(ClassGenBase.ClassGenBase): return 1 # 结构体的对齐 = 最大字段对齐 max_align: int = 1 - cur: llvmlite.ParamNode | t.CPtr = fields + cur: rawptr[llvmlite.Function] = fields i: int = 0 while cur is not None and i < fcount: if cur.Ty is not None: - fty: llvmlite.LLVMType | t.CPtr = (llvmlite.LLVMType | t.CPtr)(cur.Ty) + fty: rawptr[llvmlite.LLVMType] = (rawptr[llvmlite.LLVMType])(cur.Ty) fa: int = self._get_type_align(fty) if fa > max_align: max_align = fa @@ -390,8 +390,8 @@ class ClassGenEnum(ClassGenBase.ClassGenBase): return max_align case _: return 8 - def _translate_union_def(self, trans: HT.Translator | t.CPtr, - cd: ast.ClassDef | t.CPtr) -> int: + def _translate_union_def(self, trans: rawptr[HT.Translator], + cd: rawptr[ast.ClassDef]) -> int: """翻译联合体定义,返回 0""" if cd is None or cd.name is None or trans is None: return 0 @@ -412,7 +412,7 @@ class ClassGenEnum(ClassGenBase.ClassGenBase): # SHA1 已在 register_struct 时设置,无需再补 return 0 - children: list[ast.AST | t.CPtr] | t.CPtr = cd.children + children: list[rawptr[ast.AST]] | t.CPtr = cd.children if children is None: VLogger.warning("{class_name} has no body", "UNION") return 0 @@ -431,25 +431,25 @@ class ClassGenEnum(ClassGenBase.ClassGenBase): max_size: int = 0 for ci in range(cn): - stmt: ast.AST | t.CPtr = children.get(ci) + stmt: rawptr[ast.AST] = children.get(ci) if stmt is None: continue sk: int = stmt.kind() if sk == ast.ASTKind.AnnAssign: - aa: ast.AnnAssign | t.CPtr = (ast.AnnAssign | t.CPtr)(stmt) + aa: rawptr[ast.AnnAssign] = rawptr[ast.AnnAssign](stmt) if aa is None or aa.target is None: continue # 获取字段名 if aa.target.kind() != ast.ASTKind.Name: continue - tgt: ast.Name | t.CPtr = (ast.Name | t.CPtr)(aa.target) + tgt: rawptr[ast.Name] = rawptr[ast.Name](aa.target) if tgt.id is None: continue # 解析字段类型 - field_ty: llvmlite.LLVMType | t.CPtr = self.Gen.TypeGenResolve.resolve_annotation_type( + field_ty: rawptr[llvmlite.LLVMType] = self.Gen.TypeGenResolve.resolve_annotation_type( pool, aa.annotation, trans._imported_modules, trans._from_imports, trans, 0) if field_ty is None: # Phase A-pre(declare_only=1):依赖的类可能尚未注册, @@ -484,11 +484,11 @@ class ClassGenEnum(ClassGenBase.ClassGenBase): # 创建联合体的 LLVM 类型: Struct([Array(Int8, max_size)]) # 即 { [max_size x i8] } - i8_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int8(pool) - array_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Array(pool, i8_ty, max_size) + i8_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int8(pool) + array_ty: rawptr[llvmlite.LLVMType] = llvmlite.Array(pool, i8_ty, max_size) # 构建 ParamNode 链表(单字段:字节数组) - pnode: llvmlite.ParamNode | t.CPtr = pool.alloc(llvmlite.ParamNode.__sizeof__()) + pnode: rawptr[llvmlite.Function] = pool.alloc(llvmlite.ParamNode.__sizeof__()) if pnode is None: return 0 string.memset(pnode, 0, llvmlite.ParamNode.__sizeof__()) @@ -502,7 +502,7 @@ class ClassGenEnum(ClassGenBase.ClassGenBase): viperlib.snprintf(union_name_buf, 64, "%s.%s", trans.ModuleSha1, class_name) union_type_name = union_name_buf - union_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Struct(pool, pnode, 1, union_type_name) + union_ty: rawptr[llvmlite.LLVMType] = llvmlite.Struct(pool, pnode, 1, union_type_name) if union_ty is None: VLogger.error(f"failed to create type for {class_name}", "UNION") return 0 @@ -513,7 +513,7 @@ class ClassGenEnum(ClassGenBase.ClassGenBase): # entry.Ty 悬空 → 后续文件 opaque 扫描跨模块引用遍历悬空 fields 崩溃 # (LoopTest _scan_type_for_cross_module_refs 0xFFFF 根因)。 if trans._declare_only == 0 or self.Gen.StructGen.get_stdlib_alloc() != 0: - union_copy: llvmlite.LLVMType | t.CPtr = llvmlite.DeepCopyType( + union_copy: rawptr[llvmlite.LLVMType] = llvmlite.DeepCopyType( CompilerFactory.factory.PermPool, union_ty) if union_copy is not None: union_ty = union_copy @@ -543,14 +543,14 @@ class ClassGenEnum(ClassGenBase.ClassGenBase): fty_addr2: sizet = field_types_buf[fi] if fty_addr2 == 0: continue - fty2: llvmlite.LLVMType | t.CPtr = (llvmlite.LLVMType | t.CPtr)(fty_addr2) + fty2: rawptr[llvmlite.LLVMType] = (rawptr[llvmlite.LLVMType])(fty_addr2) if fname is not None and fty2 is not None: self.Gen.StructGen.add_field(pool, entry, fname, fty2, None, None) VLogger.info(f"registered {class_name} with {field_count} fields, max_size={max_size}", "UNION") return 0 def _get_annotation_field_size(self, pool: rawptr[memhub.MemBuddy], - annotation: ast.AST | t.CPtr) -> int: + annotation: rawptr[ast.AST]) -> int: """计算注解类型的字节大小,用于 REnum 布局计算""" if annotation is None: return 8 @@ -561,11 +561,11 @@ class ClassGenEnum(ClassGenBase.ClassGenBase): # Name(id) 或 Attribute(attr) → 解析类型名 type_name: str = None if k == ast.ASTKind.Name: - nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(annotation) + nm: rawptr[ast.Name] = rawptr[ast.Name](annotation) if nm is not None: type_name = nm.id elif k == ast.ASTKind.Attribute: - at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(annotation) + at: rawptr[ast.Attribute] = rawptr[ast.Attribute](annotation) if at is not None: type_name = at.attr if type_name is None: @@ -606,15 +606,15 @@ class ClassGenEnum(ClassGenBase.ClassGenBase): # bool = t.CBool = i8(1 字节) return 1 # 已注册的结构体类型 - struct_ty: llvmlite.LLVMType | t.CPtr = self.Gen.StructGen.get_struct_type(type_name) + struct_ty: rawptr[llvmlite.LLVMType] = self.Gen.StructGen.get_struct_type(type_name) if struct_ty is not None: sz: int = self._get_type_size(struct_ty) if sz > 0: return sz # 未注册类型 → 默认指针大小 8(可能是自引用或前向引用) return 8 - def _translate_renum_def(self, trans: HT.Translator | t.CPtr, - cd: ast.ClassDef | t.CPtr) -> int: + def _translate_renum_def(self, trans: rawptr[HT.Translator], + cd: rawptr[ast.ClassDef]) -> int: """翻译 REnum 类定义,返回 0""" if cd is None or cd.name is None or trans is None: return 0 @@ -646,7 +646,7 @@ class ClassGenEnum(ClassGenBase.ClassGenBase): existing.Ty = None existing.FieldCount = 0 - children: list[ast.AST | t.CPtr] | t.CPtr = cd.children + children: list[rawptr[ast.AST]] | t.CPtr = cd.children if children is None: # [D32 fail-fast] 此前只 warning + return 0:变体表**静默不注册** → # _is_renum_class_name 恒 0、变体构造拿不到 tag(__types.vp L703 @@ -669,34 +669,34 @@ class ClassGenEnum(ClassGenBase.ClassGenBase): max_field_count: int = 0 # 所有变体中最大字段数 for ci in range(cn): - stmt: ast.AST | t.CPtr = children.get(ci) + stmt: rawptr[ast.AST] = children.get(ci) if stmt is None: continue sk: int = stmt.kind() if sk == ast.ASTKind.ClassDef: # 嵌套变体类 - variant_cd: ast.ClassDef | t.CPtr = (ast.ClassDef | t.CPtr)(stmt) + variant_cd: rawptr[ast.ClassDef] = rawptr[ast.ClassDef](stmt) if variant_cd is None or variant_cd.children is None: variant_count += 1 continue - variant_children: list[ast.AST | t.CPtr] | t.CPtr = variant_cd.children + variant_children: list[rawptr[ast.AST]] | t.CPtr = variant_cd.children vcn: sizet = len(variant_children) field_idx: int = 0 for vi in range(vcn): - vstmt: ast.AST | t.CPtr = variant_children.get(vi) + vstmt: rawptr[ast.AST] = variant_children.get(vi) if vstmt is None: continue vk: int = vstmt.kind() if vk != ast.ASTKind.AnnAssign: continue - vaa: ast.AnnAssign | t.CPtr = (ast.AnnAssign | t.CPtr)(vstmt) + vaa: rawptr[ast.AnnAssign] = rawptr[ast.AnnAssign](vstmt) if vaa is None or vaa.target is None or vaa.annotation is None: continue if vaa.target.kind() != ast.ASTKind.Name: continue # 提取字段名 - vnm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(vaa.target) + vnm: rawptr[ast.Name] = rawptr[ast.Name](vaa.target) # 计算字段大小 fsize: int = self._get_annotation_field_size(pool, vaa.annotation) if variant_count < 32 and field_idx < 16: @@ -710,7 +710,7 @@ class ClassGenEnum(ClassGenBase.ClassGenBase): # 不存类型,绑定回退槽位类型。variant_cd.name 在 1a reset # 后悬空,注册内部会 strcpy 到 perm_pool。 if vnm is not None and vnm.id is not None: - mem_ty_l: llvmlite.LLVMType | t.CPtr = None + mem_ty_l: rawptr[llvmlite.LLVMType] = None if trans is not None: mem_ty_l = self.Gen.TypeGenResolve.resolve_annotation_type( pool, vaa.annotation, @@ -729,16 +729,16 @@ class ClassGenEnum(ClassGenBase.ClassGenBase): # 只是无字段。不认则 variant_count 与变体表都漏掉该变体 ⇒ match 的 # `case Option.Empty():` 查表失配 tag=-1 → 硬校验 fail-fast。 # tag 值由 _register_renum_variants 按同一口径分配(显式值优先)。 - ag_v: ast.Assign | t.CPtr = (ast.Assign | t.CPtr)(stmt) + ag_v: rawptr[ast.Assign] = rawptr[ast.Assign](stmt) if ag_v is None or ag_v.targets is None: continue - tgts_v: list[ast.AST | t.CPtr] | t.CPtr = ag_v.targets + tgts_v: list[rawptr[ast.AST]] | t.CPtr = ag_v.targets if len(tgts_v) == 0: continue - t0_v: ast.AST | t.CPtr = tgts_v.get(0) + t0_v: rawptr[ast.AST] = tgts_v.get(0) if t0_v is None or t0_v.kind() != ast.ASTKind.Name: continue - tgt_v: ast.Name | t.CPtr = (ast.Name | t.CPtr)(t0_v) + tgt_v: rawptr[ast.Name] = rawptr[ast.Name](t0_v) if tgt_v.id is None: continue variant_count += 1 @@ -782,18 +782,18 @@ class ClassGenEnum(ClassGenBase.ClassGenBase): position_max_sizes[pos] = sizet(pos_max) # 构建 ParamNode 链表 - i32_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int32(pool) - i64_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int64(pool) + i32_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int32(pool) + i64_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int64(pool) - first_node: llvmlite.ParamNode | t.CPtr = None - tail_node: llvmlite.ParamNode | t.CPtr = None + first_node: rawptr[llvmlite.Function] = None + tail_node: rawptr[llvmlite.Function] = None for pos in range(total_positions): psize: int = position_max_sizes[pos] - field_ty: llvmlite.LLVMType | t.CPtr = i32_ty + field_ty: rawptr[llvmlite.LLVMType] = i32_ty if psize > 4: field_ty = i64_ty - pnode: llvmlite.ParamNode | t.CPtr = llvmlite.new_param_node(pool, field_ty) + pnode: rawptr[llvmlite.Function] = llvmlite.new_param_node(pool, field_ty) if pnode is None: continue tail_node = llvmlite.param_list_append(first_node, tail_node, pnode) @@ -812,7 +812,7 @@ class ClassGenEnum(ClassGenBase.ClassGenBase): viperlib.snprintf(renum_name_buf, 64, "%s.%s", trans.ModuleSha1, class_name) renum_type_name = renum_name_buf - renum_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Struct( + renum_ty: rawptr[llvmlite.LLVMType] = llvmlite.Struct( pool, first_node, total_positions, renum_type_name) if renum_ty is None: VLogger.error(f"failed to create type for {class_name}", "RENUM") @@ -822,7 +822,7 @@ class ClassGenEnum(ClassGenBase.ClassGenBase): # 与 entry.Ty 保持同一指针,find_struct_by_type 匹配不失效) # StdlibAlloc=1(Phase2 mark2 后)也必须深拷贝:同 union 的悬空根因。 if trans._declare_only == 0 or self.Gen.StructGen.get_stdlib_alloc() != 0: - renum_copy: llvmlite.LLVMType | t.CPtr = llvmlite.DeepCopyType( + renum_copy: rawptr[llvmlite.LLVMType] = llvmlite.DeepCopyType( CompilerFactory.factory.PermPool, renum_ty) if renum_copy is not None: renum_ty = renum_copy @@ -843,7 +843,7 @@ class ClassGenEnum(ClassGenBase.ClassGenBase): # 添加 payload 字段(位置 1+,i32 或 i64) for pos in range(1, total_positions): psize2: int = position_max_sizes[pos] - payload_ty: llvmlite.LLVMType | t.CPtr = i32_ty + payload_ty: rawptr[llvmlite.LLVMType] = i32_ty if psize2 > 4: payload_ty = i64_ty field_name_buf: str = pool.alloc(16) @@ -863,10 +863,10 @@ class ClassGenEnum(ClassGenBase.ClassGenBase): VLogger.info(f"registered {class_name} with {variant_count} variants, {total_positions} positions", "RENUM") return 0 - def _refill_renum_field_types(self, trans: HT.Translator | t.CPtr, + def _refill_renum_field_types(self, trans: rawptr[HT.Translator], pool: rawptr[memhub.MemBuddy], class_name: str, - cd: ast.ClassDef | t.CPtr): + cd: rawptr[ast.ClassDef]): """REnum 注册完成后补解析变体字段类型(仅回填类型槽为 0 的别名记录) 第一遍变体字段遍历发生在 register_struct 之前:字段注解引用本 REnum 类 @@ -886,39 +886,39 @@ class ClassGenEnum(ClassGenBase.ClassGenBase): """ if trans is None or pool is None or class_name is None or cd is None: return - children: list[ast.AST | t.CPtr] | t.CPtr = cd.children + children: list[rawptr[ast.AST]] | t.CPtr = cd.children if children is None: return cn: sizet = len(children) for ci in range(cn): - stmt: ast.AST | t.CPtr = children.get(ci) + stmt: rawptr[ast.AST] = children.get(ci) if stmt is None or stmt.kind() != ast.ASTKind.ClassDef: continue - variant_cd: ast.ClassDef | t.CPtr = (ast.ClassDef | t.CPtr)(stmt) + variant_cd: rawptr[ast.ClassDef] = rawptr[ast.ClassDef](stmt) if variant_cd is None or variant_cd.name is None \ or variant_cd.children is None: continue - vchildren: list[ast.AST | t.CPtr] | t.CPtr = variant_cd.children + vchildren: list[rawptr[ast.AST]] | t.CPtr = variant_cd.children vcn: sizet = len(vchildren) field_idx: int = 0 for vi in range(vcn): - vstmt: ast.AST | t.CPtr = vchildren.get(vi) + vstmt: rawptr[ast.AST] = vchildren.get(vi) if vstmt is None: continue if vstmt.kind() != ast.ASTKind.AnnAssign: continue - vaa: ast.AnnAssign | t.CPtr = (ast.AnnAssign | t.CPtr)(vstmt) + vaa: rawptr[ast.AnnAssign] = rawptr[ast.AnnAssign](vstmt) if vaa is None or vaa.target is None or vaa.annotation is None: # 与第一遍同规则:无效 AnnAssign 不占用 payload 槽位 continue if vaa.target.kind() != ast.ASTKind.Name: continue - vnm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(vaa.target) + vnm: rawptr[ast.Name] = rawptr[ast.Name](vaa.target) if vnm.id is None: # 与第一遍同规则:有效 AnnAssign 仍占用 payload 槽位 field_idx += 1 continue - mem_ty_l: llvmlite.LLVMType | t.CPtr = \ + mem_ty_l: rawptr[llvmlite.LLVMType] = \ self.Gen.TypeGenResolve.resolve_annotation_type( pool, vaa.annotation, trans._imported_modules, @@ -931,14 +931,14 @@ class ClassGenEnum(ClassGenBase.ClassGenBase): field_idx += 1 def _register_renum_variants(self, pool: rawptr[memhub.MemBuddy], class_name: str, - cd: ast.ClassDef | t.CPtr, + cd: rawptr[ast.ClassDef], variant_count: int): """注册 REnum 类的变体名和 tag 值到全局变体表""" if pool is None or class_name is None or cd is None: return if variant_count == 0: return - children: list[ast.AST | t.CPtr] | t.CPtr = cd.children + children: list[rawptr[ast.AST]] | t.CPtr = cd.children if children is None: return @@ -1005,16 +1005,16 @@ class ClassGenEnum(ClassGenBase.ClassGenBase): # 第一遍:扫出 Assign 变体的显式整数值上界(无显式值时保持 -1) max_explicit: int = -1 for ci in range(cn): - stmt_p: ast.AST | t.CPtr = children.get(ci) + stmt_p: rawptr[ast.AST] = children.get(ci) if stmt_p is None or stmt_p.kind() != ast.ASTKind.Assign: continue - ag_p: ast.Assign | t.CPtr = (ast.Assign | t.CPtr)(stmt_p) + ag_p: rawptr[ast.Assign] = rawptr[ast.Assign](stmt_p) if ag_p is None or ag_p.targets is None or ag_p.value is None: continue - tgts_p: list[ast.AST | t.CPtr] | t.CPtr = ag_p.targets + tgts_p: list[rawptr[ast.AST]] | t.CPtr = ag_p.targets if len(tgts_p) == 0: continue - t0_p: ast.AST | t.CPtr = tgts_p.get(0) + t0_p: rawptr[ast.AST] = tgts_p.get(0) if t0_p is None or t0_p.kind() != ast.ASTKind.Name: continue if ag_p.value.kind() != ast.ASTKind.Constant: @@ -1036,14 +1036,14 @@ class ClassGenEnum(ClassGenBase.ClassGenBase): # 每类固定 32 槽:变体超过上限继续写会越界污染相邻类槽,fail-fast 报错 VLogger.error(f"REnum 变体数超过上限 {RENUM_VARIANT_PER_CLASS}: {class_name}", "RENUM") break - stmt: ast.AST | t.CPtr = children.get(ci) + stmt: rawptr[ast.AST] = children.get(ci) if stmt is None: continue sk_rv: int = stmt.kind() vname_ptr: sizet = 0 tag_val: int = 0 if sk_rv == ast.ASTKind.ClassDef: - vcd: ast.ClassDef | t.CPtr = (ast.ClassDef | t.CPtr)(stmt) + vcd: rawptr[ast.ClassDef] = rawptr[ast.ClassDef](stmt) if vcd is None or vcd.name is None: continue vname_ptr = sizet(vcd.name) @@ -1051,16 +1051,16 @@ class ClassGenEnum(ClassGenBase.ClassGenBase): next_class_tag += 1 elif sk_rv == ast.ASTKind.Assign: # Assign 形式无载荷变体(与 _translate_renum_def 首遍同过滤口径) - ag_rv: ast.Assign | t.CPtr = (ast.Assign | t.CPtr)(stmt) + ag_rv: rawptr[ast.Assign] = rawptr[ast.Assign](stmt) if ag_rv is None or ag_rv.targets is None: continue - tgts_rv: list[ast.AST | t.CPtr] | t.CPtr = ag_rv.targets + tgts_rv: list[rawptr[ast.AST]] | t.CPtr = ag_rv.targets if len(tgts_rv) == 0: continue - t0_rv: ast.AST | t.CPtr = tgts_rv.get(0) + t0_rv: rawptr[ast.AST] = tgts_rv.get(0) if t0_rv is None or t0_rv.kind() != ast.ASTKind.Name: continue - tgt_rv: ast.Name | t.CPtr = (ast.Name | t.CPtr)(t0_rv) + tgt_rv: rawptr[ast.Name] = rawptr[ast.Name](t0_rv) if tgt_rv.id is None: continue vname_ptr = sizet(tgt_rv.id) @@ -1140,7 +1140,7 @@ class ClassGenEnum(ClassGenBase.ClassGenBase): """ if class_name is None: return 0 - st: llvmlite.LLVMType | t.CPtr = self.Gen.StructGen.get_struct_type(class_name) + st: rawptr[llvmlite.LLVMType] = self.Gen.StructGen.get_struct_type(class_name) if st is None: return 0 if self.Gen.StructGen.lookup_field(st, "__tag") is None: @@ -1176,7 +1176,7 @@ class ClassGenEnum(ClassGenBase.ClassGenBase): class_name: str, field_name: str, payload_idx: int, - field_ty: llvmlite.LLVMType | t.CPtr = None, + field_ty: rawptr[llvmlite.LLVMType] = None, variant_name: str = None): """注册 REnum 变体字段名别名到全局表 @@ -1230,7 +1230,7 @@ class ClassGenEnum(ClassGenBase.ClassGenBase): # _refill_renum_field_types)类型槽为 0 时,本次解析成功则 # 回填真实类型;非 0 槽保持原样(避免重复 DeepCopy 覆盖抖动)。 if self.RenumAliasTy[i] == 0 and field_ty is not None: - ty_copy_rf2: llvmlite.LLVMType | t.CPtr = llvmlite.DeepCopyType( + ty_copy_rf2: rawptr[llvmlite.LLVMType] = llvmlite.DeepCopyType( CompilerFactory.factory.PermPool, field_ty) if ty_copy_rf2 is not None: self.RenumAliasTy[i] = sizet(ty_copy_rf2) @@ -1258,7 +1258,7 @@ class ClassGenEnum(ClassGenBase.ClassGenBase): # 未解析成功(自引用等)存 0,绑定回退槽位类型) self.RenumAliasTy[idx] = 0 if field_ty is not None: - ty_copy_rfa: llvmlite.LLVMType | t.CPtr = llvmlite.DeepCopyType( + ty_copy_rfa: rawptr[llvmlite.LLVMType] = llvmlite.DeepCopyType( CompilerFactory.factory.PermPool, field_ty) if ty_copy_rfa is not None: self.RenumAliasTy[idx] = sizet(ty_copy_rfa) @@ -1290,7 +1290,7 @@ class ClassGenEnum(ClassGenBase.ClassGenBase): return self.RenumAliasIndex[i] return -1 def _lookup_renum_field_alias_ty(self, class_name: str, - field_name: str) -> llvmlite.LLVMType | t.CPtr: + field_name: str) -> rawptr[llvmlite.LLVMType]: """查找 REnum 变体成员的实际 LLVM 类型,返回类型或 None 与 _lookup_renum_field_alias 同表同键(class/field 均 strcmp 内容比较)。 @@ -1305,11 +1305,11 @@ class ClassGenEnum(ClassGenBase.ClassGenBase): if fld_existing_ptr is not None and string.strcmp(fld_existing_ptr, field_name) == 0: if self.RenumAliasTy[i] == 0: return None - return (llvmlite.LLVMType | t.CPtr)(self.RenumAliasTy[i]) + return (rawptr[llvmlite.LLVMType])(self.RenumAliasTy[i]) return None def _lookup_renum_member_ty(self, class_name: str, variant_name: str, - payload_idx: int) -> llvmlite.LLVMType | t.CPtr: + payload_idx: int) -> rawptr[llvmlite.LLVMType]: """按 (class, 变体名, payload 位置) 查找变体成员的实际 LLVM 类型 match 绑定用:同一 payload 位置跨变体类型不同(Int.Bits=i32 vs @@ -1333,5 +1333,5 @@ class ClassGenEnum(ClassGenBase.ClassGenBase): continue if self.RenumAliasTy[i] == 0: return None - return (llvmlite.LLVMType | t.CPtr)(self.RenumAliasTy[i]) + return (rawptr[llvmlite.LLVMType])(self.RenumAliasTy[i]) return None \ No newline at end of file diff --git a/App/lib/core/Gen/Class/ClassGenGeneric.vp b/App/lib/core/Gen/Class/ClassGenGeneric.vp index 0c6cd43..8731a56 100644 --- a/App/lib/core/Gen/Class/ClassGenGeneric.vp +++ b/App/lib/core/Gen/Class/ClassGenGeneric.vp @@ -53,12 +53,12 @@ class ClassGenGeneric(ClassGenBase.ClassGenBase): return 0 return 1 def _register_generic_template(self, pool: rawptr[memhub.MemBuddy], - cd: ast.ClassDef | t.CPtr, + cd: rawptr[ast.ClassDef], module_sha1: str) -> None: """注册泛型类模板(类名 + ClassDef 节点 + 来源模块 SHA1)""" if self.GenericClassNames is None: self.GenericClassNames = list[str](pool, 8) - self.GenericClassNodes = list[ast.ClassDef | t.CPtr](pool, 8) + self.GenericClassNodes = list[rawptr[ast.ClassDef]](pool, 8) self.GenericClassSha1s = list[str](pool, 8) self.GenericClassFiles = list[str](pool, 8) if self.GenericClassTpParams is None: @@ -161,19 +161,19 @@ class ClassGenGeneric(ClassGenBase.ClassGenBase): pos += 1 return tp_list return None - def _find_generic_template(self, class_name: str) -> ast.ClassDef | t.CPtr: + def _find_generic_template(self, class_name: str) -> rawptr[ast.ClassDef]: """查找泛型类模板,返回 ClassDef 节点或 None""" if self.GenericClassNames is None or class_name is None: return None # 用局部变量接收 list,触发类型推断(避免字段 __len__ 失败) names_local: list[str] | t.CPtr = self.GenericClassNames - nodes_local: list[ast.ClassDef | t.CPtr] | t.CPtr = self.GenericClassNodes + nodes_local: list[rawptr[ast.ClassDef]] | t.CPtr = self.GenericClassNodes cn: sizet = len(names_local) i: sizet for i in range(cn): nm: str = names_local.get(i) if nm is not None and string.strcmp(nm, class_name) == 0: - node: ast.ClassDef | t.CPtr = nodes_local.get(i) + node: rawptr[ast.ClassDef] = nodes_local.get(i) return node return None def _find_generic_template_sha1(self, class_name: str) -> str: @@ -247,9 +247,9 @@ class ClassGenGeneric(ClassGenBase.ClassGenBase): string.strcat(mangled, "]") return mangled def _clone_annotation(self, pool: rawptr[memhub.MemBuddy], - node: ast.AST | t.CPtr, + node: rawptr[ast.AST], tp_names: list[str] | t.CPtr, - type_args: list[str] | t.CPtr) -> ast.AST | t.CPtr: + type_args: list[str] | t.CPtr) -> rawptr[ast.AST]: """拷贝类型注解表达式,替换类型参数 T 为具体类型名 tp_names: 类型参数名列表 ['T'] @@ -261,7 +261,7 @@ class ClassGenGeneric(ClassGenBase.ClassGenBase): # Name: 可能是类型参数 T if k == ast.ASTKind.Name: - nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(node) + nm: rawptr[ast.Name] = rawptr[ast.Name](node) if nm.id is not None: n: sizet = len(tp_names) if tp_names is not None else 0 i: sizet @@ -270,88 +270,88 @@ class ClassGenGeneric(ClassGenBase.ClassGenBase): if tpn is not None and string.strcmp(nm.id, tpn) == 0: ta: str = type_args.get(i) # 类型实参可能是复合类型(如 "AST|t.CPtr"),用 _parse_type_string 解析 - parsed_node: ast.AST | t.CPtr = self.Gen.TypeGenResolve._parse_type_string(pool, ta, nm.ctx) + parsed_node: rawptr[ast.AST] = self.Gen.TypeGenResolve._parse_type_string(pool, ta, nm.ctx) return parsed_node return ast.Name(pool, nm.id, nm.ctx) return None # Attribute: t.CPtr 等 if k == ast.ASTKind.Attribute: - at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(node) - new_value: ast.AST | t.CPtr = self._clone_annotation(pool, at.value, tp_names, type_args) + at: rawptr[ast.Attribute] = rawptr[ast.Attribute](node) + new_value: rawptr[ast.AST] = self._clone_annotation(pool, at.value, tp_names, type_args) return ast.Attribute(pool, new_value, at.attr, at.ctx) # BinOp: T | t.CPtr 等 if k == ast.ASTKind.BinOp: - bop: ast.BinOp | t.CPtr = (ast.BinOp | t.CPtr)(node) - new_left: ast.AST | t.CPtr = self._clone_annotation(pool, bop.left, tp_names, type_args) - new_right: ast.AST | t.CPtr = self._clone_annotation(pool, bop.right, tp_names, type_args) + bop: rawptr[ast.BinOp] = rawptr[ast.BinOp](node) + new_left: rawptr[ast.AST] = self._clone_annotation(pool, bop.left, tp_names, type_args) + new_right: rawptr[ast.AST] = self._clone_annotation(pool, bop.right, tp_names, type_args) return ast.BinOp(pool, new_left, bop.op, new_right) # Subscript: list[int] 等 if k == ast.ASTKind.Subscript: - sub: ast.Subscript | t.CPtr = (ast.Subscript | t.CPtr)(node) - new_value2: ast.AST | t.CPtr = self._clone_annotation(pool, sub.value, tp_names, type_args) - new_slice: ast.AST | t.CPtr = self._clone_annotation(pool, sub.slice, tp_names, type_args) + sub: rawptr[ast.Subscript] = rawptr[ast.Subscript](node) + new_value2: rawptr[ast.AST] = self._clone_annotation(pool, sub.value, tp_names, type_args) + new_slice: rawptr[ast.AST] = self._clone_annotation(pool, sub.slice, tp_names, type_args) return ast.Subscript(pool, new_value2, new_slice, sub.ctx) # Tuple: (T, int) 等 if k == ast.ASTKind.Tuple: - tup: ast.Tuple | t.CPtr = (ast.Tuple | t.CPtr)(node) - new_elts: list[ast.AST | t.CPtr] | t.CPtr = list[ast.AST | t.CPtr](pool, 8) + tup: rawptr[ast.Tuple] = rawptr[ast.Tuple](node) + new_elts: list[rawptr[ast.AST]] | t.CPtr = list[rawptr[ast.AST]](pool, 8) if tup.elts is not None: - tup_elts: list[ast.AST | t.CPtr] | t.CPtr = tup.elts + tup_elts: list[rawptr[ast.AST]] | t.CPtr = tup.elts en: sizet = len(tup_elts) ei: sizet for ei in range(en): - el: ast.AST | t.CPtr = tup_elts.get(ei) - new_el: ast.AST | t.CPtr = self._clone_annotation(pool, el, tp_names, type_args) + el: rawptr[ast.AST] = tup_elts.get(ei) + new_el: rawptr[ast.AST] = self._clone_annotation(pool, el, tp_names, type_args) if new_el is not None: new_elts.append(new_el) return ast.Tuple(pool, new_elts, tup.ctx) # Constant: 默认值等 if k == ast.ASTKind.Constant: - cnst: ast.Constant | t.CPtr = (ast.Constant | t.CPtr)(node) + cnst: rawptr[ast.Constant] = rawptr[ast.Constant](node) return ast.Constant(pool, cnst.const_kind, cnst.int_val, cnst.float_val, cnst.str_val, cnst.lineno, cnst.col_offset) # 其他: 直接引用(不拷贝) return node def _clone_arguments(self, pool: rawptr[memhub.MemBuddy], - args: ast.AST | t.CPtr, + args: rawptr[ast.AST], tp_names: list[str] | t.CPtr, - type_args: list[str] | t.CPtr) -> ast.AST | t.CPtr: + type_args: list[str] | t.CPtr) -> rawptr[ast.AST]: """拷贝 Arguments 节点,替换 arg annotation 中的 T""" if args is None: return None if args.kind() != ast.ASTKind.Arguments: return args - old_args: ast.Arguments | t.CPtr = (ast.Arguments | t.CPtr)(args) + old_args: rawptr[ast.Arguments] = rawptr[ast.Arguments](args) # 拷贝 args 列表,替换每个 Arg 的 annotation - new_arg_list: list[ast.AST | t.CPtr] | t.CPtr = list[ast.AST | t.CPtr](pool, 8) + new_arg_list: list[rawptr[ast.AST]] | t.CPtr = list[rawptr[ast.AST]](pool, 8) if old_args.args is not None: - old_arg_list: list[ast.AST | t.CPtr] | t.CPtr = old_args.args + old_arg_list: list[rawptr[ast.AST]] | t.CPtr = old_args.args an: sizet = len(old_arg_list) ai: sizet for ai in range(an): - arg_node: ast.AST | t.CPtr = old_arg_list.get(ai) + arg_node: rawptr[ast.AST] = old_arg_list.get(ai) if arg_node is None: continue if arg_node.kind() == ast.ASTKind.Arg: - ag: ast.Arg | t.CPtr = (ast.Arg | t.CPtr)(arg_node) - new_anno: ast.AST | t.CPtr = self._clone_annotation(pool, ag.annotation, tp_names, type_args) - new_arg: ast.Arg | t.CPtr = ast.Arg(pool, ag.arg, new_anno) + ag: rawptr[ast.Arg] = rawptr[ast.Arg](arg_node) + new_anno: rawptr[ast.AST] = self._clone_annotation(pool, ag.annotation, tp_names, type_args) + new_arg: rawptr[ast.Arg] = ast.Arg(pool, ag.arg, new_anno) new_arg_list.append(new_arg) else: new_arg_list.append(arg_node) return ast.Arguments(pool, new_arg_list, old_args.vararg, old_args.kwarg, old_args.defaults, old_args.kw_defaults) def _clone_classdef_for_spec(self, pool: rawptr[memhub.MemBuddy], - cd: ast.ClassDef | t.CPtr, + cd: rawptr[ast.ClassDef], spec_name: str, tp_names: list[str] | t.CPtr, - type_args: list[str] | t.CPtr) -> ast.ClassDef | t.CPtr: + type_args: list[str] | t.CPtr) -> rawptr[ast.ClassDef]: """拷贝 ClassDef 节点用于泛型特化 - 替换类名为 spec_name @@ -360,40 +360,40 @@ class ClassGenGeneric(ClassGenBase.ClassGenBase): - 方法体直接引用原始节点(通过 type_map 上下文处理 T) """ # 创建新 ClassDef(type_params=None 表示非泛型) - new_cd: ast.ClassDef | t.CPtr = ast.ClassDef(pool, spec_name, cd.bases, cd.keywords, + new_cd: rawptr[ast.ClassDef] = ast.ClassDef(pool, spec_name, cd.bases, cd.keywords, cd.decorator_list, None) # 拷贝 children if cd.children is not None: - cd_children: list[ast.AST | t.CPtr] | t.CPtr = cd.children + cd_children: list[rawptr[ast.AST]] | t.CPtr = cd.children cn: sizet = len(cd_children) ci: sizet for ci in range(cn): - child: ast.AST | t.CPtr = cd_children.get(ci) + child: rawptr[ast.AST] = cd_children.get(ci) if child is None: continue ck: int = child.kind() if ck == ast.ASTKind.AnnAssign: - aa: ast.AnnAssign | t.CPtr = (ast.AnnAssign | t.CPtr)(child) - new_target: ast.AST | t.CPtr = aa.target - new_anno2: ast.AST | t.CPtr = self._clone_annotation(pool, aa.annotation, tp_names, type_args) - new_value3: ast.AST | t.CPtr = aa.value - new_aa: ast.AnnAssign | t.CPtr = ast.AnnAssign(pool, new_target, new_anno2, new_value3, aa.simple) + aa: rawptr[ast.AnnAssign] = rawptr[ast.AnnAssign](child) + new_target: rawptr[ast.AST] = aa.target + new_anno2: rawptr[ast.AST] = self._clone_annotation(pool, aa.annotation, tp_names, type_args) + new_value3: rawptr[ast.AST] = aa.value + new_aa: rawptr[ast.AnnAssign] = ast.AnnAssign(pool, new_target, new_anno2, new_value3, aa.simple) new_cd.append(new_aa) elif ck == ast.ASTKind.FunctionDef: - fd: ast.FunctionDef | t.CPtr = (ast.FunctionDef | t.CPtr)(child) - new_args2: ast.AST | t.CPtr = self._clone_arguments(pool, fd.args, tp_names, type_args) - new_returns2: ast.AST | t.CPtr = self._clone_annotation(pool, fd.returns, tp_names, type_args) - new_fd: ast.FunctionDef | t.CPtr = ast.FunctionDef(pool, fd.name, new_args2, + fd: rawptr[ast.FunctionDef] = rawptr[ast.FunctionDef](child) + new_args2: rawptr[ast.AST] = self._clone_arguments(pool, fd.args, tp_names, type_args) + new_returns2: rawptr[ast.AST] = self._clone_annotation(pool, fd.returns, tp_names, type_args) + new_fd: rawptr[ast.FunctionDef] = ast.FunctionDef(pool, fd.name, new_args2, fd.decorator_list, new_returns2, 0) # 方法体直接引用原始节点 if fd.children is not None: - fd_children: list[ast.AST | t.CPtr] | t.CPtr = fd.children + fd_children: list[rawptr[ast.AST]] | t.CPtr = fd.children bcn: sizet = len(fd_children) bci: sizet for bci in range(bcn): - body_stmt: ast.AST | t.CPtr = fd_children.get(bci) + body_stmt: rawptr[ast.AST] = fd_children.get(bci) if body_stmt is not None: new_fd.append(body_stmt) new_cd.append(new_fd) @@ -442,7 +442,7 @@ class ClassGenGeneric(ClassGenBase.ClassGenBase): self.SpecKeys[self.SpecCount] = sizet(key_copy) self.SpecNames[self.SpecCount] = sizet(name_copy) self.SpecCount += 1 - def _merge_template_imports(self, trans: HT.Translator | t.CPtr, + def _merge_template_imports(self, trans: rawptr[HT.Translator], template_sha1: str) -> None: """将模板模块的 imports 并入 trans._imported_modules(空格分隔)""" if trans is None or template_sha1 is None: @@ -486,7 +486,7 @@ class ClassGenGeneric(ClassGenBase.ClassGenBase): string.strcpy(ts_buf_r, trigger_sha1) entry_rt.SpecTriggerSha1 = ts_buf_r return 1 - def _specialize_generic_class(self, trans: HT.Translator | t.CPtr, + def _specialize_generic_class(self, trans: rawptr[HT.Translator], class_name: str, type_args: list[str] | t.CPtr) -> str: """特化泛型类,返回特化类名 @@ -531,7 +531,7 @@ class ClassGenGeneric(ClassGenBase.ClassGenBase): pool: rawptr[memhub.MemBuddy] = trans.Pool # 1. 查找泛型模板 - template_cd: ast.ClassDef | t.CPtr = self._find_generic_template(class_name) + template_cd: rawptr[ast.ClassDef] = self._find_generic_template(class_name) if template_cd is None: self.GenericSpecDepth -= 1 return None @@ -561,7 +561,7 @@ class ClassGenGeneric(ClassGenBase.ClassGenBase): pool, class_name) if tp_names_pre is None: tp_names_pre = template_cd.type_params - spec_cd_pre: ast.ClassDef | t.CPtr = self._clone_classdef_for_spec( + spec_cd_pre: rawptr[ast.ClassDef] = self._clone_classdef_for_spec( pool, template_cd, spec_name, tp_names_pre, type_args) if spec_cd_pre is not None: trans.GenericTypeParamNames = tp_names_pre @@ -640,7 +640,7 @@ class ClassGenGeneric(ClassGenBase.ClassGenBase): pool, class_name) if tp_names is None: tp_names = template_cd.type_params - spec_cd: ast.ClassDef | t.CPtr = self._clone_classdef_for_spec( + spec_cd: rawptr[ast.ClassDef] = self._clone_classdef_for_spec( pool, template_cd, spec_name, tp_names, type_args) if spec_cd is None: self.GenericSpecDepth -= 1 diff --git a/App/lib/core/Gen/Class/ClassGenVTable.vp b/App/lib/core/Gen/Class/ClassGenVTable.vp index 368567a..03a50c5 100644 --- a/App/lib/core/Gen/Class/ClassGenVTable.vp +++ b/App/lib/core/Gen/Class/ClassGenVTable.vp @@ -77,17 +77,17 @@ class ClassGenVTable(ClassGenBase.ClassGenBase): # # 返回 1=有虚方法 / 0=无方法或失败 # ============================================================ - def _collect_vtable_methods(self, trans: HT.Translator | t.CPtr, - cd: ast.ClassDef | t.CPtr, + def _collect_vtable_methods(self, trans: rawptr[HT.Translator], + cd: rawptr[ast.ClassDef], class_name: str) -> int: """收集虚方法信息,设置 entry.VTableMethods/VTableMethodCount""" if trans is None or cd is None or class_name is None: return 0 pool: rawptr[memhub.MemBuddy] = trans.Pool - mod: llvmlite.LLVMModule | t.CPtr = trans.Module + mod: rawptr[llvmlite.LLVMModule] = trans.Module - children: list[ast.AST | t.CPtr] | t.CPtr = cd.children + children: list[rawptr[ast.AST]] | t.CPtr = cd.children if children is None: return 0 cn: sizet = len(children) @@ -148,12 +148,12 @@ class ClassGenVTable(ClassGenBase.ClassGenBase): child_overrides: int = 0 child_nvt: int = 0 for ci2 in range(cn): - stmt2: ast.AST | t.CPtr = children.get(ci2) + stmt2: rawptr[ast.AST] = children.get(ci2) if stmt2 is None: continue if stmt2.kind() != ast.ASTKind.FunctionDef: continue - fd2: ast.FunctionDef | t.CPtr = (ast.FunctionDef | t.CPtr)(stmt2) + fd2: rawptr[ast.FunctionDef] = rawptr[ast.FunctionDef](stmt2) if fd2 is not None and fd2.name is not None: if string.strcmp(fd2.name, pmethod_name) == 0: child_overrides = 1 @@ -214,12 +214,12 @@ class ClassGenVTable(ClassGenBase.ClassGenBase): # 2. 收集当前类的虚方法(跳过已从父类继承的) for ci in range(cn): - stmt: ast.AST | t.CPtr = children.get(ci) + stmt: rawptr[ast.AST] = children.get(ci) if stmt is None: continue if stmt.kind() != ast.ASTKind.FunctionDef: continue - fd: ast.FunctionDef | t.CPtr = (ast.FunctionDef | t.CPtr)(stmt) + fd: rawptr[ast.FunctionDef] = rawptr[ast.FunctionDef](stmt) if fd is None or fd.name is None: continue if method_count >= VTBL_METHOD_MAX: @@ -288,8 +288,8 @@ class ClassGenVTable(ClassGenBase.ClassGenBase): # 4. 创建全局变量 @"SHA1.ClassName.vtable" # 5. 存储虚方法名列表到 StructEntry # ============================================================ - def _generate_vtable(self, trans: HT.Translator | t.CPtr, - cd: ast.ClassDef | t.CPtr, + def _generate_vtable(self, trans: rawptr[HT.Translator], + cd: rawptr[ast.ClassDef], class_name: str) -> int: """生成 VTable 全局变量""" if trans is None or cd is None or class_name is None: @@ -297,7 +297,7 @@ class ClassGenVTable(ClassGenBase.ClassGenBase): pool: rawptr[memhub.MemBuddy] = trans.Pool - mod: llvmlite.LLVMModule | t.CPtr = trans.Module + mod: rawptr[llvmlite.LLVMModule] = trans.Module # 收集虚方法信息(继承父类 + 自身,结果存 self.VtFullNames 等暂存区) # 同时设置 entry.VTableMethodCount/VTableMethods(虚分派查询用) @@ -312,20 +312,20 @@ class ClassGenVTable(ClassGenBase.ClassGenBase): class_name, trans.ModuleSha1) # 2. 构造 VTable 类型: { i8*, i8*, ..., i8* } - i8_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int8(pool) - i8_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, i8_ty) + i8_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int8(pool) + i8_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, i8_ty) - first_node: llvmlite.ParamNode | t.CPtr = None - tail_node: llvmlite.ParamNode | t.CPtr = None + first_node: rawptr[llvmlite.Function] = None + tail_node: rawptr[llvmlite.Function] = None for i in range(method_count): - pnode: llvmlite.ParamNode | t.CPtr = llvmlite.new_param_node(pool, i8_ptr_ty) + pnode: rawptr[llvmlite.Function] = llvmlite.new_param_node(pool, i8_ptr_ty) if pnode is None: continue tail_node = llvmlite.param_list_append(first_node, tail_node, pnode) if first_node is None: first_node = tail_node - vtable_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Struct(pool, first_node, method_count, None) + vtable_ty: rawptr[llvmlite.LLVMType] = llvmlite.Struct(pool, first_node, method_count, None) if vtable_ty is None: return 0 @@ -363,7 +363,7 @@ class ClassGenVTable(ClassGenBase.ClassGenBase): # 全局表 entry.Spec 在方法 add_param 完成后由 update_global_func_spec 填 # (PermPool 驻留,跨 1b reset 安全),故不再解引用 func(func 可能已被 # reset_to(mark1) 回收悬空)。 - ge: GenTypes.FuncEntry | t.CPtr = self.Gen.CallGenLeafKit.find_func_entry_global(full_name) + ge: rawptr[GenTypes.FuncEntry] = self.Gen.CallGenLeafKit.find_func_entry_global(full_name) func_ty_buf: str = pool.alloc(1024) if func_ty_buf is None: self._vtable_strcat(init_buf, 16384, "i8* null") @@ -427,9 +427,9 @@ class ClassGenVTable(ClassGenBase.ClassGenBase): # - 翻译方法(生成 SHA1.ClassName.method_name 函数) # 翻译完所有方法后,生成 __before_init__ 函数 # ============================================================ - def _translate_oop_methods(self, trans: HT.Translator | t.CPtr, - cd: ast.ClassDef | t.CPtr, - struct_ty: llvmlite.LLVMType | t.CPtr, + def _translate_oop_methods(self, trans: rawptr[HT.Translator], + cd: rawptr[ast.ClassDef], + struct_ty: rawptr[llvmlite.LLVMType], class_name: str, mark_only: int = 0, reemit: int = 0) -> int: @@ -444,7 +444,7 @@ class ClassGenVTable(ClassGenBase.ClassGenBase): if trans is None or cd is None or struct_ty is None or class_name is None: return 0 - children: list[ast.AST | t.CPtr] | t.CPtr = cd.children + children: list[rawptr[ast.AST]] | t.CPtr = cd.children if children is None: return 0 @@ -458,12 +458,12 @@ class ClassGenVTable(ClassGenBase.ClassGenBase): # 第一遍:检测是否有方法,标记 OOP,并注册装饰器元数据 for ci in range(cn): - stmt: ast.AST | t.CPtr = children.get(ci) + stmt: rawptr[ast.AST] = children.get(ci) if stmt is None: continue if stmt.kind() == ast.ASTKind.FunctionDef: has_method = 1 - fd_check: ast.FunctionDef | t.CPtr = (ast.FunctionDef | t.CPtr)(stmt) + fd_check: rawptr[ast.FunctionDef] = rawptr[ast.FunctionDef](stmt) if fd_check is not None and fd_check.name is not None: if string.strcmp(fd_check.name, "__init__") == 0: has_init = 1 @@ -540,11 +540,11 @@ class ClassGenVTable(ClassGenBase.ClassGenBase): if oop_has_vt_pre == 1: self._collect_vtable_methods(trans, cd, class_name) for ci in range(cn): - stmt: ast.AST | t.CPtr = children.get(ci) + stmt: rawptr[ast.AST] = children.get(ci) if stmt is None: continue if stmt.kind() == ast.ASTKind.FunctionDef: - fd: ast.FunctionDef | t.CPtr = (ast.FunctionDef | t.CPtr)(stmt) + fd: rawptr[ast.FunctionDef] = rawptr[ast.FunctionDef](stmt) if fd is not None and fd.name is not None: self._translate_method(trans, fd, struct_ty, class_name) @@ -570,9 +570,9 @@ class ClassGenVTable(ClassGenBase.ClassGenBase): # - 类型 Ptr(struct_ty),直接注册为 SSA 值(不创建 alloca) # - 使 self.field 能通过 GEP 直接访问原始结构体 # ============================================================ - def _translate_method(self, trans: HT.Translator | t.CPtr, - fd: ast.FunctionDef | t.CPtr, - struct_ty: llvmlite.LLVMType | t.CPtr, + def _translate_method(self, trans: rawptr[HT.Translator], + fd: rawptr[ast.FunctionDef], + struct_ty: rawptr[llvmlite.LLVMType], class_name: str) -> int: """翻译单个方法,返回 0""" if trans is None or fd is None or struct_ty is None or class_name is None: @@ -580,14 +580,14 @@ class ClassGenVTable(ClassGenBase.ClassGenBase): pool: rawptr[memhub.MemBuddy] = trans.Pool - mod: llvmlite.LLVMModule | t.CPtr = trans.Module + mod: rawptr[llvmlite.LLVMModule] = trans.Module imported_modules: str = trans._imported_modules from_imports: str = trans._from_imports - funcs_ptr: GenTypes.FuncEntry | t.CPtr = trans._funcs + funcs_ptr: rawptr[GenTypes.FuncEntry] = trans._funcs func_count: int = trans._func_count - i32_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int32(pool) - self_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, struct_ty) + i32_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int32(pool) + self_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, struct_ty) method_name: str = fd.name if method_name is None: @@ -634,7 +634,7 @@ class ClassGenVTable(ClassGenBase.ClassGenBase): mangled_name: str = self.Gen.FuncGenBase._mangle_name(trans, full_name) # 推断返回类型 - ret_ty: llvmlite.LLVMType | t.CPtr = None + ret_ty: rawptr[llvmlite.LLVMType] = None if fd.returns is not None: ret_ty = self.Gen.TypeGenResolve.resolve_annotation_type( pool, fd.returns, imported_modules, from_imports, trans, 0) @@ -665,7 +665,7 @@ class ClassGenVTable(ClassGenBase.ClassGenBase): pool, fd.children, param_types_str) # 创建 LLVM 函数 - func: llvmlite.Function | t.CPtr = llvmlite.create_function( + func: rawptr[llvmlite.Function] = llvmlite.create_function( pool, mod, mangled_name, ret_ty) if func is None: return 0 @@ -677,17 +677,17 @@ class ClassGenVTable(ClassGenBase.ClassGenBase): md_defaults: t.CPtr = None md_default_count: int = 0 md_param_count: int = 0 - md_args_node: ast.Arguments | t.CPtr = fd.args + md_args_node: rawptr[ast.Arguments] = fd.args if md_args_node is not None: - md_ags: ast.Arguments | t.CPtr = (ast.Arguments | t.CPtr)(md_args_node) + md_ags: rawptr[ast.Arguments] = rawptr[ast.Arguments](md_args_node) if md_ags.args is not None: - md_alist: list[ast.AST | t.CPtr] | t.CPtr = md_ags.args + md_alist: list[rawptr[ast.AST]] | t.CPtr = md_ags.args if is_static_m != 0: md_param_count = len(md_alist) else: md_param_count = len(md_alist) - 1 if md_ags.defaults is not None: - md_dlist: list[ast.AST | t.CPtr] | t.CPtr = md_ags.defaults + md_dlist: list[rawptr[ast.AST]] | t.CPtr = md_ags.defaults md_defaults = md_dlist md_default_count = len(md_dlist) @@ -703,9 +703,9 @@ class ClassGenVTable(ClassGenBase.ClassGenBase): if is_static_m == 0: first_pname: str = "self" if is_class_m != 0 and fd.args is not None: - fd_ags: ast.Arguments | t.CPtr = (ast.Arguments | t.CPtr)(fd.args) + fd_ags: rawptr[ast.Arguments] = rawptr[ast.Arguments](fd.args) if fd_ags.args is not None and len(fd_ags.args) > 0: - fd_first_arg: ast.Arg | t.CPtr = (ast.Arg | t.CPtr)(fd_ags.args.get(0)) + fd_first_arg: rawptr[ast.Arg] = rawptr[ast.Arg](fd_ags.args.get(0)) if fd_first_arg is not None and fd_first_arg.arg is not None: first_pname = fd_first_arg.arg first_pname_buf: str = pool.alloc(32) @@ -714,21 +714,21 @@ class ClassGenVTable(ClassGenBase.ClassGenBase): llvmlite.add_param(pool, func, self_ptr_ty, first_pname_buf) # 添加其他参数(支持类型注解;@staticmethod 从索引 0 开始,其余跳过索引 0 的 self/cls) - args_node: ast.Arguments | t.CPtr = fd.args + args_node: rawptr[ast.Arguments] = fd.args if args_node is not None: - ags: ast.Arguments | t.CPtr = (ast.Arguments | t.CPtr)(args_node) + ags: rawptr[ast.Arguments] = rawptr[ast.Arguments](args_node) if ags.args is not None: - alist: list[ast.AST | t.CPtr] | t.CPtr = ags.args + alist: list[rawptr[ast.AST]] | t.CPtr = ags.args an: sizet = len(alist) start_idx: int = 0 if is_static_m == 0: start_idx = 1 for ai in range(start_idx, an): - arg: ast.Arg | t.CPtr = (ast.Arg | t.CPtr)(alist.get(ai)) + arg: rawptr[ast.Arg] = rawptr[ast.Arg](alist.get(ai)) if arg is not None and arg.arg is not None: - param_ty: llvmlite.LLVMType | t.CPtr = i32_ty + param_ty: rawptr[llvmlite.LLVMType] = i32_ty if arg.annotation is not None: - resolved: llvmlite.LLVMType | t.CPtr = self.Gen.TypeGenResolve.resolve_annotation_type( + resolved: rawptr[llvmlite.LLVMType] = self.Gen.TypeGenResolve.resolve_annotation_type( pool, arg.annotation, imported_modules, from_imports, trans, 0) if resolved is None: # [S4 fail-fast] 有注解但解析失败:不再静默用 i32 @@ -757,9 +757,9 @@ class ClassGenVTable(ClassGenBase.ClassGenBase): # raise StopIteration 时置 1(对齐 TPC HandlesFunctions.py L703-705)。 # 该参数不计入 md_param_count(逻辑参数),调用侧(for 循环)显式传。 if string.strcmp(method_name, "__next__") == 0: - i1_ty_si: llvmlite.LLVMType | t.CPtr = llvmlite.Int1(pool) + i1_ty_si: rawptr[llvmlite.LLVMType] = llvmlite.Int1(pool) if i1_ty_si is not None: - i1_ptr_ty_si: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, i1_ty_si) + i1_ptr_ty_si: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, i1_ty_si) if i1_ptr_ty_si is not None: llvmlite.add_param(pool, func, i1_ptr_ty_si, "%__stop_iter_flag__") @@ -786,10 +786,10 @@ class ClassGenVTable(ClassGenBase.ClassGenBase): tls_m_gv: llvmlite.GlobalVariable | t.CPtr = llvmlite.create_global_int( pool, mod, tls_m_flag_name, 1, 0) if tls_m_gv is not None: - i1_ty_m: llvmlite.LLVMType | t.CPtr = llvmlite.Int1(pool) + i1_ty_m: rawptr[llvmlite.LLVMType] = llvmlite.Int1(pool) if i1_ty_m is not None: # GlobalVariable 非 Value 子类:构造 Value 视图后再 load/store - tls_m_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, i1_ty_m) + tls_m_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, i1_ty_m) tls_m_rn: str = pool.alloc(64) if tls_m_rn is not None: viperlib.snprintf(tls_m_rn, 64, "@%s", tls_m_flag_name) @@ -848,9 +848,9 @@ class ClassGenVTable(ClassGenBase.ClassGenBase): self_var_name: str = "self" self_ssa_name: str = "%self" if is_class_m != 0 and args_node is not None: - cags: ast.Arguments | t.CPtr = (ast.Arguments | t.CPtr)(args_node) + cags: rawptr[ast.Arguments] = rawptr[ast.Arguments](args_node) if cags.args is not None and len(cags.args) > 0: - cfirst: ast.Arg | t.CPtr = (ast.Arg | t.CPtr)(cags.args.get(0)) + cfirst: rawptr[ast.Arg] = rawptr[ast.Arg](cags.args.get(0)) if cfirst is not None and cfirst.arg is not None: self_var_name = cfirst.arg self_ssa_name_buf: str = pool.alloc(32) @@ -866,19 +866,19 @@ class ClassGenVTable(ClassGenBase.ClassGenBase): # 为其他参数创建 alloca 并 store(与普通函数一致; # @staticmethod 从索引 0 开始,其余跳过索引 0 的 self/cls 参数) if args_node is not None: - ags2: ast.Arguments | t.CPtr = (ast.Arguments | t.CPtr)(args_node) + ags2: rawptr[ast.Arguments] = rawptr[ast.Arguments](args_node) if ags2.args is not None: - alist2: list[ast.AST | t.CPtr] | t.CPtr = ags2.args + alist2: list[rawptr[ast.AST]] | t.CPtr = ags2.args an2: sizet = len(alist2) start_idx2: int = 0 if is_static_m == 0: start_idx2 = 1 for ai2 in range(start_idx2, an2): - arg2: ast.Arg | t.CPtr = (ast.Arg | t.CPtr)(alist2.get(ai2)) + arg2: rawptr[ast.Arg] = rawptr[ast.Arg](alist2.get(ai2)) if arg2 is not None and arg2.arg is not None: - param_ty2: llvmlite.LLVMType | t.CPtr = i32_ty + param_ty2: rawptr[llvmlite.LLVMType] = i32_ty if arg2.annotation is not None: - resolved2: llvmlite.LLVMType | t.CPtr = self.Gen.TypeGenResolve.resolve_annotation_type( + resolved2: rawptr[llvmlite.LLVMType] = self.Gen.TypeGenResolve.resolve_annotation_type( pool, arg2.annotation, imported_modules, from_imports, trans, 0) if resolved2 is None: # fail-fast:参数有注解但类型解析失败,不再静默保持 i32 @@ -918,9 +918,9 @@ class ClassGenVTable(ClassGenBase.ClassGenBase): # 指针到 trans,供 translate_raise 的 raise StopIteration 写 1。 # 参数名必须与上面 add_param 的 "%__stop_iter_flag__" 一致。 if string.strcmp(method_name, "__next__") == 0: - i1_ty_sf: llvmlite.LLVMType | t.CPtr = llvmlite.Int1(pool) + i1_ty_sf: rawptr[llvmlite.LLVMType] = llvmlite.Int1(pool) if i1_ty_sf is not None: - i1_ptr_ty_sf: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, i1_ty_sf) + i1_ptr_ty_sf: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, i1_ty_sf) if i1_ptr_ty_sf is not None: flag_ref_sf: llvmlite.Value | t.CPtr = llvmlite.SSAValue( pool, i1_ptr_ty_sf, "%__stop_iter_flag__") @@ -932,7 +932,7 @@ class ClassGenVTable(ClassGenBase.ClassGenBase): llvmlite.build_store(func_builder, zero_i1_sf, flag_ref_sf) # 保存模块级作用域状态 - old_func: llvmlite.Function | t.CPtr = trans._cur_func + old_func: rawptr[llvmlite.Function] = trans._cur_func old_builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder old_global_count: int = trans._global_name_count old_nonlocal_count: int = trans._nonlocal_name_count @@ -948,15 +948,15 @@ class ClassGenVTable(ClassGenBase.ClassGenBase): # 否则 `global BootInfo` 未注册时 prescan 把 BootInfo 当局部创建 alloca, # 后续翻译 is_global_name 为真又写全局 → 局部 alloca 永不写入 → 读全 0 # (main.vp __init__ BootInfo memmap 全 0 根因)。 - body: list[ast.AST | t.CPtr] | t.CPtr = fd.children + body: list[rawptr[ast.AST]] | t.CPtr = fd.children if body is not None: bn: sizet = len(body) for bi in range(bn): - stmt: ast.AST | t.CPtr = body.get(bi) + stmt: rawptr[ast.AST] = body.get(bi) if stmt is not None: self.Gen.StmtGenDecl.pre_scan_scope_decls(trans, stmt) for bi in range(bn): - stmt: ast.AST | t.CPtr = body.get(bi) + stmt: rawptr[ast.AST] = body.get(bi) if stmt is not None: self.Gen.StmtGenDecl.pre_scan_allocas(trans, stmt) @@ -964,7 +964,7 @@ class ClassGenVTable(ClassGenBase.ClassGenBase): if body is not None: bn2: sizet = len(body) for bi2 in range(bn2): - stmt2: ast.AST | t.CPtr = body.get(bi2) + stmt2: rawptr[ast.AST] = body.get(bi2) if stmt2 is not None: self.Gen.StmtGen.translate_stmt(trans, stmt2) @@ -983,14 +983,14 @@ class ClassGenVTable(ClassGenBase.ClassGenBase): if body is not None: bn3 = len(body) if bn3 > 0: - last_stmt_m: ast.AST | t.CPtr = body.get(bn3 - 1) + last_stmt_m: rawptr[ast.AST] = body.get(bn3 - 1) if last_stmt_m is not None and last_stmt_m.kind() == ast.ASTKind.Return: last_is_return = 1 if last_is_return == 0: if llvmlite.builder_cur_block_is_terminated(func_builder) == 0: last_is_ctrl: int = 0 if bn3 > 0: - last_stmt3_m: ast.AST | t.CPtr = body.get(bn3 - 1) + last_stmt3_m: rawptr[ast.AST] = body.get(bn3 - 1) if last_stmt3_m is not None: k3m: int = last_stmt3_m.kind() if k3m == ast.ASTKind.If or k3m == ast.ASTKind.While or \ @@ -1017,8 +1017,8 @@ class ClassGenVTable(ClassGenBase.ClassGenBase): fd.returns, imported_modules) != 0: _is_void = 1 elif fd.returns.kind() == ast.ASTKind.Constant: - ret_none_cn_m: ast.Constant | t.CPtr = ( - ast.Constant | t.CPtr)(fd.returns) + ret_none_cn_m: rawptr[ast.Constant] = ( + rawptr[ast.Constant])(fd.returns) if ret_none_cn_m.const_kind == ast.CONST_NONE: _is_void = 1 if _is_void != 0: @@ -1078,8 +1078,8 @@ class ClassGenVTable(ClassGenBase.ClassGenBase): # 2. 逐字段 store 默认值(如有) # 3. ret void # ============================================================ - def _generate_before_init(self, trans: HT.Translator | t.CPtr, - struct_ty: llvmlite.LLVMType | t.CPtr, + def _generate_before_init(self, trans: rawptr[HT.Translator], + struct_ty: rawptr[llvmlite.LLVMType], class_name: str) -> int: """生成 __before_init__ 函数,返回 0""" if trans is None or struct_ty is None or class_name is None: @@ -1087,12 +1087,12 @@ class ClassGenVTable(ClassGenBase.ClassGenBase): pool: rawptr[memhub.MemBuddy] = trans.Pool - mod: llvmlite.LLVMModule | t.CPtr = trans.Module - funcs_ptr: GenTypes.FuncEntry | t.CPtr = trans._funcs + mod: rawptr[llvmlite.LLVMModule] = trans.Module + funcs_ptr: rawptr[GenTypes.FuncEntry] = trans._funcs func_count: int = trans._func_count - self_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, struct_ty) - void_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Void(pool) + self_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, struct_ty) + void_ty: rawptr[llvmlite.LLVMType] = llvmlite.Void(pool) # 构建函数名: ClassName.__before_init__ full_name_buf: str = pool.alloc(128) @@ -1104,7 +1104,7 @@ class ClassGenVTable(ClassGenBase.ClassGenBase): mangled_name: str = self.Gen.FuncGenBase._mangle_name(trans, full_name) # 创建函数 - func: llvmlite.Function | t.CPtr = llvmlite.create_function( + func: rawptr[llvmlite.Function] = llvmlite.create_function( pool, mod, mangled_name, void_ty) if func is None: return 0 @@ -1155,13 +1155,13 @@ class ClassGenVTable(ClassGenBase.ClassGenBase): vt_method_count = bi_entry.VTableMethodCount if vt_method_count > 0: # 构造 vtable 类型 { i8*, i8*, ..., i8* } - vt_i8_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int8(pool) - vt_i8_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, vt_i8_ty) + vt_i8_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int8(pool) + vt_i8_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, vt_i8_ty) - vt_first_node: llvmlite.ParamNode | t.CPtr = None - vt_prev_node: llvmlite.ParamNode | t.CPtr = None + vt_first_node: rawptr[llvmlite.Function] = None + vt_prev_node: rawptr[llvmlite.Function] = None for vti in range(vt_method_count): - vtnode: llvmlite.ParamNode | t.CPtr = llvmlite.new_param_node(pool, vt_i8_ptr_ty) + vtnode: rawptr[llvmlite.Function] = llvmlite.new_param_node(pool, vt_i8_ptr_ty) if vtnode is None: continue if vt_first_node is None: @@ -1170,8 +1170,8 @@ class ClassGenVTable(ClassGenBase.ClassGenBase): llvmlite.paramnode_set_next(vt_prev_node, vtnode) vt_prev_node = vtnode - vt_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Struct(pool, vt_first_node, vt_method_count, None) - vt_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, vt_ty) + vt_ty: rawptr[llvmlite.LLVMType] = llvmlite.Struct(pool, vt_first_node, vt_method_count, None) + vt_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, vt_ty) # 构造 vtable 全局变量名 vt_name_buf: str = pool.alloc(128) diff --git a/App/lib/core/Gen/Expr/ExprGenAttr.vp b/App/lib/core/Gen/Expr/ExprGenAttr.vp index e961230..790bf33 100644 --- a/App/lib/core/Gen/Expr/ExprGenAttr.vp +++ b/App/lib/core/Gen/Expr/ExprGenAttr.vp @@ -35,7 +35,7 @@ class ExprGenAttr(ExprGenBase.ExprGenBase): # 1. 精确匹配 (如 "_mbuddy" 匹配 @_mbuddy) # 2. 后缀匹配 (如 "_mbuddy" 匹配 @"sha1._mbuddy") # ============================================================ - def find_global_in_module(self, mod: llvmlite.LLVMModule | t.CPtr, + def find_global_in_module(self, mod: rawptr[llvmlite.LLVMModule], name: str) -> llvmlite.GlobalVariable | t.CPtr: """在模块全局变量链表中按名称查找全局变量""" if mod is None or name is None: @@ -73,11 +73,11 @@ class ExprGenAttr(ExprGenBase.ExprGenBase): # ============================================================ def make_global_ref(self, pool: rawptr[memhub.MemBuddy], name: str, - ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: + ty: rawptr[llvmlite.LLVMType]) -> llvmlite.Value | t.CPtr: """创建全局变量引用 (类型为 ty*,名称为 @name)""" if name is None or ty is None: return None - ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, ty) + ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, ty) ref_name: str = pool.alloc(96) if ref_name is None: return None @@ -186,7 +186,7 @@ class ExprGenAttr(ExprGenBase.ExprGenBase): return 1 return 0 def _attr_module_path_str(self, pool: rawptr[memhub.MemBuddy], - node: ast.AST | t.CPtr) -> str: + node: rawptr[ast.AST]) -> str: """把模块引用 AST 转成模块路径字符串(递归拼接 Attribute 链): Name('sys') → "sys";Attribute(Attribute(Name('os'),'_win32')) → "os._win32"。 非模块引用形态(Call/Subscript 等)返回 None。""" @@ -194,12 +194,12 @@ class ExprGenAttr(ExprGenBase.ExprGenBase): return None k: int = node.kind() if k == ast.ASTKind.Name: - nm_m: ast.Name | t.CPtr = (ast.Name | t.CPtr)(node) + nm_m: rawptr[ast.Name] = rawptr[ast.Name](node) if nm_m.id is not None: return nm_m.id return None if k == ast.ASTKind.Attribute: - at_m: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(node) + at_m: rawptr[ast.Attribute] = rawptr[ast.Attribute](node) if at_m.attr is None: return None base_m: str = self._attr_module_path_str(pool, at_m.value) @@ -214,10 +214,10 @@ class ExprGenAttr(ExprGenBase.ExprGenBase): return buf_m return None def _resolve_module_attribute_global(self, pool: rawptr[memhub.MemBuddy], - mod: llvmlite.LLVMModule | t.CPtr, - trans: HT.Translator | t.CPtr, - at: ast.Attribute | t.CPtr, - ty_hint: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: + mod: rawptr[llvmlite.LLVMModule], + trans: rawptr[HT.Translator], + at: rawptr[ast.Attribute], + ty_hint: rawptr[llvmlite.LLVMType]) -> llvmlite.Value | t.CPtr: """解析模块属性访问,返回全局变量引用 (用于跨模块 global 访问)""" if at is None or at.value is None or at.attr is None: return None @@ -270,7 +270,7 @@ class ExprGenAttr(ExprGenBase.ExprGenBase): return self.make_global_ref(pool, gv.Name, gv.Ty) # 未找到: 创建 external global 声明并添加到模块 # 否则只生成 @_argc 引用而无声明,LLVM 报 "use of undefined value '@_argc'" - use_ty: llvmlite.LLVMType | t.CPtr = ty_hint + use_ty: rawptr[llvmlite.LLVMType] = ty_hint if use_ty is None: use_ty = llvmlite.Int8(pool) # 确保 use_ty 中的跨模块结构体类型有 opaque 声明 @@ -344,21 +344,21 @@ class ExprGenAttr(ExprGenBase.ExprGenBase): # ============================================================ def _get_cderef_attr_base(self, builder: llvmlite.IRBuilder | t.CPtr, pool: rawptr[memhub.MemBuddy], - mod: llvmlite.LLVMModule | t.CPtr, - at_value: ast.AST | t.CPtr, - trans: HT.Translator | t.CPtr = None) -> llvmlite.Value | t.CPtr: + mod: rawptr[llvmlite.LLVMModule], + at_value: rawptr[ast.AST], + trans: rawptr[HT.Translator] = None) -> llvmlite.Value | t.CPtr: """检测 at.value 是否为 c.Deref(ptr) 调用,返回 ptr 指针(不做 load)""" if at_value is None or at_value.kind() != ast.ASTKind.Call: return None - cl_cd: ast.Call | t.CPtr = (ast.Call | t.CPtr)(at_value) + cl_cd: rawptr[ast.Call] = rawptr[ast.Call](at_value) if cl_cd.func is None or cl_cd.func.kind() != ast.ASTKind.Attribute: return None - f_cd: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(cl_cd.func) + f_cd: rawptr[ast.Attribute] = rawptr[ast.Attribute](cl_cd.func) if f_cd.attr is None or string.strcmp(f_cd.attr, "Deref") != 0: return None if f_cd.value is None or f_cd.value.kind() != ast.ASTKind.Name: return None - nm_cd: ast.Name | t.CPtr = (ast.Name | t.CPtr)(f_cd.value) + nm_cd: rawptr[ast.Name] = rawptr[ast.Name](f_cd.value) if nm_cd.id is None or string.strcmp(nm_cd.id, "c") != 0: return None if cl_cd.args is None or len(cl_cd.args) < 1: @@ -370,13 +370,13 @@ class ExprGenAttr(ExprGenBase.ExprGenBase): return None def translate_attribute(self, builder: llvmlite.IRBuilder | t.CPtr, pool: rawptr[memhub.MemBuddy], - mod: llvmlite.LLVMModule | t.CPtr, - node: ast.AST | t.CPtr, - trans: HT.Translator | t.CPtr = None) -> llvmlite.Value | t.CPtr: + mod: rawptr[llvmlite.LLVMModule], + node: rawptr[ast.AST], + trans: rawptr[HT.Translator] = None) -> llvmlite.Value | t.CPtr: """翻译属性访问,返回加载的字段值""" if node is None or builder is None: return None - at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(node) + at: rawptr[ast.Attribute] = rawptr[ast.Attribute](node) if at is None or at.value is None or at.attr is None: # fast-fail: AST 节点字段缺失属解析器 bug,应报告具体缺失字段 diag_buf_an: bytes = stdlib.malloc(256) @@ -408,19 +408,19 @@ class ExprGenAttr(ExprGenBase.ExprGenBase): doc_mod_buf[0] = '\0' doc_sym_buf[0] = '\0' if at.value is not None and at.value.kind() == ast.ASTKind.Name: - nm_doc: ast.Name | t.CPtr = (ast.Name | t.CPtr)(at.value) + nm_doc: rawptr[ast.Name] = rawptr[ast.Name](at.value) if nm_doc.id is not None: self.Gen.ExprGenCls._resolve_doc_symbol_name(trans, nm_doc.id, doc_mod_buf, doc_sym_buf) elif at.value is not None and at.value.kind() == ast.ASTKind.Attribute: - self.Gen.ExprGenCls._resolve_doc_symbol_attr(trans, (ast.Attribute | t.CPtr)(at.value), doc_mod_buf, doc_sym_buf) + self.Gen.ExprGenCls._resolve_doc_symbol_attr(trans, rawptr[ast.Attribute](at.value), doc_mod_buf, doc_sym_buf) doc_val: str = None if doc_mod_buf[0] != '\0' and doc_sym_buf[0] != '\0': doc_val = self.Gen.ExprGenCls.lookup_docstring(doc_mod_buf, doc_sym_buf) if doc_val is None: - i8_ty_doc: llvmlite.LLVMType | t.CPtr = llvmlite.Int8(pool) + i8_ty_doc: rawptr[llvmlite.LLVMType] = llvmlite.Int8(pool) if i8_ty_doc is None: return None - i8_ptr_ty_doc: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, i8_ty_doc) + i8_ptr_ty_doc: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, i8_ty_doc) if i8_ptr_ty_doc is None: return None return llvmlite.ConstNull(pool, i8_ptr_ty_doc, "null") @@ -429,13 +429,13 @@ class ExprGenAttr(ExprGenBase.ExprGenBase): # 枚举成员访问: EnumName.MemberName → 常量值 # 当 value 是 Name 且 Name.id 是已注册枚举时,查找成员并返回常量 if at.value.kind() == ast.ASTKind.Name: - enum_nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(at.value) + enum_nm: rawptr[ast.Name] = rawptr[ast.Name](at.value) if enum_nm.id is not None: if self.Gen.StmtGenDecl.is_enum_class(enum_nm.id) == 1: member: GenTypes.EnumMember | t.CPtr = self.Gen.StmtGenDecl.lookup_enum_member( enum_nm.id, at.attr) if member is not None: - base_ty: llvmlite.LLVMType | t.CPtr = self.Gen.StmtGenDecl.get_enum_base_type( + base_ty: rawptr[llvmlite.LLVMType] = self.Gen.StmtGenDecl.get_enum_base_type( enum_nm.id) if base_ty is not None: # 生成数字字符串作为常量名(LLVM IR 要求常量输出数字值) @@ -457,13 +457,13 @@ class ExprGenAttr(ExprGenBase.ExprGenBase): # Attribute)被跳过 → "属性访问失败: .W"(SysLibTest L190 根因)。 # 枚举类名只取最内层 attr(MODE),模块路径形态不影响。 if at.value.kind() == ast.ASTKind.Attribute: - inner_at_e: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(at.value) + inner_at_e: rawptr[ast.Attribute] = rawptr[ast.Attribute](at.value) if inner_at_e.attr is not None: if self.Gen.StmtGenDecl.is_enum_class(inner_at_e.attr) == 1: member_e: GenTypes.EnumMember | t.CPtr = self.Gen.StmtGenDecl.lookup_enum_member( inner_at_e.attr, at.attr) if member_e is not None: - base_ty_e: llvmlite.LLVMType | t.CPtr = self.Gen.StmtGenDecl.get_enum_base_type( + base_ty_e: rawptr[llvmlite.LLVMType] = self.Gen.StmtGenDecl.get_enum_base_type( inner_at_e.attr) if base_ty_e is not None: name_buf_e: str = pool.alloc(32) @@ -489,11 +489,11 @@ class ExprGenAttr(ExprGenBase.ExprGenBase): # 见 __types.vp)查变体返回 -1 → 自然落空不拦截。 renum_cls_rv: str = None if at.value.kind() == ast.ASTKind.Name: - rn_nm_rv: ast.Name | t.CPtr = (ast.Name | t.CPtr)(at.value) + rn_nm_rv: rawptr[ast.Name] = rawptr[ast.Name](at.value) if rn_nm_rv.id is not None: renum_cls_rv = rn_nm_rv.id elif at.value.kind() == ast.ASTKind.Attribute: - rn_at_rv: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(at.value) + rn_at_rv: rawptr[ast.Attribute] = rawptr[ast.Attribute](at.value) if rn_at_rv.attr is not None: renum_cls_rv = rn_at_rv.attr if renum_cls_rv is not None \ @@ -512,7 +512,7 @@ class ExprGenAttr(ExprGenBase.ExprGenBase): # 对齐 TPC HandlesExprAttr.py L433-442:对象是 Name 变量且存在 # {var}__meta__ 影子(fd2 创建)时,属性访问改走影子结构体。 if at.value.kind() == ast.ASTKind.Name and trans is not None: - fd_nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(at.value) + fd_nm: rawptr[ast.Name] = rawptr[ast.Name](at.value) if fd_nm.id is not None: # pool 持久缓冲(f-string 栈缓冲在函数返回后失效) fd_meta_buf: str = pool.alloc(256) @@ -521,7 +521,7 @@ class ExprGenAttr(ExprGenBase.ExprGenBase): fd_meta_v: llvmlite.Value | t.CPtr = self.Gen.VarGen.lookup_current( trans.SymTab, fd_meta_buf) if fd_meta_v is not None: - fd_sty: llvmlite.LLVMType | t.CPtr = self.Gen.StructGen.get_struct_type( + fd_sty: rawptr[llvmlite.LLVMType] = self.Gen.StructGen.get_struct_type( "_str") if fd_sty is not None: fd_fe: GenTypes.FieldEntry | t.CPtr = \ @@ -535,7 +535,7 @@ class ExprGenAttr(ExprGenBase.ExprGenBase): # 模块属性访问 (读路径): sys._mbuddy → 加载全局变量 @_mbuddy # 当 obj 是已导入模块名且不是普通变量时,查找/创建全局变量引用并加载 if at.value.kind() == ast.ASTKind.Name and trans is not None: - nm_ma: ast.Name | t.CPtr = (ast.Name | t.CPtr)(at.value) + nm_ma: rawptr[ast.Name] = rawptr[ast.Name](at.value) if nm_ma.id is not None: # 先检查是否是普通变量 (优先级高于模块属性) ma_is_var: llvmlite.Value | t.CPtr = self.Gen.VarGen.lookup_var( @@ -642,11 +642,11 @@ class ExprGenAttr(ExprGenBase.ExprGenBase): "TypeError") # 命中跨模块全局 → 落到下方跨模块全局加载路径 # 非 CDefine: 使用 i8* 作为类型提示 (模块级变量通常存储指针) - i8_ptr_hint: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, llvmlite.Int8(pool)) + i8_ptr_hint: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, llvmlite.Int8(pool)) mod_gv_ref: llvmlite.Value | t.CPtr = self._resolve_module_attribute_global( pool, mod, trans, at, i8_ptr_hint) if mod_gv_ref is not None and mod_gv_ref.Ty is not None: - load_ty_mod: llvmlite.LLVMType | t.CPtr = mod_gv_ref.Ty.Pointee + load_ty_mod: rawptr[llvmlite.LLVMType] = mod_gv_ref.Ty.Pointee if load_ty_mod is not None: # 模块级全局数组(如 zdef.zdeflate_len_base: CArray[T, N]): # 按 C 语义衰减为基址返回(对齐 translate_name_value 局部 @@ -661,9 +661,9 @@ class ExprGenAttr(ExprGenBase.ExprGenBase): # 嵌套模块属性访问 (w32.win32file.GENERIC_READ → 查找全局 @GENERIC_READ) # 当 at.value 是 Attribute 且解析为已导入子模块时,查找 at.attr 作为全局常量 if at.value.kind() == ast.ASTKind.Attribute and trans is not None: - inner_at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(at.value) + inner_at: rawptr[ast.Attribute] = rawptr[ast.Attribute](at.value) if inner_at.value is not None and inner_at.value.kind() == ast.ASTKind.Name: - inner_nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(inner_at.value) + inner_nm: rawptr[ast.Name] = rawptr[ast.Name](inner_at.value) if inner_nm.id is not None and inner_at.attr is not None: if self.Gen.VarGen.lookup_var(trans.SymTab, inner_nm.id) is None: # 构建限定模块名: "w32.win32file" @@ -697,7 +697,7 @@ class ExprGenAttr(ExprGenBase.ExprGenBase): gv_ref_nested: llvmlite.Value | t.CPtr = self.make_global_ref( pool, gv_nested.Name, gv_nested.Ty) if gv_ref_nested is not None and gv_ref_nested.Ty is not None: - load_ty_nested: llvmlite.LLVMType | t.CPtr = gv_ref_nested.Ty.Pointee + load_ty_nested: rawptr[llvmlite.LLVMType] = gv_ref_nested.Ty.Pointee if load_ty_nested is not None: # 模块级全局数组(如 idt.idt: CArray[T, N])按 C 语义 # 返回基址指针(对齐读路径 L629-634),下标/取址继续 GEP @@ -740,13 +740,13 @@ class ExprGenAttr(ExprGenBase.ExprGenBase): # 跨函数引用外层 alloca(SSA 编号跨函数错乱崩溃) obj_ptr: llvmlite.Value | t.CPtr = None if at.value.kind() == ast.ASTKind.Name and trans is not None: - nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(at.value) + nm: rawptr[ast.Name] = rawptr[ast.Name](at.value) if nm.id is not None: if GenApi.is_nonlocal_name(trans, nm.id) != 0: raw_nl_a: llvmlite.Value | t.CPtr = self.Gen.StmtGenDecl._load_raw_var_ptr( trans, nm.id) if raw_nl_a is not None: - nl_ty_a: llvmlite.LLVMType | t.CPtr = GenApi.get_nonlocal_type( + nl_ty_a: rawptr[llvmlite.LLVMType] = GenApi.get_nonlocal_type( trans, nm.id) if nl_ty_a is not None: # 对象即指针:Struct/Array 类型直接用堆地址(bitcast 后 @@ -828,11 +828,11 @@ class ExprGenAttr(ExprGenBase.ExprGenBase): builder, struct_ty, alias_fe.Ty, obj_ptr, alias_idx) if alias_ptr is not None: # REnum 变体字段按声明类型读取(对齐 match 绑定 _lookup_renum_member_ty):槽位是 i32/i64(布局按最大字段大小),直接 load 得整数位模式,赋给 X|t.CPtr 指针变量会触发 int→ptr 禁令误报。用别名表存的成员声明类型(自引用退化为 i8*)把槽位地址 bitcast 后按声明类型 load——同宽无信息丢失,指针字段读出真正的指针值 - decl_ty_rn: llvmlite.LLVMType | t.CPtr = \ + decl_ty_rn: rawptr[llvmlite.LLVMType] = \ self.Gen.ClassGenEnum._lookup_renum_field_alias_ty( renum_se.Name, at.attr) if decl_ty_rn is not None: - decl_ptr_rn: llvmlite.LLVMType | t.CPtr = \ + decl_ptr_rn: rawptr[llvmlite.LLVMType] = \ llvmlite.Ptr(pool, decl_ty_rn) if decl_ptr_rn is not None: cast_ptr_rn: llvmlite.Value | t.CPtr = \ @@ -854,7 +854,7 @@ class ExprGenAttr(ExprGenBase.ExprGenBase): if field_info is None: base_class: str = None if at.value.kind() == ast.ASTKind.Name and trans is not None: - nm_fb: ast.Name | t.CPtr = (ast.Name | t.CPtr)(at.value) + nm_fb: rawptr[ast.Name] = rawptr[ast.Name](at.value) if nm_fb.id is not None: var_entry: GenTypes.VarEntry | t.CPtr = self.Gen.VarGen.lookup_var_entry( trans.SymTab, nm_fb.id) @@ -890,7 +890,7 @@ class ExprGenAttr(ExprGenBase.ExprGenBase): annot_se: GenTypes.StructEntry | t.CPtr = \ self.Gen.StructGen.find_struct(base_class) if annot_se is not None and annot_se.Ty is not None: - annot_ptr_ty: llvmlite.LLVMType | t.CPtr = \ + annot_ptr_ty: rawptr[llvmlite.LLVMType] = \ llvmlite.Ptr(pool, annot_se.Ty) casted_ptr: llvmlite.Value | t.CPtr = \ llvmlite.build_bitcast(builder, obj_ptr, annot_ptr_ty) @@ -903,10 +903,10 @@ class ExprGenAttr(ExprGenBase.ExprGenBase): self.Gen.StructGen.ensure_struct_def_in_module( pool, mod, annot_se.Ty) if field_info is not None: - field_ty: llvmlite.LLVMType | t.CPtr = field_info.Ty + field_ty: rawptr[llvmlite.LLVMType] = field_info.Ty # 联合体:bitcast obj_ptr 到 field_ty* 后 load if self.Gen.StructGen.is_union_by_type(struct_ty) == 1: - field_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, field_ty) + field_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, field_ty) casted: llvmlite.Value | t.CPtr = llvmlite.build_bitcast( builder, obj_ptr, field_ptr_ty) if casted is not None: @@ -925,11 +925,11 @@ class ExprGenAttr(ExprGenBase.ExprGenBase): self.Gen.StructGen.find_struct_by_type(struct_ty) if rn_rd_se is not None and rn_rd_se.Name is not None \ and self.Gen.ClassGenEnum._is_renum_class_name(rn_rd_se.Name) != 0: - decl_ty_rd: llvmlite.LLVMType | t.CPtr = \ + decl_ty_rd: rawptr[llvmlite.LLVMType] = \ self.Gen.ClassGenEnum._lookup_renum_field_alias_ty( rn_rd_se.Name, at.attr) if decl_ty_rd is not None and self.is_array_type(decl_ty_rd) == 0: - decl_ptr_rd: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr( + decl_ptr_rd: rawptr[llvmlite.LLVMType] = llvmlite.Ptr( pool, decl_ty_rd) if decl_ptr_rd is not None: cast_ptr_rd: llvmlite.Value | t.CPtr = llvmlite.build_bitcast( @@ -961,7 +961,7 @@ class ExprGenAttr(ExprGenBase.ExprGenBase): # opaque 声明足以支撑指针 bitcast(不访问字段),行为不变。 llvmlite.module_ensure_opaque_for_type( mod, pool, llvmlite.Ptr(pool, annot_struct.Ty)) - annot_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, annot_struct.Ty) + annot_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, annot_struct.Ty) return llvmlite.build_bitcast(builder, loaded_val, annot_ptr_ty) return loaded_val # 字段未找到:可能是 Phase A 依赖未就绪(定义侧模块未编译,vpi @@ -971,7 +971,7 @@ class ExprGenAttr(ExprGenBase.ExprGenBase): diag_annot: str = None diag_var_nm: str = None if at.value is not None and at.value.kind() == ast.ASTKind.Name: - dnm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(at.value) + dnm: rawptr[ast.Name] = rawptr[ast.Name](at.value) diag_var_nm = dnm.id if dnm.id is not None: dve: GenTypes.VarEntry | t.CPtr = self.Gen.VarGen.lookup_var_entry( @@ -1016,8 +1016,8 @@ class ExprGenAttr(ExprGenBase.ExprGenBase): # 对于 Name 类型的 obj,直接使用 alloca 指针(不 load 结构体) # ============================================================ def _resolve_attr_field_class(self, pool: rawptr[memhub.MemBuddy], - trans: HT.Translator | t.CPtr, - attr_node: ast.AST | t.CPtr) -> str: + trans: rawptr[HT.Translator], + attr_node: rawptr[ast.AST]) -> str: """解析属性链(a.b.c)中 c 字段的注解类名。 联合类型字段(X | t.CPtr)被简化为 Ptr(i8),属性链写入时 @@ -1031,13 +1031,13 @@ class ExprGenAttr(ExprGenBase.ExprGenBase): k: int = attr_node.kind() if k != ast.ASTKind.Attribute: return None - at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(attr_node) + at: rawptr[ast.Attribute] = rawptr[ast.Attribute](attr_node) if at is None or at.attr is None or at.value is None: return None # 递归解析基座的注解类名(Name → 变量注解;Attribute → 字段注解) parent_class: str = None if at.value.kind() == ast.ASTKind.Name: - nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(at.value) + nm: rawptr[ast.Name] = rawptr[ast.Name](at.value) if nm.id is None: return None var_entry: GenTypes.VarEntry | t.CPtr = self.Gen.VarGen.lookup_var_entry( @@ -1065,13 +1065,13 @@ class ExprGenAttr(ExprGenBase.ExprGenBase): return self.Gen.StructGen.get_field_annot_class_name(fe) def get_attribute_ptr(self, builder: llvmlite.IRBuilder | t.CPtr, pool: rawptr[memhub.MemBuddy], - mod: llvmlite.LLVMModule | t.CPtr, - node: ast.AST | t.CPtr, - trans: HT.Translator | t.CPtr = None) -> llvmlite.Value | t.CPtr: + mod: rawptr[llvmlite.LLVMModule], + node: rawptr[ast.AST], + trans: rawptr[HT.Translator] = None) -> llvmlite.Value | t.CPtr: """获取属性访问的字段指针(用于赋值 lhs)""" if node is None or builder is None: return None - at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(node) + at: rawptr[ast.Attribute] = rawptr[ast.Attribute](node) if at is None or at.value is None or at.attr is None: return None @@ -1080,13 +1080,13 @@ class ExprGenAttr(ExprGenBase.ExprGenBase): # 跨函数引用外层 alloca(SSA 编号跨函数错乱崩溃) obj_ptr: llvmlite.Value | t.CPtr = None if at.value.kind() == ast.ASTKind.Name and trans is not None: - nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(at.value) + nm: rawptr[ast.Name] = rawptr[ast.Name](at.value) if nm.id is not None: if GenApi.is_nonlocal_name(trans, nm.id) != 0: raw_nl_a: llvmlite.Value | t.CPtr = self.Gen.StmtGenDecl._load_raw_var_ptr( trans, nm.id) if raw_nl_a is not None: - nl_ty_a: llvmlite.LLVMType | t.CPtr = GenApi.get_nonlocal_type( + nl_ty_a: rawptr[llvmlite.LLVMType] = GenApi.get_nonlocal_type( trans, nm.id) if nl_ty_a is not None: # 对象即指针:Struct/Array 类型直接用堆地址(bitcast 后 @@ -1118,7 +1118,7 @@ class ExprGenAttr(ExprGenBase.ExprGenBase): # CDefine 常量不可写: 报 FATAL 错误,不创建未定义全局 # (仅单层 Name 模块可精确判 CDefine) if at.value.kind() == ast.ASTKind.Name: - nm_wma: ast.Name | t.CPtr = (ast.Name | t.CPtr)(at.value) + nm_wma: rawptr[ast.Name] = rawptr[ast.Name](at.value) if nm_wma.id is not None: if self.Gen.ExprGenCdef._is_cdefine_name_pattern(at.attr) != 0: err_buf_wma: str = pool.alloc(256) @@ -1129,7 +1129,7 @@ class ExprGenAttr(ExprGenBase.ExprGenBase): VLogger.error(err_buf_wma, "CD") return None # 使用 i8* 作为类型提示 (模块级变量通常存储指针) - i8_ptr_w: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, llvmlite.Int8(pool)) + i8_ptr_w: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, llvmlite.Int8(pool)) wma_ref: llvmlite.Value | t.CPtr = self._resolve_module_attribute_global( pool, mod, trans, at, i8_ptr_w) if wma_ref is not None: @@ -1181,7 +1181,7 @@ class ExprGenAttr(ExprGenBase.ExprGenBase): if field_info is None: base_class: str = None if at.value.kind() == ast.ASTKind.Name and trans is not None: - nm_fb: ast.Name | t.CPtr = (ast.Name | t.CPtr)(at.value) + nm_fb: rawptr[ast.Name] = rawptr[ast.Name](at.value) if nm_fb.id is not None: var_entry: GenTypes.VarEntry | t.CPtr = self.Gen.VarGen.lookup_var_entry( trans.SymTab, nm_fb.id) @@ -1219,7 +1219,7 @@ class ExprGenAttr(ExprGenBase.ExprGenBase): annot_se: GenTypes.StructEntry | t.CPtr = \ self.Gen.StructGen.find_struct(base_class) if annot_se is not None and annot_se.Ty is not None: - annot_ptr_ty: llvmlite.LLVMType | t.CPtr = \ + annot_ptr_ty: rawptr[llvmlite.LLVMType] = \ llvmlite.Ptr(pool, annot_se.Ty) casted_ptr: llvmlite.Value | t.CPtr = \ llvmlite.build_bitcast(builder, obj_ptr, annot_ptr_ty) @@ -1233,7 +1233,7 @@ class ExprGenAttr(ExprGenBase.ExprGenBase): if field_info is not None: # 联合体:bitcast obj_ptr 到 field_ty*(字段指针用于 store) if self.Gen.StructGen.is_union_by_type(struct_ty) == 1: - field_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, field_info.Ty) + field_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, field_info.Ty) return llvmlite.build_bitcast(builder, obj_ptr, field_ptr_ty) # 普通结构体:GEP 获取字段指针 return llvmlite.build_gep_struct( @@ -1245,7 +1245,7 @@ class ExprGenAttr(ExprGenBase.ExprGenBase): diag_annot_g: str = None diag_var_nm_g: str = None if at.value is not None and at.value.kind() == ast.ASTKind.Name: - dnm_g: ast.Name | t.CPtr = (ast.Name | t.CPtr)(at.value) + dnm_g: rawptr[ast.Name] = rawptr[ast.Name](at.value) diag_var_nm_g = dnm_g.id if dnm_g.id is not None: dve_g: GenTypes.VarEntry | t.CPtr = self.Gen.VarGen.lookup_var_entry( diff --git a/App/lib/core/Gen/Expr/ExprGenBase.vp b/App/lib/core/Gen/Expr/ExprGenBase.vp index 5ffd6e2..43dda2b 100644 --- a/App/lib/core/Gen/Expr/ExprGenBase.vp +++ b/App/lib/core/Gen/Expr/ExprGenBase.vp @@ -42,16 +42,16 @@ class ExprGenBase: # ============================================================ # 从 AST 节点提取函数名 # ============================================================ - def get_func_name(self, func_node: ast.AST | t.CPtr) -> str: + def get_func_name(self, func_node: rawptr[ast.AST]) -> str: """从函数节点提取函数名""" if func_node is None: return None k: int = func_node.kind() if k == ast.ASTKind.Name: - nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(func_node) + nm: rawptr[ast.Name] = rawptr[ast.Name](func_node) return nm.id elif k == ast.ASTKind.Attribute: - at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(func_node) + at: rawptr[ast.Attribute] = rawptr[ast.Attribute](func_node) return at.attr return None # ============================================================ @@ -106,13 +106,13 @@ class ExprGenBase: # 同样委托到它)。两份副本一旦分叉,会出现「同一类型在两处算出不同位宽」的 # 隐蔽不一致。私有调用点(self.get_llvm_type_bits)保持原样不受影响。 # ============================================================ - def get_llvm_type_bits(self, ty: llvmlite.LLVMType | t.CPtr) -> int: + def get_llvm_type_bits(self, ty: rawptr[llvmlite.LLVMType]) -> int: """获取 LLVM 整数类型的位宽,非整数类型返回 0(委托 SpecTypeBits)""" return TSpec.SpecTypeBits(ty) # ============================================================ # 获取 LLVM 浮点类型的位宽 # ============================================================ - def get_llvm_float_bits(self, ty: llvmlite.LLVMType | t.CPtr) -> int: + def get_llvm_float_bits(self, ty: rawptr[llvmlite.LLVMType]) -> int: """获取 LLVM 浮点类型的位宽,非浮点类型返回 0""" if ty is None: return 0 @@ -126,7 +126,7 @@ class ExprGenBase: # # 返回 1=是, 0=否。作为类型检查工具函数被广泛使用(50+ 处调用)。 # ============================================================ - def is_ptr_type(self, ty: llvmlite.LLVMType | t.CPtr) -> int: + def is_ptr_type(self, ty: rawptr[llvmlite.LLVMType]) -> int: """检查 ty 是否是 Ptr 类型,返回 1=是, 0=否""" if ty is None: return 0 @@ -150,7 +150,7 @@ class ExprGenBase: # - 数值(0) vs 指针(1+) → 禁止(fast-fail) # - 不同级指针(1 vs 2) → 禁止(fast-fail) # ============================================================ - def get_ptr_level(self, ty: llvmlite.LLVMType | t.CPtr) -> int: + def get_ptr_level(self, ty: rawptr[llvmlite.LLVMType]) -> int: """计算指针层级,0=非指针, 1=一级指针, 2=二级指针... [S3 切读·指针层级块] 实现已收拢到 `TSpec.SpecTypePtrLevel` @@ -164,13 +164,13 @@ class ExprGenBase: # 用于指针判空比较(ptr != 0 / ptr == 0):指针与字面量 0 比较时 # 0 视为 NULL,允许并转成 null 指针(比较类型检查的例外)。 # ============================================================ - def _is_zero_int_literal(self, node: ast.AST | t.CPtr) -> int: + def _is_zero_int_literal(self, node: rawptr[ast.AST]) -> int: """判断节点是否为整数字面量 0,返回 1=是 / 0=否""" if node is None: return 0 if node.kind() != ast.ASTKind.Constant: return 0 - cn: ast.Constant | t.CPtr = (ast.Constant | t.CPtr)(node) + cn: rawptr[ast.Constant] = rawptr[ast.Constant](node) if cn is None or cn.const_kind != ast.CONST_INT: return 0 if cn.int_val == 0: @@ -181,7 +181,7 @@ class ExprGenBase: # # 返回 1=是, 0=否。类型检查工具函数。 # ============================================================ - def is_array_type(self, ty: llvmlite.LLVMType | t.CPtr) -> int: + def is_array_type(self, ty: rawptr[llvmlite.LLVMType]) -> int: """检查 ty 是否是 Array 类型,返回 1=是, 0=否""" if ty is None: return 0 @@ -205,7 +205,7 @@ class ExprGenBase: return idx_val idx_bits: int = self.get_llvm_type_bits(idx_val.Ty) if idx_bits != 0 and idx_bits < 32: - i32_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int32(builder.Pool) + i32_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int32(builder.Pool) return llvmlite.build_zext(builder, idx_val, i32_ty) return idx_val # ============================================================ @@ -219,7 +219,7 @@ class ExprGenBase: # 转发到 __getitem__/__setitem__ 而非生成 GEP。 # ============================================================ def _get_custom_struct_cls_nm(self, pool: rawptr[memhub.MemBuddy], - ty: llvmlite.LLVMType | t.CPtr) -> str: + ty: rawptr[llvmlite.LLVMType]) -> str: """检查 ty 或 ty 的 pointee 是否是已注册的自定义结构体,返回类名或 None""" if ty is None: return None @@ -229,7 +229,7 @@ class ExprGenBase: return cls_nm_direct # 如果 ty 是 Ptr,检查 pointee if self.is_ptr_type(ty) != 0: - pointee_cs: llvmlite.LLVMType | t.CPtr = ty.Pointee + pointee_cs: rawptr[llvmlite.LLVMType] = ty.Pointee if pointee_cs is not None: return self.Gen.StructGen.get_class_name_by_type(pool, pointee_cs) return None @@ -242,15 +242,15 @@ class ExprGenBase: # 路由错误会让 list[T] 被当作结构体数组 GEP,访问错位崩溃。 # ============================================================ def _is_list_subscript_base(self, pool: rawptr[memhub.MemBuddy], - trans: HT.Translator | t.CPtr, - sub_node: ast.AST | t.CPtr) -> int: + trans: rawptr[HT.Translator], + sub_node: rawptr[ast.AST]) -> int: """判断下标基座是否为 list[T] 变量(1=是)""" if sub_node is None or trans is None: return 0 - sub: ast.Subscript | t.CPtr = (ast.Subscript | t.CPtr)(sub_node) + sub: rawptr[ast.Subscript] = rawptr[ast.Subscript](sub_node) if sub is None or sub.value is None or sub.value.kind() != ast.ASTKind.Name: return 0 - nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(sub.value) + nm: rawptr[ast.Name] = rawptr[ast.Name](sub.value) if nm.id is None: return 0 alloca: llvmlite.Value | t.CPtr = self.Gen.VarGen.lookup_var(trans.SymTab, nm.id) @@ -258,7 +258,7 @@ class ExprGenBase: return 0 if self.is_ptr_type(alloca.Ty) == 0: return 0 - pointee: llvmlite.LLVMType | t.CPtr = alloca.Ty.Pointee + pointee: rawptr[llvmlite.LLVMType] = alloca.Ty.Pointee if pointee is None: return 0 match pointee: @@ -278,15 +278,15 @@ class ExprGenBase: # _sub_base_class_name - 解析下标基座变量的结构体类名 # ============================================================ def _sub_base_class_name(self, pool: rawptr[memhub.MemBuddy], - trans: HT.Translator | t.CPtr, - sub_node: ast.AST | t.CPtr) -> str: + trans: rawptr[HT.Translator], + sub_node: rawptr[ast.AST]) -> str: """解析下标基座变量的结构体类名(无则 None)""" if sub_node is None or trans is None: return None - sub: ast.Subscript | t.CPtr = (ast.Subscript | t.CPtr)(sub_node) + sub: rawptr[ast.Subscript] = rawptr[ast.Subscript](sub_node) if sub is None or sub.value is None or sub.value.kind() != ast.ASTKind.Name: return None - nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(sub.value) + nm: rawptr[ast.Name] = rawptr[ast.Name](sub.value) if nm.id is None: return None alloca: llvmlite.Value | t.CPtr = self.Gen.VarGen.lookup_var(trans.SymTab, nm.id) @@ -294,11 +294,11 @@ class ExprGenBase: return None if self.is_ptr_type(alloca.Ty) == 0: return None - pointee: llvmlite.LLVMType | t.CPtr = alloca.Ty.Pointee + pointee: rawptr[llvmlite.LLVMType] = alloca.Ty.Pointee if pointee is None: return None if self.is_ptr_type(pointee) != 0: - inner: llvmlite.LLVMType | t.CPtr = pointee.Pointee + inner: rawptr[llvmlite.LLVMType] = pointee.Pointee if inner is not None: return self.Gen.StructGen.get_class_name_by_type(pool, inner) return self.Gen.StructGen.get_class_name_by_type(pool, pointee) @@ -312,9 +312,9 @@ class ExprGenBase: # (GEP 元素地址,避免结构体值 base=非指针 报错) # ============================================================ def _sub_base_uses_getitem(self, pool: rawptr[memhub.MemBuddy], - mod: llvmlite.LLVMModule | t.CPtr, - trans: HT.Translator | t.CPtr, - sub_node: ast.AST | t.CPtr) -> int: + mod: rawptr[llvmlite.LLVMModule], + trans: rawptr[HT.Translator], + sub_node: rawptr[ast.AST]) -> int: """下标基座应走 __getitem__ 语义时返回 1,否则 0(应走 GEP 地址语义)""" if self._is_list_subscript_base(pool, trans, sub_node) != 0: return 1 @@ -342,7 +342,7 @@ class ExprGenBase: return obj_ptr if self.is_ptr_type(obj_ptr.Ty) == 0: return obj_ptr - pointee: llvmlite.LLVMType | t.CPtr = obj_ptr.Ty.Pointee + pointee: rawptr[llvmlite.LLVMType] = obj_ptr.Ty.Pointee if pointee is None: return obj_ptr if self.is_ptr_type(pointee) == 0: @@ -357,9 +357,9 @@ class ExprGenBase: # ============================================================ def coerce_to_type(self, builder: llvmlite.IRBuilder | t.CPtr, val: llvmlite.Value | t.CPtr, - target_ty: llvmlite.LLVMType | t.CPtr, - node: ast.AST | t.CPtr = None, - trans: HT.Translator | t.CPtr = None) -> llvmlite.Value | t.CPtr: + target_ty: rawptr[llvmlite.LLVMType], + node: rawptr[ast.AST] = None, + trans: rawptr[HT.Translator] = None) -> llvmlite.Value | t.CPtr: """将 val 强制转换为 target_ty 整数: sext(扩展)/ trunc(截断) @@ -491,8 +491,8 @@ class ExprGenBase: def _zext_or_sext_val(self, pool: rawptr[memhub.MemBuddy], val: llvmlite.Value | t.CPtr, - node: ast.AST | t.CPtr = None, - trans: HT.Translator | t.CPtr = None) -> int: + node: rawptr[ast.AST] = None, + trans: rawptr[HT.Translator] = None) -> int: """统一整数拓宽方向:1=zext(无符号语义),0=sext 委托到 ExprGenOps.should_zext_widen(拓宽方向的**单一真源**),避免两套 @@ -518,7 +518,7 @@ class ExprGenBase: if ptr_val is None or int_val is None or ptr_val.Ty is None: return None # 提取 pointee 类型(非指针 → 不处理返回 None) - elem_ty: llvmlite.LLVMType | t.CPtr = None + elem_ty: rawptr[llvmlite.LLVMType] = None match ptr_val.Ty: case llvmlite.LLVMType.Ptr(pointee): elem_ty = pointee @@ -527,7 +527,7 @@ class ExprGenBase: if elem_ty is None: return None # 索引统一到 i64(对齐 TPC zext 到 i64) - i64_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int64(pool) + i64_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int64(pool) idx: llvmlite.Value | t.CPtr = self.coerce_to_type(builder, int_val, i64_ty, None) if idx is None: return None @@ -540,7 +540,7 @@ class ExprGenBase: idx = neg_idx # 数组 pointee → 先 decay 为元素指针(getelementptr [N x ty], [N x ty]* %p, i32 0, i32 0) if self.is_array_type(elem_ty) != 0: - inner_ty: llvmlite.LLVMType | t.CPtr = None + inner_ty: rawptr[llvmlite.LLVMType] = None match elem_ty: case llvmlite.LLVMType.Array(inner, _): inner_ty = inner diff --git a/App/lib/core/Gen/Expr/ExprGenCdef.vp b/App/lib/core/Gen/Expr/ExprGenCdef.vp index d7f4e17..7b35b90 100644 --- a/App/lib/core/Gen/Expr/ExprGenCdef.vp +++ b/App/lib/core/Gen/Expr/ExprGenCdef.vp @@ -130,7 +130,7 @@ class ExprGenCdef(ExprGenBase.ExprGenBase): from_imports: str, imported_modules: str = None, depth: int = 0, - node: ast.AST | t.CPtr = None) -> int64: + node: rawptr[ast.AST] = None) -> int64: """跨模块查找 CDefine 常量,返回值(64 位)或 -1(未找到) 查找顺序: diff --git a/App/lib/core/Gen/Expr/ExprGenCls.vp b/App/lib/core/Gen/Expr/ExprGenCls.vp index 7d5987f..f2a4560 100644 --- a/App/lib/core/Gen/Expr/ExprGenCls.vp +++ b/App/lib/core/Gen/Expr/ExprGenCls.vp @@ -46,17 +46,17 @@ class ExprGenCls(ExprGenBase.ExprGenBase): # 符号依赖),未命中返回 null。幂等查重,多遍翻译安全。 # ============================================================ - def _extract_docstring_from_body(self, body: list[ast.AST | t.CPtr] | t.CPtr) -> str: + def _extract_docstring_from_body(self, body: list[rawptr[ast.AST]] | t.CPtr) -> str: """从函数/类体提取 docstring:body[0] 为 Expr(Constant str) 时返回内容""" if body is None or len(body) == 0: return None - first: ast.AST | t.CPtr = body.get(0) + first: rawptr[ast.AST] = body.get(0) if first is None or first.kind() != ast.ASTKind.Expr: return None ex: ast.Expr | t.CPtr = (ast.Expr | t.CPtr)(first) if ex is None or ex.value is None or ex.value.kind() != ast.ASTKind.Constant: return None - cn: ast.Constant | t.CPtr = (ast.Constant | t.CPtr)(ex.value) + cn: rawptr[ast.Constant] = rawptr[ast.Constant](ex.value) if cn is None or cn.const_kind != ast.CONST_STR: return None return cn.str_val @@ -107,43 +107,43 @@ class ExprGenCls(ExprGenBase.ExprGenBase): return self.DocValues + i * DOC_VAL_SZ stdlib.free(key_buf) return None - def extract_module_docstrings(self, tree: ast.AST | t.CPtr, module_sha1: str) -> None: + def extract_module_docstrings(self, tree: rawptr[ast.AST], module_sha1: str) -> None: """扫描模块 AST:登记模块级函数/类/方法的 docstring(幂等)""" if tree is None or module_sha1 is None: return - ch: list[ast.AST | t.CPtr] | t.CPtr = tree.children + ch: list[rawptr[ast.AST]] | t.CPtr = tree.children if ch is None: return cn: sizet = len(ch) for ci in range(cn): - child: ast.AST | t.CPtr = ch.get(ci) + child: rawptr[ast.AST] = ch.get(ci) if child is None: continue kd: int = child.kind() if kd == ast.ASTKind.FunctionDef: - fd: ast.FunctionDef | t.CPtr = (ast.FunctionDef | t.CPtr)(child) + fd: rawptr[ast.FunctionDef] = rawptr[ast.FunctionDef](child) if fd is not None and fd.name is not None: - fd_body: list[ast.AST | t.CPtr] | t.CPtr = fd.children + fd_body: list[rawptr[ast.AST]] | t.CPtr = fd.children fdoc: str = self._extract_docstring_from_body(fd_body) if fdoc is not None: self.register_docstring(module_sha1, fd.name, fdoc) elif kd == ast.ASTKind.ClassDef: - cd: ast.ClassDef | t.CPtr = (ast.ClassDef | t.CPtr)(child) + cd: rawptr[ast.ClassDef] = rawptr[ast.ClassDef](child) if cd is None or cd.name is None: continue - cd_body0: list[ast.AST | t.CPtr] | t.CPtr = cd.children + cd_body0: list[rawptr[ast.AST]] | t.CPtr = cd.children cdoc: str = self._extract_docstring_from_body(cd_body0) if cdoc is not None: self.register_docstring(module_sha1, cd.name, cdoc) # 类方法 docstring(key="{ClassName}.{method}") - cd_body: list[ast.AST | t.CPtr] | t.CPtr = cd.children + cd_body: list[rawptr[ast.AST]] | t.CPtr = cd.children if cd_body is not None: cbn: sizet = len(cd_body) for mi in range(cbn): - m: ast.AST | t.CPtr = cd_body.get(mi) + m: rawptr[ast.AST] = cd_body.get(mi) if m is None or m.kind() != ast.ASTKind.FunctionDef: continue - mfd: ast.FunctionDef | t.CPtr = (ast.FunctionDef | t.CPtr)(m) + mfd: rawptr[ast.FunctionDef] = rawptr[ast.FunctionDef](m) if mfd is None or mfd.name is None: continue mdoc: str = self._extract_docstring_from_body(mfd.children) @@ -155,7 +155,7 @@ class ExprGenCls(ExprGenBase.ExprGenBase): viperlib.snprintf(sym_buf, cl_nl + mt_nl + 2, "%s.%s", cd.name, mfd.name) self.register_docstring(module_sha1, sym_buf, mdoc) stdlib.free(sym_buf) - def _resolve_doc_symbol_name(self, trans: HT.Translator | t.CPtr, name_id: str, + def _resolve_doc_symbol_name(self, trans: rawptr[HT.Translator], name_id: str, out_mod: str, out_sym: str) -> int: """解析 Name 符号的 docstring 归属,写入 out_mod/out_sym,成功返回 1 @@ -192,8 +192,8 @@ class ExprGenCls(ExprGenBase.ExprGenBase): string.strcpy(out_mod, trans.ModuleSha1) string.strcpy(out_sym, name_id) return 1 - def _resolve_doc_symbol_attr(self, trans: HT.Translator | t.CPtr, - at: ast.Attribute | t.CPtr, + def _resolve_doc_symbol_attr(self, trans: rawptr[HT.Translator], + at: rawptr[ast.Attribute], out_mod: str, out_sym: str) -> int: """解析嵌套 Attribute 链的 docstring 归属,写入 out_mod/out_sym @@ -211,9 +211,9 @@ class ExprGenCls(ExprGenBase.ExprGenBase): if items is None: return 0 n_items: int = 0 - cur: ast.AST | t.CPtr = (ast.AST | t.CPtr)(at) + cur: rawptr[ast.AST] = (rawptr[ast.AST])(at) while cur is not None and cur.kind() == ast.ASTKind.Attribute and n_items < DOC_CHAIN_MAX: - cat: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(cur) + cat: rawptr[ast.Attribute] = rawptr[ast.Attribute](cur) if cat.attr is None: break string.strcpy(items + n_items * 128, cat.attr) @@ -222,7 +222,7 @@ class ExprGenCls(ExprGenBase.ExprGenBase): # 最左应为 Name head_id: str = None if cur is not None and cur.kind() == ast.ASTKind.Name: - hnm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(cur) + hnm: rawptr[ast.Name] = rawptr[ast.Name](cur) head_id = hnm.id if head_id is None: stdlib.free(items) @@ -300,20 +300,20 @@ class ExprGenCls(ExprGenBase.ExprGenBase): # 仅采用已注册结构体;无法精确推断返回 None(fail-fast 由调用方暴露)。 # ============================================================ def infer_expr_class(self, pool: rawptr[memhub.MemBuddy], - mod: llvmlite.LLVMModule | t.CPtr, - node: ast.AST | t.CPtr, - trans: HT.Translator | t.CPtr) -> str: + mod: rawptr[llvmlite.LLVMModule], + node: rawptr[ast.AST], + trans: rawptr[HT.Translator]) -> str: """从表达式推断结构体类名,无法推断返回 None""" if node is None or trans is None: return None k: int = node.kind() # Call: 类实例化 / 方法调用 if k == ast.ASTKind.Call: - cl: ast.Call | t.CPtr = (ast.Call | t.CPtr)(node) + cl: rawptr[ast.Call] = rawptr[ast.Call](node) if cl is None or cl.func is None: return None if cl.func.kind() == ast.ASTKind.Name: - cand: str = ((ast.Name | t.CPtr)(cl.func)).id + cand: str = (rawptr[ast.Name](cl.func)).id if cand is None: return None if self.Gen.StructGen.find_struct(cand) is not None: @@ -322,12 +322,12 @@ class ExprGenCls(ExprGenBase.ExprGenBase): if cl.func.kind() == ast.ASTKind.Attribute: # 方法调用 a.cross(b):vpi 返回注解缓存精确解析返回类名 # (方法可返回非同类对象,如 Transform.world_position → 'Vec3')。 - ca: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(cl.func) + ca: rawptr[ast.Attribute] = rawptr[ast.Attribute](cl.func) if ca is None or ca.attr is None or ca.value is None: return None # 模块级函数调用(Module.func()):接收者是已导入模块名而非类对象 if ca.value.kind() == ast.ASTKind.Name: - mod_nm2: str = ((ast.Name | t.CPtr)(ca.value)).id + mod_nm2: str = (rawptr[ast.Name](ca.value)).id if mod_nm2 is not None and trans._from_imports is not None: mod_sha1_2: str = self.Gen.CallGenBase._lookup_mod_sha1( pool, trans._from_imports, mod_nm2) @@ -367,7 +367,7 @@ class ExprGenCls(ExprGenBase.ExprGenBase): return None # Name: 源变量注解 if k == ast.ASTKind.Name: - nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(node) + nm: rawptr[ast.Name] = rawptr[ast.Name](node) if nm is None or nm.id is None: return None ve: GenTypes.VarEntry | t.CPtr = self.Gen.VarGen.lookup_var_entry( @@ -388,7 +388,7 @@ class ExprGenCls(ExprGenBase.ExprGenBase): return acn_n # BinOp/UnaryOp: 运算符重载返回同类对象 if k == ast.ASTKind.BinOp: - bop: ast.BinOp | t.CPtr = (ast.BinOp | t.CPtr)(node) + bop: rawptr[ast.BinOp] = rawptr[ast.BinOp](node) if bop is None or bop.left is None: return None dunder: str = self.Gen.ExprGenOps._binop_to_dunder(bop.op) @@ -399,7 +399,7 @@ class ExprGenCls(ExprGenBase.ExprGenBase): return None return lhs_cls if k == ast.ASTKind.UnaryOp: - uop: ast.UnaryOp | t.CPtr = (ast.UnaryOp | t.CPtr)(node) + uop: rawptr[ast.UnaryOp] = rawptr[ast.UnaryOp](node) if uop is None or uop.operand is None: return None dunder: str = self.Gen.ExprGenOps._unaryop_to_dunder(uop.op) @@ -421,7 +421,7 @@ class ExprGenCls(ExprGenBase.ExprGenBase): # 避免把原生运算误标为类类型。 # ============================================================ def _cls_has_dunder(self, pool: rawptr[memhub.MemBuddy], - mod: llvmlite.LLVMModule | t.CPtr, + mod: rawptr[llvmlite.LLVMModule], class_name: str, dunder: str) -> int: """类及其 MRO 祖先链中是否存在 dunder 方法,存在返回 1""" if class_name is None or dunder is None or mod is None: diff --git a/App/lib/core/Gen/Expr/ExprGenConst.vp b/App/lib/core/Gen/Expr/ExprGenConst.vp index 8a5f83d..a5480b6 100644 --- a/App/lib/core/Gen/Expr/ExprGenConst.vp +++ b/App/lib/core/Gen/Expr/ExprGenConst.vp @@ -29,9 +29,9 @@ class ExprGenConst(ExprGenBase.ExprGenBase): # ============================================================ def create_global_string(self, builder: llvmlite.IRBuilder | t.CPtr, pool: rawptr[memhub.MemBuddy], - mod: llvmlite.LLVMModule | t.CPtr, + mod: rawptr[llvmlite.LLVMModule], str_val: str, - trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: + trans: rawptr[HT.Translator]) -> llvmlite.Value | t.CPtr: """创建全局字符串常量并返回 i8* bitcast""" escaped: str = self.escape_llvm_string(pool, str_val) if escaped is None: @@ -40,8 +40,8 @@ class ExprGenConst(ExprGenBase.ExprGenBase): slen: sizet = string.strlen(str_val) count: int = slen + 1 - i8_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int8(pool) - arr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Array(pool, i8_ty, count) + i8_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int8(pool) + arr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Array(pool, i8_ty, count) # 使用模块级计数器(trans._label_counter)避免跨函数命名冲突 str_idx: int = trans._label_counter @@ -68,14 +68,14 @@ class ExprGenConst(ExprGenBase.ExprGenBase): gv.Linkage = "internal" gv.Initializer = escaped - arr_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, arr_ty) + arr_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, arr_ty) gv_ref_name: str = pool.alloc(64) if gv_ref_name is None: return None viperlib.snprintf(gv_ref_name, 64, "@%s", gv.Name) gv_ref: llvmlite.Value | t.CPtr = llvmlite.SSAValue(pool, arr_ptr_ty, gv_ref_name) - i8_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, i8_ty) + i8_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, i8_ty) bc: llvmlite.Value | t.CPtr = llvmlite.build_bitcast(builder, gv_ref, i8_ptr_ty) return bc @@ -84,12 +84,12 @@ class ExprGenConst(ExprGenBase.ExprGenBase): # ============================================================ def translate_constant(self, builder: llvmlite.IRBuilder | t.CPtr, pool: rawptr[memhub.MemBuddy], - mod: llvmlite.LLVMModule | t.CPtr, - node: ast.AST | t.CPtr, - trans: HT.Translator | t.CPtr = None, - target_ty: llvmlite.LLVMType | t.CPtr = None) -> llvmlite.Value | t.CPtr: + mod: rawptr[llvmlite.LLVMModule], + node: rawptr[ast.AST], + trans: rawptr[HT.Translator] = None, + target_ty: rawptr[llvmlite.LLVMType] = None) -> llvmlite.Value | t.CPtr: """翻译常量(int/str/bool)""" - cn: ast.Constant | t.CPtr = (ast.Constant | t.CPtr)(node) + cn: rawptr[ast.Constant] = rawptr[ast.Constant](node) if cn is None: return None ck: int = cn.const_kind @@ -110,7 +110,7 @@ class ExprGenConst(ExprGenBase.ExprGenBase): return llvmlite.const_int32(pool, iv) elif cn.const_kind == ast.CONST_FLOAT: # 浮点常量默认创建为 double(64 位),赋值时由 coerce_to_type 自动 fptrunc - double_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Double(pool) + double_ty: rawptr[llvmlite.LLVMType] = llvmlite.Double(pool) return llvmlite.ConstFloat(pool, double_ty, cn.float_val) elif cn.const_kind == ast.CONST_CHAR: # 单引号单字符字面量(CONST_CHAR):默认按字符值(i32,coerce 截断为 i8);但当目标类型是指针(str/bytes/t.CPtr)时须物化为 1 字符字符串,否则 coerce inttoptr 把字符值当指针(如 '"'=0x22)→ 运行期 strlen 访问低地址崩溃。1a 阶段(declare_only=1)依赖函数 found_func=None,target_ty 未对齐即视为垃圾跳过,避免 is_ptr_type 解引用崩溃 @@ -138,10 +138,10 @@ class ExprGenConst(ExprGenBase.ExprGenBase): return llvmlite.const_int32(pool, 0) elif cn.const_kind == ast.CONST_NONE: # None → i8* null(空指针常量),用于 `p is None` / `p is not None` 比较 - i8_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int8(pool) + i8_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int8(pool) if i8_ty is None: return None - i8_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, i8_ty) + i8_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, i8_ty) if i8_ptr_ty is None: return None rv_none: llvmlite.Value | t.CPtr = llvmlite.ConstNull(pool, i8_ptr_ty, "null") @@ -161,7 +161,7 @@ class ExprGenConst(ExprGenBase.ExprGenBase): """ if value is None or value.Ty is None: return None - ty: llvmlite.LLVMType | t.CPtr = value.Ty + ty: rawptr[llvmlite.LLVMType] = value.Ty bits: int = self.get_llvm_type_bits(ty) if bits != 0: if bits == 32: @@ -187,7 +187,7 @@ class ExprGenConst(ExprGenBase.ExprGenBase): # # 依次尝试 "pool", "_mbuddy", "mbuddy", "mb" # ============================================================ - def _find_pool_var(self, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: + def _find_pool_var(self, trans: rawptr[HT.Translator]) -> llvmlite.Value | t.CPtr: """查找上下文中的 pool 变量,返回 alloca 或 None 查找顺序: pool → _mbuddy → mbuddy → mb @@ -224,8 +224,8 @@ class ExprGenConst(ExprGenBase.ExprGenBase): if existing is not None: return existing # 创建 i8* 类型(t.CPtr = i8*) - i8_ty_fb: llvmlite.LLVMType | t.CPtr = llvmlite.Int8(pool) - i8_ptr_ty_fb: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, i8_ty_fb) + i8_ty_fb: rawptr[llvmlite.LLVMType] = llvmlite.Int8(pool) + i8_ptr_ty_fb: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, i8_ty_fb) # 当前模块 mangled 名(@<模块sha1>._mbuddy) mb_name_fb: str = self.Gen.FuncGenBase._mangle_name(trans, "_mbuddy") # 创建 linkonce_odr 定义(可被链接器合并,自给自足保证链接通过) @@ -235,7 +235,7 @@ class ExprGenConst(ExprGenBase.ExprGenBase): gv_ext.Initializer = "zeroinitializer" llvmlite.module_add_global(trans.Module, gv_ext) # 创建 Value 引用(@<模块sha1>._mbuddy, 类型为 i8**) - i8_ptr_ptr_ty_fb: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, i8_ptr_ty_fb) + i8_ptr_ptr_ty_fb: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, i8_ptr_ty_fb) ref_name_fb: str = pool.alloc(96) if ref_name_fb is not None: # mangled 名带 SHA1 前缀(数字开头),引用必须加引号(见 make_global_ref) @@ -250,10 +250,10 @@ class ExprGenConst(ExprGenBase.ExprGenBase): # 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, pool: rawptr[memhub.MemBuddy], - mod: llvmlite.LLVMModule | t.CPtr, - node: ast.AST | t.CPtr, + mod: rawptr[llvmlite.LLVMModule], + node: rawptr[ast.AST], elem_type_name: str, - trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: + trans: rawptr[HT.Translator]) -> llvmlite.Value | t.CPtr: """翻译 list 字面量 [a, b, c] → list[T](pool) + append 序列""" if node is None or trans is None: return None @@ -262,7 +262,7 @@ class ExprGenConst(ExprGenBase.ExprGenBase): if list_node is None: return None - elts: list[ast.AST | t.CPtr] | t.CPtr = list_node.elts + elts: list[rawptr[ast.AST]] | t.CPtr = list_node.elts elts_count: sizet = 0 if elts is not None: elts_count = len(elts) @@ -272,7 +272,7 @@ class ExprGenConst(ExprGenBase.ExprGenBase): first_elem_val: llvmlite.Value | t.CPtr = None if inferred_type_name is None: if elts_count > 0: - first_elem_node: ast.AST | t.CPtr = elts.get(0) + first_elem_node: rawptr[ast.AST] = elts.get(0) first_elem_val = self.Gen.ExprGen.translate_value(builder, pool, mod, first_elem_node, None, 0, trans) if first_elem_val is None or first_elem_val.Ty is None: # fail-fast:首元素翻译失败/Value 类型缺失,立即终止编译(暴露上游根因) @@ -294,8 +294,8 @@ class ExprGenConst(ExprGenBase.ExprGenBase): return None # load pool 变量值(i8*) - i8_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int8(pool) - i8_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, i8_ty) + i8_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int8(pool) + i8_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, i8_ty) pool_val: llvmlite.Value | t.CPtr = llvmlite.build_load(builder, i8_ptr_ty, pool_alloca) if pool_val is None: return None @@ -313,7 +313,7 @@ class ExprGenConst(ExprGenBase.ExprGenBase): if struct_entry is None: self.Gen.TypeGenErr.fatal_error(node, "list literal specialized class not registered") return None - struct_ty: llvmlite.LLVMType | t.CPtr = struct_entry.Ty + struct_ty: rawptr[llvmlite.LLVMType] = struct_entry.Ty if struct_ty is None: return None @@ -372,7 +372,7 @@ class ExprGenConst(ExprGenBase.ExprGenBase): # 翻译剩余元素 i: sizet = 1 while i < elts_count: - elem_node_i: ast.AST | t.CPtr = elts.get(i) + elem_node_i: rawptr[ast.AST] = elts.get(i) elem_val_i: llvmlite.Value | t.CPtr = self.Gen.ExprGen.translate_value(builder, pool, mod, elem_node_i, None, 0, trans) if elem_val_i is not None: ap_args: sizet | t.CPtr = pool.alloc(8 * 32) diff --git a/App/lib/core/Gen/Expr/ExprGenFstr.vp b/App/lib/core/Gen/Expr/ExprGenFstr.vp index 737aa85..89c1a64 100644 --- a/App/lib/core/Gen/Expr/ExprGenFstr.vp +++ b/App/lib/core/Gen/Expr/ExprGenFstr.vp @@ -37,9 +37,9 @@ class ExprGenFstr(ExprGenBase.ExprGenBase): # ============================================================ def translate_joined_str(self, builder: llvmlite.IRBuilder | t.CPtr, pool: rawptr[memhub.MemBuddy], - mod: llvmlite.LLVMModule | t.CPtr, - node: ast.AST | t.CPtr, - trans: HT.Translator | t.CPtr = None) -> llvmlite.Value | t.CPtr: + mod: rawptr[llvmlite.LLVMModule], + node: rawptr[ast.AST], + trans: rawptr[HT.Translator] = None) -> llvmlite.Value | t.CPtr: """f-string → snprintf 生成 i8* 栈缓冲""" if node is None or builder is None or trans is None: return None @@ -58,14 +58,14 @@ class ExprGenFstr(ExprGenBase.ExprGenBase): arg_tail: llvmlite.Value | t.CPtr = None arg_count: int = 0 - parts: list[ast.AST | t.CPtr] | t.CPtr = js.values + parts: list[rawptr[ast.AST]] | t.CPtr = js.values pn: sizet = len(parts) for pi in range(pn): - part: ast.AST | t.CPtr = parts.get(pi) + part: rawptr[ast.AST] = parts.get(pi) if part is None: continue if part.kind() == ast.ASTKind.Constant: - pcn: ast.Constant | t.CPtr = (ast.Constant | t.CPtr)(part) + pcn: rawptr[ast.Constant] = rawptr[ast.Constant](part) if pcn.const_kind == ast.CONST_STR and pcn.str_val is not None: self._fstr_append_literal(fmt_buf, pcn.str_val) continue @@ -109,9 +109,9 @@ class ExprGenFstr(ExprGenBase.ExprGenBase): 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, pool: rawptr[memhub.MemBuddy], - mod: llvmlite.LLVMModule | t.CPtr, - node: ast.AST | t.CPtr, - trans: HT.Translator | t.CPtr = None) -> llvmlite.Value | t.CPtr: + mod: rawptr[llvmlite.LLVMModule], + node: rawptr[ast.AST], + trans: rawptr[HT.Translator] = None) -> llvmlite.Value | t.CPtr: """翻译裸 FormattedValue(f"{expr:spec}" 无字面量时解析器返回 FormattedValue 而非 JoinedStr)""" if node is None or builder is None or trans is None: return None @@ -153,15 +153,15 @@ class ExprGenFstr(ExprGenBase.ExprGenBase): 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, pool: rawptr[memhub.MemBuddy], - mod: llvmlite.LLVMModule | t.CPtr, + mod: rawptr[llvmlite.LLVMModule], fmt_buf: str, arg_head: llvmlite.Value | t.CPtr, arg_tail: llvmlite.Value | t.CPtr, arg_count: int, - trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: + trans: rawptr[HT.Translator]) -> llvmlite.Value | t.CPtr: """f-string 尾部:全局格式串 + 固定栈缓冲 + snprintf,返回 i8*""" - i32_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int32(pool) - i8_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int8(pool) + i32_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int32(pool) + i8_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int8(pool) if fmt_buf is None or fmt_buf[0] == '\0': # 空 f-string(f"")→ 空字符串常量 return self.Gen.ExprGenConst.create_global_string(builder, pool, mod, "", trans) @@ -171,7 +171,7 @@ class ExprGenFstr(ExprGenBase.ExprGenBase): if fmt_ptr is None: return None # 固定栈缓冲 [FSTR_BUF_SIZE x i8],GEP(0,0) 取 i8* - buf_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Array(pool, i8_ty, FSTR_BUF_SIZE) + buf_ty: rawptr[llvmlite.LLVMType] = llvmlite.Array(pool, i8_ty, FSTR_BUF_SIZE) buf_alloca: llvmlite.Value | t.CPtr = self.Gen.VarGen._alloca_at_entry(builder, buf_ty) if buf_alloca is None: return None @@ -224,9 +224,9 @@ class ExprGenFstr(ExprGenBase.ExprGenBase): if cur_len + src_len < FSTR_BUF_SIZE: string.strcpy(fmt_buf + cur_len, s) def _fstr_parse_format_spec(self, pool: rawptr[memhub.MemBuddy], - spec_node: ast.AST | t.CPtr, + spec_node: rawptr[ast.AST], val: llvmlite.Value | t.CPtr, - arg_node: ast.AST | t.CPtr) -> str: + arg_node: rawptr[ast.AST]) -> str: """Python format_spec → C printf 格式串(pool 分配),无法解析返回 None""" if spec_node is None or pool is None or val is None: return None @@ -242,18 +242,18 @@ class ExprGenFstr(ExprGenBase.ExprGenBase): return None vn: sizet = len(jss.values) for vi in range(vn): - vpart: ast.AST | t.CPtr = jss.values.get(vi) + vpart: rawptr[ast.AST] = jss.values.get(vi) if vpart is None: continue if vpart.kind() != ast.ASTKind.Constant: return None - vcn: ast.Constant | t.CPtr = (ast.Constant | t.CPtr)(vpart) + vcn: rawptr[ast.Constant] = rawptr[ast.Constant](vpart) if vcn.const_kind != ast.CONST_STR or vcn.str_val is None: return None if string.strlen(spec) + string.strlen(vcn.str_val) < FSTR_SPEC_MAX - 1: string.strcat(spec, vcn.str_val) elif sk == ast.ASTKind.Constant: - cn: ast.Constant | t.CPtr = (ast.Constant | t.CPtr)(spec_node) + cn: rawptr[ast.Constant] = rawptr[ast.Constant](spec_node) if cn.const_kind != ast.CONST_STR or cn.str_val is None: return None string.strncpy(spec, cn.str_val, FSTR_SPEC_MAX - 1) @@ -408,8 +408,8 @@ class ExprGenFstr(ExprGenBase.ExprGenBase): return out def _fstr_infer_c_fmt(self, pool: rawptr[memhub.MemBuddy], val: llvmlite.Value | t.CPtr, - arg_node: ast.AST | t.CPtr, - trans: HT.Translator | t.CPtr) -> str: + arg_node: rawptr[ast.AST], + trans: rawptr[HT.Translator]) -> str: """无 format_spec 时按值类型推断 C printf 格式(对齐 TPC 无 spec 分支,带 % 前缀)""" if val is None or pool is None: return None @@ -446,8 +446,8 @@ class ExprGenFstr(ExprGenBase.ExprGenBase): pool: rawptr[memhub.MemBuddy], val: llvmlite.Value | t.CPtr, c_fmt: str, - arg_node: ast.AST | t.CPtr, - trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: + arg_node: rawptr[ast.AST], + trans: rawptr[HT.Translator]) -> llvmlite.Value | t.CPtr: """按 C 格式转换值类型(i8/i16→i32、bool→i32、f32→f64)""" if val is None or c_fmt is None: return None @@ -464,7 +464,7 @@ class ExprGenFstr(ExprGenBase.ExprGenBase): if ch != 'l' and ch != 'h': fmt_char = ch break - i32_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int32(pool) + i32_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int32(pool) if fmt_char == 's': return val if fmt_char == 'c': diff --git a/App/lib/core/Gen/Expr/ExprGenMixin.vp b/App/lib/core/Gen/Expr/ExprGenMixin.vp index 561d1ca..c90e1a0 100644 --- a/App/lib/core/Gen/Expr/ExprGenMixin.vp +++ b/App/lib/core/Gen/Expr/ExprGenMixin.vp @@ -62,12 +62,12 @@ class ExprGenMixin(ExprGenBase.ExprGenBase): # ============================================================ def translate_value(self, builder: llvmlite.IRBuilder | t.CPtr, pool: rawptr[memhub.MemBuddy], - mod: llvmlite.LLVMModule | t.CPtr, - node: ast.AST | t.CPtr, + mod: rawptr[llvmlite.LLVMModule], + node: rawptr[ast.AST], funcs_ptr: t.CPtr = None, func_count: int = 0, - trans: HT.Translator | t.CPtr = None, - target_ty: llvmlite.LLVMType | t.CPtr = None) -> llvmlite.Value | t.CPtr: + trans: rawptr[HT.Translator] = None, + target_ty: rawptr[llvmlite.LLVMType] = None) -> llvmlite.Value | t.CPtr: """翻译值表达式为 LLVM Value(深度守卫包装器,原逻辑见 _translate_value_impl) target_ty: 目标类型上下文(如调用形参类型/赋值目标类型),用于单引号 @@ -86,12 +86,12 @@ class ExprGenMixin(ExprGenBase.ExprGenBase): def _translate_value_impl(self, builder: llvmlite.IRBuilder | t.CPtr, pool: rawptr[memhub.MemBuddy], - mod: llvmlite.LLVMModule | t.CPtr, - node: ast.AST | t.CPtr, + mod: rawptr[llvmlite.LLVMModule], + node: rawptr[ast.AST], funcs_ptr: t.CPtr = None, func_count: int = 0, - trans: HT.Translator | t.CPtr = None, - target_ty: llvmlite.LLVMType | t.CPtr = None) -> llvmlite.Value | t.CPtr: + trans: rawptr[HT.Translator] = None, + target_ty: rawptr[llvmlite.LLVMType] = None) -> llvmlite.Value | t.CPtr: """翻译值表达式为 LLVM Value""" if node is None: return None @@ -139,9 +139,9 @@ class ExprGenMixin(ExprGenBase.ExprGenBase): # await(M1 覆盖有限场景,详见 AsyncGenMixin._emit_await)。 aw: ast.Await | t.CPtr = (ast.Await | t.CPtr)(node) if aw is not None and aw.value is not None and aw.value.kind() == ast.ASTKind.Call: - aw_cl: ast.Call | t.CPtr = (ast.Call | t.CPtr)(aw.value) + aw_cl: rawptr[ast.Call] = rawptr[ast.Call](aw.value) if aw_cl.func is not None and aw_cl.func.kind() == ast.ASTKind.Name: - aw_nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(aw_cl.func) + aw_nm: rawptr[ast.Name] = rawptr[ast.Name](aw_cl.func) if aw_nm.id is not None and trans is not None: if self.Gen.AsyncGen.is_async_func(trans, aw_nm.id) != 0: return self.Gen.AsyncGen._emit_await( @@ -155,7 +155,7 @@ class ExprGenMixin(ExprGenBase.ExprGenBase): st: ast.Starred | t.CPtr = (ast.Starred | t.CPtr)(node) if st is None or st.value is None: return None - deref_node: ast.AST | t.CPtr = ast.UnaryOp(pool, ast.OpKind.Deref, st.value) + deref_node: rawptr[ast.AST] = ast.UnaryOp(pool, ast.OpKind.Deref, st.value) if deref_node is None: return None return self.Gen.ExprGenOps.translate_unaryop(builder, pool, mod, deref_node, trans) diff --git a/App/lib/core/Gen/Expr/ExprGenName.vp b/App/lib/core/Gen/Expr/ExprGenName.vp index b32befd..b5464e0 100644 --- a/App/lib/core/Gen/Expr/ExprGenName.vp +++ b/App/lib/core/Gen/Expr/ExprGenName.vp @@ -52,16 +52,16 @@ class ExprGenName(ExprGenBase.ExprGenBase): def translate_name_value(self, builder: llvmlite.IRBuilder | t.CPtr, pool: rawptr[memhub.MemBuddy], - node: ast.AST | t.CPtr, - trans: HT.Translator | t.CPtr = None) -> llvmlite.Value | t.CPtr: + node: rawptr[ast.AST], + trans: rawptr[HT.Translator] = None) -> llvmlite.Value | t.CPtr: """翻译变量引用(Name 节点)→ load""" # mod 必须取自 trans.Module:函数签名无 mod 参数,若用裸名 mod 会被 # 解析为 None → create_global_string 的 module_add_global(None, gv) 被 # add_global 的 `if self is None: return` 静默丢弃 → 字符串 CDefine 的 # global 定义丢失但 _label_counter/IR 引用已生成 → llc 报 # "use of undefined value '@.str.{sha1}.N'(SysLibTest _cleanup 根因)" - mod: llvmlite.LLVMModule | t.CPtr = trans.Module - nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(node) + mod: rawptr[llvmlite.LLVMModule] = trans.Module + nm: rawptr[ast.Name] = rawptr[ast.Name](node) if nm is None: return None nm_id: str = nm.id @@ -134,7 +134,7 @@ class ExprGenName(ExprGenBase.ExprGenBase): fi_ref: llvmlite.Value | t.CPtr = self.Gen.ExprGenAttr.make_global_ref( pool, fi_gv.Name, fi_gv.Ty) if fi_ref is not None and fi_ref.Ty is not None: - fi_pty: llvmlite.LLVMType | t.CPtr = fi_ref.Ty.Pointee + fi_pty: rawptr[llvmlite.LLVMType] = fi_ref.Ty.Pointee if fi_pty is not None: match fi_pty: case llvmlite.LLVMType.Array(_, _): @@ -150,7 +150,7 @@ class ExprGenName(ExprGenBase.ExprGenBase): mod_alloca: llvmlite.Value | t.CPtr = self.Gen.VarGen.lookup_module_var( trans.SymTab, nm_id) if mod_alloca is not None: - load_ty: llvmlite.LLVMType | t.CPtr = None + load_ty: rawptr[llvmlite.LLVMType] = None if mod_alloca.Ty is not None: load_ty = mod_alloca.Ty.Pointee if load_ty is None: @@ -186,7 +186,7 @@ class ExprGenName(ExprGenBase.ExprGenBase): # 导致 SymTab 已注册的局部变量查找不到(rhs_val is None bug 根因) alloca: llvmlite.Value | t.CPtr = self.Gen.VarGen.lookup_var(trans.SymTab, nm_id) if alloca is not None: - load_ty: llvmlite.LLVMType | t.CPtr = None + load_ty: rawptr[llvmlite.LLVMType] = None if alloca.Ty is not None: load_ty = alloca.Ty.Pointee if load_ty is None: @@ -225,25 +225,25 @@ class ExprGenName(ExprGenBase.ExprGenBase): # 最终打印出 `declare void @()` 空名函数。正确做法:按 Function 的 # RetTy/Params 构造真实函数类型,用 new_value 包装成普通 Value 再 bitcast。 if trans is not None and trans.Module is not None: - fn_ref: llvmlite.Function | t.CPtr = self.Gen.CallGenBase.find_func_in_module( + fn_ref: rawptr[llvmlite.Function] = self.Gen.CallGenBase.find_func_in_module( trans.Module, nm_id) if fn_ref is not None: fn_name: str = llvmlite.function_get_name(fn_ref) if fn_name is None: return None # 构造函数类型:ret_ty + 参数 ParamNode 链表 - fn_ret_ty: llvmlite.LLVMType | t.CPtr = llvmlite.function_get_ret_ty(fn_ref) + fn_ret_ty: rawptr[llvmlite.LLVMType] = llvmlite.function_get_ret_ty(fn_ref) if fn_ret_ty is None: # fail-fast:函数返回类型缺失,无法构造函数指针(暴露上游根因) self.Gen.TypeGenErr.fatal_error( node, f"函数 '{nm_id}' 返回类型缺失,无法构造函数指针", "TypeError") fn_pp: llvmlite.Param | t.CPtr = llvmlite.function_get_param_head(fn_ref) - fn_first_node: llvmlite.ParamNode | t.CPtr = None - fn_prev_node: llvmlite.ParamNode | t.CPtr = None + fn_first_node: rawptr[llvmlite.Function] = None + fn_prev_node: rawptr[llvmlite.Function] = None fn_pcount: int = 0 while fn_pp is not None: - fn_pty: llvmlite.LLVMType | t.CPtr = llvmlite.param_get_ty(fn_pp) - fn_pn: llvmlite.ParamNode | t.CPtr = llvmlite.new_param_node(pool, fn_pty) + fn_pty: rawptr[llvmlite.LLVMType] = llvmlite.param_get_ty(fn_pp) + fn_pn: rawptr[llvmlite.Function] = llvmlite.new_param_node(pool, fn_pty) if fn_pn is not None: if fn_first_node is None: fn_first_node = fn_pn @@ -252,7 +252,7 @@ class ExprGenName(ExprGenBase.ExprGenBase): fn_prev_node = fn_pn fn_pcount += 1 fn_pp = llvmlite.param_get_next(fn_pp) - fn_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Func( + fn_ty: rawptr[llvmlite.LLVMType] = llvmlite.Func( pool, fn_ret_ty, fn_first_node, fn_pcount) if fn_ty is None: return None @@ -270,7 +270,7 @@ class ExprGenName(ExprGenBase.ExprGenBase): else: viperlib.snprintf(fn_ref_name, 256, "@%s", fn_name) llvmlite.value_set_name(fn_ref_v, fn_ref_name) - fn_i8ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr( + fn_i8ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr( pool, llvmlite.Int8(pool)) return llvmlite.build_bitcast(builder, fn_ref_v, fn_i8ptr_ty) @@ -333,7 +333,7 @@ class ExprGenName(ExprGenBase.ExprGenBase): # "stub 未注入"。 return None if ref_fi is not None and ref_fi.Ty is not None: - lty_fi: llvmlite.LLVMType | t.CPtr = ref_fi.Ty.Pointee + lty_fi: rawptr[llvmlite.LLVMType] = ref_fi.Ty.Pointee if lty_fi is not None: return llvmlite.build_load(builder, lty_fi, ref_fi) return ref_fi @@ -366,13 +366,13 @@ class ExprGenName(ExprGenBase.ExprGenBase): pool: rawptr[memhub.MemBuddy], lm_obj: llvmlite.Value | t.CPtr, idx_val: llvmlite.Value | t.CPtr, - node: ast.AST | t.CPtr = None) -> llvmlite.Value | t.CPtr: + node: rawptr[ast.AST] = None) -> llvmlite.Value | t.CPtr: """内联生成 list __getitem__ 逻辑,返回元素地址 (i8*)""" if builder is None or pool is None or lm_obj is None or idx_val is None: return None - i64_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int64(pool) - i8_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int8(pool) - i8_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, i8_ty) + i64_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int64(pool) + i8_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int8(pool) + i8_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, i8_ty) # 加载 __data__ (偏移 0, index 0) g_idx0: llvmlite.Value | t.CPtr = llvmlite.const_int64(pool, 0) g_dpp: llvmlite.Value | t.CPtr = llvmlite.build_gep(builder, i64_ty, lm_obj, g_idx0) @@ -404,7 +404,7 @@ class ExprGenName(ExprGenBase.ExprGenBase): # 默认: i32 # ============================================================ def _list_elem_type_from_name(self, pool: rawptr[memhub.MemBuddy], - struct_name: str) -> llvmlite.LLVMType | t.CPtr: + struct_name: str) -> rawptr[llvmlite.LLVMType]: """从 list 类型名提取元素 LLVM 类型""" if pool is None or struct_name is None: return None @@ -430,7 +430,7 @@ class ExprGenName(ExprGenBase.ExprGenBase): if string.strstr(struct_name, "list[CChar]") is not None: return llvmlite.Int8(pool) # str/bytes/CPtr 等已知指针元素类型 → i8*(元素存储为 8 字节地址) - i8_ty_d: llvmlite.LLVMType | t.CPtr = llvmlite.Int8(pool) + i8_ty_d: rawptr[llvmlite.LLVMType] = llvmlite.Int8(pool) if string.strstr(struct_name, "list[str]") is not None: return llvmlite.Ptr(pool, i8_ty_d) if string.strstr(struct_name, "list[bytes]") is not None: @@ -445,7 +445,7 @@ class ExprGenName(ExprGenBase.ExprGenBase): # 才能经 LLVM 类型解析出类名 AST(T29 修复);否则统一 Ptr(i8) 丢失 # 类名,.kind() 被当未绑定外部函数(AstTest NewAstTest fatal: 'kind' # 根因:list 元素类名没有沿 get(0) 调用结果值类型传播到后续分派)。 - elem_obj_ty_l: llvmlite.LLVMType | t.CPtr = \ + elem_obj_ty_l: rawptr[llvmlite.LLVMType] = \ self._list_elem_obj_ty_from_struct_name(pool, struct_name) if elem_obj_ty_l is not None: return elem_obj_ty_l @@ -465,7 +465,7 @@ class ExprGenName(ExprGenBase.ExprGenBase): # 返回 None(调用方回退 Ptr(i8) 旧行为,不影响已支持的内置元素)。 # ============================================================ def _list_elem_obj_ty_from_struct_name(self, pool: rawptr[memhub.MemBuddy], - struct_name: str) -> llvmlite.LLVMType | t.CPtr: + struct_name: str) -> rawptr[llvmlite.LLVMType]: """从 list 特化类型名还原元素对象指针 LLVM 类型,失败返回 None""" if pool is None or struct_name is None: return None @@ -536,13 +536,13 @@ class ExprGenName(ExprGenBase.ExprGenBase): lm_obj: llvmlite.Value | t.CPtr, idx_val: llvmlite.Value | t.CPtr, rhs_val: llvmlite.Value | t.CPtr, - node: ast.AST | t.CPtr = None) -> int: + node: rawptr[ast.AST] = None) -> int: """内联生成 list __setitem__ 逻辑,返回 0""" if builder is None or pool is None or lm_obj is None or idx_val is None or rhs_val is None: return 0 - i64_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int64(pool) - i8_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int8(pool) - i8_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, i8_ty) + i64_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int64(pool) + i8_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int8(pool) + i8_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, i8_ty) # 加载 __data__ (偏移 0, index 0) s_idx0: llvmlite.Value | t.CPtr = llvmlite.const_int64(pool, 0) s_dpp: llvmlite.Value | t.CPtr = llvmlite.build_gep(builder, i64_ty, lm_obj, s_idx0) @@ -569,11 +569,11 @@ class ExprGenName(ExprGenBase.ExprGenBase): # 元素类型 T:从 list 特化类型名解析(list[int]→i32、list[str]→i8*)。 # 此前固定 i8*(8 字节)store(inttoptr 值)覆盖相邻元素——与 # CallGenMixin list 内置分支同根因(ListTest pop FAILED expect 30)。 - s_sty: llvmlite.LLVMType | t.CPtr = self.Gen.StructGen.get_struct_type_from_value(lm_obj) + s_sty: rawptr[llvmlite.LLVMType] = self.Gen.StructGen.get_struct_type_from_value(lm_obj) s_name: str = None if s_sty is not None: s_name = llvmlite.get_struct_name(s_sty) - s_elem_ty: llvmlite.LLVMType | t.CPtr = None + s_elem_ty: rawptr[llvmlite.LLVMType] = None if s_name is not None: s_elem_ty = self._list_elem_type_from_name(pool, s_name) if s_elem_ty is None: @@ -591,17 +591,17 @@ class ExprGenName(ExprGenBase.ExprGenBase): # # 返回 list 对象指针 (Ptr(list[T])) 或 None # ============================================================ - def is_list_subscript(self, node: ast.AST | t.CPtr, - trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: + def is_list_subscript(self, node: rawptr[ast.AST], + trans: rawptr[HT.Translator]) -> llvmlite.Value | t.CPtr: """检查 Subscript 节点是否是 list[T] 类型,返回 list 对象指针或 None""" if node is None or trans is None: return None - sub: ast.Subscript | t.CPtr = (ast.Subscript | t.CPtr)(node) + sub: rawptr[ast.Subscript] = rawptr[ast.Subscript](node) if sub is None or sub.value is None: return None if sub.value.kind() != ast.ASTKind.Name: return None - nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(sub.value) + nm: rawptr[ast.Name] = rawptr[ast.Name](sub.value) if nm is None or nm.id is None: return None alloca: llvmlite.Value | t.CPtr = self.Gen.VarGen.lookup_var(trans.SymTab, nm.id) @@ -609,11 +609,11 @@ class ExprGenName(ExprGenBase.ExprGenBase): return None if self.is_ptr_type(alloca.Ty) == 0: return None - pointee: llvmlite.LLVMType | t.CPtr = alloca.Ty.Pointee + pointee: rawptr[llvmlite.LLVMType] = alloca.Ty.Pointee if pointee is None: return None # 检查 pointee 是否是 Ptr(Struct) - inner_ty: llvmlite.LLVMType | t.CPtr = None + inner_ty: rawptr[llvmlite.LLVMType] = None match pointee: case llvmlite.LLVMType.Ptr(it): inner_ty = it @@ -638,13 +638,13 @@ class ExprGenName(ExprGenBase.ExprGenBase): # _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, pool: rawptr[memhub.MemBuddy], - trans: HT.Translator | t.CPtr, + trans: rawptr[HT.Translator], nm_id: str, idx_val: llvmlite.Value | t.CPtr) -> llvmlite.Value | t.CPtr: """nonlocal 数组/指针下标:从 env 读堆地址 → bitcast → GEP,返回元素指针""" if trans is None or nm_id is None or idx_val is None: return None - nl_ty: llvmlite.LLVMType | t.CPtr = GenApi.get_nonlocal_type(trans, nm_id) + nl_ty: rawptr[llvmlite.LLVMType] = GenApi.get_nonlocal_type(trans, nm_id) if nl_ty is None: return None raw_nl: llvmlite.Value | t.CPtr = self.Gen.StmtGenDecl._load_raw_var_ptr(trans, nm_id) @@ -681,13 +681,13 @@ class ExprGenName(ExprGenBase.ExprGenBase): # ============================================================ def translate_subscript(self, builder: llvmlite.IRBuilder | t.CPtr, pool: rawptr[memhub.MemBuddy], - mod: llvmlite.LLVMModule | t.CPtr, - node: ast.AST | t.CPtr, - trans: HT.Translator | t.CPtr = None) -> llvmlite.Value | t.CPtr: + mod: rawptr[llvmlite.LLVMModule], + node: rawptr[ast.AST], + trans: rawptr[HT.Translator] = None) -> llvmlite.Value | t.CPtr: """翻译下标表达式,返回加载的元素值""" if node is None or builder is None: return None - sub: ast.Subscript | t.CPtr = (ast.Subscript | t.CPtr)(node) + sub: rawptr[ast.Subscript] = rawptr[ast.Subscript](node) if sub is None: return None @@ -708,7 +708,7 @@ class ExprGenName(ExprGenBase.ExprGenBase): builder, pool, mod, slc.lower, None, 0, trans) if start_v is None: return None - i64_sc: llvmlite.LLVMType | t.CPtr = llvmlite.Int64(pool) + i64_sc: rawptr[llvmlite.LLVMType] = llvmlite.Int64(pool) start_w: llvmlite.Value | t.CPtr = start_v if start_v.Ty is not None: bt_sc: int = self.Gen.ExprGenBase.get_llvm_type_bits(start_v.Ty) @@ -716,7 +716,7 @@ class ExprGenName(ExprGenBase.ExprGenBase): start_w = llvmlite.build_sext(builder, start_v, i64_sc) if start_w is None: return None - i8_sc: llvmlite.LLVMType | t.CPtr = llvmlite.Int8(pool) + i8_sc: rawptr[llvmlite.LLVMType] = llvmlite.Int8(pool) return llvmlite.build_gep(builder, i8_sc, base_v, start_w) # 翻译索引 @@ -734,7 +734,7 @@ class ExprGenName(ExprGenBase.ExprGenBase): builder, pool, mod, sub.value, trans) if inner_ptr_r is None or inner_ptr_r.Ty is None: return None - inner_elem_r: llvmlite.LLVMType | t.CPtr = inner_ptr_r.Ty.Pointee + inner_elem_r: rawptr[llvmlite.LLVMType] = inner_ptr_r.Ty.Pointee if inner_elem_r is None: return None match inner_elem_r: @@ -754,7 +754,7 @@ class ExprGenName(ExprGenBase.ExprGenBase): # 如果 value 是 Name,尝试从 alloca 类型推断 if sub.value is not None and sub.value.kind() == ast.ASTKind.Name: - nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(sub.value) + nm: rawptr[ast.Name] = rawptr[ast.Name](sub.value) if nm.id is not None and trans is not None: # nonlocal 数组/指针:从 env 读共享堆地址(提升函数内不能 # lookup_var 外层 alloca——SSA 编号跨函数错乱崩溃) @@ -763,14 +763,14 @@ class ExprGenName(ExprGenBase.ExprGenBase): nl_ptr_r: llvmlite.Value | t.CPtr = self._nonlocal_subscript_ptr( builder, pool, trans, nm.id, idx_val) if nl_ptr_r is not None and nl_ptr_r.Ty is not None: - nl_elem_ty: llvmlite.LLVMType | t.CPtr = nl_ptr_r.Ty.Pointee + nl_elem_ty: rawptr[llvmlite.LLVMType] = nl_ptr_r.Ty.Pointee if nl_elem_ty is not None: return llvmlite.build_load(builder, nl_elem_ty, nl_ptr_r) return None alloca: llvmlite.Value | t.CPtr = self.Gen.VarGen.lookup_var(trans.SymTab, nm.id) if alloca is not None and alloca.Ty is not None: if self.is_ptr_type(alloca.Ty) != 0: - pointee: llvmlite.LLVMType | t.CPtr = alloca.Ty.Pointee + pointee: rawptr[llvmlite.LLVMType] = alloca.Ty.Pointee if pointee is not None: # 不调用 pointee.kind() 避免跨模块引用 LLVMType.kind 符号 # 用 match 检查 pointee 类型 @@ -795,10 +795,10 @@ class ExprGenName(ExprGenBase.ExprGenBase): self.list_getitem_inline( builder, pool, alloca, idx_val, node) if elem_addr_v is not None: - elem_ty_v: llvmlite.LLVMType | t.CPtr = \ + elem_ty_v: rawptr[llvmlite.LLVMType] = \ self._list_elem_type_from_name(pool, lsn_v) if elem_ty_v is not None: - elem_ptr_ty_v: llvmlite.LLVMType | t.CPtr = \ + elem_ptr_ty_v: rawptr[llvmlite.LLVMType] = \ llvmlite.Ptr(pool, elem_ty_v) casted_v: llvmlite.Value | t.CPtr = \ llvmlite.build_bitcast( @@ -826,10 +826,10 @@ class ExprGenName(ExprGenBase.ExprGenBase): builder, pool, ptr_val_list, idx_val, node) if elem_addr_list is not None: # 根据类型名提取元素类型,bitcast 后 load - elem_ty_list: llvmlite.LLVMType | t.CPtr = self._list_elem_type_from_name( + elem_ty_list: rawptr[llvmlite.LLVMType] = self._list_elem_type_from_name( pool, list_struct_name) if elem_ty_list is not None: - elem_ptr_ty_list: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr( + elem_ptr_ty_list: rawptr[llvmlite.LLVMType] = llvmlite.Ptr( pool, elem_ty_list) casted_addr_list: llvmlite.Value | t.CPtr = llvmlite.build_bitcast( builder, elem_addr_list, elem_ptr_ty_list) @@ -923,7 +923,7 @@ class ExprGenName(ExprGenBase.ExprGenBase): match pointee: case llvmlite.LLVMType.Int(bits_rd): if bits_rd == 8: - i8_ptr_rd: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr( + i8_ptr_rd: rawptr[llvmlite.LLVMType] = llvmlite.Ptr( pool, llvmlite.Int8(pool)) elem_ptr_rd: llvmlite.Value | t.CPtr = llvmlite.build_gep( builder, i8_ptr_rd, alloca, idx_val) @@ -971,7 +971,7 @@ class ExprGenName(ExprGenBase.ExprGenBase): # 检查是否是指针类型 if self.is_ptr_type(ptr_val.Ty) != 0: - elem_ty2: llvmlite.LLVMType | t.CPtr = ptr_val.Ty.Pointee + elem_ty2: rawptr[llvmlite.LLVMType] = ptr_val.Ty.Pointee if elem_ty2 is not None: # 数组类型: 双索引 GEP + load 元素 match elem_ty2: @@ -1003,11 +1003,11 @@ class ExprGenName(ExprGenBase.ExprGenBase): cell_p_u64: llvmlite.Value | t.CPtr = \ llvmlite.build_gep(builder, elem_ty2, ptr_val, idx_val) if cell_p_u64 is not None: - i8_ty_u64: llvmlite.LLVMType | t.CPtr = \ + i8_ty_u64: rawptr[llvmlite.LLVMType] = \ llvmlite.Int8(pool) - i8p_ty_u64: llvmlite.LLVMType | t.CPtr = \ + i8p_ty_u64: rawptr[llvmlite.LLVMType] = \ llvmlite.Ptr(pool, i8_ty_u64) - i8pp_ty_u64: llvmlite.LLVMType | t.CPtr = \ + i8pp_ty_u64: rawptr[llvmlite.LLVMType] = \ llvmlite.Ptr(pool, i8p_ty_u64) cast_cell_u64: llvmlite.Value | t.CPtr = \ llvmlite.build_bitcast( @@ -1064,13 +1064,13 @@ class ExprGenName(ExprGenBase.ExprGenBase): def get_subscript_ptr(self, builder: llvmlite.IRBuilder | t.CPtr, pool: rawptr[memhub.MemBuddy], - mod: llvmlite.LLVMModule | t.CPtr, - node: ast.AST | t.CPtr, - trans: HT.Translator | t.CPtr = None) -> llvmlite.Value | t.CPtr: + mod: rawptr[llvmlite.LLVMModule], + node: rawptr[ast.AST], + trans: rawptr[HT.Translator] = None) -> llvmlite.Value | t.CPtr: """获取下标表达式的元素指针(用于赋值 lhs)""" if node is None or builder is None: return None - sub: ast.Subscript | t.CPtr = (ast.Subscript | t.CPtr)(node) + sub: rawptr[ast.Subscript] = rawptr[ast.Subscript](node) if sub is None: return None @@ -1090,7 +1090,7 @@ class ExprGenName(ExprGenBase.ExprGenBase): builder, pool, mod, sub.value, trans) if inner_ptr is None or inner_ptr.Ty is None: return None - inner_elem: llvmlite.LLVMType | t.CPtr = inner_ptr.Ty.Pointee + inner_elem: rawptr[llvmlite.LLVMType] = inner_ptr.Ty.Pointee if inner_elem is None: return None match inner_elem: @@ -1103,7 +1103,7 @@ class ExprGenName(ExprGenBase.ExprGenBase): # 如果 value 是 Name,尝试从 alloca 类型推断 if sub.value is not None and sub.value.kind() == ast.ASTKind.Name: - nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(sub.value) + nm: rawptr[ast.Name] = rawptr[ast.Name](sub.value) if nm.id is not None and trans is not None: # nonlocal 数组/指针:从 env 读共享堆地址(提升函数内不能 # lookup_var 外层 alloca——SSA 编号跨函数错乱崩溃) @@ -1113,7 +1113,7 @@ class ExprGenName(ExprGenBase.ExprGenBase): alloca: llvmlite.Value | t.CPtr = self.Gen.VarGen.lookup_var(trans.SymTab, nm.id) if alloca is not None and alloca.Ty is not None: if self.is_ptr_type(alloca.Ty) != 0: - pointee: llvmlite.LLVMType | t.CPtr = alloca.Ty.Pointee + pointee: rawptr[llvmlite.LLVMType] = alloca.Ty.Pointee if pointee is not None: # 用 match 检查 pointee 类型 match pointee: @@ -1173,7 +1173,7 @@ class ExprGenName(ExprGenBase.ExprGenBase): match pointee: case llvmlite.LLVMType.Int(bits_pe): if bits_pe == 8: - i8_ptr_pe: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr( + i8_ptr_pe: rawptr[llvmlite.LLVMType] = llvmlite.Ptr( pool, llvmlite.Int8(pool)) return llvmlite.build_gep( builder, i8_ptr_pe, ptr_val_pe, idx_val) @@ -1212,7 +1212,7 @@ class ExprGenName(ExprGenBase.ExprGenBase): match pointee: case llvmlite.LLVMType.Int(bits_cs): if bits_cs == 8: - i8_ptr_cs: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr( + i8_ptr_cs: rawptr[llvmlite.LLVMType] = llvmlite.Ptr( pool, llvmlite.Int8(pool)) return llvmlite.build_gep( builder, i8_ptr_cs, ptr_val_cs, idx_val) @@ -1229,7 +1229,7 @@ class ExprGenName(ExprGenBase.ExprGenBase): if ptr_val is None or ptr_val.Ty is None: return None if self.is_ptr_type(ptr_val.Ty) != 0: - elem_ty2: llvmlite.LLVMType | t.CPtr = ptr_val.Ty.Pointee + elem_ty2: rawptr[llvmlite.LLVMType] = ptr_val.Ty.Pointee if elem_ty2 is not None: # 数组类型: 双索引 GEP (getelementptr [N x ty], ptr, i32 0, i32 idx) match elem_ty2: diff --git a/App/lib/core/Gen/Expr/ExprGenOps.vp b/App/lib/core/Gen/Expr/ExprGenOps.vp index 5f389fc..47fadff 100644 --- a/App/lib/core/Gen/Expr/ExprGenOps.vp +++ b/App/lib/core/Gen/Expr/ExprGenOps.vp @@ -33,9 +33,9 @@ class ExprGenOps(ExprGenBase.ExprGenBase): # ============================================================ def translate_ifexp(self, builder: llvmlite.IRBuilder | t.CPtr, pool: rawptr[memhub.MemBuddy], - mod: llvmlite.LLVMModule | t.CPtr, - node: ast.AST | t.CPtr, - trans: HT.Translator | t.CPtr = None) -> llvmlite.Value | t.CPtr: + mod: rawptr[llvmlite.LLVMModule], + node: rawptr[ast.AST], + trans: rawptr[HT.Translator] = None) -> llvmlite.Value | t.CPtr: """翻译三元表达式 (body if test else orelse),返回 phi 结果 Value""" if node is None or builder is None or trans is None: return None @@ -43,7 +43,7 @@ class ExprGenOps(ExprGenBase.ExprGenBase): if ie is None: return None - func: llvmlite.Function | t.CPtr = trans._cur_func + func: rawptr[llvmlite.Function] = trans._cur_func if func is None: return None @@ -102,7 +102,7 @@ class ExprGenOps(ExprGenBase.ExprGenBase): # (VpiReader.vp `rel_path_rt if rel_path_rt is not None else '?'` 根因:then 是 # str(i8*)、else '?' 恒 i32 → CastError)。非指针 then 分支不下传,既有 # 常量物化与位宽行为保持不变。 - orelse_target_ty: llvmlite.LLVMType | t.CPtr = None + orelse_target_ty: rawptr[llvmlite.LLVMType] = None if self.is_ptr_type(body_val.Ty) != 0: orelse_target_ty = body_val.Ty llvmlite.position_at_end(builder, else_bb) @@ -152,7 +152,7 @@ class ExprGenOps(ExprGenBase.ExprGenBase): # 6. merge 块: phi(PHI 是 merge 块的第一条指令) llvmlite.position_at_end(builder, merge_bb) - phi_ty: llvmlite.LLVMType | t.CPtr = body_val.Ty + phi_ty: rawptr[llvmlite.LLVMType] = body_val.Ty if phi_ty is None: # fail-fast:三元表达式分支类型缺失,立即终止编译(暴露上游根因) self.Gen.TypeGenErr.fatal_error(node, "三元表达式分支类型缺失", "TypeError") @@ -175,8 +175,8 @@ class ExprGenOps(ExprGenBase.ExprGenBase): def should_zext_widen(self, pool: rawptr[memhub.MemBuddy], narrow_val: llvmlite.Value | t.CPtr, wide_val: llvmlite.Value | t.CPtr, - narrow_node: ast.AST | t.CPtr = None, - trans: HT.Translator | t.CPtr = None) -> int: + narrow_node: rawptr[ast.AST] = None, + trans: rawptr[HT.Translator] = None) -> int: """判断整数拓宽方向:1=zext(无符号语义),0=sext **拓宽方向的单一真源**:ExprGenBase._zext_or_sext_val(coerce 路径)委托到此。 @@ -233,7 +233,7 @@ class ExprGenOps(ExprGenBase.ExprGenBase): # 全 FAIL 根因)。负值 CDefine(如 -1)不在此区间(-1 > 0x7FFFFFFF 为假), # 保持 sext 语义不变。 if narrow_node is not None and narrow_node.kind() == ast.ASTKind.Name: - cdef_nm_zw: ast.Name | t.CPtr = (ast.Name | t.CPtr)(narrow_node) + cdef_nm_zw: rawptr[ast.Name] = rawptr[ast.Name](narrow_node) if cdef_nm_zw.id is not None: cdv_zw: int64 = self.Gen.TypeGenCDef.lookup_cdefine_constant(cdef_nm_zw.id) if self.Gen.TypeGenCDef.is_cdefine_found() != 0: @@ -241,8 +241,8 @@ class ExprGenOps(ExprGenBase.ExprGenBase): return 1 return 0 def _node_type_unsigned(self, pool: rawptr[memhub.MemBuddy], - node: ast.AST | t.CPtr, - trans: HT.Translator | t.CPtr = None) -> int: + node: rawptr[ast.AST], + trans: rawptr[HT.Translator] = None) -> int: """轻量判断 AST 节点是否解析为无符号整数类型(1=是,0=否/未知) 覆盖常见形态(对齐 TPC _check_node_unsigned 的 Call/Subscript 分支): @@ -254,18 +254,18 @@ class ExprGenOps(ExprGenBase.ExprGenBase): return 0 k: int = node.kind() if k == ast.ASTKind.Call: - cl: ast.Call | t.CPtr = (ast.Call | t.CPtr)(node) + cl: rawptr[ast.Call] = rawptr[ast.Call](node) if cl.func is not None and cl.func.kind() == ast.ASTKind.Attribute: - at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(cl.func) + at: rawptr[ast.Attribute] = rawptr[ast.Attribute](cl.func) if at.value is not None and at.value.kind() == ast.ASTKind.Name: - mod_nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(at.value) + mod_nm: rawptr[ast.Name] = rawptr[ast.Name](at.value) if mod_nm.id is not None and string.strcmp(mod_nm.id, "t") == 0 \ and at.attr is not None: if self._type_name_unsigned(at.attr) != 0: return 1 return 0 if k == ast.ASTKind.Name: - nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(node) + nm: rawptr[ast.Name] = rawptr[ast.Name](node) if nm.id is not None: # 1) 名字本身是无符号类型名(如 UInt32T 别名) if self._type_name_unsigned(nm.id) != 0: @@ -284,23 +284,23 @@ class ExprGenOps(ExprGenBase.ExprGenBase): return 1 return 0 if k == ast.ASTKind.BinOp: - bop: ast.BinOp | t.CPtr = (ast.BinOp | t.CPtr)(node) + bop: rawptr[ast.BinOp] = rawptr[ast.BinOp](node) if self._node_type_unsigned(pool, bop.left, trans) != 0: return 1 if self._node_type_unsigned(pool, bop.right, trans) != 0: return 1 return 0 if k == ast.ASTKind.UnaryOp: - uop: ast.UnaryOp | t.CPtr = (ast.UnaryOp | t.CPtr)(node) + uop: rawptr[ast.UnaryOp] = rawptr[ast.UnaryOp](node) if self._node_type_unsigned(pool, uop.operand, trans) != 0: return 1 return 0 if k == ast.ASTKind.Subscript: # 数组/指针下标: md5_buf[i](t.CArray[uint8, N])或 buf[i] # (形参 uint8 | t.CPtr)元素是无符号整型 → printf("%02x", ...) zext。 - sub_su: ast.Subscript | t.CPtr = (ast.Subscript | t.CPtr)(node) + sub_su: rawptr[ast.Subscript] = rawptr[ast.Subscript](node) if sub_su.value is not None and sub_su.value.kind() == ast.ASTKind.Name: - snm_su: ast.Name | t.CPtr = (ast.Name | t.CPtr)(sub_su.value) + snm_su: rawptr[ast.Name] = rawptr[ast.Name](sub_su.value) if snm_su.id is not None and trans is not None: ve_su: GenTypes.VarEntry | t.CPtr = self.Gen.VarGen.lookup_var_entry( trans.SymTab, snm_su.id) @@ -316,11 +316,11 @@ class ExprGenOps(ExprGenBase.ExprGenBase): return 0 if k == ast.ASTKind.Attribute: # 结构体字段(如 viperio.Buf 的 self.capacity/length: sizet):经接收者变量的 AnnotClassName 取类名,再按类名+字段名查字段注解,判定无符号(CSizeT/uint*)。本函数在 translate_binop 对每个操作数调用,必须只读、失败返回 0——故不走 lookup_field_by_class(其模块限定名分支会 fatal_error),改用 find_struct + 自遍历字段(未命中一律返回 0) - at_u: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(node) + at_u: rawptr[ast.Attribute] = rawptr[ast.Attribute](node) if at_u.value is not None and at_u.attr is not None and trans is not None: cls_nm_u: str = None if at_u.value.kind() == ast.ASTKind.Name: - vn_u: ast.Name | t.CPtr = (ast.Name | t.CPtr)(at_u.value) + vn_u: rawptr[ast.Name] = rawptr[ast.Name](at_u.value) if vn_u.id is not None: ve_u: GenTypes.VarEntry | t.CPtr = self.Gen.VarGen.lookup_var_entry( trans.SymTab, vn_u.id) @@ -353,8 +353,8 @@ class ExprGenOps(ExprGenBase.ExprGenBase): return 0 return 0 def _node_type_signed(self, pool: rawptr[memhub.MemBuddy], - node: ast.AST | t.CPtr, - trans: HT.Translator | t.CPtr = None) -> int: + node: rawptr[ast.AST], + trans: rawptr[HT.Translator] = None) -> int: """源节点是否**明确有符号**整数(独立真源的 SIGNED 分支;未知返回 0) 只服务 should_zext_widen 的 i8 分支:i8 默认按「无符号字节」zext, @@ -367,18 +367,18 @@ class ExprGenOps(ExprGenBase.ExprGenBase): return 0 k: int = node.kind() if k == ast.ASTKind.Call: - cl: ast.Call | t.CPtr = (ast.Call | t.CPtr)(node) + cl: rawptr[ast.Call] = rawptr[ast.Call](node) if cl.func is not None and cl.func.kind() == ast.ASTKind.Attribute: - at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(cl.func) + at: rawptr[ast.Attribute] = rawptr[ast.Attribute](cl.func) if at.value is not None and at.value.kind() == ast.ASTKind.Name: - mod_nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(at.value) + mod_nm: rawptr[ast.Name] = rawptr[ast.Name](at.value) if mod_nm.id is not None and string.strcmp(mod_nm.id, "t") == 0 \ and at.attr is not None: if self._spec_sign_from_annot(at.attr) == TSpec.TS_SIGN_SIGNED: return 1 return 0 if k == ast.ASTKind.Name: - nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(node) + nm: rawptr[ast.Name] = rawptr[ast.Name](node) if nm.id is not None: if self._spec_sign_from_annot(nm.id) == TSpec.TS_SIGN_SIGNED: return 1 @@ -392,9 +392,9 @@ class ExprGenOps(ExprGenBase.ExprGenBase): return 1 return 0 if k == ast.ASTKind.Subscript: - sub_s: ast.Subscript | t.CPtr = (ast.Subscript | t.CPtr)(node) + sub_s: rawptr[ast.Subscript] = rawptr[ast.Subscript](node) if sub_s.value is not None and sub_s.value.kind() == ast.ASTKind.Name: - snm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(sub_s.value) + snm: rawptr[ast.Name] = rawptr[ast.Name](sub_s.value) if snm.id is not None and trans is not None: ve_s: GenTypes.VarEntry | t.CPtr = self.Gen.VarGen.lookup_var_entry( trans.SymTab, snm.id) @@ -466,9 +466,9 @@ class ExprGenOps(ExprGenBase.ExprGenBase): return 0 def translate_compare(self, builder: llvmlite.IRBuilder | t.CPtr, pool: rawptr[memhub.MemBuddy], - mod: llvmlite.LLVMModule | t.CPtr, - node: ast.AST | t.CPtr, - trans: HT.Translator | t.CPtr = None) -> llvmlite.Value | t.CPtr: + mod: rawptr[llvmlite.LLVMModule], + node: rawptr[ast.AST], + trans: rawptr[HT.Translator] = None) -> llvmlite.Value | t.CPtr: """翻译比较表达式,返回 i1 结果""" cmp: ast.Compare | t.CPtr = (ast.Compare | t.CPtr)(node) if cmp is None: @@ -479,10 +479,10 @@ class ExprGenOps(ExprGenBase.ExprGenBase): return None op: int = ops_list.get(0) - comparators: list[ast.AST | t.CPtr] | t.CPtr = cmp.comparators + comparators: list[rawptr[ast.AST]] | t.CPtr = cmp.comparators if comparators is None or len(comparators) == 0: return None - rhs_node: ast.AST | t.CPtr = comparators.get(0) + rhs_node: rawptr[ast.AST] = comparators.get(0) rhs: llvmlite.Value | t.CPtr = self.Gen.ExprGen.translate_value( builder, pool, mod, rhs_node, None, 0, trans) if rhs is None: @@ -492,15 +492,15 @@ class ExprGenOps(ExprGenBase.ExprGenBase): # 避免对结构体指针生成无效的 __eq__/__ne__ 调用(方法未定义但类有 SHA1 时 # try_operator_overload 会误生成 call void @...__eq__(...) 导致链接错误) # 语义依据: Python 中 == None / != None 默认走身份比较,不调用 __eq__/__ne__ - lhs_node: ast.AST | t.CPtr = cmp.left + lhs_node: rawptr[ast.AST] = cmp.left cmp_with_none: int = 0 if op == ast.OpKind.Eq or op == ast.OpKind.Ne or op == ast.OpKind.Is or op == ast.OpKind.IsNot: if rhs_node is not None and rhs_node.kind() == ast.ASTKind.Constant: - rhs_cn: ast.Constant | t.CPtr = (ast.Constant | t.CPtr)(rhs_node) + rhs_cn: rawptr[ast.Constant] = rawptr[ast.Constant](rhs_node) if rhs_cn is not None and rhs_cn.const_kind == ast.CONST_NONE: cmp_with_none = 1 if cmp_with_none == 0 and lhs_node is not None and lhs_node.kind() == ast.ASTKind.Constant: - lhs_cn: ast.Constant | t.CPtr = (ast.Constant | t.CPtr)(lhs_node) + lhs_cn: rawptr[ast.Constant] = rawptr[ast.Constant](lhs_node) if lhs_cn is not None and lhs_cn.const_kind == ast.CONST_NONE: cmp_with_none = 1 @@ -521,7 +521,7 @@ class ExprGenOps(ExprGenBase.ExprGenBase): # 对于值类型变量(如 cnt: Counter),用 alloca 指针尝试重载 # None 比较跳过重载(走身份比较) if cmp_with_none == 0 and lhs_node is not None and lhs_node.kind() == ast.ASTKind.Name and trans is not None: - nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(lhs_node) + nm: rawptr[ast.Name] = rawptr[ast.Name](lhs_node) if nm is not None and nm.id is not None: lhs_alloca: llvmlite.Value | t.CPtr = self.Gen.VarGen.lookup_var( trans.SymTab, nm.id) @@ -552,24 +552,24 @@ class ExprGenOps(ExprGenBase.ExprGenBase): # x not in y → !y.__contains__(x)。容器无 __contains__ → # 返回 i1 0(TPC 同:恒 False)。 if op == ast.OpKind.In or op == ast.OpKind.NotIn: - cn_st: llvmlite.LLVMType | t.CPtr = self.Gen.StructGen.get_struct_type_from_value(rhs) + cn_st: rawptr[llvmlite.LLVMType] = self.Gen.StructGen.get_struct_type_from_value(rhs) if cn_st is not None: cn_cls: str = self.Gen.StructGen.get_class_name_by_type(pool, cn_st) if cn_cls is not None: cn_lookup: str = pool.alloc(128) if cn_lookup is not None: viperlib.snprintf(cn_lookup, 128, "%s.__contains__", cn_cls) - cn_fn: llvmlite.Function | t.CPtr = self.Gen.CallGenBase.find_func_in_module( + cn_fn: rawptr[llvmlite.Function] = self.Gen.CallGenBase.find_func_in_module( mod, cn_lookup) if cn_fn is not None: - cn_ret: llvmlite.LLVMType | t.CPtr = llvmlite.function_get_ret_ty(cn_fn) + cn_ret: rawptr[llvmlite.LLVMType] = llvmlite.function_get_ret_ty(cn_fn) cn_fn_name: str = llvmlite.function_get_name(cn_fn) if cn_ret is not None and cn_fn_name is not None: # self 参数(容器)按 __contains__ 首参类型对齐 cn_self: llvmlite.Value | t.CPtr = rhs cn_first: llvmlite.Param | t.CPtr = llvmlite.function_get_param_head(cn_fn) if cn_first is not None: - cn_self_ty: llvmlite.LLVMType | t.CPtr = llvmlite.param_get_ty(cn_first) + cn_self_ty: rawptr[llvmlite.LLVMType] = llvmlite.param_get_ty(cn_first) if cn_self_ty is not None: cn_self = llvmlite.build_bitcast(builder, rhs, cn_self_ty) if cn_self is not None: @@ -592,7 +592,7 @@ class ExprGenOps(ExprGenBase.ExprGenBase): case _: pass if op == ast.OpKind.NotIn: - i1_ty_ni: llvmlite.LLVMType | t.CPtr = llvmlite.Int1(pool) + i1_ty_ni: rawptr[llvmlite.LLVMType] = llvmlite.Int1(pool) if i1_ty_ni is not None and cn_i1 is not None: one_i1_ni: llvmlite.Value | t.CPtr = llvmlite.ConstInt( pool, i1_ty_ni, 1, "1") @@ -601,7 +601,7 @@ class ExprGenOps(ExprGenBase.ExprGenBase): if cn_i1 is not None: return cn_i1 # 容器无 __contains__:TPC 语义恒 False(i1 0) - i1_ty_in: llvmlite.LLVMType | t.CPtr = llvmlite.Int1(pool) + i1_ty_in: rawptr[llvmlite.LLVMType] = llvmlite.Int1(pool) if i1_ty_in is not None: return llvmlite.ConstInt(pool, i1_ty_in, 0, "0") return None @@ -781,11 +781,11 @@ class ExprGenOps(ExprGenBase.ExprGenBase): # ============================================================ def translate_unaryop(self, builder: llvmlite.IRBuilder | t.CPtr, pool: rawptr[memhub.MemBuddy], - mod: llvmlite.LLVMModule | t.CPtr, - node: ast.AST | t.CPtr, - trans: HT.Translator | t.CPtr = None) -> llvmlite.Value | t.CPtr: + mod: rawptr[llvmlite.LLVMModule], + node: rawptr[ast.AST], + trans: rawptr[HT.Translator] = None) -> llvmlite.Value | t.CPtr: """翻译一元运算(-x, +x, not x, ~x)""" - uo: ast.UnaryOp | t.CPtr = (ast.UnaryOp | t.CPtr)(node) + uo: rawptr[ast.UnaryOp] = rawptr[ast.UnaryOp](node) if uo is None: return None @@ -850,7 +850,7 @@ class ExprGenOps(ExprGenBase.ExprGenBase): elif uo.op == ast.OpKind.Deref: # *p → load 按 pointee 类型读取(对齐 translate_c_deref) if self.Gen.ExprGenBase.is_ptr_type(operand.Ty) != 0: - d_pointee: llvmlite.LLVMType | t.CPtr = operand.Ty.Pointee + d_pointee: rawptr[llvmlite.LLVMType] = operand.Ty.Pointee if d_pointee is not None: return llvmlite.build_load(builder, d_pointee, operand) # 非指针即类型推断退化:fail-fast,绝不按 i8 兜底读取 @@ -863,7 +863,7 @@ class ExprGenOps(ExprGenBase.ExprGenBase): if trans is None: return None if uo.operand.kind() == ast.ASTKind.Name: - nm_ao: ast.Name | t.CPtr = (ast.Name | t.CPtr)(uo.operand) + nm_ao: rawptr[ast.Name] = rawptr[ast.Name](uo.operand) if nm_ao.id is not None: # self/cls 对象引用:返回对象指针本身(Ptr(Struct))而非 # 指针变量的地址(Ptr(Ptr(Struct))) @@ -875,7 +875,7 @@ class ExprGenOps(ExprGenBase.ExprGenBase): case llvmlite.LLVMType.Ptr(sa1): match sa1: case llvmlite.LLVMType.Ptr(sa2): - obj_ty_sa: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, sa2) + obj_ty_sa: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, sa2) return llvmlite.build_load(builder, obj_ty_sa, se_ao.Alloca) case _: pass @@ -896,7 +896,7 @@ class ExprGenOps(ExprGenBase.ExprGenBase): case llvmlite.LLVMType.Ptr(ao2): match ao2: case llvmlite.LLVMType.Struct(_, _, _): - obj_ty_ao: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, ao2) + obj_ty_ao: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, ao2) return llvmlite.build_load(builder, obj_ty_ao, v_ao) case _: pass @@ -907,7 +907,7 @@ class ExprGenOps(ExprGenBase.ExprGenBase): return v_ao # 模块函数地址:函数符号本身 if v_ao is None and mod is not None: - f_ao: llvmlite.Function | t.CPtr = self.Gen.CallGenBase.find_func_in_module(mod, nm_ao.id) + f_ao: rawptr[llvmlite.Function] = self.Gen.CallGenBase.find_func_in_module(mod, nm_ao.id) if f_ao is not None: fname_ao: str = llvmlite.function_get_name(f_ao) if fname_ao is not None: @@ -917,7 +917,7 @@ class ExprGenOps(ExprGenBase.ExprGenBase): while p_cur_ao is not None: p_cnt_ao += 1 p_cur_ao = llvmlite.param_get_next(p_cur_ao) - fn_ty_ao: llvmlite.LLVMType | t.CPtr = llvmlite.Func(pool, f_ao.RetTy, p_head_ao, p_cnt_ao) + fn_ty_ao: rawptr[llvmlite.LLVMType] = llvmlite.Func(pool, f_ao.RetTy, p_head_ao, p_cnt_ao) # 函数引用名按需加引号(数字开头/含 '.' 的 sha1 前缀名) fnlen_ao: sizet = string.strlen(fname_ao) needs_q_ao: int = self.Gen.ClassGenVTable._vtable_name_needs_quote(fname_ao) @@ -955,18 +955,18 @@ class ExprGenOps(ExprGenBase.ExprGenBase): # ============================================================ def translate_boolop(self, builder: llvmlite.IRBuilder | t.CPtr, pool: rawptr[memhub.MemBuddy], - mod: llvmlite.LLVMModule | t.CPtr, - node: ast.AST | t.CPtr, + mod: rawptr[llvmlite.LLVMModule], + node: rawptr[ast.AST], funcs_ptr: t.CPtr = None, func_count: int = 0, - trans: HT.Translator | t.CPtr = None) -> llvmlite.Value | t.CPtr: + trans: rawptr[HT.Translator] = None) -> llvmlite.Value | t.CPtr: """翻译布尔运算(and/or)的短路求值,返回 i1""" bo: ast.BoolOp | t.CPtr = (ast.BoolOp | t.CPtr)(node) if bo is None: return None op: int = bo.op - values: list[ast.AST | t.CPtr] | t.CPtr = bo.values + values: list[rawptr[ast.AST]] | t.CPtr = bo.values if values is None: return None count: sizet = len(values) @@ -976,7 +976,7 @@ class ExprGenOps(ExprGenBase.ExprGenBase): return self.Gen.ExprGen.translate_value(builder, pool, mod, values.get(0), funcs_ptr, func_count, trans) - func: llvmlite.Function | t.CPtr = builder.Func + func: rawptr[llvmlite.Function] = builder.Func if func is None: return None @@ -997,7 +997,7 @@ class ExprGenOps(ExprGenBase.ExprGenBase): # 对每个值(除最后一个)求值并短路 for i in range(count - 1): - val_node: ast.AST | t.CPtr = values.get(i) + val_node: rawptr[ast.AST] = values.get(i) val: llvmlite.Value | t.CPtr = self.Gen.ExprGen.translate_value( builder, pool, mod, val_node, funcs_ptr, func_count, trans) @@ -1042,7 +1042,7 @@ class ExprGenOps(ExprGenBase.ExprGenBase): llvmlite.position_at_end(builder, next_bb) # 最后一个值:求值后直接跳 merge - last_node: ast.AST | t.CPtr = values.get(count - 1) + last_node: rawptr[ast.AST] = values.get(count - 1) last_val: llvmlite.Value | t.CPtr = self.Gen.ExprGen.translate_value( builder, pool, mod, last_node, funcs_ptr, func_count, trans) @@ -1071,7 +1071,7 @@ class ExprGenOps(ExprGenBase.ExprGenBase): # 定位到 merge,创建 phi 合并所有入边 llvmlite.position_at_end(builder, merge_bb) - i1_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int1(pool) + i1_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int1(pool) return llvmlite.build_phi(builder, i1_ty, phi_head, phi_count) # ============================================================ # BinOp 运算符 → dunder 方法名 @@ -1123,11 +1123,11 @@ class ExprGenOps(ExprGenBase.ExprGenBase): # ============================================================ def try_operator_overload(self, pool: rawptr[memhub.MemBuddy], builder: llvmlite.IRBuilder | t.CPtr, - mod: llvmlite.LLVMModule | t.CPtr, + mod: rawptr[llvmlite.LLVMModule], lhs: llvmlite.Value | t.CPtr, rhs: llvmlite.Value | t.CPtr, op: int, - trans: HT.Translator | t.CPtr, + trans: rawptr[HT.Translator], is_compare: int) -> llvmlite.Value | t.CPtr: """尝试运算符重载:lhs 是结构体指针时调用 dunder 方法,否则返回 None""" if lhs is None or rhs is None: @@ -1142,7 +1142,7 @@ class ExprGenOps(ExprGenBase.ExprGenBase): return None # 检查 lhs 是否为结构体指针 - struct_ty: llvmlite.LLVMType | t.CPtr = self.Gen.StructGen.get_struct_type_from_value(lhs) + struct_ty: rawptr[llvmlite.LLVMType] = self.Gen.StructGen.get_struct_type_from_value(lhs) if struct_ty is None: return None @@ -1156,7 +1156,7 @@ class ExprGenOps(ExprGenBase.ExprGenBase): if lookup_name is None: return None viperlib.snprintf(lookup_name, 128, "%s.%s", class_name, dunder) - found_func: llvmlite.Function | t.CPtr = self.Gen.CallGenBase.find_func_in_module(mod, lookup_name) + found_func: rawptr[llvmlite.Function] = self.Gen.CallGenBase.find_func_in_module(mod, lookup_name) search_class: str = class_name if found_func is None: @@ -1169,7 +1169,7 @@ class ExprGenOps(ExprGenBase.ExprGenBase): parent_lookup: str = pool.alloc(128) if parent_lookup is not None: viperlib.snprintf(parent_lookup, 128, "%s.%s", anc, dunder) - parent_func: llvmlite.Function | t.CPtr = self.Gen.CallGenBase.find_func_in_module(mod, parent_lookup) + parent_func: rawptr[llvmlite.Function] = self.Gen.CallGenBase.find_func_in_module(mod, parent_lookup) if parent_func is not None: found_func = parent_func search_class = anc @@ -1208,7 +1208,7 @@ class ExprGenOps(ExprGenBase.ExprGenBase): # vpi 未命中(依赖模块确实无此 dunder)→ 回退原生比较(icmp), # 绝不发幽灵 call——`call @{cls_sha1}.{Class}.{dunder}` 链接 undefined # (MemBuddy 无 __eq__ 时 os._mbuddy == sys._mbuddy,SysLibTest 根因)。 - vpi_dup: llvmlite.LLVMType | t.CPtr = self.Gen.CallGenBase._lookup_method_ret_ty_via_vpi( + vpi_dup: rawptr[llvmlite.LLVMType] = self.Gen.CallGenBase._lookup_method_ret_ty_via_vpi( pool, cls_sha1, search_class, dunder) if vpi_dup is None: return None @@ -1232,10 +1232,10 @@ class ExprGenOps(ExprGenBase.ExprGenBase): # ============================================================ def try_unary_operator_overload(self, pool: rawptr[memhub.MemBuddy], builder: llvmlite.IRBuilder | t.CPtr, - mod: llvmlite.LLVMModule | t.CPtr, + mod: rawptr[llvmlite.LLVMModule], operand: llvmlite.Value | t.CPtr, op: int, - trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: + trans: rawptr[HT.Translator]) -> llvmlite.Value | t.CPtr: """尝试一元运算符重载:operand 是结构体指针时调用 dunder 方法,否则返回 None""" if operand is None: return None @@ -1244,7 +1244,7 @@ class ExprGenOps(ExprGenBase.ExprGenBase): return None # 检查 operand 是否为结构体指针 - struct_ty: llvmlite.LLVMType | t.CPtr = self.Gen.StructGen.get_struct_type_from_value(operand) + struct_ty: rawptr[llvmlite.LLVMType] = self.Gen.StructGen.get_struct_type_from_value(operand) if struct_ty is None: return None @@ -1258,7 +1258,7 @@ class ExprGenOps(ExprGenBase.ExprGenBase): if lookup_name is None: return None viperlib.snprintf(lookup_name, 128, "%s.%s", class_name, dunder) - found_func: llvmlite.Function | t.CPtr = self.Gen.CallGenBase.find_func_in_module(mod, lookup_name) + found_func: rawptr[llvmlite.Function] = self.Gen.CallGenBase.find_func_in_module(mod, lookup_name) search_class: str = class_name if found_func is None: @@ -1271,7 +1271,7 @@ class ExprGenOps(ExprGenBase.ExprGenBase): parent_lookup: str = pool.alloc(128) if parent_lookup is not None: viperlib.snprintf(parent_lookup, 128, "%s.%s", anc, dunder) - parent_func: llvmlite.Function | t.CPtr = self.Gen.CallGenBase.find_func_in_module(mod, parent_lookup) + parent_func: rawptr[llvmlite.Function] = self.Gen.CallGenBase.find_func_in_module(mod, parent_lookup) if parent_func is not None: found_func = parent_func search_class = anc @@ -1313,16 +1313,16 @@ class ExprGenOps(ExprGenBase.ExprGenBase): # ============================================================ def translate_binop(self, pool: rawptr[memhub.MemBuddy], builder: llvmlite.IRBuilder | t.CPtr, - mod: llvmlite.LLVMModule | t.CPtr, - node: ast.AST | t.CPtr, - trans: HT.Translator | t.CPtr = None) -> llvmlite.Value | t.CPtr: + mod: rawptr[llvmlite.LLVMModule], + node: rawptr[ast.AST], + trans: rawptr[HT.Translator] = None) -> llvmlite.Value | t.CPtr: """翻译二元运算(自动类型提升)""" - binop: ast.BinOp | t.CPtr = (ast.BinOp | t.CPtr)(node) + binop: rawptr[ast.BinOp] = rawptr[ast.BinOp](node) if binop is None: return None - lhs_node: ast.AST | t.CPtr = binop.left - rhs_node: ast.AST | t.CPtr = binop.right + lhs_node: rawptr[ast.AST] = binop.left + rhs_node: rawptr[ast.AST] = binop.right op: int = binop.op # 先翻译 rhs(只翻译一次,避免副作用重复) @@ -1335,7 +1335,7 @@ class ExprGenOps(ExprGenBase.ExprGenBase): # 对于值类型变量(如 cnt: Counter),translate_value 会 load 返回 Struct 值, # 但 dunder 方法需要 Ptr(Struct) 作为 self。直接用 alloca 指针尝试重载。 if lhs_node is not None and lhs_node.kind() == ast.ASTKind.Name and trans is not None: - nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(lhs_node) + nm: rawptr[ast.Name] = rawptr[ast.Name](lhs_node) if nm is not None and nm.id is not None: lhs_alloca: llvmlite.Value | t.CPtr = self.Gen.VarGen.lookup_var( trans.SymTab, nm.id) @@ -1382,7 +1382,7 @@ class ExprGenOps(ExprGenBase.ExprGenBase): target_fbits: int = lhs_fbits if rhs_fbits > target_fbits: target_fbits = rhs_fbits - target_float_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Double(pool) + target_float_ty: rawptr[llvmlite.LLVMType] = llvmlite.Double(pool) if target_fbits == 32: target_float_ty = llvmlite.Float(pool) # 将两个操作数转换为目标浮点类型(int→float via si2fp, float→float via fpext/fptrunc) diff --git a/App/lib/core/Gen/Func/FuncGenBase.vp b/App/lib/core/Gen/Func/FuncGenBase.vp index b407061..b592dc5 100644 --- a/App/lib/core/Gen/Func/FuncGenBase.vp +++ b/App/lib/core/Gen/Func/FuncGenBase.vp @@ -32,7 +32,7 @@ class FuncGenBase(CallGenBase.CallGenBase): # 返回 LLVM IR 属性字符串(如 "alwaysinline nounwind"),无属性返回 None # ============================================================ def extract_func_attrs(self, pool: rawptr[memhub.MemBuddy], - decorator_list: list[ast.AST | t.CPtr] | t.CPtr, + decorator_list: list[rawptr[ast.AST]] | t.CPtr, imported_modules: str) -> str: """从 decorator_list 提取 c.Attribute 属性,返回 LLVM IR 属性字符串""" if decorator_list is None: @@ -48,13 +48,13 @@ class FuncGenBase(CallGenBase.CallGenBase): found_any: int = 0 for di in range(dn): - deco: ast.AST | t.CPtr = decorator_list.get(di) + deco: rawptr[ast.AST] = decorator_list.get(di) if deco is None: continue dk: int = deco.kind() if dk != ast.ASTKind.Call: continue - call_node: ast.Call | t.CPtr = (ast.Call | t.CPtr)(deco) + call_node: rawptr[ast.Call] = rawptr[ast.Call](deco) if call_node.func is None: continue cfk: int = call_node.func.kind() @@ -62,7 +62,7 @@ class FuncGenBase(CallGenBase.CallGenBase): continue # 检测 c.Attribute - func_attr: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(call_node.func) + func_attr: rawptr[ast.Attribute] = rawptr[ast.Attribute](call_node.func) if func_attr.attr is None: continue if string.strcmp(func_attr.attr, "Attribute") != 0: @@ -72,7 +72,7 @@ class FuncGenBase(CallGenBase.CallGenBase): fvk: int = func_attr.value.kind() if fvk != ast.ASTKind.Name: continue - c_name: ast.Name | t.CPtr = (ast.Name | t.CPtr)(func_attr.value) + c_name: rawptr[ast.Name] = rawptr[ast.Name](func_attr.value) if c_name.id is None: continue if string.strcmp(c_name.id, "c") != 0: @@ -84,10 +84,10 @@ class FuncGenBase(CallGenBase.CallGenBase): # 遍历参数提取属性 if call_node.args is None: continue - args_list: list[ast.AST | t.CPtr] | t.CPtr = call_node.args + args_list: list[rawptr[ast.AST]] | t.CPtr = call_node.args an: sizet = len(args_list) for ai in range(an): - arg_node: ast.AST | t.CPtr = args_list.get(ai) + arg_node: rawptr[ast.AST] = args_list.get(ai) if arg_node is None: continue # 提取属性名(t.attr.xxx / t.attr.xxx() / t.attr.llvm.xxx) @@ -108,7 +108,7 @@ class FuncGenBase(CallGenBase.CallGenBase): return None return attrs_buf def extract_func_section(self, pool: rawptr[memhub.MemBuddy], - decorator_list: list[ast.AST | t.CPtr] | t.CPtr, + decorator_list: list[rawptr[ast.AST]] | t.CPtr, imported_modules: str) -> str: """提取 @c.Attribute(t.attr.section("xxx")) 为属性组文本 '"section"="xxx"'。 @@ -122,21 +122,21 @@ class FuncGenBase(CallGenBase.CallGenBase): if dn == 0: return None for di in range(dn): - deco: ast.AST | t.CPtr = decorator_list.get(di) + deco: rawptr[ast.AST] = decorator_list.get(di) if deco is None or deco.kind() != ast.ASTKind.Call: continue - call_node: ast.Call | t.CPtr = (ast.Call | t.CPtr)(deco) + call_node: rawptr[ast.Call] = rawptr[ast.Call](deco) if call_node.func is None or call_node.func.kind() != ast.ASTKind.Attribute: continue - func_attr: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(call_node.func) + func_attr: rawptr[ast.Attribute] = rawptr[ast.Attribute](call_node.func) if func_attr.attr is None or string.strcmp(func_attr.attr, "Attribute") != 0: continue if call_node.args is None: continue - args_list: list[ast.AST | t.CPtr] | t.CPtr = call_node.args + args_list: list[rawptr[ast.AST]] | t.CPtr = call_node.args an: sizet = len(args_list) for ai in range(an): - arg_node: ast.AST | t.CPtr = args_list.get(ai) + arg_node: rawptr[ast.AST] = args_list.get(ai) if arg_node is None: continue attr_name: str = self._get_attr_name_from_node(arg_node) @@ -151,7 +151,7 @@ class FuncGenBase(CallGenBase.CallGenBase): viperlib.snprintf(sec_buf, 128, "\"section\"=\"%s\"", sec_val) return sec_buf return None - def _get_attr_name_from_node(self, node: ast.AST | t.CPtr) -> str: + def _get_attr_name_from_node(self, node: rawptr[ast.AST]) -> str: """从 AST 节点提取属性名 支持: @@ -165,29 +165,29 @@ class FuncGenBase(CallGenBase.CallGenBase): # Call 节点: t.attr.always_inline() if k == ast.ASTKind.Call: - call: ast.Call | t.CPtr = (ast.Call | t.CPtr)(node) + call: rawptr[ast.Call] = rawptr[ast.Call](node) if call.func is None or call.func.kind() != ast.ASTKind.Attribute: return None - at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(call.func) + at: rawptr[ast.Attribute] = rawptr[ast.Attribute](call.func) return at.attr # Attribute 节点: t.attr.packed 或 t.attr.llvm.nounwind if k == ast.ASTKind.Attribute: - at2: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(node) + at2: rawptr[ast.Attribute] = rawptr[ast.Attribute](node) return at2.attr return None - def _get_attr_call_arg_str(self, node: ast.AST | t.CPtr) -> str: + def _get_attr_call_arg_str(self, node: rawptr[ast.AST]) -> str: """取 t.attr.xxx("val") 调用的首参字符串常量(如 section(".text.startup"))""" if node is None or node.kind() != ast.ASTKind.Call: return None - cl: ast.Call | t.CPtr = (ast.Call | t.CPtr)(node) + cl: rawptr[ast.Call] = rawptr[ast.Call](node) if cl.args is None or len(cl.args) == 0: return None - a0: ast.AST | t.CPtr = cl.args.get(0) + a0: rawptr[ast.AST] = cl.args.get(0) if a0 is None or a0.kind() != ast.ASTKind.Constant: return None - cn: ast.Constant | t.CPtr = (ast.Constant | t.CPtr)(a0) + cn: rawptr[ast.Constant] = rawptr[ast.Constant](a0) if cn.const_kind != ast.CONST_STR: return None return cn.str_val @@ -257,7 +257,7 @@ class FuncGenBase(CallGenBase.CallGenBase): # 返回 "sha1.name" 格式的混淆名。若 ModuleSha1 为 None 或名称已带 # SHA1 前缀(16 hex + '.'),则原样返回。 # ============================================================ - def _mangle_name(self, trans: HT.Translator | t.CPtr, name: str) -> str: + def _mangle_name(self, trans: rawptr[HT.Translator], name: str) -> str: """为任意名称添加 SHA1 前缀(不做 main/export 检查)""" if trans is None or name is None: return name @@ -310,7 +310,7 @@ class FuncGenBase(CallGenBase.CallGenBase): # - 已带 SHA1 前缀的不再加 # - ModuleSha1 为 None 时不加前缀 # ============================================================ - def _mangle_func_name(self, trans: HT.Translator | t.CPtr, name: str, + def _mangle_func_name(self, trans: rawptr[HT.Translator], name: str, has_export: int) -> str: """为函数名添加 SHA1 前缀(检查 main/export)""" if trans is None or name is None: @@ -327,14 +327,14 @@ class FuncGenBase(CallGenBase.CallGenBase): # 追加 __eh_msg_out__/__eh_code_out__ 输出参数的条件。v1 只扫函数体 # 顶层 raise(嵌套 if/for/try 内的 raise 未覆盖,后续扩展)。 # ============================================================ - def _body_has_raise(self, fd: ast.FunctionDef | t.CPtr) -> int: + def _body_has_raise(self, fd: rawptr[ast.FunctionDef]) -> int: """函数体顶层是否含 raise(非 StopIteration),1=是 / 0=否""" if fd is None or fd.children is None: return 0 - body_f: list[ast.AST | t.CPtr] | t.CPtr = fd.children + body_f: list[rawptr[ast.AST]] | t.CPtr = fd.children bn_f: sizet = len(body_f) for bi_f in range(bn_f): - stmt_f: ast.AST | t.CPtr = body_f.get(bi_f) + stmt_f: rawptr[ast.AST] = body_f.get(bi_f) if stmt_f is None: continue if stmt_f.kind() != ast.ASTKind.Raise: @@ -345,13 +345,13 @@ class FuncGenBase(CallGenBase.CallGenBase): ek_f: int = rn_f.exc.kind() is_stop_f: int = 0 if ek_f == ast.ASTKind.Name: - enm_f: ast.Name | t.CPtr = (ast.Name | t.CPtr)(rn_f.exc) + enm_f: rawptr[ast.Name] = rawptr[ast.Name](rn_f.exc) if enm_f.id is not None and string.strcmp(enm_f.id, "StopIteration") == 0: is_stop_f = 1 elif ek_f == ast.ASTKind.Call: - ecl_f: ast.Call | t.CPtr = (ast.Call | t.CPtr)(rn_f.exc) + ecl_f: rawptr[ast.Call] = rawptr[ast.Call](rn_f.exc) if ecl_f.func is not None and ecl_f.func.kind() == ast.ASTKind.Name: - ecn_f: ast.Name | t.CPtr = (ast.Name | t.CPtr)(ecl_f.func) + ecn_f: rawptr[ast.Name] = rawptr[ast.Name](ecl_f.func) if ecn_f.id is not None and string.strcmp(ecn_f.id, "StopIteration") == 0: is_stop_f = 1 if is_stop_f == 0: @@ -367,37 +367,37 @@ class FuncGenBase(CallGenBase.CallGenBase): # "ret doesn't match function result type"。 # ============================================================ def _resolve_creturn_ret_ty(self, pool: rawptr[memhub.MemBuddy], - fd: ast.FunctionDef | t.CPtr, + fd: rawptr[ast.FunctionDef], imported_modules: str, from_imports: str, - trans: HT.Translator | t.CPtr) -> llvmlite.LLVMType | t.CPtr: + trans: rawptr[HT.Translator]) -> rawptr[llvmlite.LLVMType]: """解析 @c.CReturn 装饰器为 struct 返回类型;无 CReturn 返回 None""" if fd is None or fd.decorator_list is None: return None - cr_head: llvmlite.ParamNode | t.CPtr = None - cr_last: llvmlite.ParamNode | t.CPtr = None + cr_head: rawptr[llvmlite.Function] = None + cr_last: rawptr[llvmlite.Function] = None cr_count: int = 0 cr_dn: sizet = len(fd.decorator_list) for cdi in range(cr_dn): - deco_cr: ast.AST | t.CPtr = fd.decorator_list.get(cdi) + deco_cr: rawptr[ast.AST] = fd.decorator_list.get(cdi) if deco_cr is None or deco_cr.kind() != ast.ASTKind.Call: continue - deco_call_cr: ast.Call | t.CPtr = (ast.Call | t.CPtr)(deco_cr) + deco_call_cr: rawptr[ast.Call] = rawptr[ast.Call](deco_cr) if deco_call_cr.func is None or deco_call_cr.func.kind() != ast.ASTKind.Attribute: continue - deco_fa_cr: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(deco_call_cr.func) + deco_fa_cr: rawptr[ast.Attribute] = rawptr[ast.Attribute](deco_call_cr.func) if deco_fa_cr.attr is None or string.strcmp(deco_fa_cr.attr, "CReturn") != 0: continue - cr_args: list[ast.AST | t.CPtr] | t.CPtr = deco_call_cr.args + cr_args: list[rawptr[ast.AST]] | t.CPtr = deco_call_cr.args if cr_args is None: continue cr_an: sizet = len(cr_args) for cai in range(cr_an): - cr_aty: llvmlite.LLVMType | t.CPtr = self.Gen.TypeGenResolve.resolve_annotation_type( + cr_aty: rawptr[llvmlite.LLVMType] = self.Gen.TypeGenResolve.resolve_annotation_type( pool, cr_args.get(cai), imported_modules, from_imports, trans, 0) if cr_aty is None: continue - cr_pn: llvmlite.ParamNode | t.CPtr = llvmlite.new_param_node(pool, cr_aty) + cr_pn: rawptr[llvmlite.Function] = llvmlite.new_param_node(pool, cr_aty) if cr_pn is not None: if cr_head is None: cr_head = cr_pn @@ -412,36 +412,36 @@ class FuncGenBase(CallGenBase.CallGenBase): # 创建 LLVM 函数(简单版本,仅声明) # ============================================================ def create_function(self, pool: rawptr[memhub.MemBuddy], - mod: llvmlite.LLVMModule | t.CPtr, + mod: rawptr[llvmlite.LLVMModule], name: str, - args_node: ast.AST | t.CPtr, - ret_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Function | t.CPtr: + args_node: rawptr[ast.AST], + ret_ty: rawptr[llvmlite.LLVMType]) -> rawptr[llvmlite.Function]: """创建 LLVM 函数并添加参数""" if name is None or mod is None: return None - func: llvmlite.Function | t.CPtr = llvmlite.create_function(pool, mod, name, ret_ty) + func: rawptr[llvmlite.Function] = llvmlite.create_function(pool, mod, name, ret_ty) if func is None: return None if args_node is not None: - ags: ast.Arguments | t.CPtr = (ast.Arguments | t.CPtr)(args_node) + ags: rawptr[ast.Arguments] = rawptr[ast.Arguments](args_node) if ags.args is not None: - alist: list[ast.AST | t.CPtr] | t.CPtr = ags.args + alist: list[rawptr[ast.AST]] | t.CPtr = ags.args an: sizet = len(alist) - i32_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int32(pool) + i32_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int32(pool) for ai in range(an): - arg: ast.Arg | t.CPtr = (ast.Arg | t.CPtr)(alist.get(ai)) + arg: rawptr[ast.Arg] = rawptr[ast.Arg](alist.get(ai)) if arg is not None and arg.arg is not None: # t\.CVoid 表示空参:跳过 if arg.annotation is not None: if arg.annotation.kind() == ast.ASTKind.Attribute: - at_cf: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(arg.annotation) + at_cf: rawptr[ast.Attribute] = rawptr[ast.Attribute](arg.annotation) if at_cf.attr is not None and string.strcmp(at_cf.attr, "CVoid") == 0: continue - param_ty: llvmlite.LLVMType | t.CPtr = i32_ty + param_ty: rawptr[llvmlite.LLVMType] = i32_ty if arg.annotation is not None: - resolved: llvmlite.LLVMType | t.CPtr = self.Gen.TypeGenResolve.resolve_annotation_type( + resolved: rawptr[llvmlite.LLVMType] = self.Gen.TypeGenResolve.resolve_annotation_type( pool, arg.annotation, None, None, None, 0) if resolved is None: # [S4 fail-fast] 有注解但解析失败:不再静默用 i32。 diff --git a/App/lib/core/Gen/Func/FuncGenDef.vp b/App/lib/core/Gen/Func/FuncGenDef.vp index 16992d8..c4bdf29 100644 --- a/App/lib/core/Gen/Func/FuncGenDef.vp +++ b/App/lib/core/Gen/Func/FuncGenDef.vp @@ -31,25 +31,25 @@ class FuncGenDef(CallGenBase.CallGenBase): # 3) 创建 declare(IsDeclared=1) 4) 添加参数 5) 注册到函数表。 # 后续 translate_function_def 经 find_func_in_module 复用该 declare(清除 IsDeclared, # 跳过参数创建,直接添加函数体)。 - def forward_declare_functions(self, trans: HT.Translator | t.CPtr, - tree: ast.AST | t.CPtr) -> int: + def forward_declare_functions(self, trans: rawptr[HT.Translator], + tree: rawptr[ast.AST]) -> int: """预扫描所有顶层 FunctionDef,创建前向声明""" if trans is None or tree is None: return 0 pool: rawptr[memhub.MemBuddy] = trans.Pool - mod: llvmlite.LLVMModule | t.CPtr = trans.Module + mod: rawptr[llvmlite.LLVMModule] = trans.Module if pool is None or mod is None: return 0 imported_modules: str = trans._imported_modules from_imports: str = trans._from_imports - funcs_ptr: GenTypes.FuncEntry | t.CPtr = trans._funcs + funcs_ptr: rawptr[GenTypes.FuncEntry] = trans._funcs - i32_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int32(pool) - i8_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int8(pool) - i8_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, i8_ty) + i32_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int32(pool) + i8_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int8(pool) + i8_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, i8_ty) - ch: list[ast.AST | t.CPtr] | t.CPtr = tree.children + ch: list[rawptr[ast.AST]] | t.CPtr = tree.children if ch is None: return 0 @@ -77,12 +77,12 @@ class FuncGenDef(CallGenBase.CallGenBase): # 交由 translate_children 走 existing 路径,无重复处理副作用。 pre_i: sizet for pre_i in range(cn_count): - pre_child: ast.AST | t.CPtr = ch.get(pre_i) + pre_child: rawptr[ast.AST] = ch.get(pre_i) if pre_child is None: continue if pre_child.kind() != ast.ASTKind.ClassDef: continue - pre_cd: ast.ClassDef | t.CPtr = (ast.ClassDef | t.CPtr)(pre_child) + pre_cd: rawptr[ast.ClassDef] = rawptr[ast.ClassDef](pre_child) if pre_cd is None or pre_cd.name is None: continue pre_ex: GenTypes.StructEntry | t.CPtr = self.Gen.StructGen.find_struct_by_module( @@ -92,12 +92,12 @@ class FuncGenDef(CallGenBase.CallGenBase): self.Gen.ClassGenDef.translate_class_def(trans, pre_child) for ci in range(cn_count): - child: ast.AST | t.CPtr = ch.get(ci) + child: rawptr[ast.AST] = ch.get(ci) if child is None: continue if child.kind() != ast.ASTKind.FunctionDef: continue - fd: ast.FunctionDef | t.CPtr = (ast.FunctionDef | t.CPtr)(child) + fd: rawptr[ast.FunctionDef] = rawptr[ast.FunctionDef](child) if fd is None or fd.name is None: continue @@ -119,7 +119,7 @@ class FuncGenDef(CallGenBase.CallGenBase): self.Gen.TypeGenBase.set_generic_context(tp_names_fd, tp_args_fd) # 推断返回类型 - ret_ty: llvmlite.LLVMType | t.CPtr = None + ret_ty: rawptr[llvmlite.LLVMType] = None if fd.returns is not None: ret_ty = self.Gen.TypeGenResolve.resolve_annotation_type( pool, fd.returns, imported_modules, from_imports, trans, 0) @@ -128,10 +128,10 @@ class FuncGenDef(CallGenBase.CallGenBase): # 回退为 i32 → 掉尾检查强制 return i32,mm.vp free 根因)。 # CExport 混用实际类型(-> t.CExport | int)时保持解析结果。 if fd.returns.kind() == ast.ASTKind.Attribute: - ce_at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(fd.returns) + ce_at: rawptr[ast.Attribute] = rawptr[ast.Attribute](fd.returns) if ce_at.attr is not None and string.strcmp(ce_at.attr, "CExport") == 0: if ce_at.value is not None and ce_at.value.kind() == ast.ASTKind.Name: - ce_nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(ce_at.value) + ce_nm: rawptr[ast.Name] = rawptr[ast.Name](ce_at.value) if ce_nm.id is not None and string.strcmp(ce_nm.id, "t") == 0: ret_ty = llvmlite.Void(pool) if ret_ty is None and fd.returns is not None: @@ -186,14 +186,14 @@ class FuncGenDef(CallGenBase.CallGenBase): mangled_name = self.Gen.FuncGenBase._mangle_func_name(trans, fd.name, 0) # 如果函数已存在(如重复定义),跳过 - existing: llvmlite.Function | t.CPtr = self.Gen.CallGenBase.find_func_in_module(mod, mangled_name) + existing: rawptr[llvmlite.Function] = self.Gen.CallGenBase.find_func_in_module(mod, mangled_name) if existing is not None: if tp_names_fd is not None: self.Gen.TypeGenBase.clear_generic_context() continue # 创建 declare - func: llvmlite.Function | t.CPtr = llvmlite.create_declare( + func: rawptr[llvmlite.Function] = llvmlite.create_declare( pool, mod, mangled_name, ret_ty) if func is None: if tp_names_fd is not None: @@ -203,17 +203,17 @@ class FuncGenDef(CallGenBase.CallGenBase): # 提取默认参数信息 # 注意: 必须先把属性赋给显式类型为 list[...] | t.CPtr 的局部变量再调用 __len__(), # 否则编译器无法识别属性返回的 list 类型,GEP base 会变成 i32 0 导致 llc 报错 - fd_args_node: ast.Arguments | t.CPtr = fd.args + fd_args_node: rawptr[ast.Arguments] = fd.args fd_defaults: t.CPtr = None fd_default_count: int = 0 fd_param_count: int = 0 if fd_args_node is not None: - fd_ags: ast.Arguments | t.CPtr = (ast.Arguments | t.CPtr)(fd_args_node) + fd_ags: rawptr[ast.Arguments] = rawptr[ast.Arguments](fd_args_node) if fd_ags.args is not None: - fd_alist: list[ast.AST | t.CPtr] | t.CPtr = fd_ags.args + fd_alist: list[rawptr[ast.AST]] | t.CPtr = fd_ags.args fd_param_count = len(fd_alist) if fd_ags.defaults is not None: - fd_dlist: list[ast.AST | t.CPtr] | t.CPtr = fd_ags.defaults + fd_dlist: list[rawptr[ast.AST]] | t.CPtr = fd_ags.defaults fd_defaults = fd_dlist fd_default_count = len(fd_dlist) @@ -230,23 +230,23 @@ class FuncGenDef(CallGenBase.CallGenBase): self.Gen.CallGenBase.register_cexport_func(trans.ModuleSha1, fd.name) # 添加参数 - args_node: ast.Arguments | t.CPtr = fd.args + args_node: rawptr[ast.Arguments] = fd.args if args_node is not None: - ags: ast.Arguments | t.CPtr = (ast.Arguments | t.CPtr)(args_node) + ags: rawptr[ast.Arguments] = rawptr[ast.Arguments](args_node) if ags.args is not None: - alist: list[ast.AST | t.CPtr] | t.CPtr = ags.args + alist: list[rawptr[ast.AST]] | t.CPtr = ags.args an: sizet = len(alist) for ai in range(an): - arg: ast.Arg | t.CPtr = (ast.Arg | t.CPtr)(alist.get(ai)) + arg: rawptr[ast.Arg] = rawptr[ast.Arg](alist.get(ai)) if arg is None or arg.arg is None: continue # CVoid 表示空参:跳过 if arg.annotation is not None: if self.Gen.TypeGenResolve._is_t_attr(arg.annotation, "CVoid", imported_modules) != 0: continue - param_ty: llvmlite.LLVMType | t.CPtr = i32_ty + param_ty: rawptr[llvmlite.LLVMType] = i32_ty if arg.annotation is not None: - resolved: llvmlite.LLVMType | t.CPtr = self.Gen.TypeGenResolve.resolve_annotation_type( + resolved: rawptr[llvmlite.LLVMType] = self.Gen.TypeGenResolve.resolve_annotation_type( pool, arg.annotation, imported_modules, from_imports, trans, 0) if resolved is None: # [S4 fail-fast] 有注解但解析失败:不再静默用 i32 @@ -305,10 +305,10 @@ class FuncGenDef(CallGenBase.CallGenBase): # trans 单参模式:所有共享状态从 trans 获取 # 函数局部作用域通过 enter_scope/exit_scope 管理 # ============================================================ - def translate_function_def(self, trans: HT.Translator | t.CPtr, - node: ast.AST | t.CPtr) -> int: + def translate_function_def(self, trans: rawptr[HT.Translator], + node: rawptr[ast.AST]) -> int: """翻译函数定义,返回新增的变量数(通常为 0,函数定义不增加当前作用域变量)""" - fd: ast.FunctionDef | t.CPtr = (ast.FunctionDef | t.CPtr)(node) + fd: rawptr[ast.FunctionDef] = rawptr[ast.FunctionDef](node) if fd is None or fd.name is None: return 0 @@ -320,16 +320,16 @@ class FuncGenDef(CallGenBase.CallGenBase): return self.Gen.AsyncGen.translate_async_function(trans, node) pool: rawptr[memhub.MemBuddy] = trans.Pool - mod: llvmlite.LLVMModule | t.CPtr = trans.Module + mod: rawptr[llvmlite.LLVMModule] = trans.Module imported_modules: str = trans._imported_modules from_imports: str = trans._from_imports - funcs_ptr: GenTypes.FuncEntry | t.CPtr = trans._funcs + funcs_ptr: rawptr[GenTypes.FuncEntry] = trans._funcs func_count: int = trans._func_count - i32_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int32(pool) + i32_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int32(pool) # 推断返回类型:优先使用返回类型注解 - ret_ty: llvmlite.LLVMType | t.CPtr = None + ret_ty: rawptr[llvmlite.LLVMType] = None if fd.returns is not None: ret_ty = self.Gen.TypeGenResolve.resolve_annotation_type( pool, fd.returns, imported_modules, from_imports, trans, 0) @@ -338,10 +338,10 @@ class FuncGenDef(CallGenBase.CallGenBase): # 为 i32 → 掉尾检查强制 return i32,mm.vp free 根因)。 # 混合实际类型(-> t.CExport | int)时保持解析结果。 if fd.returns.kind() == ast.ASTKind.Attribute: - ce_at2: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(fd.returns) + ce_at2: rawptr[ast.Attribute] = rawptr[ast.Attribute](fd.returns) if ce_at2.attr is not None and string.strcmp(ce_at2.attr, "CExport") == 0: if ce_at2.value is not None and ce_at2.value.kind() == ast.ASTKind.Name: - ce_nm2: ast.Name | t.CPtr = (ast.Name | t.CPtr)(ce_at2.value) + ce_nm2: rawptr[ast.Name] = rawptr[ast.Name](ce_at2.value) if ce_nm2.id is not None and string.strcmp(ce_nm2.id, "t") == 0: ret_ty = llvmlite.Void(pool) @@ -427,24 +427,24 @@ class FuncGenDef(CallGenBase.CallGenBase): if fd.decorator_list is not None: ddn: sizet = len(fd.decorator_list) for ddi in range(ddn): - deco: ast.AST | t.CPtr = fd.decorator_list.get(ddi) + deco: rawptr[ast.AST] = fd.decorator_list.get(ddi) if deco is None: continue dk: int = deco.kind() dname: str = None if dk == ast.ASTKind.Name: - dnm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(deco) + dnm: rawptr[ast.Name] = rawptr[ast.Name](deco) dname = dnm.id elif dk == ast.ASTKind.Call: - dcl: ast.Call | t.CPtr = (ast.Call | t.CPtr)(deco) + dcl: rawptr[ast.Call] = rawptr[ast.Call](deco) if dcl.func is not None and dcl.func.kind() == ast.ASTKind.Name: - dnm2: ast.Name | t.CPtr = (ast.Name | t.CPtr)(dcl.func) + dnm2: rawptr[ast.Name] = rawptr[ast.Name](dcl.func) dname = dnm2.id # @repeat(3):取首个常量 int 参数(对齐 TPC L1182-1184) if dcl.args is not None and len(dcl.args) >= 1: - da0: ast.AST | t.CPtr = dcl.args.get(0) + da0: rawptr[ast.AST] = dcl.args.get(0) if da0 is not None and da0.kind() == ast.ASTKind.Constant: - dc0: ast.Constant | t.CPtr = (ast.Constant | t.CPtr)(da0) + dc0: rawptr[ast.Constant] = rawptr[ast.Constant](da0) if dc0.const_kind == ast.CONST_INT: decor_arg0 = dc0.int_val if dname is None: @@ -492,12 +492,12 @@ class FuncGenDef(CallGenBase.CallGenBase): if is_extern_decl != 0: # 外部声明函数:生成 declare(仅声明,不定义) # 先检查是否已由 forward_declare_functions 创建,避免重复 declare - existing_extern: llvmlite.Function | t.CPtr = self.Gen.CallGenBase.find_func_in_module(mod, mangled_name) + existing_extern: rawptr[llvmlite.Function] = self.Gen.CallGenBase.find_func_in_module(mod, mangled_name) if existing_extern is not None: # 已存在前向声明,复用之,不再重复创建 return 0 - func: llvmlite.Function | t.CPtr = llvmlite.create_declare( + func: rawptr[llvmlite.Function] = llvmlite.create_declare( pool, mod, mangled_name, ret_ty) if func is None: return 0 @@ -508,22 +508,22 @@ class FuncGenDef(CallGenBase.CallGenBase): trans._func_count = func_count + 1 # 添加参数(支持类型注解) - args_node_extern: ast.Arguments | t.CPtr = fd.args + args_node_extern: rawptr[ast.Arguments] = fd.args if args_node_extern is not None: - ags_e: ast.Arguments | t.CPtr = (ast.Arguments | t.CPtr)(args_node_extern) + ags_e: rawptr[ast.Arguments] = rawptr[ast.Arguments](args_node_extern) if ags_e.args is not None: - alist_e: list[ast.AST | t.CPtr] | t.CPtr = ags_e.args + alist_e: list[rawptr[ast.AST]] | t.CPtr = ags_e.args an_e: sizet = len(alist_e) for ai_e in range(an_e): - arg_e: ast.Arg | t.CPtr = (ast.Arg | t.CPtr)(alist_e.get(ai_e)) + arg_e: rawptr[ast.Arg] = rawptr[ast.Arg](alist_e.get(ai_e)) if arg_e is not None and arg_e.arg is not None: # CVoid 表示空参:跳过,不添加到函数签名 if arg_e.annotation is not None \ and self.Gen.TypeGenResolve._is_t_attr(arg_e.annotation, "CVoid", imported_modules) != 0: continue - param_ty_e: llvmlite.LLVMType | t.CPtr = i32_ty + param_ty_e: rawptr[llvmlite.LLVMType] = i32_ty if arg_e.annotation is not None: - resolved_e: llvmlite.LLVMType | t.CPtr = self.Gen.TypeGenResolve.resolve_annotation_type( + resolved_e: rawptr[llvmlite.LLVMType] = self.Gen.TypeGenResolve.resolve_annotation_type( pool, arg_e.annotation, imported_modules, from_imports, trans, 0) if resolved_e is None: # fail-fast:外部声明函数参数有注解但类型解析失败, @@ -571,10 +571,10 @@ class FuncGenDef(CallGenBase.CallGenBase): return 0 # args_node 用于后续 alloca 创建,提前赋值 - args_node: ast.Arguments | t.CPtr = fd.args + args_node: rawptr[ast.Arguments] = fd.args # 检查是否已有前向声明(由 forward_declare_functions 创建) - func: llvmlite.Function | t.CPtr = self.Gen.CallGenBase.find_func_in_module(mod, mangled_name) + func: rawptr[llvmlite.Function] = self.Gen.CallGenBase.find_func_in_module(mod, mangled_name) if func is not None and llvmlite.function_is_declared(func) != 0: # 复用前向声明:清除 IsDeclared 标记,转为 define func.IsDeclared = 0 @@ -609,12 +609,12 @@ class FuncGenDef(CallGenBase.CallGenBase): tfd_default_count: int = 0 tfd_param_count: int = 0 if args_node is not None: - tfd_ags: ast.Arguments | t.CPtr = (ast.Arguments | t.CPtr)(args_node) + tfd_ags: rawptr[ast.Arguments] = rawptr[ast.Arguments](args_node) if tfd_ags.args is not None: - tfd_alist: list[ast.AST | t.CPtr] | t.CPtr = tfd_ags.args + tfd_alist: list[rawptr[ast.AST]] | t.CPtr = tfd_ags.args tfd_param_count = len(tfd_alist) if tfd_ags.defaults is not None: - tfd_dlist: list[ast.AST | t.CPtr] | t.CPtr = tfd_ags.defaults + tfd_dlist: list[rawptr[ast.AST]] | t.CPtr = tfd_ags.defaults tfd_defaults = tfd_dlist tfd_default_count = len(tfd_dlist) @@ -627,20 +627,20 @@ class FuncGenDef(CallGenBase.CallGenBase): # 添加参数(支持类型注解) if args_node is not None: - ags: ast.Arguments | t.CPtr = (ast.Arguments | t.CPtr)(args_node) + ags: rawptr[ast.Arguments] = rawptr[ast.Arguments](args_node) if ags.args is not None: - alist: list[ast.AST | t.CPtr] | t.CPtr = ags.args + alist: list[rawptr[ast.AST]] | t.CPtr = ags.args an: sizet = len(alist) for ai in range(an): - arg: ast.Arg | t.CPtr = (ast.Arg | t.CPtr)(alist.get(ai)) + arg: rawptr[ast.Arg] = rawptr[ast.Arg](alist.get(ai)) if arg is not None and arg.arg is not None: # CVoid 表示空参:跳过,不添加到函数签名 if arg.annotation is not None \ and self.Gen.TypeGenResolve._is_t_attr(arg.annotation, "CVoid", imported_modules) != 0: continue - param_ty: llvmlite.LLVMType | t.CPtr = i32_ty + param_ty: rawptr[llvmlite.LLVMType] = i32_ty if arg.annotation is not None: - resolved: llvmlite.LLVMType | t.CPtr = self.Gen.TypeGenResolve.resolve_annotation_type( + resolved: rawptr[llvmlite.LLVMType] = self.Gen.TypeGenResolve.resolve_annotation_type( pool, arg.annotation, imported_modules, from_imports, trans, 0) if resolved is None: # [S4 fail-fast] 有注解但解析失败:不再静默用 i32 @@ -677,11 +677,11 @@ class FuncGenDef(CallGenBase.CallGenBase): # store %__eh_code_out__ 但签名无此参数(llc: use of undefined value)。 if string.strcmp(fd.name, "main") != 0: if self.Gen.FuncGenBase._body_has_raise(fd) != 0: - i8_ty_eh: llvmlite.LLVMType | t.CPtr = llvmlite.Int8(pool) - i8_ptr_ty_eh: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, i8_ty_eh) - i8_ptr_ptr_ty_eh: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, i8_ptr_ty_eh) - i32_ty_eh: llvmlite.LLVMType | t.CPtr = llvmlite.Int32(pool) - i32_ptr_ty_eh: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, i32_ty_eh) + i8_ty_eh: rawptr[llvmlite.LLVMType] = llvmlite.Int8(pool) + i8_ptr_ty_eh: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, i8_ty_eh) + i8_ptr_ptr_ty_eh: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, i8_ptr_ty_eh) + i32_ty_eh: rawptr[llvmlite.LLVMType] = llvmlite.Int32(pool) + i32_ptr_ty_eh: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, i32_ty_eh) if i8_ptr_ptr_ty_eh is not None and i32_ptr_ty_eh is not None: llvmlite.add_param(pool, func, i8_ptr_ptr_ty_eh, "%__eh_msg_out__") llvmlite.add_param(pool, func, i32_ptr_ty_eh, "%__eh_code_out__") @@ -710,12 +710,12 @@ class FuncGenDef(CallGenBase.CallGenBase): tls_flag_gv: llvmlite.GlobalVariable | t.CPtr = llvmlite.create_global_int( pool, mod, tls_flag_name, 1, 0) if tls_flag_gv is not None: - i1_ty_t: llvmlite.LLVMType | t.CPtr = llvmlite.Int1(pool) + i1_ty_t: rawptr[llvmlite.LLVMType] = llvmlite.Int1(pool) if i1_ty_t is not None: # GlobalVariable 不是 Value 子类(字段布局不同),build_load/store # 按 Value 读 ptr.Ty/ptr.Name 会错位(Ty 读到 Name → void,Name 为空)。 # 与 create_global_string 一致:构造 Value 视图(Ty=Ptr(i1), Name="@name")。 - tls_gv_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, i1_ty_t) + tls_gv_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, i1_ty_t) tls_ref_name: str = pool.alloc(64) if tls_ref_name is not None: viperlib.snprintf(tls_ref_name, 64, "@%s", tls_flag_name) @@ -785,20 +785,20 @@ class FuncGenDef(CallGenBase.CallGenBase): # 为参数创建 alloca if args_node is not None: - ags2: ast.Arguments | t.CPtr = (ast.Arguments | t.CPtr)(args_node) + ags2: rawptr[ast.Arguments] = rawptr[ast.Arguments](args_node) if ags2.args is not None: - alist2: list[ast.AST | t.CPtr] | t.CPtr = ags2.args + alist2: list[rawptr[ast.AST]] | t.CPtr = ags2.args an2: sizet = len(alist2) for ai2 in range(an2): - arg2: ast.Arg | t.CPtr = (ast.Arg | t.CPtr)(alist2.get(ai2)) + arg2: rawptr[ast.Arg] = rawptr[ast.Arg](alist2.get(ai2)) if arg2 is not None and arg2.arg is not None: # CVoid 表示空参:跳过,不创建 alloca if arg2.annotation is not None: if self.Gen.TypeGenResolve._is_t_attr(arg2.annotation, "CVoid", imported_modules) != 0: continue - param_ty2: llvmlite.LLVMType | t.CPtr = i32_ty + param_ty2: rawptr[llvmlite.LLVMType] = i32_ty if arg2.annotation is not None: - resolved2: llvmlite.LLVMType | t.CPtr = self.Gen.TypeGenResolve.resolve_annotation_type( + resolved2: rawptr[llvmlite.LLVMType] = self.Gen.TypeGenResolve.resolve_annotation_type( pool, arg2.annotation, imported_modules, from_imports, trans, 0) if resolved2 is None: # fail-fast:参数有注解但类型解析失败,不再静默保持 i32 @@ -846,14 +846,14 @@ class FuncGenDef(CallGenBase.CallGenBase): # 无 raise 的函数(viperlib.sprintf 等)同样有 *args,若放在 EH 块内 # 会被跳过,args 未注册到符号表 → NameError: 未定义名称 'args'。 if ags2.vararg is not None: - vararg_node: ast.Arg | t.CPtr = (ast.Arg | t.CPtr)(ags2.vararg) + vararg_node: rawptr[ast.Arg] = rawptr[ast.Arg](ags2.vararg) if vararg_node is not None and vararg_node.arg is not None: vararg_name_str: str = vararg_node.arg # va_list 缓冲区 24 字节(Win64 的 __va_list_tag = {i32,i32,i8*,i8*})+ 16 对齐 # (对齐 TPC HandlesFunctions.py:1739-1741) - i8_ty_va: llvmlite.LLVMType | t.CPtr = llvmlite.Int8(pool) - i8_ptr_ty_va: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, i8_ty_va) - va_buf_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Array(pool, i8_ty_va, 24) + i8_ty_va: rawptr[llvmlite.LLVMType] = llvmlite.Int8(pool) + i8_ptr_ty_va: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, i8_ty_va) + va_buf_ty: rawptr[llvmlite.LLVMType] = llvmlite.Array(pool, i8_ty_va, 24) va_list_alloca: llvmlite.Value | t.CPtr = llvmlite.build_alloca_aligned( func_builder, va_buf_ty, 16) if va_list_alloca is not None: @@ -864,7 +864,7 @@ class FuncGenDef(CallGenBase.CallGenBase): # 注册到符号表(translate_name_value 对 vararg 名特殊处理返回地址) self.Gen.VarGen.define_var(trans.SymTab, vararg_name_str, va_list_alloca) # 调用 @llvm.va_start(i8* %va_list_addr) - void_ty_va: llvmlite.LLVMType | t.CPtr = llvmlite.Void(pool) + void_ty_va: rawptr[llvmlite.LLVMType] = llvmlite.Void(pool) llvmlite.build_call(func_builder, "llvm.va_start", va_list_addr, 1, void_ty_va, 0) # 保存到 trans 供 arg(type) 糖函数与 vararg 名翻译使用 @@ -885,11 +885,11 @@ class FuncGenDef(CallGenBase.CallGenBase): # try-except:保存当前函数的 EH 输出参数(__eh_msg_out__/__eh_code_out__) # 供 translate_raise / UnhandledBB 写入并向上传播。无 EH 参数的函数置空。 if string.strcmp(fd.name, "main") != 0 and self.Gen.FuncGenBase._body_has_raise(fd) != 0: - i8_ty_eh2: llvmlite.LLVMType | t.CPtr = llvmlite.Int8(pool) - i8_ptr_ty_eh2: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, i8_ty_eh2) - i8_ptr_ptr_ty_eh2: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, i8_ptr_ty_eh2) - i32_ty_eh2: llvmlite.LLVMType | t.CPtr = llvmlite.Int32(pool) - i32_ptr_ty_eh2: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, i32_ty_eh2) + i8_ty_eh2: rawptr[llvmlite.LLVMType] = llvmlite.Int8(pool) + i8_ptr_ty_eh2: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, i8_ty_eh2) + i8_ptr_ptr_ty_eh2: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, i8_ptr_ty_eh2) + i32_ty_eh2: rawptr[llvmlite.LLVMType] = llvmlite.Int32(pool) + i32_ptr_ty_eh2: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, i32_ty_eh2) if i8_ptr_ptr_ty_eh2 is not None and i32_ptr_ty_eh2 is not None: msg_out_ref: llvmlite.Value | t.CPtr = llvmlite.SSAValue( pool, i8_ptr_ptr_ty_eh2, "%__eh_msg_out__") @@ -900,7 +900,7 @@ class FuncGenDef(CallGenBase.CallGenBase): trans._cur_func_has_eh = 1 # 保存模块级作用域状态(仅非变量表相关) - old_func: llvmlite.Function | t.CPtr = trans._cur_func + old_func: rawptr[llvmlite.Function] = trans._cur_func old_builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder old_global_count: int = trans._global_name_count old_nonlocal_count: int = trans._nonlocal_name_count @@ -909,7 +909,7 @@ class FuncGenDef(CallGenBase.CallGenBase): old_vararg_name: str = trans._vararg_name # 返回注解上下文([C①] 裸名泛型构造的类型实参回退来源之一): # 进入函数体前记录本函数返回注解,退出时恢复外层函数的值 - old_ret_annot: ast.AST | t.CPtr = trans.CurFuncRetAnnot + old_ret_annot: rawptr[ast.AST] = trans.CurFuncRetAnnot trans._cur_func = func trans._cur_builder = func_builder @@ -924,15 +924,15 @@ class FuncGenDef(CallGenBase.CallGenBase): # 1. 先预扫描 Global/Nonlocal 声明(Python 语义:global/nonlocal # 对整个函数作用域生效,与声明位置无关,故须在任何赋值前注册) # 2. 再预扫描 AnnAssign 为局部变量提前创建 alloca - body: list[ast.AST | t.CPtr] | t.CPtr = fd.children + body: list[rawptr[ast.AST]] | t.CPtr = fd.children if body is not None: bn: sizet = len(body) for bi in range(bn): - stmt: ast.AST | t.CPtr = body.get(bi) + stmt: rawptr[ast.AST] = body.get(bi) if stmt is not None: self.Gen.StmtGenDecl.pre_scan_scope_decls(trans, stmt) for bi in range(bn): - stmt: ast.AST | t.CPtr = body.get(bi) + stmt: rawptr[ast.AST] = body.get(bi) if stmt is not None: self.Gen.StmtGenDecl.pre_scan_allocas(trans, stmt) @@ -940,7 +940,7 @@ class FuncGenDef(CallGenBase.CallGenBase): if body is not None: bn2: sizet = len(body) for bi2 in range(bn2): - stmt2: ast.AST | t.CPtr = body.get(bi2) + stmt2: rawptr[ast.AST] = body.get(bi2) if stmt2 is not None: # 嵌套函数定义前:预扫描其链内 nonlocal 并建堆 # (不同层捕获不同变量的场景,见 _prepare_chain_nonlocals) @@ -958,7 +958,7 @@ class FuncGenDef(CallGenBase.CallGenBase): if body is not None: bn3 = len(body) if bn3 > 0: - last_stmt: ast.AST | t.CPtr = body.get(bn3 - 1) + last_stmt: rawptr[ast.AST] = body.get(bn3 - 1) if last_stmt is not None and last_stmt.kind() == ast.ASTKind.Return: last_is_return = 1 if last_is_return == 0: @@ -977,7 +977,7 @@ class FuncGenDef(CallGenBase.CallGenBase): # 生成 unreachable 而非 fail-fast(GCC/Clang 对 fall-through 视为 UB 同语义)。 last_is_ctrl: int = 0 if bn3 > 0: - last_stmt3: ast.AST | t.CPtr = body.get(bn3 - 1) + last_stmt3: rawptr[ast.AST] = body.get(bn3 - 1) if last_stmt3 is not None: k3: int = last_stmt3.kind() if k3 == ast.ASTKind.If or k3 == ast.ASTKind.While or \ @@ -1005,8 +1005,8 @@ class FuncGenDef(CallGenBase.CallGenBase): fd.returns, imported_modules) != 0: _is_void = 1 elif fd.returns.kind() == ast.ASTKind.Constant: - ret_none_cn: ast.Constant | t.CPtr = ( - ast.Constant | t.CPtr)(fd.returns) + ret_none_cn: rawptr[ast.Constant] = ( + rawptr[ast.Constant])(fd.returns) if ret_none_cn.const_kind == ast.CONST_NONE: _is_void = 1 if _is_void != 0: @@ -1101,29 +1101,29 @@ class FuncGenDef(CallGenBase.CallGenBase): # i8* args_ptr, i8* ret_ptr, i8* decor_args_ptr) # 前置返回:0=跳过原函数,1=调用一次,N=循环 N 次 # ============================================================ - def _gen_decor_wrapper(self, trans: HT.Translator | t.CPtr, + def _gen_decor_wrapper(self, trans: rawptr[HT.Translator], pool: rawptr[memhub.MemBuddy], - mod: llvmlite.LLVMModule | t.CPtr, - func: llvmlite.Function | t.CPtr, + mod: rawptr[llvmlite.LLVMModule], + func: rawptr[llvmlite.Function], func_name: str, wrapper_name: str, handler_name: str, - decor_arg0: int64) -> llvmlite.Function | t.CPtr: + decor_arg0: int64) -> rawptr[llvmlite.Function]: """生成装饰器 wrapper 函数,返回 wrapper 或 None""" if trans is None or pool is None or mod is None or func is None: return None if func_name is None or wrapper_name is None or handler_name is None: return None - ret_ty: llvmlite.LLVMType | t.CPtr = llvmlite.function_get_ret_ty(func) + ret_ty: rawptr[llvmlite.LLVMType] = llvmlite.function_get_ret_ty(func) if ret_ty is None: return None orig_call_name: str = llvmlite.function_get_name(func) if orig_call_name is None: return None - i32_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int32(pool) - i8_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int8(pool) - i8_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, i8_ty) + i32_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int32(pool) + i8_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int8(pool) + i8_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, i8_ty) # ---- 收集原函数参数类型(按位置,最多 16 个)---- n_params: int = 0 @@ -1133,14 +1133,14 @@ class FuncGenDef(CallGenBase.CallGenBase): string.memset(param_tys, 0, 16 * 8) pp: llvmlite.Param | t.CPtr = llvmlite.function_get_param_head(func) while pp is not None: - pty: llvmlite.LLVMType | t.CPtr = llvmlite.param_get_ty(pp) + pty: rawptr[llvmlite.LLVMType] = llvmlite.param_get_ty(pp) if pty is not None and n_params < 16: param_tys[n_params] = sizet(pty) n_params += 1 pp = llvmlite.param_get_next(pp) # ---- 创建 wrapper 函数并添加参数(名字 %a0..%aN)---- - wrapper: llvmlite.Function | t.CPtr = llvmlite.create_function( + wrapper: rawptr[llvmlite.Function] = llvmlite.create_function( pool, mod, wrapper_name, ret_ty) if wrapper is None: return None @@ -1149,7 +1149,7 @@ class FuncGenDef(CallGenBase.CallGenBase): pname_w: str = pool.alloc(16) if pname_w is not None: viperlib.snprintf(pname_w, 16, "%%a%d", pi) - llvmlite.add_param(pool, wrapper, (llvmlite.LLVMType | t.CPtr)(param_tys[pi]), pname_w) + llvmlite.add_param(pool, wrapper, (rawptr[llvmlite.LLVMType])(param_tys[pi]), pname_w) # ---- 创建块 ---- entry_bb: llvmlite.BasicBlock | t.CPtr = llvmlite.create_block(pool, wrapper, "entry") @@ -1205,7 +1205,7 @@ class FuncGenDef(CallGenBase.CallGenBase): continue viperlib.snprintf(an_r, 16, "%%a%d", ri) av_r: llvmlite.Value | t.CPtr = llvmlite.SSAValue( - pool, (llvmlite.LLVMType | t.CPtr)(param_tys[ri]), an_r) + pool, (rawptr[llvmlite.LLVMType])(param_tys[ri]), an_r) if av_r is not None: llvmlite.value_set_next(av_r, None) if rec_args is None: @@ -1235,7 +1235,7 @@ class FuncGenDef(CallGenBase.CallGenBase): # ---- 公共装饰路径(entry 或 decorated_entry)---- # 1. ctx = alloca [32 x i8]; ctx_ptr = bitcast i8* - ctx_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Array(pool, i8_ty, 32) + ctx_ty: rawptr[llvmlite.LLVMType] = llvmlite.Array(pool, i8_ty, 32) ctx_alloca: llvmlite.Value | t.CPtr = llvmlite.build_alloca(wb, ctx_ty) ctx_ptr: llvmlite.Value | t.CPtr = llvmlite.build_bitcast(wb, ctx_alloca, i8_ptr_ty) @@ -1243,21 +1243,21 @@ class FuncGenDef(CallGenBase.CallGenBase): args_alloca: llvmlite.Value | t.CPtr = None args_ptr: llvmlite.Value | t.CPtr = None if n_params > 0: - fields_head: llvmlite.ParamNode | t.CPtr = None + fields_head: rawptr[llvmlite.Function] = None fk: int = 0 for fk in range(n_params - 1, -1, -1): - pn_n: llvmlite.ParamNode | t.CPtr = llvmlite.new_param_node( - pool, (llvmlite.LLVMType | t.CPtr)(param_tys[fk])) + pn_n: rawptr[llvmlite.Function] = llvmlite.new_param_node( + pool, (rawptr[llvmlite.LLVMType])(param_tys[fk])) if pn_n is not None: pn_n.Next = fields_head fields_head = pn_n - args_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Struct( + args_ty: rawptr[llvmlite.LLVMType] = llvmlite.Struct( pool, fields_head, n_params, None) if args_ty is not None: args_alloca = llvmlite.build_alloca(wb, args_ty) fi2: int = 0 for fi2 in range(n_params): - fld_ty: llvmlite.LLVMType | t.CPtr = (llvmlite.LLVMType | t.CPtr)(param_tys[fi2]) + fld_ty: rawptr[llvmlite.LLVMType] = (rawptr[llvmlite.LLVMType])(param_tys[fi2]) fld_ptr: llvmlite.Value | t.CPtr = llvmlite.build_gep_struct( wb, args_ty, fld_ty, args_alloca, fi2) if fld_ptr is not None: @@ -1295,7 +1295,7 @@ class FuncGenDef(CallGenBase.CallGenBase): # 5. handler 声明(未翻译时 declare,固定签名 i32 (i8*,i8*,i32,i8*,i8*,i8*)) if self.Gen.CallGenBase.find_func_in_module(mod, handler_name) is None: - handler_d: llvmlite.Function | t.CPtr = llvmlite.create_declare( + handler_d: rawptr[llvmlite.Function] = llvmlite.create_declare( pool, mod, handler_name, i32_ty) if handler_d is not None: llvmlite.add_param(pool, handler_d, i8_ptr_ty, "ctx") @@ -1344,7 +1344,7 @@ class FuncGenDef(CallGenBase.CallGenBase): if n_params > 0: k: int = 0 for k in range(n_params): - fld_ty_k: llvmlite.LLVMType | t.CPtr = (llvmlite.LLVMType | t.CPtr)(param_tys[k]) + fld_ty_k: rawptr[llvmlite.LLVMType] = (rawptr[llvmlite.LLVMType])(param_tys[k]) fld_pk: llvmlite.Value | t.CPtr = llvmlite.build_gep_struct( wb, args_ty, fld_ty_k, args_alloca, k) if fld_pk is None: diff --git a/App/lib/core/Gen/Func/FuncGenMixin.vp b/App/lib/core/Gen/Func/FuncGenMixin.vp index f000535..7001da5 100644 --- a/App/lib/core/Gen/Func/FuncGenMixin.vp +++ b/App/lib/core/Gen/Func/FuncGenMixin.vp @@ -74,20 +74,20 @@ class FuncGenMixin(CallGenBase.CallGenBase): # 闭包结构: {i8* fn_ptr, i8* env_ptr} (16 字节, malloc 分配) # Env 结构: {i8* ptr0, i8* ptr1, ...} (每个 nonlocal 变量 8 字节,指向父函数 alloca) # ============================================================ - def translate_nested_function_def(self, trans: HT.Translator | t.CPtr, - node: ast.AST | t.CPtr) -> int: + def translate_nested_function_def(self, trans: rawptr[HT.Translator], + node: rawptr[ast.AST]) -> int: """翻译嵌套函数定义:提升为顶层函数 + 创建闭包""" - fd: ast.FunctionDef | t.CPtr = (ast.FunctionDef | t.CPtr)(node) + fd: rawptr[ast.FunctionDef] = rawptr[ast.FunctionDef](node) if fd is None or fd.name is None: return 0 pool: rawptr[memhub.MemBuddy] = trans.Pool - mod: llvmlite.LLVMModule | t.CPtr = trans.Module + mod: rawptr[llvmlite.LLVMModule] = trans.Module func_name: str = fd.name - i32_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int32(pool) - i8_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int8(pool) - i8_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, i8_ty) + i32_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int32(pool) + i8_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int8(pool) + i8_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, i8_ty) # 1. 构建提升后的函数名: __closure_{name}(加 SHA1 前缀避免跨模块冲突) promoted_name: str = pool.alloc(64) @@ -96,7 +96,7 @@ class FuncGenMixin(CallGenBase.CallGenBase): mangled_promoted: str = self.Gen.FuncGenBase._mangle_name(trans, promoted_name) # 2. 创建提升后的函数: define i32 @__closure_{name}(i8* %env, args...) - func: llvmlite.Function | t.CPtr = llvmlite.create_function( + func: rawptr[llvmlite.Function] = llvmlite.create_function( pool, mod, mangled_promoted, i32_ty) if func is None: return 0 @@ -111,20 +111,20 @@ class FuncGenMixin(CallGenBase.CallGenBase): string.memset(param_tys, 0, 8 * 64) param_count: int = 0 if fd.args is not None: - ags_n: ast.Arguments | t.CPtr = (ast.Arguments | t.CPtr)(fd.args) + ags_n: rawptr[ast.Arguments] = rawptr[ast.Arguments](fd.args) if ags_n.args is not None: - alist_n: list[ast.AST | t.CPtr] | t.CPtr = ags_n.args + alist_n: list[rawptr[ast.AST]] | t.CPtr = ags_n.args an_n: sizet = len(alist_n) for ai_n in range(an_n): - arg_n: ast.Arg | t.CPtr = (ast.Arg | t.CPtr)(alist_n.get(ai_n)) + arg_n: rawptr[ast.Arg] = rawptr[ast.Arg](alist_n.get(ai_n)) if arg_n is None or arg_n.arg is None: continue if arg_n.annotation is not None: if self.Gen.TypeGenResolve._is_t_attr(arg_n.annotation, "CVoid", imported_modules) != 0: continue - pty_n: llvmlite.LLVMType | t.CPtr = i32_ty + pty_n: rawptr[llvmlite.LLVMType] = i32_ty if arg_n.annotation is not None: - resolved_n: llvmlite.LLVMType | t.CPtr = self.Gen.TypeGenResolve.resolve_annotation_type( + resolved_n: rawptr[llvmlite.LLVMType] = self.Gen.TypeGenResolve.resolve_annotation_type( pool, arg_n.annotation, imported_modules, from_imports, trans, 0) if resolved_n is not None: match resolved_n: @@ -166,13 +166,13 @@ class FuncGenMixin(CallGenBase.CallGenBase): # 5a. 创建嵌套函数参数 alloca(函数体内参数名可引用,如 # accumulate(n) 内 for i in range(n)、set_result(val) 内 result = val) if fd.args is not None: - ags_p: ast.Arguments | t.CPtr = (ast.Arguments | t.CPtr)(fd.args) + ags_p: rawptr[ast.Arguments] = rawptr[ast.Arguments](fd.args) if ags_p.args is not None: - alist_p: list[ast.AST | t.CPtr] | t.CPtr = ags_p.args + alist_p: list[rawptr[ast.AST]] | t.CPtr = ags_p.args idx_p: int = 0 apn: sizet = len(alist_p) for api in range(apn): - arg_p: ast.Arg | t.CPtr = (ast.Arg | t.CPtr)(alist_p.get(api)) + arg_p: rawptr[ast.Arg] = rawptr[ast.Arg](alist_p.get(api)) if arg_p is None or arg_p.arg is None: continue if arg_p.annotation is not None: @@ -180,11 +180,11 @@ class FuncGenMixin(CallGenBase.CallGenBase): continue if idx_p >= param_count: break - pty2_n: llvmlite.LLVMType | t.CPtr = i32_ty + pty2_n: rawptr[llvmlite.LLVMType] = i32_ty if param_tys is not None: ty_addr_n: uint64 = uint64(param_tys) + idx_p * 8 ty_slot_n: str | t.CPtr = (t.CPtr)(ty_addr_n) - pty2_n = (llvmlite.LLVMType | t.CPtr)(ty_slot_n[0]) + pty2_n = (rawptr[llvmlite.LLVMType])(ty_slot_n[0]) if pty2_n is None: pty2_n = i32_ty p_alloca: llvmlite.Value | t.CPtr = llvmlite.build_alloca(func_builder, pty2_n) @@ -204,7 +204,7 @@ class FuncGenMixin(CallGenBase.CallGenBase): idx_p += 1 # 6. 保存父函数作用域状态(仅非变量表相关) - old_func: llvmlite.Function | t.CPtr = trans._cur_func + old_func: rawptr[llvmlite.Function] = trans._cur_func old_builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder old_func_name: str = trans._cur_func_name old_global_count: int = trans._global_name_count @@ -232,15 +232,15 @@ class FuncGenMixin(CallGenBase.CallGenBase): # 8. 预扫描函数体: # a. 先预扫描 Global/Nonlocal 声明(Python 语义:对整个函数作用域生效) # b. 再预扫描 AnnAssign 为局部变量提前创建 alloca - body: list[ast.AST | t.CPtr] | t.CPtr = fd.children + body: list[rawptr[ast.AST]] | t.CPtr = fd.children if body is not None: bn: sizet = len(body) for bi in range(bn): - stmt: ast.AST | t.CPtr = body.get(bi) + stmt: rawptr[ast.AST] = body.get(bi) if stmt is not None: self.Gen.StmtGenDecl.pre_scan_scope_decls(trans, stmt) for bi in range(bn): - stmt: ast.AST | t.CPtr = body.get(bi) + stmt: rawptr[ast.AST] = body.get(bi) if stmt is not None: self.Gen.StmtGenDecl.pre_scan_allocas(trans, stmt) @@ -252,7 +252,7 @@ class FuncGenMixin(CallGenBase.CallGenBase): if body is not None: bnc: sizet = len(body) for bic in range(bnc): - stmtc: ast.AST | t.CPtr = body.get(bic) + stmtc: rawptr[ast.AST] = body.get(bic) if stmtc is not None: self._closure_scan_captures(trans, stmtc) @@ -260,7 +260,7 @@ class FuncGenMixin(CallGenBase.CallGenBase): if body is not None: bn2: sizet = len(body) for bi2 in range(bn2): - stmt2: ast.AST | t.CPtr = body.get(bi2) + stmt2: rawptr[ast.AST] = body.get(bi2) if stmt2 is not None: self.Gen.StmtGen.translate_stmt(trans, stmt2) @@ -269,7 +269,7 @@ class FuncGenMixin(CallGenBase.CallGenBase): if body is not None: bn3: sizet = len(body) if bn3 > 0: - last_stmt: ast.AST | t.CPtr = body.get(bn3 - 1) + last_stmt: rawptr[ast.AST] = body.get(bn3 - 1) if last_stmt is not None and last_stmt.kind() == ast.ASTKind.Return: last_is_return = 1 if last_is_return == 0: @@ -319,7 +319,7 @@ class FuncGenMixin(CallGenBase.CallGenBase): # → 从父函数 env 读该变量的堆地址(_load_raw_var_ptr), # env[ni] = 同一堆地址(运行时链式共享,各层写同一堆) if env_ptr is not None: - i8_ptr_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, i8_ptr_ty) + i8_ptr_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, i8_ptr_ty) for ni in range(nested_nonlocal_count): # 从 _nonlocal_names 缓冲区读取名称 name_addr: uint64 = uint64(trans._nonlocal_names) + ni * 8 @@ -345,7 +345,7 @@ class FuncGenMixin(CallGenBase.CallGenBase): trans.SymTab, nl_name) if local_alloca is not None and local_alloca.Ty is not None: # 父函数局部变量:新建堆存储 + 拷贝当前值 + 重定向 - nl_load_ty: llvmlite.LLVMType | t.CPtr = local_alloca.Ty.Pointee + nl_load_ty: rawptr[llvmlite.LLVMType] = local_alloca.Ty.Pointee if nl_load_ty is not None: cur_val_nl: llvmlite.Value | t.CPtr = llvmlite.build_load( parent_builder, nl_load_ty, local_alloca) @@ -421,9 +421,9 @@ class FuncGenMixin(CallGenBase.CallGenBase): # 13c. 存储 fn_ptr 到 offset 0 # 创建函数指针类型 i32(i8*)* - fn_param_node: llvmlite.ParamNode | t.CPtr = llvmlite.new_param_node(pool, i8_ptr_ty) - fn_func_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Func(pool, i32_ty, fn_param_node, 1) - fn_func_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, fn_func_ty) + fn_param_node: rawptr[llvmlite.Function] = llvmlite.new_param_node(pool, i8_ptr_ty) + fn_func_ty: rawptr[llvmlite.LLVMType] = llvmlite.Func(pool, i32_ty, fn_param_node, 1) + fn_func_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, fn_func_ty) # 创建函数引用 Value(类型为 i32(i8*)*,使用 SHA1 混淆名) fn_ptr_name: str = pool.alloc(64) @@ -483,14 +483,14 @@ class FuncGenMixin(CallGenBase.CallGenBase): # 属于父函数 → llc "use of undefined value")。故对嵌套 def 做等价预扫描:把"读取的外层 # 函数局部变量"注册为 nonlocal(复用 env 共享堆机制),使 read 走 _load_raw_var_ptr 从堆读。 # 注意:注册顺序必须与 step 13 的 env 构建一致(本扫描在 body 翻译前执行,顺序稳定)。 - def _closure_scan_captures(self, trans: HT.Translator | t.CPtr, - node: ast.AST | t.CPtr) -> int: + def _closure_scan_captures(self, trans: rawptr[HT.Translator], + node: rawptr[ast.AST]) -> int: """递归扫描节点中的隐式捕获并注册为 nonlocal""" if node is None or trans is None: return 1 k: int = node.kind() if k == ast.ASTKind.Name: - nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(node) + nm: rawptr[ast.Name] = rawptr[ast.Name](node) if nm.id is None: return 1 # 当前作用域已定义(参数 / AnnAssign 局部,含分支内)→ 非捕获 @@ -503,7 +503,7 @@ class FuncGenMixin(CallGenBase.CallGenBase): trans.SymTab, nm.id) if ve is None or ve.Alloca is None or ve.Alloca.Ty is None: return 1 - nl_ty: llvmlite.LLVMType | t.CPtr = ve.Alloca.Ty.Pointee + nl_ty: rawptr[llvmlite.LLVMType] = ve.Alloca.Ty.Pointee if nl_ty is None: return 1 # 模块级全局直接解析,无需 env 捕获 @@ -517,12 +517,12 @@ class FuncGenMixin(CallGenBase.CallGenBase): return 1 # ---- 语句 ---- if k == ast.ASTKind.Assign: - asn: ast.Assign | t.CPtr = (ast.Assign | t.CPtr)(node) + asn: rawptr[ast.Assign] = rawptr[ast.Assign](node) if asn.value is not None: self._closure_scan_captures(trans, asn.value) return 1 if k == ast.ASTKind.AnnAssign: - aan: ast.AnnAssign | t.CPtr = (ast.AnnAssign | t.CPtr)(node) + aan: rawptr[ast.AnnAssign] = rawptr[ast.AnnAssign](node) if aan.value is not None: self._closure_scan_captures(trans, aan.value) return 1 @@ -585,11 +585,11 @@ class FuncGenMixin(CallGenBase.CallGenBase): self._closure_scan_captures(trans, ex_n.value) return 1 if k == ast.ASTKind.With: - wth: ast.With | t.CPtr = (ast.With | t.CPtr)(node) + wth: rawptr[ast.With] = rawptr[ast.With](node) if wth.items is not None: bn_wi: sizet = len(wth.items) for bi_wi in range(bn_wi): - wi_n: ast.AST | t.CPtr = wth.items.get(bi_wi) + wi_n: rawptr[ast.AST] = wth.items.get(bi_wi) if wi_n is not None and wi_n.kind() == ast.ASTKind.WithItem: wi_c: ast.WithItem | t.CPtr = (ast.WithItem | t.CPtr)(wi_n) if wi_c.context_expr is not None: @@ -614,7 +614,7 @@ class FuncGenMixin(CallGenBase.CallGenBase): self._closure_scan_captures(trans, as_n.msg) return 1 if k == ast.ASTKind.Try: - tr_n: ast.Try | t.CPtr = (ast.Try | t.CPtr)(node) + tr_n: rawptr[ast.Try] = rawptr[ast.Try](node) if tr_n.children is not None: bn_t: sizet = len(tr_n.children) for bi_t in range(bn_t): @@ -622,9 +622,9 @@ class FuncGenMixin(CallGenBase.CallGenBase): if tr_n.handlers is not None: bn_th: sizet = len(tr_n.handlers) for bi_th in range(bn_th): - eh_n: ast.AST | t.CPtr = tr_n.handlers.get(bi_th) + eh_n: rawptr[ast.AST] = tr_n.handlers.get(bi_th) if eh_n is not None and eh_n.kind() == ast.ASTKind.ExceptHandler: - eh_c: ast.ExceptHandler | t.CPtr = (ast.ExceptHandler | t.CPtr)(eh_n) + eh_c: rawptr[ast.ExceptHandler] = rawptr[ast.ExceptHandler](eh_n) if eh_c.children is not None: bn_ehb: sizet = len(eh_c.children) for bi_ehb in range(bn_ehb): @@ -639,13 +639,13 @@ class FuncGenMixin(CallGenBase.CallGenBase): self._closure_scan_captures(trans, tr_n.finalbody.get(bi_tf)) return 1 if k == ast.ASTKind.Match: - mt_n: ast.Match | t.CPtr = (ast.Match | t.CPtr)(node) + mt_n: rawptr[ast.Match] = rawptr[ast.Match](node) if mt_n.subject is not None: self._closure_scan_captures(trans, mt_n.subject) if mt_n.cases is not None: bn_mc: sizet = len(mt_n.cases) for bi_mc in range(bn_mc): - mc_n: ast.AST | t.CPtr = mt_n.cases.get(bi_mc) + mc_n: rawptr[ast.AST] = mt_n.cases.get(bi_mc) if mc_n is not None and mc_n.kind() == ast.ASTKind.MatchCase: mc_c: ast.MatchCase | t.CPtr = (ast.MatchCase | t.CPtr)(mc_n) if mc_c.guard is not None: @@ -657,14 +657,14 @@ class FuncGenMixin(CallGenBase.CallGenBase): return 1 # ---- 表达式 ---- if k == ast.ASTKind.BinOp: - bop: ast.BinOp | t.CPtr = (ast.BinOp | t.CPtr)(node) + bop: rawptr[ast.BinOp] = rawptr[ast.BinOp](node) if bop.left is not None: self._closure_scan_captures(trans, bop.left) if bop.right is not None: self._closure_scan_captures(trans, bop.right) return 1 if k == ast.ASTKind.UnaryOp: - uop: ast.UnaryOp | t.CPtr = (ast.UnaryOp | t.CPtr)(node) + uop: rawptr[ast.UnaryOp] = rawptr[ast.UnaryOp](node) if uop.operand is not None: self._closure_scan_captures(trans, uop.operand) return 1 @@ -685,7 +685,7 @@ class FuncGenMixin(CallGenBase.CallGenBase): self._closure_scan_captures(trans, cmp.comparators.get(bi_cmp)) return 1 if k == ast.ASTKind.Call: - cal: ast.Call | t.CPtr = (ast.Call | t.CPtr)(node) + cal: rawptr[ast.Call] = rawptr[ast.Call](node) if cal.func is not None: self._closure_scan_captures(trans, cal.func) if cal.args is not None: @@ -695,21 +695,21 @@ class FuncGenMixin(CallGenBase.CallGenBase): if cal.keywords is not None: bn_ck: sizet = len(cal.keywords) for bi_ck in range(bn_ck): - kw_n: ast.AST | t.CPtr = cal.keywords.get(bi_ck) + kw_n: rawptr[ast.AST] = cal.keywords.get(bi_ck) if kw_n is not None and kw_n.kind() == ast.ASTKind.Keyword: kw_c: ast.Keyword | t.CPtr = (ast.Keyword | t.CPtr)(kw_n) if kw_c.value is not None: self._closure_scan_captures(trans, kw_c.value) return 1 if k == ast.ASTKind.Subscript: - sub: ast.Subscript | t.CPtr = (ast.Subscript | t.CPtr)(node) + sub: rawptr[ast.Subscript] = rawptr[ast.Subscript](node) if sub.value is not None: self._closure_scan_captures(trans, sub.value) if sub.slice is not None: self._closure_scan_captures(trans, sub.slice) return 1 if k == ast.ASTKind.Attribute: - at_n: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(node) + at_n: rawptr[ast.Attribute] = rawptr[ast.Attribute](node) if at_n.value is not None: self._closure_scan_captures(trans, at_n.value) return 1 @@ -748,7 +748,7 @@ class FuncGenMixin(CallGenBase.CallGenBase): self._closure_scan_captures(trans, ls_n.elts.get(bi_ls)) return 1 if k == ast.ASTKind.Tuple: - tp_n: ast.Tuple | t.CPtr = (ast.Tuple | t.CPtr)(node) + tp_n: rawptr[ast.Tuple] = rawptr[ast.Tuple](node) if tp_n.elts is not None: bn_tp: sizet = len(tp_n.elts) for bi_tp in range(bn_tp): @@ -816,7 +816,7 @@ class FuncGenMixin(CallGenBase.CallGenBase): if lc_n.generators is not None: bn_gen: sizet = len(lc_n.generators) for bi_gen in range(bn_gen): - cp_n: ast.AST | t.CPtr = lc_n.generators.get(bi_gen) + cp_n: rawptr[ast.AST] = lc_n.generators.get(bi_gen) if cp_n is not None and cp_n.kind() == ast.ASTKind.Comprehension: cp_c: ast.Comprehension | t.CPtr = (ast.Comprehension | t.CPtr)(cp_n) if cp_c.iter is not None: @@ -835,7 +835,7 @@ class FuncGenMixin(CallGenBase.CallGenBase): if dcn.generators is not None: bn_dgen: sizet = len(dcn.generators) for bi_dgen in range(bn_dgen): - cp_dn: ast.AST | t.CPtr = dcn.generators.get(bi_dgen) + cp_dn: rawptr[ast.AST] = dcn.generators.get(bi_dgen) if cp_dn is not None and cp_dn.kind() == ast.ASTKind.Comprehension: cp_dc: ast.Comprehension | t.CPtr = (ast.Comprehension | t.CPtr)(cp_dn) if cp_dc.iter is not None: @@ -855,7 +855,7 @@ class FuncGenMixin(CallGenBase.CallGenBase): # (结构体尺寸需查布局表,本函数只做 LLVMType 递归);改 fatal 会拒绝 # "nonlocal 结构体"这一合法用法,需先补布局查询能力。 def _type_byte_size(self, pool: rawptr[memhub.MemBuddy], - ty: llvmlite.LLVMType | t.CPtr) -> int: + ty: rawptr[llvmlite.LLVMType]) -> int: """计算 LLVM 类型占用的字节大小(递归)""" if ty is None: # [S4 fail-fast] 类型缺失 → 不再保守 8 字节(分配不足会越界写邻块) @@ -889,7 +889,7 @@ class FuncGenMixin(CallGenBase.CallGenBase): # 局部的,跨函数传递堆地址只能经全局变量/模块级映射)。 # ============================================================ def _nl_heap_global_name(self, pool: rawptr[memhub.MemBuddy], - trans: HT.Translator | t.CPtr, + trans: rawptr[HT.Translator], name: str) -> str: """构造 nonlocal 堆地址全局映射变量名 nlheap_{sha1}.{name}""" if pool is None or trans is None or name is None: @@ -904,7 +904,7 @@ class FuncGenMixin(CallGenBase.CallGenBase): # _nl_heap_global_ref - 全局映射变量引用 Value(i8**) # ============================================================ def _nl_heap_global_ref(self, pool: rawptr[memhub.MemBuddy], - trans: HT.Translator | t.CPtr, + trans: rawptr[HT.Translator], name: str) -> llvmlite.Value | t.CPtr: """获取 nonlocal 堆地址全局映射变量的引用(@"..." 引号包裹)""" if pool is None or trans is None or name is None: @@ -912,8 +912,8 @@ class FuncGenMixin(CallGenBase.CallGenBase): gname: str = self._nl_heap_global_name(pool, trans, name) if gname is None: return None - i8_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int8(pool) - i8_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, i8_ty) + i8_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int8(pool) + i8_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, i8_ty) ref_buf: str = pool.alloc(176) if ref_buf is None: return None @@ -923,7 +923,7 @@ class FuncGenMixin(CallGenBase.CallGenBase): # ============================================================ # _nl_heap_global_exists - 检查 nonlocal 堆地址全局映射变量是否存在 # ============================================================ - def _nl_heap_global_exists(self, mod: llvmlite.LLVMModule | t.CPtr, + def _nl_heap_global_exists(self, mod: rawptr[llvmlite.LLVMModule], gname: str) -> int: """检查全局映射变量 gname 是否已在模块中,1=存在""" if mod is None or gname is None: @@ -941,20 +941,20 @@ class FuncGenMixin(CallGenBase.CallGenBase): # 遍历 node(FunctionDef)的 children:遇嵌套 FunctionDef 递归, # 遇 Nonlocal 语句收集变量名(去重)。返回更新后的计数。 # ============================================================ - def _collect_chain_nonlocals(self, trans: HT.Translator | t.CPtr, - node: ast.AST | t.CPtr, + def _collect_chain_nonlocals(self, trans: rawptr[HT.Translator], + node: rawptr[ast.AST], names: t.CPtr, count: int) -> int: """递归收集 node(FunctionDef)链内所有 nonlocal 声明名(去重)""" if node is None or names is None: return count - fd: ast.FunctionDef | t.CPtr = (ast.FunctionDef | t.CPtr)(node) + fd: rawptr[ast.FunctionDef] = rawptr[ast.FunctionDef](node) if fd is None or fd.children is None: return count - ch: list[ast.AST | t.CPtr] | t.CPtr = fd.children + ch: list[rawptr[ast.AST]] | t.CPtr = fd.children cn: sizet = len(ch) for ci in range(cn): - st: ast.AST | t.CPtr = ch.get(ci) + st: rawptr[ast.AST] = ch.get(ci) if st is None: continue k: int = st.kind() @@ -963,13 +963,13 @@ class FuncGenMixin(CallGenBase.CallGenBase): elif k == ast.ASTKind.Nonlocal: nl_node: ast.Nonlocal | t.CPtr = (ast.Nonlocal | t.CPtr)(st) if nl_node is not None and nl_node.names is not None: - nl_list: list[ast.AST | t.CPtr] | t.CPtr = nl_node.names + nl_list: list[rawptr[ast.AST]] | t.CPtr = nl_node.names nn: sizet = len(nl_list) for ni in range(nn): - nm_node: ast.AST | t.CPtr = nl_list.get(ni) + nm_node: rawptr[ast.AST] = nl_list.get(ni) if nm_node is None: continue - nm_x: ast.Name | t.CPtr = (ast.Name | t.CPtr)(nm_node) + nm_x: rawptr[ast.Name] = rawptr[ast.Name](nm_node) if nm_x is None or nm_x.id is None: continue dup: int = 0 @@ -995,13 +995,13 @@ class FuncGenMixin(CallGenBase.CallGenBase): # 建堆 + 重定向 VarEntry + 把堆地址 store 到模块级映射 # @nlheap.{sha1}.{name}(全局变量跨函数可见),内层闭包创建时从映射 load。 # ============================================================ - def _prepare_chain_nonlocals(self, trans: HT.Translator | t.CPtr, - node: ast.AST | t.CPtr, + def _prepare_chain_nonlocals(self, trans: rawptr[HT.Translator], + node: rawptr[ast.AST], pool: rawptr[memhub.MemBuddy], builder: llvmlite.IRBuilder | t.CPtr, - mod: llvmlite.LLVMModule | t.CPtr, - i8_ty: llvmlite.LLVMType | t.CPtr, - i8_ptr_ty: llvmlite.LLVMType | t.CPtr) -> int: + mod: rawptr[llvmlite.LLVMModule], + i8_ty: rawptr[llvmlite.LLVMType], + i8_ptr_ty: rawptr[llvmlite.LLVMType]) -> int: """预收集嵌套函数链内 nonlocal 并建堆,1 成功""" if node is None or trans is None or builder is None or mod is None: return 0 @@ -1029,7 +1029,7 @@ class FuncGenMixin(CallGenBase.CallGenBase): trans.SymTab, nl_name) if local_alloca is None or local_alloca.Ty is None: continue - nl_ty: llvmlite.LLVMType | t.CPtr = local_alloca.Ty.Pointee + nl_ty: rawptr[llvmlite.LLVMType] = local_alloca.Ty.Pointee if nl_ty is None: continue gname: str = self._nl_heap_global_name(pool, trans, nl_name) @@ -1097,9 +1097,9 @@ class FuncGenMixin(CallGenBase.CallGenBase): # ============================================================ def translate_lambda(self, builder: llvmlite.IRBuilder | t.CPtr, pool: rawptr[memhub.MemBuddy], - mod: llvmlite.LLVMModule | t.CPtr, - node: ast.AST | t.CPtr, - trans: HT.Translator | t.CPtr = None) -> llvmlite.Value | t.CPtr: + mod: rawptr[llvmlite.LLVMModule], + node: rawptr[ast.AST], + trans: rawptr[HT.Translator] = None) -> llvmlite.Value | t.CPtr: """翻译 lambda 表达式,返回闭包指针(i8*)""" if node is None or trans is None or builder is None: return None @@ -1107,10 +1107,10 @@ class FuncGenMixin(CallGenBase.CallGenBase): if lam is None: return None - i32_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int32(pool) - i8_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int8(pool) - i8_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, i8_ty) - i8_ptr_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, i8_ptr_ty) + i32_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int32(pool) + i8_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int8(pool) + i8_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, i8_ty) + i8_ptr_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, i8_ptr_ty) # 1. lambda id + 提升函数名 # 注意:计数器放 trans(_lambda_count)而非 self——Mixin 类自身无字段, @@ -1135,20 +1135,20 @@ class FuncGenMixin(CallGenBase.CallGenBase): string.memset(param_tys, 0, 8 * 64) param_count: int = 0 if lam.args is not None: - ags: ast.Arguments | t.CPtr = (ast.Arguments | t.CPtr)(lam.args) + ags: rawptr[ast.Arguments] = rawptr[ast.Arguments](lam.args) if ags.args is not None: - alist: list[ast.AST | t.CPtr] | t.CPtr = ags.args + alist: list[rawptr[ast.AST]] | t.CPtr = ags.args pn: sizet = len(alist) for pi in range(pn): if param_count >= 64: break - arg_n: ast.Arg | t.CPtr = (ast.Arg | t.CPtr)(alist.get(pi)) + arg_n: rawptr[ast.Arg] = rawptr[ast.Arg](alist.get(pi)) if arg_n is None or arg_n.arg is None: continue string.strncpy(param_names + param_count * 32, arg_n.arg, 31) - p_ty: llvmlite.LLVMType | t.CPtr = i32_ty + p_ty: rawptr[llvmlite.LLVMType] = i32_ty if arg_n.annotation is not None: - resolved: llvmlite.LLVMType | t.CPtr = self.Gen.TypeGenResolve.resolve_annotation_type( + resolved: rawptr[llvmlite.LLVMType] = self.Gen.TypeGenResolve.resolve_annotation_type( pool, arg_n.annotation, trans._imported_modules, trans._from_imports, trans, 0) if resolved is None: # fail-fast:lambda 参数有注解但类型解析失败,不再静默保持 i32 @@ -1187,7 +1187,7 @@ class FuncGenMixin(CallGenBase.CallGenBase): cap_names, cap_allocas, cap_tys, 0) # 4. 创建提升函数 __lambda_{id}(i8* %env, [args...]) - func: llvmlite.Function | t.CPtr = llvmlite.create_function( + func: rawptr[llvmlite.Function] = llvmlite.create_function( pool, mod, mangled_promoted, i32_ty) if func is None: return None @@ -1195,7 +1195,7 @@ class FuncGenMixin(CallGenBase.CallGenBase): for pi2 in range(param_count): ty_addr2: uint64 = uint64(param_tys) + pi2 * 8 ty_slot2: str | t.CPtr = (t.CPtr)(ty_addr2) - p_ty2: llvmlite.LLVMType | t.CPtr = (llvmlite.LLVMType | t.CPtr)(ty_slot2[0]) + p_ty2: rawptr[llvmlite.LLVMType] = (rawptr[llvmlite.LLVMType])(ty_slot2[0]) if p_ty2 is None: p_ty2 = i32_ty pname_l: str = pool.alloc(32) @@ -1223,7 +1223,7 @@ class FuncGenMixin(CallGenBase.CallGenBase): llvmlite.build_store(func_builder, env_param_val, env_alloca) # 8. 保存父函数状态并切换到提升函数 - old_func: llvmlite.Function | t.CPtr = trans._cur_func + old_func: rawptr[llvmlite.Function] = trans._cur_func old_builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder old_func_name: str = trans._cur_func_name old_global_count: int = trans._global_name_count @@ -1244,7 +1244,7 @@ class FuncGenMixin(CallGenBase.CallGenBase): continue ty_addr3: uint64 = uint64(cap_tys) + ci * 8 ty_slot3: str | t.CPtr = (t.CPtr)(ty_addr3) - cap_ty: llvmlite.LLVMType | t.CPtr = (llvmlite.LLVMType | t.CPtr)(ty_slot3[0]) + cap_ty: rawptr[llvmlite.LLVMType] = (rawptr[llvmlite.LLVMType])(ty_slot3[0]) if cap_ty is None: continue off_val: llvmlite.Value | t.CPtr = llvmlite.const_int32(pool, ci * 8) @@ -1273,7 +1273,7 @@ class FuncGenMixin(CallGenBase.CallGenBase): for pi3 in range(param_count): ty_addr4: uint64 = uint64(param_tys) + pi3 * 8 ty_slot4: str | t.CPtr = (t.CPtr)(ty_addr4) - p_ty3: llvmlite.LLVMType | t.CPtr = (llvmlite.LLVMType | t.CPtr)(ty_slot4[0]) + p_ty3: rawptr[llvmlite.LLVMType] = (rawptr[llvmlite.LLVMType])(ty_slot4[0]) if p_ty3 is None: # fail-fast:lambda 参数类型槽缺失(内部状态不一致),不再静默保持 i32 self.Gen.TypeGenErr.fatal_error( @@ -1339,8 +1339,8 @@ class FuncGenMixin(CallGenBase.CallGenBase): continue ty_addr5: uint64 = uint64(cap_tys) + ci3 * 8 ty_slot5: str | t.CPtr = (t.CPtr)(ty_addr5) - cap_ty2: llvmlite.LLVMType | t.CPtr = ( - llvmlite.LLVMType | t.CPtr)(ty_slot5[0]) + cap_ty2: rawptr[llvmlite.LLVMType] = ( + rawptr[llvmlite.LLVMType])(ty_slot5[0]) if cap_ty2 is None: continue # 堆存储大小:位宽/8,至少 8 字节(容纳指针/标量) @@ -1380,9 +1380,9 @@ class FuncGenMixin(CallGenBase.CallGenBase): return None # 15. [0] = fn_ptr(函数引用 bitcast 到 i8*) - fn_param_node: llvmlite.ParamNode | t.CPtr = llvmlite.new_param_node(pool, i8_ptr_ty) - fn_func_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Func(pool, i32_ty, fn_param_node, 1) - fn_func_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, fn_func_ty) + fn_param_node: rawptr[llvmlite.Function] = llvmlite.new_param_node(pool, i8_ptr_ty) + fn_func_ty: rawptr[llvmlite.LLVMType] = llvmlite.Func(pool, i32_ty, fn_param_node, 1) + fn_func_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, fn_func_ty) fn_ptr_name: str = pool.alloc(64) if fn_ptr_name is not None: if string.strchr(mangled_promoted, '.') is not None: @@ -1421,8 +1421,8 @@ class FuncGenMixin(CallGenBase.CallGenBase): # 记录到 cap_names/cap_allocas/cap_tys 三个并行缓冲。 # 返回更新后的捕获数量(递归调用逐层累加)。 # ============================================================ - def _lambda_scan_body(self, trans: HT.Translator | t.CPtr, - node: ast.AST | t.CPtr, + def _lambda_scan_body(self, trans: rawptr[HT.Translator], + node: rawptr[ast.AST], param_names: str, param_count: int, cap_names: str, @@ -1434,7 +1434,7 @@ class FuncGenMixin(CallGenBase.CallGenBase): return cap_count k: int = node.kind() if k == ast.ASTKind.Name: - nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(node) + nm: rawptr[ast.Name] = rawptr[ast.Name](node) if nm.id is None: return cap_count # 排除 lambda 参数 @@ -1449,7 +1449,7 @@ class FuncGenMixin(CallGenBase.CallGenBase): alloca: llvmlite.Value | t.CPtr = self.Gen.VarGen.lookup_var(trans.SymTab, nm.id) if alloca is None or alloca.Ty is None: return cap_count - pointee: llvmlite.LLVMType | t.CPtr = alloca.Ty.Pointee + pointee: rawptr[llvmlite.LLVMType] = alloca.Ty.Pointee if pointee is None: return cap_count # 跳过模块级全局(body 直接解析全局,无需 env 捕获) @@ -1469,20 +1469,20 @@ class FuncGenMixin(CallGenBase.CallGenBase): return cap_count + 1 # 递归遍历常见表达式子节点 if k == ast.ASTKind.BinOp: - bop: ast.BinOp | t.CPtr = (ast.BinOp | t.CPtr)(node) + bop: rawptr[ast.BinOp] = rawptr[ast.BinOp](node) cc1: int = self._lambda_scan_body(trans, bop.left, param_names, param_count, cap_names, cap_allocas, cap_tys, cap_count) return self._lambda_scan_body(trans, bop.right, param_names, param_count, cap_names, cap_allocas, cap_tys, cc1) if k == ast.ASTKind.UnaryOp: - uop: ast.UnaryOp | t.CPtr = (ast.UnaryOp | t.CPtr)(node) + uop: rawptr[ast.UnaryOp] = rawptr[ast.UnaryOp](node) return self._lambda_scan_body(trans, uop.operand, param_names, param_count, cap_names, cap_allocas, cap_tys, cap_count) if k == ast.ASTKind.BoolOp: bop2: ast.BoolOp | t.CPtr = (ast.BoolOp | t.CPtr)(node) cc2: int = cap_count if bop2.values is not None: - vs: list[ast.AST | t.CPtr] | t.CPtr = bop2.values + vs: list[rawptr[ast.AST]] | t.CPtr = bop2.values vn: sizet = len(vs) for vi in range(vn): cc2 = self._lambda_scan_body(trans, vs.get(vi), param_names, param_count, @@ -1493,24 +1493,24 @@ class FuncGenMixin(CallGenBase.CallGenBase): cc3: int = self._lambda_scan_body(trans, cmp.left, param_names, param_count, cap_names, cap_allocas, cap_tys, cap_count) if cmp.comparators is not None: - cl: list[ast.AST | t.CPtr] | t.CPtr = cmp.comparators + cl: list[rawptr[ast.AST]] | t.CPtr = cmp.comparators cn: sizet = len(cl) for cvi in range(cn): cc3 = self._lambda_scan_body(trans, cl.get(cvi), param_names, param_count, cap_names, cap_allocas, cap_tys, cc3) return cc3 if k == ast.ASTKind.Call: - cal: ast.Call | t.CPtr = (ast.Call | t.CPtr)(node) + cal: rawptr[ast.Call] = rawptr[ast.Call](node) cc4: int = self._lambda_scan_body(trans, cal.func, param_names, param_count, cap_names, cap_allocas, cap_tys, cap_count) if cal.args is not None: - als: list[ast.AST | t.CPtr] | t.CPtr = cal.args + als: list[rawptr[ast.AST]] | t.CPtr = cal.args an: sizet = len(als) for ai in range(an): cc4 = self._lambda_scan_body(trans, als.get(ai), param_names, param_count, cap_names, cap_allocas, cap_tys, cc4) if cal.keywords is not None: - kws: list[ast.AST | t.CPtr] | t.CPtr = cal.keywords + kws: list[rawptr[ast.AST]] | t.CPtr = cal.keywords kn: sizet = len(kws) for ki in range(kn): kw: ast.Keyword | t.CPtr = (ast.Keyword | t.CPtr)(kws.get(ki)) @@ -1519,7 +1519,7 @@ class FuncGenMixin(CallGenBase.CallGenBase): cap_names, cap_allocas, cap_tys, cc4) return cc4 if k == ast.ASTKind.Subscript: - sub: ast.Subscript | t.CPtr = (ast.Subscript | t.CPtr)(node) + sub: rawptr[ast.Subscript] = rawptr[ast.Subscript](node) cc5: int = self._lambda_scan_body(trans, sub.value, param_names, param_count, cap_names, cap_allocas, cap_tys, cap_count) if sub.slice is not None: @@ -1527,7 +1527,7 @@ class FuncGenMixin(CallGenBase.CallGenBase): cap_names, cap_allocas, cap_tys, cc5) return cc5 if k == ast.ASTKind.Attribute: - at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(node) + at: rawptr[ast.Attribute] = rawptr[ast.Attribute](node) return self._lambda_scan_body(trans, at.value, param_names, param_count, cap_names, cap_allocas, cap_tys, cap_count) if k == ast.ASTKind.IfExp: @@ -1542,7 +1542,7 @@ class FuncGenMixin(CallGenBase.CallGenBase): ls: ast.List | t.CPtr = (ast.List | t.CPtr)(node) cc7: int = cap_count if ls.elts is not None: - es: list[ast.AST | t.CPtr] | t.CPtr = ls.elts + es: list[rawptr[ast.AST]] | t.CPtr = ls.elts en: sizet = len(es) for ei in range(en): cc7 = self._lambda_scan_body(trans, es.get(ei), param_names, param_count, diff --git a/App/lib/core/Gen/GenApi.vp b/App/lib/core/Gen/GenApi.vp index ab9862f..4e71965 100644 --- a/App/lib/core/Gen/GenApi.vp +++ b/App/lib/core/Gen/GenApi.vp @@ -86,7 +86,7 @@ def dump_parse_traceback(file_path: str) -> None: # ---------------- fatal_error(委托 TypeGenErr.fatal_error) ---------------- -def fatal_error(node: ast.AST | t.CPtr, msg: str, +def fatal_error(node: rawptr[ast.AST], msg: str, err_type: str = "SyntaxError") -> None: """委托到 gen.TypeGenErr.fatal_error —— 模块级函数的报错通道 @@ -106,7 +106,7 @@ def fatal_error(node: ast.AST | t.CPtr, msg: str, # ---------------- map_t_type(委托 TypeGenResolve.map_t_type) ---------------- -def map_t_type(pool: rawptr[memhub.MemBuddy], type_name: str) -> llvmlite.LLVMType | t.CPtr: +def map_t_type(pool: rawptr[memhub.MemBuddy], type_name: str) -> rawptr[llvmlite.LLVMType]: """委托到 gen.map_t_type(原 Handles 壳)""" if _g_gen is not None: _g_gen.TypeGenResolve.map_t_type(pool, type_name) @@ -118,7 +118,7 @@ def resolve_typedef_or_map(pool: rawptr[memhub.MemBuddy], name: str, imported_modules: str, from_imports: str, - trans: HT.Translator | t.CPtr = None) -> llvmlite.LLVMType | t.CPtr: + trans: rawptr[HT.Translator] = None) -> rawptr[llvmlite.LLVMType]: """委托到 gen.resolve_typedef_or_map(CTypedef 动态表优先,miss 回退 map_t_type)""" if _g_gen is not None: return _g_gen.TypeGenResolve.resolve_typedef_or_map(pool, name, imported_modules, from_imports, trans) @@ -127,7 +127,7 @@ def resolve_typedef_or_map(pool: rawptr[memhub.MemBuddy], # ---------------- infer_external_func_ret_ty(委托 CallGenLib._infer_external_func_ret_ty) ---------------- def infer_external_func_ret_ty(pool: rawptr[memhub.MemBuddy], - func_name: str) -> llvmlite.LLVMType | t.CPtr: + func_name: str) -> rawptr[llvmlite.LLVMType]: """委托到 gen.CallGenLib._infer_external_func_ret_ty(外部函数返回类型白名单) vpi 注入 extern declare 时返回类型解析 miss 的兜底:FindFirstFileA/ @@ -150,7 +150,7 @@ def get_current_file() -> str: # ---------------- _is_ctypedef_annotation(委托 TypeGenCType._is_ctypedef_annotation) ---------------- -def _is_ctypedef_annotation(annotation: ast.AST | t.CPtr) -> int: +def _is_ctypedef_annotation(annotation: rawptr[ast.AST]) -> int: """委托到 gen._is_ctypedef_annotation(原 Handles 壳)""" if _g_gen is not None: return _g_gen.TypeGenCType._is_ctypedef_annotation(annotation) @@ -158,7 +158,7 @@ def _is_ctypedef_annotation(annotation: ast.AST | t.CPtr) -> int: # ---------------- resolve_annotation_type(委托 TypeGenResolve.resolve_annotation_type) ---------------- -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: +def resolve_annotation_type(pool: rawptr[memhub.MemBuddy], node: rawptr[ast.AST], imported_modules: str, from_imports: str, trans: rawptr[HT.Translator] = None, depth: int = 0) -> rawptr[llvmlite.LLVMType]: """委托到 gen.resolve_annotation_type(原 Handles 壳)""" if _g_gen is not None: return _g_gen.TypeGenResolve.resolve_annotation_type(pool, node, imported_modules, from_imports, trans, depth) @@ -166,7 +166,7 @@ def resolve_annotation_type(pool: rawptr[memhub.MemBuddy], node: ast.AST | t.CPt # ---------------- has_decorator_marker(委托 TypeGenErr.has_decorator_marker) ---------------- -def has_decorator_marker(node: ast.AST | t.CPtr, marker_name: str, +def has_decorator_marker(node: rawptr[ast.AST], marker_name: str, depth: int = 0) -> int: """委托到 gen.has_decorator_marker(原 Handles 壳)""" if _g_gen is not None: @@ -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) ---------------- -def _get_type_name_from_annotation(pool: rawptr[memhub.MemBuddy], node: ast.AST | t.CPtr) -> str: +def _get_type_name_from_annotation(pool: rawptr[memhub.MemBuddy], node: rawptr[ast.AST]) -> str: """委托到 gen._get_type_name_from_annotation(原 Handles 壳)""" if _g_gen is not None: return _g_gen.TypeGenResolve._get_type_name_from_annotation(pool, node) @@ -222,7 +222,7 @@ def register_cdefine_double(pool: rawptr[memhub.MemBuddy], # ---------------- is_cdefine_annotation(委托 AssignGenMixin.is_cdefine_annotation) ---------------- -def is_cdefine_annotation(annot: ast.AST | t.CPtr) -> int: +def is_cdefine_annotation(annot: rawptr[ast.AST]) -> int: """委托到 gen.is_cdefine_annotation(原 Handles 壳)""" if _g_gen is not None: return _g_gen.AssignGen.is_cdefine_annotation(annot) @@ -230,7 +230,7 @@ def is_cdefine_annotation(annot: ast.AST | t.CPtr) -> int: # ---------------- extract_cdefine_int_value(委托 AssignGenMixin.extract_cdefine_int_value) ---------------- -def extract_cdefine_int_value(val_node: ast.AST | t.CPtr) -> int64: +def extract_cdefine_int_value(val_node: rawptr[ast.AST]) -> int64: """委托到 gen.extract_cdefine_int_value(原 Handles 壳)""" if _g_gen is not None: return _g_gen.AssignGen.extract_cdefine_int_value(val_node) @@ -290,7 +290,7 @@ def reset_module_methods_emitted(sha1: str) -> int: # ---------------- get_struct_type(委托 StructGenMixin.get_struct_type) ---------------- -def get_struct_type(class_name: str) -> llvmlite.LLVMType | t.CPtr: +def get_struct_type(class_name: str) -> rawptr[llvmlite.LLVMType]: """委托到 gen.get_struct_type(原 Handles 壳)""" if _g_gen is not None: return _g_gen.StructGen.get_struct_type(class_name) @@ -298,7 +298,7 @@ def get_struct_type(class_name: str) -> llvmlite.LLVMType | t.CPtr: # ---------------- get_enum_base_type(委托 StmtGenDeclMixin.get_enum_base_type) ---------------- -def get_enum_base_type(enum_name: str) -> llvmlite.LLVMType | t.CPtr: +def get_enum_base_type(enum_name: str) -> rawptr[llvmlite.LLVMType]: """委托到 gen.get_enum_base_type(原 Handles 壳) 枚举(t.CEnum)注册在独立的 EnumTable(EnumEntry),不进 StructTable, @@ -327,7 +327,7 @@ def find_struct_by_module(name: str, sha1: str) -> GenTypes.StructEntry | t.CPtr # ---------------- find_struct_by_type(委托 StructGenMixin.find_struct_by_type) ---------------- -def find_struct_by_type(struct_ty: llvmlite.LLVMType | t.CPtr) -> GenTypes.StructEntry | t.CPtr: +def find_struct_by_type(struct_ty: rawptr[llvmlite.LLVMType]) -> GenTypes.StructEntry | t.CPtr: """委托到 gen.find_struct_by_type(原 Handles 壳)""" if _g_gen is not None: return _g_gen.StructGen.find_struct_by_type(struct_ty) @@ -337,7 +337,7 @@ def find_struct_by_type(struct_ty: llvmlite.LLVMType | t.CPtr) -> GenTypes.Struc # ---------------- register_struct(委托 StructGenMixin.register_struct) ---------------- def register_struct(pool: rawptr[memhub.MemBuddy], name: str, - struct_ty: llvmlite.LLVMType | t.CPtr, + struct_ty: rawptr[llvmlite.LLVMType], sha1: str = None) -> GenTypes.StructEntry | t.CPtr: """委托到 gen.register_struct(原 Handles 壳)""" if _g_gen is not None: @@ -349,7 +349,7 @@ def register_struct(pool: rawptr[memhub.MemBuddy], def add_field(pool: rawptr[memhub.MemBuddy], struct_entry: GenTypes.StructEntry | t.CPtr, field_name: str, - field_ty: llvmlite.LLVMType | t.CPtr) -> int: + field_ty: rawptr[llvmlite.LLVMType]) -> int: """委托到 gen.add_field(原 Handles 壳)""" if _g_gen is not None: return _g_gen.StructGen.add_field(pool, struct_entry, field_name, field_ty) @@ -443,7 +443,7 @@ def add_imported_module(pool: rawptr[memhub.MemBuddy], imported_modules: str, na # ---------------- translate_import(委托 ImportsGenMixin.translate_import) ---------------- -def translate_import(trans: HT.Translator | t.CPtr, node: ast.AST | t.CPtr) -> int: +def translate_import(trans: rawptr[HT.Translator], node: rawptr[ast.AST]) -> int: """委托到 gen.translate_import(原 Handles 壳)""" if _g_gen is not None: return _g_gen.ImportsGen.translate_import(trans, node) @@ -451,7 +451,7 @@ def translate_import(trans: HT.Translator | t.CPtr, node: ast.AST | t.CPtr) -> i # ---------------- translate_import_from_module(委托 ImportsGenMixin.translate_import_from_module) ---------------- -def translate_import_from_module(trans: HT.Translator | t.CPtr, node: ast.AST | t.CPtr) -> int: +def translate_import_from_module(trans: rawptr[HT.Translator], node: rawptr[ast.AST]) -> int: """委托到 gen.translate_import_from_module(原 Handles 壳)""" if _g_gen is not None: return _g_gen.ImportsGen.translate_import_from_module(trans, node) @@ -459,7 +459,7 @@ def translate_import_from_module(trans: HT.Translator | t.CPtr, node: ast.AST | # ---------------- translate_import_from_names(委托 ImportsGenMixin.translate_import_from_names) ---------------- -def translate_import_from_names(trans: HT.Translator | t.CPtr, node: ast.AST | t.CPtr) -> int: +def translate_import_from_names(trans: rawptr[HT.Translator], node: rawptr[ast.AST]) -> int: """委托到 gen.translate_import_from_names(原 Handles 壳)""" if _g_gen is not None: return _g_gen.ImportsGen.translate_import_from_names(trans, node) @@ -467,7 +467,7 @@ def translate_import_from_names(trans: HT.Translator | t.CPtr, node: ast.AST | t # ---------------- _get_parent_class(委托 ClassGenBase._get_parent_class) ---------------- -def _get_parent_class(cd: ast.ClassDef | t.CPtr, trans: HT.Translator | t.CPtr = None) -> str: +def _get_parent_class(cd: rawptr[ast.ClassDef], trans: rawptr[HT.Translator] = None) -> str: """委托到 gen._get_parent_class(原 Handles 壳)""" if _g_gen is not None: return _g_gen.ClassGenBase._get_parent_class(cd, trans) @@ -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) ---------------- -def _register_generic_template(pool: rawptr[memhub.MemBuddy], cd: ast.ClassDef | t.CPtr, module_sha1: str): +def _register_generic_template(pool: rawptr[memhub.MemBuddy], cd: rawptr[ast.ClassDef], module_sha1: str): """委托到 gen._register_generic_template(原 Handles 壳)""" if _g_gen is not None: _g_gen.ClassGenGeneric._register_generic_template(pool, cd, module_sha1) @@ -490,7 +490,7 @@ def _mangle_name_with_sha1(sha1: str, name: str) -> str: # ---------------- forward_declare_functions(委托 FuncGenDef.forward_declare_functions) ---------------- -def forward_declare_functions(trans: HT.Translator | t.CPtr, tree: ast.AST | t.CPtr) -> int: +def forward_declare_functions(trans: rawptr[HT.Translator], tree: rawptr[ast.AST]) -> int: """委托到 gen.forward_declare_functions(原 Handles 壳)""" if _g_gen is not None: return _g_gen.FuncGenDef.forward_declare_functions(trans, tree) @@ -498,7 +498,7 @@ def forward_declare_functions(trans: HT.Translator | t.CPtr, tree: ast.AST | t.C # ---------------- create_wrapper_main(委托 TranslatorGenMixin.create_wrapper_main) ---------------- -def create_wrapper_main(trans: HT.Translator | t.CPtr, tree: ast.AST | t.CPtr, i32_ty: llvmlite.LLVMType | t.CPtr) -> int: +def create_wrapper_main(trans: rawptr[HT.Translator], tree: rawptr[ast.AST], i32_ty: rawptr[llvmlite.LLVMType]) -> int: """委托到 gen.create_wrapper_main(原 Handles 壳)""" if _g_gen is not None: return _g_gen.TranslatorGen.create_wrapper_main(trans, tree, i32_ty) @@ -506,7 +506,7 @@ def create_wrapper_main(trans: HT.Translator | t.CPtr, tree: ast.AST | t.CPtr, i # ---------------- handle_module_level_var(委托 TranslatorGenMixin.handle_module_level_var) ---------------- -def handle_module_level_var(trans: HT.Translator | t.CPtr, node: ast.AST | t.CPtr) -> int: +def handle_module_level_var(trans: rawptr[HT.Translator], node: rawptr[ast.AST]) -> int: """委托到 gen.handle_module_level_var(原 Handles 壳)""" if _g_gen is not None: return _g_gen.TranslatorGen.handle_module_level_var(trans, node) @@ -514,7 +514,7 @@ def handle_module_level_var(trans: HT.Translator | t.CPtr, node: ast.AST | t.CPt # ---------------- translate_children(委托 TranslatorGenMixin.translate_children) ---------------- -def translate_children(trans: HT.Translator | t.CPtr, tree: ast.AST | t.CPtr) -> int: +def translate_children(trans: rawptr[HT.Translator], tree: rawptr[ast.AST]) -> int: """委托到 gen.translate_children(原 Handles 壳)""" if _g_gen is not None: return _g_gen.TranslatorGen.translate_children(trans, tree) @@ -537,7 +537,7 @@ def SetTempDir(temp_dir: str): # ---------------- find_func_in_module(委托 CallGenBase.find_func_in_module) ---------------- -def find_func_in_module(mod: llvmlite.LLVMModule | t.CPtr, name: str) -> llvmlite.Function | t.CPtr: +def find_func_in_module(mod: rawptr[llvmlite.LLVMModule], name: str) -> rawptr[llvmlite.Function]: """委托到 gen.find_func_in_module(原 Handles 壳)""" if _g_gen is not None: return _g_gen.CallGenBase.find_func_in_module(mod, name) @@ -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) ---------------- -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: +def add_func_to_table(funcs: rawptr[GenTypes.FuncEntry], func_count: int, name: str, func: rawptr[llvmlite.Function], 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 壳) 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) ---------------- -def init_func_table(pool: rawptr[memhub.MemBuddy], max_count: int) -> GenTypes.FuncEntry | t.CPtr: +def init_func_table(pool: rawptr[memhub.MemBuddy], max_count: int) -> rawptr[GenTypes.FuncEntry]: """委托到 gen.init_func_table(原 Handles 壳)""" if _g_gen is not None: return _g_gen.CallGenLeafKit.init_func_table(pool, max_count) @@ -564,7 +564,7 @@ def init_func_table(pool: rawptr[memhub.MemBuddy], max_count: int) -> GenTypes.F # ---------------- translate_call(委托 CallGenMixin.translate_call) ---------------- -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: +def translate_call(pool: rawptr[memhub.MemBuddy], builder: llvmlite.IRBuilder | t.CPtr, mod: rawptr[llvmlite.LLVMModule], node: rawptr[ast.AST], funcs_ptr: t.CPtr, func_count: int, trans: rawptr[HT.Translator] = None) -> llvmlite.Value | t.CPtr: """委托到 gen.translate_call(原 Handles 壳)""" if _g_gen is not None: return _g_gen.CallGen.translate_call(pool, builder, mod, node, funcs_ptr, func_count, trans) @@ -572,28 +572,28 @@ def translate_call(pool: rawptr[memhub.MemBuddy], builder: llvmlite.IRBuilder | # ---------------- translate_printf_call(委托 CallGenLeafKit.translate_printf_call) ---------------- -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): +def translate_printf_call(pool: rawptr[memhub.MemBuddy], builder: llvmlite.IRBuilder | t.CPtr, mod: rawptr[llvmlite.LLVMModule], cl: rawptr[ast.Call], trans: rawptr[HT.Translator] = None): """委托到 gen.translate_printf_call(原 Handles 壳)""" if _g_gen is not None: _g_gen.CallGenLeafKit.translate_printf_call(pool, builder, mod, cl, trans) # ---------------- translate_print_call(委托 CallGenLeafKit.translate_print_call) ---------------- -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): +def translate_print_call(pool: rawptr[memhub.MemBuddy], builder: llvmlite.IRBuilder | t.CPtr, mod: rawptr[llvmlite.LLVMModule], cl: rawptr[ast.Call], trans: rawptr[HT.Translator] = None): """委托到 gen.translate_print_call(原 Handles 壳)""" if _g_gen is not None: _g_gen.CallGenLeafKit.translate_print_call(pool, builder, mod, cl, trans) # ---------------- add_global_name(委托 TranslatorGenMixin.add_global_name) ---------------- -def add_global_name(trans: HT.Translator | t.CPtr, name: str): +def add_global_name(trans: rawptr[HT.Translator], name: str): """委托到 gen.TranslatorGen.add_global_name(原 Handles 壳)""" if _g_gen is not None: _g_gen.TranslatorGen.add_global_name(trans, name) # ---------------- is_global_name(委托 TranslatorGenMixin.is_global_name) ---------------- -def is_global_name(trans: HT.Translator | t.CPtr, name: str) -> int: +def is_global_name(trans: rawptr[HT.Translator], name: str) -> int: """委托到 gen.TranslatorGen.is_global_name(原 Handles 壳)""" if _g_gen is not None: return _g_gen.TranslatorGen.is_global_name(trans, name) @@ -601,16 +601,16 @@ def is_global_name(trans: HT.Translator | t.CPtr, name: str) -> int: # ---------------- add_nonlocal_name(委托 TranslatorGenMixin.add_nonlocal_name) ---------------- -def add_nonlocal_name(trans: HT.Translator | t.CPtr, name: str, - var_ty: llvmlite.LLVMType | t.CPtr = None): +def add_nonlocal_name(trans: rawptr[HT.Translator], name: str, + var_ty: rawptr[llvmlite.LLVMType] = None): """委托到 gen.TranslatorGen.add_nonlocal_name(原 Handles 壳)""" if _g_gen is not None: _g_gen.TranslatorGen.add_nonlocal_name(trans, name, var_ty) # ---------------- get_nonlocal_type(委托 TranslatorGenMixin.get_nonlocal_type) ---------------- -def get_nonlocal_type(trans: HT.Translator | t.CPtr, - name: str) -> llvmlite.LLVMType | t.CPtr: +def get_nonlocal_type(trans: rawptr[HT.Translator], + name: str) -> rawptr[llvmlite.LLVMType]: """委托到 gen.TranslatorGen.get_nonlocal_type(原 Handles 壳)""" if _g_gen is not None: return _g_gen.TranslatorGen.get_nonlocal_type(trans, name) @@ -618,7 +618,7 @@ def get_nonlocal_type(trans: HT.Translator | t.CPtr, # ---------------- is_nonlocal_name(委托 TranslatorGenMixin.is_nonlocal_name) ---------------- -def is_nonlocal_name(trans: HT.Translator | t.CPtr, name: str) -> int: +def is_nonlocal_name(trans: rawptr[HT.Translator], name: str) -> int: """委托到 gen.TranslatorGen.is_nonlocal_name(原 Handles 壳)""" if _g_gen is not None: return _g_gen.TranslatorGen.is_nonlocal_name(trans, name) @@ -626,7 +626,7 @@ def is_nonlocal_name(trans: HT.Translator | t.CPtr, name: str) -> int: # ---------------- get_nonlocal_index(委托 TranslatorGenMixin.get_nonlocal_index) ---------------- -def get_nonlocal_index(trans: HT.Translator | t.CPtr, name: str) -> int: +def get_nonlocal_index(trans: rawptr[HT.Translator], name: str) -> int: """委托到 gen.TranslatorGen.get_nonlocal_index(原 Handles 壳)""" if _g_gen is not None: return _g_gen.TranslatorGen.get_nonlocal_index(trans, name) @@ -634,7 +634,7 @@ def get_nonlocal_index(trans: HT.Translator | t.CPtr, name: str) -> int: # ---------------- clear_scope_names(委托 TranslatorGenMixin.clear_scope_names) ---------------- -def clear_scope_names(trans: HT.Translator | t.CPtr): +def clear_scope_names(trans: rawptr[HT.Translator]): """委托到 gen.TranslatorGen.clear_scope_names(原 Handles 壳)""" if _g_gen is not None: _g_gen.TranslatorGen.clear_scope_names(trans) @@ -642,7 +642,7 @@ def clear_scope_names(trans: HT.Translator | t.CPtr): # ---------------- update_global_func_spec(委托 CallGenLeafKit.update_global_func_spec) ---------------- def update_global_func_spec(name: str, - func: llvmlite.Function | t.CPtr) -> int: + func: rawptr[llvmlite.Function]) -> int: """委托到 gen.CallGenLeafKit.update_global_func_spec(原 ExprCallTable 壳)""" if _g_gen is not None: return _g_gen.CallGenLeafKit.update_global_func_spec(name, func) diff --git a/App/lib/core/Gen/GenTypes.vp b/App/lib/core/Gen/GenTypes.vp index 638344a..759bdcf 100644 --- a/App/lib/core/Gen/GenTypes.vp +++ b/App/lib/core/Gen/GenTypes.vp @@ -103,8 +103,8 @@ class SymbolTable: class FieldEntry: Name: str # 字段名(字符串) Index: int # 字段在结构体中的索引 - Ty: llvmlite.LLVMType | t.CPtr # 字段的 LLVM 类型 - DefaultVal: ast.AST | t.CPtr # 默认值 AST 节点(None=无默认值) + Ty: rawptr[llvmlite.LLVMType] # 字段的 LLVM 类型 + DefaultVal: rawptr[ast.AST] # 默认值 AST 节点(None=无默认值) # TypeSpec(S3 起为**唯一类型承载**):由 add_field 用 SpecFromLLVMType 从 # field_ty 填充(PermPool 分配 ⇒ 跨 1b reset 安全,无需 DeepCopyType), # 注解侧再经 SpecWithSign / SpecWithSource 补符号性与注解来源名 @@ -118,7 +118,7 @@ class FieldEntry: @t.NoVTable class StructEntry: Name: str # 类名 - Ty: llvmlite.LLVMType | t.CPtr # LLVM StructType + Ty: rawptr[llvmlite.LLVMType] # LLVM StructType FieldCount: int # 字段数量 Fields: FieldEntry | t.CPtr # 字段数组(FIELD_MAX 个槽位) IsUnion: int # 1=联合体 / 0=普通结构体 @@ -148,7 +148,7 @@ class StructEntry: class EnumMember: Name: str # 成员名(字符串) Value: int64 # 成员的整数值 - Ty: llvmlite.LLVMType | t.CPtr # 成员的 LLVM 类型(用于混用类型场景) + Ty: rawptr[llvmlite.LLVMType] # 成员的 LLVM 类型(用于混用类型场景) # ============================================================ @@ -157,7 +157,7 @@ class EnumMember: @t.NoVTable class EnumEntry: Name: str # 枚举类名 - BaseTy: llvmlite.LLVMType | t.CPtr # 基准类型(所有成员类型中最大的) + BaseTy: rawptr[llvmlite.LLVMType] # 基准类型(所有成员类型中最大的) MemberCount: int # 成员数量 Members: EnumMember | t.CPtr # 成员数组(ENUM_MEMBER_MAX 个槽位) @@ -179,7 +179,7 @@ class AsmOperand: class FuncEntry: """函数表条目""" Name: str - Func: llvmlite.Function | t.CPtr + Func: rawptr[llvmlite.Function] Defaults: t.CPtr # defaults 列表节点指针 (list[AST | CPtr]),None=无默认值 DefaultCount: int # 默认值数量 ParamCount: int # 形参数量(不含 self) diff --git a/App/lib/core/Gen/ImportsGenMixin.vp b/App/lib/core/Gen/ImportsGenMixin.vp index b3f6898..cd89e1c 100644 --- a/App/lib/core/Gen/ImportsGenMixin.vp +++ b/App/lib/core/Gen/ImportsGenMixin.vp @@ -699,7 +699,7 @@ class ImportsGenMixin: # File "<当前文件>", line # ImportError: # ============================================================ - def _report_import_error(self, node: ast.AST | t.CPtr, msg: str) -> None: + def _report_import_error(self, node: rawptr[ast.AST], msg: str) -> None: """以 Python 风格报错并退出(本地实现,避免循环依赖)""" stdio.printf("Traceback (most recent call last):\n") lineno: int = 0 @@ -776,7 +776,7 @@ class ImportsGenMixin: # includes 路径配置错误时扫描结果为 0、模块不注册 SHA1,若延迟到实际跨模块调用才报错 # 会误导("跨模块调用 'bd.alloc' 找不到模块 SHA1"),故在 import 语句处立即检测。 # t/c 是内部库,不参与 includes 扫描,豁免检查。 - def _check_import_sha1(self, node: ast.AST | t.CPtr, mod_name: str) -> int: + def _check_import_sha1(self, node: rawptr[ast.AST], mod_name: str) -> int: """导入时校验模块 SHA1 是否已注册,未注册则立即报错退出 Args: @@ -813,18 +813,18 @@ class ImportsGenMixin: # translate_import - 处理 import 语句,更新 trans._imported_modules # (迁移自 HandlesImports.ImportsHandle.HandleImport) # ============================================================ - def translate_import(self, trans: HT.Translator | t.CPtr, - node: ast.AST | t.CPtr) -> int: + def translate_import(self, trans: rawptr[HT.Translator], + node: rawptr[ast.AST]) -> int: """处理 import 语句,返回 0""" - imp: ast.Import | t.CPtr = (ast.Import | t.CPtr)(node) + imp: rawptr[ast.Import] = rawptr[ast.Import](node) if imp is None: return 0 - names: list[ast.AST | t.CPtr] | t.CPtr = imp.names + names: list[rawptr[ast.AST]] | t.CPtr = imp.names if names is None: return 0 nn: sizet = len(names) for ni in range(nn): - alias: ast.Alias | t.CPtr = (ast.Alias | t.CPtr)(names.get(ni)) + alias: rawptr[ast.Alias] = rawptr[ast.Alias](names.get(ni)) if alias is not None and alias.name is not None: # 导入时立即校验模块 SHA1 是否注册(fast-fail,仅全量翻译时检查) # declare_only=1/2 是 struct 预注册/import 扫描阶段:此时 SHA1 表 @@ -867,10 +867,10 @@ class ImportsGenMixin: # 完整模块名(如 __types → llvmlite.__types),确保 .deps.txt # 记录的模块名与 SHA1 映射表一致。 # ============================================================ - def translate_import_from_module(self, trans: HT.Translator | t.CPtr, - node: ast.AST | t.CPtr) -> int: + def translate_import_from_module(self, trans: rawptr[HT.Translator], + node: rawptr[ast.AST]) -> int: """处理 from X import Y 的模块部分,更新 trans._imported_modules""" - impf: ast.ImportFrom | t.CPtr = (ast.ImportFrom | t.CPtr)(node) + impf: rawptr[ast.ImportFrom] = rawptr[ast.ImportFrom](node) if impf is None: return 0 # 解析模块名:相对导入需补充包前缀 @@ -893,11 +893,11 @@ class ImportsGenMixin: # 否则别名 "syscall" 精确匹配不到包名 "vpsdk" → is_module_imported 返回 0 # → syscall._syscall1 / syscall.LOAD_SO 跨模块解析失败。 if impf.module is None: - names_m: list[ast.AST | t.CPtr] | t.CPtr = impf.names + names_m: list[rawptr[ast.AST]] | t.CPtr = impf.names if names_m is not None: nn_m: sizet = len(names_m) for ni_m in range(nn_m): - alias_m: ast.Alias | t.CPtr = (ast.Alias | t.CPtr)(names_m.get(ni_m)) + alias_m: rawptr[ast.Alias] = rawptr[ast.Alias](names_m.get(ni_m)) if alias_m is not None and alias_m.name is not None: rl_m: sizet = string.strlen(resolved) rn_m: sizet = string.strlen(alias_m.name) @@ -926,10 +926,10 @@ class ImportsGenMixin: # 同样使用解析后的完整模块名,确保 from-import 映射 # (如 LLVMType:llvmlite.__types)能正确查到 SHA1。 # ============================================================ - def translate_import_from_names(self, trans: HT.Translator | t.CPtr, - node: ast.AST | t.CPtr) -> int: + def translate_import_from_names(self, trans: rawptr[HT.Translator], + node: rawptr[ast.AST]) -> int: """处理 from X import Y 的名称部分,更新 trans._from_imports""" - impf: ast.ImportFrom | t.CPtr = (ast.ImportFrom | t.CPtr)(node) + impf: rawptr[ast.ImportFrom] = rawptr[ast.ImportFrom](node) if impf is None: return 0 # 解析模块名:相对导入需补充包前缀 @@ -937,11 +937,11 @@ class ImportsGenMixin: trans.Pool, trans.CurrentPackage, impf.level, impf.module) if resolved is not None: - names: list[ast.AST | t.CPtr] | t.CPtr = impf.names + names: list[rawptr[ast.AST]] | t.CPtr = impf.names if names is not None: nn: sizet = len(names) for ni in range(nn): - alias: ast.Alias | t.CPtr = (ast.Alias | t.CPtr)(names.get(ni)) + alias: rawptr[ast.Alias] = rawptr[ast.Alias](names.get(ni)) if alias is not None and alias.name is not None: local_name: str = alias.name orig_name: str = None diff --git a/App/lib/core/Gen/MatchGenMixin.vp b/App/lib/core/Gen/MatchGenMixin.vp index 42d767b..3a04170 100644 --- a/App/lib/core/Gen/MatchGenMixin.vp +++ b/App/lib/core/Gen/MatchGenMixin.vp @@ -37,16 +37,16 @@ class MatchGenMixin: # 返回 1=已补 unreachable(调用方不应 br end_bb);0=正常收尾(应 br end_bb)。 # 不含 Try/With:其处理器不维护 _ctrl_merge_reachable,避免残留值误判。 Gen: rawptr[Generator.Generator] - def _case_tail_unreachable(self, trans: HT.Translator | t.CPtr, + def _case_tail_unreachable(self, trans: rawptr[HT.Translator], builder: llvmlite.IRBuilder | t.CPtr, - body_list: list[ast.AST | t.CPtr] | t.CPtr) -> int: + body_list: list[rawptr[ast.AST]] | t.CPtr) -> int: if trans is None or builder is None: return 0 if llvmlite.builder_cur_block_is_terminated(builder) != 0: return 0 if body_list is None or len(body_list) == 0: return 0 - lst: ast.AST | t.CPtr = body_list.get(len(body_list) - 1) + lst: rawptr[ast.AST] = body_list.get(len(body_list) - 1) if lst is None: return 0 lk: int = lst.kind() @@ -62,8 +62,8 @@ class MatchGenMixin: # translate_match - match 语句主入口,返回 0 # (迁移自 HandlesMatch.MatchHandle.Handle) # ============================================================ - def translate_match(self, trans: HT.Translator | t.CPtr, - node: ast.AST | t.CPtr) -> int: + def translate_match(self, trans: rawptr[HT.Translator], + node: rawptr[ast.AST]) -> int: """match 语句翻译主入口(深度守卫包装器,原逻辑见 _translate_match_impl)""" if trans is not None: if trans.MatchTranslateDepth >= MATCH_TRANSLATE_MAX_DEPTH: @@ -75,13 +75,13 @@ class MatchGenMixin: trans.MatchTranslateDepth -= 1 return mret - def _translate_match_impl(self, trans: HT.Translator | t.CPtr, - node: ast.AST | t.CPtr) -> int: + def _translate_match_impl(self, trans: rawptr[HT.Translator], + node: rawptr[ast.AST]) -> int: if node is None: return 0 pool: rawptr[memhub.MemBuddy] = trans.Pool builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder - func: llvmlite.Function | t.CPtr = trans._cur_func + func: rawptr[llvmlite.Function] = trans._cur_func if builder is None or func is None: return 0 @@ -90,10 +90,10 @@ class MatchGenMixin: # 内部声明并收尾覆盖:声明在 Handle 这里会退化为隐式全局,跨 match 污染。 trans._ctrl_merge_reachable = 0 - m_node: ast.Match | t.CPtr = (ast.Match | t.CPtr)(node) + m_node: rawptr[ast.Match] = rawptr[ast.Match](node) # 1. 求值 subject - subject_node: ast.AST | t.CPtr = m_node.subject + subject_node: rawptr[ast.AST] = m_node.subject if subject_node is None: return 0 # 序列匹配(match (a, b): case (x, y): ...)走独立路径: @@ -116,7 +116,7 @@ class MatchGenMixin: # 2a. 若 subject 是 Name,查变量注解类名 if subject_node.kind() == ast.ASTKind.Name: - nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(subject_node) + nm: rawptr[ast.Name] = rawptr[ast.Name](subject_node) if nm.id is not None: entry: GenTypes.VarEntry | t.CPtr = self.Gen.VarGen.lookup_var_entry( trans.SymTab, nm.id) @@ -132,17 +132,17 @@ class MatchGenMixin: # 2b. 若未确定,遍历 cases 查 MatchClass 变体 if is_renum == 0: - cases_list: list[ast.AST | t.CPtr] | t.CPtr = m_node.cases + cases_list: list[rawptr[ast.AST]] | t.CPtr = m_node.cases if cases_list is not None: cn: sizet = len(cases_list) ci: int = 0 while ci < cn and is_renum == 0: - case_node: ast.AST | t.CPtr = cases_list.get(ci) + case_node: rawptr[ast.AST] = cases_list.get(ci) if case_node is not None \ and case_node.kind() == ast.ASTKind.MatchCase: mc: ast.MatchCase | t.CPtr = ( ast.MatchCase | t.CPtr)(case_node) - pat: ast.AST | t.CPtr = mc.pattern + pat: rawptr[ast.AST] = mc.pattern if pat is not None \ and pat.kind() == ast.ASTKind.MatchClass: rnm: str = self._extract_renum_name_from_cls(pat) @@ -168,27 +168,27 @@ class MatchGenMixin: # Ptr -> Name('Ptr') -> 遍历查找 # ============================================================ def _extract_renum_name_from_cls(self, - pattern: ast.AST | t.CPtr) -> str: + pattern: rawptr[ast.AST]) -> str: if pattern is None: return None mc: ast.MatchClass | t.CPtr = (ast.MatchClass | t.CPtr)(pattern) - cls_node: ast.AST | t.CPtr = mc.cls + cls_node: rawptr[ast.AST] = mc.cls if cls_node is None: return None # Attribute 形式 if cls_node.kind() == ast.ASTKind.Attribute: - at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(cls_node) + at: rawptr[ast.Attribute] = rawptr[ast.Attribute](cls_node) if at.value is not None: if at.value.kind() == ast.ASTKind.Name: - inner_nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(at.value) + inner_nm: rawptr[ast.Name] = rawptr[ast.Name](at.value) return inner_nm.id if at.value.kind() == ast.ASTKind.Attribute: - inner_at: ast.Attribute | t.CPtr = ( - ast.Attribute | t.CPtr)(at.value) + inner_at: rawptr[ast.Attribute] = ( + rawptr[ast.Attribute])(at.value) return inner_at.attr # Name 形式:遍历所有 REnum 类反查 if cls_node.kind() == ast.ASTKind.Name: - nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(cls_node) + nm: rawptr[ast.Name] = rawptr[ast.Name](cls_node) return self._find_renum_class_for_variant(nm.id) return None @@ -196,18 +196,18 @@ class MatchGenMixin: # _extract_variant_name_from_cls - 从 MatchClass.cls 提取变体名 # ============================================================ def _extract_variant_name_from_cls(self, - pattern: ast.AST | t.CPtr) -> str: + pattern: rawptr[ast.AST]) -> str: if pattern is None: return None mc: ast.MatchClass | t.CPtr = (ast.MatchClass | t.CPtr)(pattern) - cls_node: ast.AST | t.CPtr = mc.cls + cls_node: rawptr[ast.AST] = mc.cls if cls_node is None: return None if cls_node.kind() == ast.ASTKind.Attribute: - at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(cls_node) + at: rawptr[ast.Attribute] = rawptr[ast.Attribute](cls_node) return at.attr if cls_node.kind() == ast.ASTKind.Name: - nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(cls_node) + nm: rawptr[ast.Name] = rawptr[ast.Name](cls_node) return nm.id return None @@ -227,26 +227,26 @@ class MatchGenMixin: # # 遍历 case body 顶层语句,查找 Expr(Call(Attribute(Name('c'), 'NoBreak'))) # ============================================================ - def _has_no_break(self, body_list: list[ast.AST | t.CPtr] | t.CPtr) -> int: + def _has_no_break(self, body_list: list[rawptr[ast.AST]] | t.CPtr) -> int: if body_list is None: return 0 n: sizet = len(body_list) i: int = 0 while i < n: - stmt: ast.AST | t.CPtr = body_list.get(i) + stmt: rawptr[ast.AST] = body_list.get(i) if stmt is not None and stmt.kind() == ast.ASTKind.Expr: expr_node: ast.Expr | t.CPtr = (ast.Expr | t.CPtr)(stmt) - val: ast.AST | t.CPtr = expr_node.value + val: rawptr[ast.AST] = expr_node.value if val is not None and val.kind() == ast.ASTKind.Call: - call_node: ast.Call | t.CPtr = (ast.Call | t.CPtr)(val) - fn: ast.AST | t.CPtr = call_node.func + call_node: rawptr[ast.Call] = rawptr[ast.Call](val) + fn: rawptr[ast.AST] = call_node.func if fn is not None and fn.kind() == ast.ASTKind.Attribute: - at: ast.Attribute | t.CPtr = ( - ast.Attribute | t.CPtr)(fn) + at: rawptr[ast.Attribute] = ( + rawptr[ast.Attribute])(fn) if at.value is not None \ and at.value.kind() == ast.ASTKind.Name: - base_nm: ast.Name | t.CPtr = ( - ast.Name | t.CPtr)(at.value) + base_nm: rawptr[ast.Name] = ( + rawptr[ast.Name])(at.value) if base_nm.id is not None \ and string.strcmp(base_nm.id, "c") == 0 \ and at.attr is not None \ @@ -263,13 +263,13 @@ class MatchGenMixin: # 3. 发射 build_switch # 4. 翻译每个 case body(含作用域隔离 + 变体字段绑定) # ============================================================ - def _handle_renum_match(self, trans: HT.Translator | t.CPtr, - node: ast.Match | t.CPtr, + def _handle_renum_match(self, trans: rawptr[HT.Translator], + node: rawptr[ast.Match], renum_name: str, subject_ptr: llvmlite.Value | t.CPtr) -> int: pool: rawptr[memhub.MemBuddy] = trans.Pool builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder - func: llvmlite.Function | t.CPtr = trans._cur_func + func: rawptr[llvmlite.Function] = trans._cur_func # 局部记录本 renum match 是否有 br 进入 end_bb,收尾时覆盖 # _ctrl_merge_reachable(case 体内嵌套 If 无 else + return 会把全局 # 标志置 1,全 case return 的 match 被误判 merge 可达 → 函数收尾 @@ -283,7 +283,7 @@ class MatchGenMixin: # 情况2: subject_ptr 不是指针(值型,如 REnum payload 槽位 load 出的 i64) # → alloca REnum 结构体 + store 值 + 用 alloca 指针 # 情况3: 指针但 pointee 不是结构体 → bitcast 到 REnum 结构体指针 - subj_ty: llvmlite.LLVMType | t.CPtr = subject_ptr.Ty + subj_ty: rawptr[llvmlite.LLVMType] = subject_ptr.Ty if subj_ty is not None and self.Gen.ExprGenBase.is_ptr_type(subj_ty) != 0 \ and subj_ty.Pointee is not None \ and self.Gen.ExprGenBase.is_ptr_type(subj_ty.Pointee) != 0: @@ -298,7 +298,7 @@ class MatchGenMixin: if subject_ptr.Ty is None or self.Gen.ExprGenBase.is_ptr_type(subject_ptr.Ty) == 0: renum_se: GenTypes.StructEntry | t.CPtr = self.Gen.StructGen.find_struct( renum_name) - renum_sty: llvmlite.LLVMType | t.CPtr = None + renum_sty: rawptr[llvmlite.LLVMType] = None if renum_se is not None: renum_sty = renum_se.Ty if renum_sty is None: @@ -307,7 +307,7 @@ class MatchGenMixin: node, f"REnum 结构体 '{renum_name}' 未注册", "NameError") - i64_ty0: llvmlite.LLVMType | t.CPtr = llvmlite.Int64(pool) + i64_ty0: rawptr[llvmlite.LLVMType] = llvmlite.Int64(pool) int_val: llvmlite.Value | t.CPtr = subject_ptr # 非 i64 整数值先扩展/截断到 i64(inttoptr 要求同宽) # 仅当 subj_ty 是已知整数类型时转换;类型未知时保持原值 @@ -317,15 +317,15 @@ class MatchGenMixin: int_val = llvmlite.build_trunc(builder, subject_ptr, i64_ty0) else: int_val = llvmlite.build_zext(builder, subject_ptr, i64_ty0) - renum_ptr_ty0: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, renum_sty) + renum_ptr_ty0: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, renum_sty) subj_ptr0: llvmlite.Value | t.CPtr = llvmlite.build_inttoptr( builder, int_val, renum_ptr_ty0) if subj_ptr0 is not None: subject_ptr = subj_ptr0 # 1. bitcast subject 到 i32* 读 __tag - i32_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int32(pool) - i32_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, i32_ty) + i32_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int32(pool) + i32_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, i32_ty) tag_ptr: llvmlite.Value | t.CPtr = llvmlite.build_bitcast( builder, subject_ptr, i32_ptr_ty) if tag_ptr is None: @@ -352,7 +352,7 @@ class MatchGenMixin: pool, func, name_buf) # 3. 准备收集数组(用 CSizeT 数组存指针) - cases_list: list[ast.AST | t.CPtr] | t.CPtr = node.cases + cases_list: list[rawptr[ast.AST]] | t.CPtr = node.cases if cases_list is None: # fail-fast: match cases 缺失 self.Gen.TypeGenErr.fatal_error(node, "match cases 缺失", "TypeError") @@ -403,7 +403,7 @@ class MatchGenMixin: # 4. 第一遍:收集 case 信息 + 创建 BB + 构建链表 i: int = 0 while i < case_count: - case_node: ast.AST | t.CPtr = cases_list.get(i) + case_node: rawptr[ast.AST] = cases_list.get(i) if case_node is None: i = i + 1 continue @@ -411,7 +411,7 @@ class MatchGenMixin: i = i + 1 continue mc: ast.MatchCase | t.CPtr = (ast.MatchCase | t.CPtr)(case_node) - pat: ast.AST | t.CPtr = mc.pattern + pat: rawptr[ast.AST] = mc.pattern is_def: int = 0 cv: llvmlite.Value | t.CPtr = None @@ -452,9 +452,9 @@ class MatchGenMixin: elif pk == ast.ASTKind.MatchOr: # MatchOr: 多个值共享一个 BB(取第一个值做 case) mo: ast.MatchOr | t.CPtr = (ast.MatchOr | t.CPtr)(pat) - pats: list[ast.AST | t.CPtr] | t.CPtr = mo.patterns + pats: list[rawptr[ast.AST]] | t.CPtr = mo.patterns if pats is not None and len(pats) > 0: - first_pat: ast.AST | t.CPtr = pats.get(0) + first_pat: rawptr[ast.AST] = pats.get(0) if first_pat is not None \ and first_pat.kind() == ast.ASTKind.MatchValue: mv2: ast.MatchValue | t.CPtr = ( @@ -474,7 +474,7 @@ class MatchGenMixin: bb = default_bb # 检测 NoBreak - body_list: list[ast.AST | t.CPtr] | t.CPtr = mc.children + body_list: list[rawptr[ast.AST]] | t.CPtr = mc.children nb: int = self._has_no_break(body_list) # 存入数组 @@ -534,7 +534,7 @@ class MatchGenMixin: # 6. 查找 REnum 结构体类型(用于变体字段绑定的 GEP) renum_entry: GenTypes.StructEntry | t.CPtr = None - renum_ty: llvmlite.LLVMType | t.CPtr = None + renum_ty: rawptr[llvmlite.LLVMType] = None se: GenTypes.StructEntry | t.CPtr = self.Gen.StructGen.find_struct(renum_name) if se is not None: renum_entry = se @@ -548,7 +548,7 @@ class MatchGenMixin: if mc is None: i = i + 1 continue - pat: ast.AST | t.CPtr = mc.pattern + pat: rawptr[ast.AST] = mc.pattern # 取 BB bb_addr: sizet = bb_arr[i] @@ -576,7 +576,7 @@ class MatchGenMixin: subject_ptr, trans, pool, builder) # 翻译 case body - body_list: list[ast.AST | t.CPtr] | t.CPtr = mc.children + body_list: list[rawptr[ast.AST]] | t.CPtr = mc.children if body_list is not None: bc: sizet = len(body_list) bi: int = 0 @@ -585,7 +585,7 @@ class MatchGenMixin: # pass1 的 cases_list.get(i) 同型同码)。切勿改为 # `bl_data + bi*8` 裸地址:那会把数组槽地址当节点传入 # translate_stmt,虚调用跳进 vtable 表 → DEP 崩溃。 - stmt: ast.AST | t.CPtr = body_list.get(bi) + stmt: rawptr[ast.AST] = body_list.get(bi) if stmt is not None: self.Gen.StmtGen.translate_stmt(trans, stmt) bi = bi + 1 @@ -614,11 +614,11 @@ class MatchGenMixin: rm_merge_reach = 1 else: # 有显式 default:翻译 default case body(找到 is_def==1 的 case) - dbody: list[ast.AST | t.CPtr] | t.CPtr = None + dbody: list[rawptr[ast.AST]] | t.CPtr = None di: int = 0 while di < collected: if def_arr[di] == 1: - dcase: ast.AST | t.CPtr = cases_list.get(di) + dcase: rawptr[ast.AST] = cases_list.get(di) if dcase is not None: dmc: ast.MatchCase | t.CPtr = ( ast.MatchCase | t.CPtr)(dcase) @@ -627,13 +627,13 @@ class MatchGenMixin: # (i32→inttoptr 截断指针 → translate_stmt 读垃圾节点崩溃, # gen1 IR 证据)。用 dbody2 内联声明接收者遍历(对齐 # Converter arg_defaults 内联声明规避模式)。 - dbody2: list[ast.AST | t.CPtr] | t.CPtr = dmc.children + dbody2: list[rawptr[ast.AST]] | t.CPtr = dmc.children dbody = dbody2 if dbody2 is not None: dn: sizet = len(dbody2) dj: int = 0 while dj < dn: - stmt: ast.AST | t.CPtr = dbody2.get(dj) + stmt: rawptr[ast.AST] = dbody2.get(dj) if stmt is not None: self.Gen.StmtGen.translate_stmt(trans, stmt) dj = dj + 1 @@ -659,22 +659,22 @@ class MatchGenMixin: # # case LLVMType.Ptr(pointee) 中的 pointee 绑定到 subject 的 payload 字段 # ============================================================ - def _bind_variant_fields(self, pat: ast.AST | t.CPtr, + def _bind_variant_fields(self, pat: rawptr[ast.AST], renum_name: str, renum_entry: GenTypes.StructEntry | t.CPtr, - renum_ty: llvmlite.LLVMType | t.CPtr, + renum_ty: rawptr[llvmlite.LLVMType], subject_ptr: llvmlite.Value | t.CPtr, - trans: HT.Translator | t.CPtr, + trans: rawptr[HT.Translator], pool: rawptr[memhub.MemBuddy], builder: llvmlite.IRBuilder | t.CPtr): if pat is None or renum_entry is None or renum_ty is None: return mc: ast.MatchClass | t.CPtr = (ast.MatchClass | t.CPtr)(pat) - pats: list[ast.AST | t.CPtr] | t.CPtr = mc.patterns + pats: list[rawptr[ast.AST]] | t.CPtr = mc.patterns if pats is None: return # bitcast subject_ptr 到 renum_ptr_ty(确保 GEP 类型匹配) - renum_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, renum_ty) + renum_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, renum_ty) casted_ptr: llvmlite.Value | t.CPtr = llvmlite.build_bitcast( builder, subject_ptr, renum_ptr_ty) if casted_ptr is None: @@ -682,7 +682,7 @@ class MatchGenMixin: pn: sizet = len(pats) j: int = 0 while j < pn: - sub_pat: ast.AST | t.CPtr = pats.get(j) + sub_pat: rawptr[ast.AST] = pats.get(j) if sub_pat is not None and sub_pat.kind() == ast.ASTKind.MatchAs: ma: ast.MatchAs | t.CPtr = (ast.MatchAs | t.CPtr)(sub_pat) bind_name: str = ma.name @@ -712,7 +712,7 @@ class MatchGenMixin: fe: GenTypes.FieldEntry | t.CPtr = ( self.Gen.StructGen._get_field_entry( renum_entry, payload_idx)) - field_ty: llvmlite.LLVMType | t.CPtr = None + field_ty: rawptr[llvmlite.LLVMType] = None if fe is not None: field_ty = fe.Ty if field_ty is None: @@ -739,14 +739,14 @@ class MatchGenMixin: # 必须按 (class, 变体名, 位置) 定位:MatchAs 名是局部变量名而非字段名, # 按字段名查恒不匹配;同一 payload 位置跨变体类型也不同。 # 自引用类型注册期解析失败 → 查不到类型时回退槽位类型。 - mem_ty_m: llvmlite.LLVMType | t.CPtr = None + mem_ty_m: rawptr[llvmlite.LLVMType] = None vnt_m: str = self._extract_variant_name_from_cls(pat) if vnt_m is not None and renum_entry is not None \ and renum_entry.Name is not None: mem_ty_m = self.Gen.ClassGenEnum._lookup_renum_member_ty( renum_entry.Name, vnt_m, payload_idx) if mem_ty_m is not None: - mem_ptr_m: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr( + mem_ptr_m: rawptr[llvmlite.LLVMType] = llvmlite.Ptr( pool, mem_ty_m) if mem_ptr_m is not None: cast_m: llvmlite.Value | t.CPtr = llvmlite.build_bitcast( @@ -763,7 +763,7 @@ class MatchGenMixin: # 对齐 lhs/rhs(指针统一 ptrtoint i64,整数位宽统一到较宽者)后 # 生成 icmp eq,返回 i1 条件。 # ============================================================ - def _seq_cmp_eq(self, trans: HT.Translator | t.CPtr, + def _seq_cmp_eq(self, trans: rawptr[HT.Translator], builder: llvmlite.IRBuilder | t.CPtr, lhs: llvmlite.Value | t.CPtr, rhs: llvmlite.Value | t.CPtr) -> llvmlite.Value | t.CPtr: @@ -773,7 +773,7 @@ class MatchGenMixin: pool: rawptr[memhub.MemBuddy] = trans.Pool if self.Gen.ExprGenBase.is_ptr_type(lhs.Ty) != 0 \ or self.Gen.ExprGenBase.is_ptr_type(rhs.Ty) != 0: - i64_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int64(pool) + i64_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int64(pool) if self.Gen.ExprGenBase.is_ptr_type(lhs.Ty) != 0: lhs = llvmlite.build_ptrtoint(builder, lhs, i64_ty) if self.Gen.ExprGenBase.is_ptr_type(rhs.Ty) != 0: @@ -808,12 +808,12 @@ class MatchGenMixin: # body_i: → end(c.NoBreak 时 fallthrough 到下一 case body) # 全不匹配 → default → end # ============================================================ - def _handle_sequence_match(self, trans: HT.Translator | t.CPtr, - node: ast.Match | t.CPtr, - subject_node: ast.AST | t.CPtr) -> int: + def _handle_sequence_match(self, trans: rawptr[HT.Translator], + node: rawptr[ast.Match], + subject_node: rawptr[ast.AST]) -> int: pool: rawptr[memhub.MemBuddy] = trans.Pool builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder - func: llvmlite.Function | t.CPtr = trans._cur_func + func: rawptr[llvmlite.Function] = trans._cur_func if builder is None or func is None: return 0 # 同主路径:局部记录本 sequence match 的 br end_bb,收尾覆盖 @@ -821,9 +821,9 @@ class MatchGenMixin: sq_merge_reach: int = 0 # 1. 求值 subject 各元素 - elts: list[ast.AST | t.CPtr] | t.CPtr = None + elts: list[rawptr[ast.AST]] | t.CPtr = None if subject_node.kind() == ast.ASTKind.Tuple: - st: ast.Tuple | t.CPtr = (ast.Tuple | t.CPtr)(subject_node) + st: rawptr[ast.Tuple] = rawptr[ast.Tuple](subject_node) if st is not None: elts = st.elts elif subject_node.kind() == ast.ASTKind.List: @@ -841,8 +841,8 @@ class MatchGenMixin: for ei in range(ecount): # elts 预声明+重赋值会把 .get 误分派成 list[int].get(i32 截断); # 用内联别名接收者规避(对齐 Converter arg_defaults 内联模式) - elts_inl: list[ast.AST | t.CPtr] | t.CPtr = elts - elt: ast.AST | t.CPtr = elts_inl.get(ei) + elts_inl: list[rawptr[ast.AST]] | t.CPtr = elts + elt: rawptr[ast.AST] = elts_inl.get(ei) sv: llvmlite.Value | t.CPtr = self.Gen.ExprGen.translate_value( builder, pool, trans.Module, elt, trans._funcs, trans._func_count, trans) @@ -865,7 +865,7 @@ class MatchGenMixin: pool, func, name_buf) # 3. 第一遍:收集 case 信息(check/body BB、default 标记、nobreak、guard) - cases_list: list[ast.AST | t.CPtr] | t.CPtr = node.cases + cases_list: list[rawptr[ast.AST]] | t.CPtr = node.cases if cases_list is None: return 0 case_count: sizet = len(cases_list) @@ -893,12 +893,12 @@ class MatchGenMixin: f"match case 数量超过上限 MAX_MATCH_CASES={MAX_MATCH_CASES}", "OverflowError") break - case_node: ast.AST | t.CPtr = cases_list.get(i) + case_node: rawptr[ast.AST] = cases_list.get(i) if case_node is None or case_node.kind() != ast.ASTKind.MatchCase: i = i + 1 continue mc: ast.MatchCase | t.CPtr = (ast.MatchCase | t.CPtr)(case_node) - pat: ast.AST | t.CPtr = mc.pattern + pat: rawptr[ast.AST] = mc.pattern is_def: int = 0 if pat is not None: pk: int = pat.kind() @@ -927,7 +927,7 @@ class MatchGenMixin: body_arr[collected] = sizet(bbb) if first_check < 0: first_check = collected - body_list: list[ast.AST | t.CPtr] | t.CPtr = mc.children + body_list: list[rawptr[ast.AST]] | t.CPtr = mc.children nb: int = self._has_no_break(body_list) def_arr[collected] = is_def nb_arr[collected] = nb @@ -956,11 +956,11 @@ class MatchGenMixin: # 计算匹配条件(元素比较 && guard) cond: llvmlite.Value | t.CPtr = None - cnode: ast.AST | t.CPtr = cases_list.get(ci) + cnode: rawptr[ast.AST] = cases_list.get(ci) mc2: ast.MatchCase | t.CPtr = (ast.MatchCase | t.CPtr)(cnode) ms: ast.MatchSequence | t.CPtr = ( ast.MatchSequence | t.CPtr)(mc2.pattern) - pats: list[ast.AST | t.CPtr] | t.CPtr = None + pats: list[rawptr[ast.AST]] | t.CPtr = None if ms is not None: pats = ms.patterns pcount: sizet = 0 @@ -973,8 +973,8 @@ class MatchGenMixin: for pi in range(ecount): # pats 预声明+重赋值会把 .get 误分派成 list[int].get(i32 截断); # 用内联别名接收者规避(对齐 Converter arg_defaults 内联模式) - pats_inl: list[ast.AST | t.CPtr] | t.CPtr = pats - pat1: ast.AST | t.CPtr = pats_inl.get(pi) + pats_inl: list[rawptr[ast.AST]] | t.CPtr = pats + pat1: rawptr[ast.AST] = pats_inl.get(pi) if pat1 is None: continue pk1: int = pat1.kind() @@ -1011,7 +1011,7 @@ class MatchGenMixin: # guard(若有):匹配成立且 guard 非零 g_addr: sizet = guard_arr[ci] if g_addr != 0: - gnode: ast.AST | t.CPtr = (ast.AST | t.CPtr)(g_addr) + gnode: rawptr[ast.AST] = (rawptr[ast.AST])(g_addr) gv: llvmlite.Value | t.CPtr = self.Gen.ExprGen.translate_value( builder, pool, trans.Module, gnode, trans._funcs, trans._func_count, trans) @@ -1055,16 +1055,16 @@ class MatchGenMixin: continue bbb3: llvmlite.BasicBlock | t.CPtr = (llvmlite.BasicBlock | t.CPtr)(body_arr[ci]) llvmlite.position_at_end(builder, bbb3) - cnode2: ast.AST | t.CPtr = cases_list.get(ci) + cnode2: rawptr[ast.AST] = cases_list.get(ci) mc3: ast.MatchCase | t.CPtr = ( ast.MatchCase | t.CPtr)(cnode2) self.Gen.VarGen.enter_scope(trans.SymTab, SCOPE_MATCH) - body_list2: list[ast.AST | t.CPtr] | t.CPtr = mc3.children + body_list2: list[rawptr[ast.AST]] | t.CPtr = mc3.children if body_list2 is not None: bc: sizet = len(body_list2) bi: int = 0 while bi < bc: - stmt: ast.AST | t.CPtr = body_list2.get(bi) + stmt: rawptr[ast.AST] = body_list2.get(bi) if stmt is not None: self.Gen.StmtGen.translate_stmt(trans, stmt) bi = bi + 1 @@ -1092,12 +1092,12 @@ class MatchGenMixin: # 7. default 块 llvmlite.position_at_end(builder, default_bb) - dbody: list[ast.AST | t.CPtr] | t.CPtr = None + dbody: list[rawptr[ast.AST]] | t.CPtr = None if has_default == 1: di: int = 0 while di < collected: if def_arr[di] == 1: - dnode: ast.AST | t.CPtr = cases_list.get(di) + dnode: rawptr[ast.AST] = cases_list.get(di) if dnode is not None: dmc: ast.MatchCase | t.CPtr = ( ast.MatchCase | t.CPtr)(dnode) @@ -1106,13 +1106,13 @@ class MatchGenMixin: # (i32→inttoptr 截断指针 → translate_stmt 读垃圾节点崩溃, # gen1 IR 证据)。用 dbody2 内联声明接收者遍历(对齐 # Converter arg_defaults 内联声明规避模式)。 - dbody2: list[ast.AST | t.CPtr] | t.CPtr = dmc.children + dbody2: list[rawptr[ast.AST]] | t.CPtr = dmc.children dbody = dbody2 if dbody2 is not None: dn: sizet = len(dbody2) dj: int = 0 while dj < dn: - stmt: ast.AST | t.CPtr = dbody2.get(dj) + stmt: rawptr[ast.AST] = dbody2.get(dj) if stmt is not None: self.Gen.StmtGen.translate_stmt(trans, stmt) dj = dj + 1 @@ -1136,18 +1136,18 @@ class MatchGenMixin: # # subject ptrtoint 到 i32 + switch 分派 # ============================================================ - def _handle_simple_match(self, trans: HT.Translator | t.CPtr, - node: ast.Match | t.CPtr, + def _handle_simple_match(self, trans: rawptr[HT.Translator], + node: rawptr[ast.Match], subject_val: llvmlite.Value | t.CPtr) -> int: pool: rawptr[memhub.MemBuddy] = trans.Pool builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder - func: llvmlite.Function | t.CPtr = trans._cur_func + func: rawptr[llvmlite.Function] = trans._cur_func # 同主路径:局部记录本 simple match 的 br end_bb,收尾覆盖 # _ctrl_merge_reachable,消除 case 体内嵌套控制流污染 sm_merge_reach: int = 0 # 1. subject 转 i32(若已 i32 直接用,否则 ptrtoint) - i32_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int32(pool) + i32_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int32(pool) subj_bits: int = self.Gen.ExprGenBase.get_llvm_type_bits(subject_val.Ty) subj_val: llvmlite.Value | t.CPtr = subject_val if subj_bits != 32: @@ -1178,7 +1178,7 @@ class MatchGenMixin: pool, func, name_buf) # 3. 收集 case 信息 - cases_list: list[ast.AST | t.CPtr] | t.CPtr = node.cases + cases_list: list[rawptr[ast.AST]] | t.CPtr = node.cases if cases_list is None: # fail-fast: match cases 缺失 self.Gen.TypeGenErr.fatal_error(node, "match cases 缺失", "TypeError") @@ -1201,7 +1201,7 @@ class MatchGenMixin: # 4. 第一遍:收集 + 创建 BB + 构建链表 i: int = 0 while i < case_count: - case_node: ast.AST | t.CPtr = cases_list.get(i) + case_node: rawptr[ast.AST] = cases_list.get(i) if case_node is None: i = i + 1 continue @@ -1209,7 +1209,7 @@ class MatchGenMixin: i = i + 1 continue mc: ast.MatchCase | t.CPtr = (ast.MatchCase | t.CPtr)(case_node) - pat: ast.AST | t.CPtr = mc.pattern + pat: rawptr[ast.AST] = mc.pattern is_def: int = 0 cv: llvmlite.Value | t.CPtr = None @@ -1233,9 +1233,9 @@ class MatchGenMixin: has_default = 1 elif pk == ast.ASTKind.MatchOr: mo: ast.MatchOr | t.CPtr = (ast.MatchOr | t.CPtr)(pat) - pats: list[ast.AST | t.CPtr] | t.CPtr = mo.patterns + pats: list[rawptr[ast.AST]] | t.CPtr = mo.patterns if pats is not None and len(pats) > 0: - first_pat: ast.AST | t.CPtr = pats.get(0) + first_pat: rawptr[ast.AST] = pats.get(0) if first_pat is not None \ and first_pat.kind() == ast.ASTKind.MatchValue: mv2: ast.MatchValue | t.CPtr = ( @@ -1266,7 +1266,7 @@ class MatchGenMixin: else: bb = default_bb - body_list: list[ast.AST | t.CPtr] | t.CPtr = mc.children + body_list: list[rawptr[ast.AST]] | t.CPtr = mc.children nb: int = self._has_no_break(body_list) if collected < MAX_MATCH_CASES: @@ -1296,7 +1296,7 @@ class MatchGenMixin: # 6. 第二遍:翻译 case body i = 0 while i < collected: - case_node: ast.AST | t.CPtr = cases_list.get(i) + case_node: rawptr[ast.AST] = cases_list.get(i) if case_node is None: i = i + 1 continue @@ -1316,12 +1316,12 @@ class MatchGenMixin: self.Gen.VarGen.enter_scope(trans.SymTab, SCOPE_MATCH) - body_list: list[ast.AST | t.CPtr] | t.CPtr = mc.children + body_list: list[rawptr[ast.AST]] | t.CPtr = mc.children if body_list is not None: bc: sizet = len(body_list) bi: int = 0 while bi < bc: - stmt: ast.AST | t.CPtr = body_list.get(bi) + stmt: rawptr[ast.AST] = body_list.get(bi) if stmt is not None: self.Gen.StmtGen.translate_stmt(trans, stmt) bi = bi + 1 @@ -1346,11 +1346,11 @@ class MatchGenMixin: trans._ctrl_merge_reachable = 1 sm_merge_reach = 1 else: - dbody: list[ast.AST | t.CPtr] | t.CPtr = None + dbody: list[rawptr[ast.AST]] | t.CPtr = None di: int = 0 while di < collected: if def_arr[di] == 1: - dcase: ast.AST | t.CPtr = cases_list.get(di) + dcase: rawptr[ast.AST] = cases_list.get(di) if dcase is not None: dmc: ast.MatchCase | t.CPtr = ( ast.MatchCase | t.CPtr)(dcase) @@ -1359,13 +1359,13 @@ class MatchGenMixin: # (i32→inttoptr 截断指针 → translate_stmt 读垃圾节点崩溃, # gen1 IR 证据)。用 dbody2 内联声明接收者遍历(对齐 # Converter arg_defaults 内联声明规避模式)。 - dbody2: list[ast.AST | t.CPtr] | t.CPtr = dmc.children + dbody2: list[rawptr[ast.AST]] | t.CPtr = dmc.children dbody = dbody2 if dbody2 is not None: dn: sizet = len(dbody2) dj: int = 0 while dj < dn: - stmt: ast.AST | t.CPtr = dbody2.get(dj) + stmt: rawptr[ast.AST] = dbody2.get(dj) if stmt is not None: self.Gen.StmtGen.translate_stmt(trans, stmt) dj = dj + 1 diff --git a/App/lib/core/Gen/Stmt/StmtGenCifMixin.vp b/App/lib/core/Gen/Stmt/StmtGenCifMixin.vp index 35d0e52..66d43b7 100644 --- a/App/lib/core/Gen/Stmt/StmtGenCifMixin.vp +++ b/App/lib/core/Gen/Stmt/StmtGenCifMixin.vp @@ -61,25 +61,25 @@ class StmtGenCifMixin: if string.strcmp(attr, "CIfndef") == 0: return 1 return 0 - def _is_cif_call(self, node: ast.AST | t.CPtr) -> int: + def _is_cif_call(self, node: rawptr[ast.AST]) -> int: """检查 test 是否为 c.CIf(...)/c.CIfdef(...)/c.CIfndef(...)(或裸 CIf 系)调用""" if node is None or node.kind() != ast.ASTKind.Call: return 0 - cl: ast.Call | t.CPtr = (ast.Call | t.CPtr)(node) + cl: rawptr[ast.Call] = rawptr[ast.Call](node) if cl.func is None: return 0 fk: int = cl.func.kind() if fk == ast.ASTKind.Attribute: - at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(cl.func) + at: rawptr[ast.Attribute] = rawptr[ast.Attribute](cl.func) if at.attr is None: return 0 if at.value is not None and at.value.kind() == ast.ASTKind.Name: - vn: ast.Name | t.CPtr = (ast.Name | t.CPtr)(at.value) + vn: rawptr[ast.Name] = rawptr[ast.Name](at.value) if vn.id is not None and string.strcmp(vn.id, "c") == 0: return self._is_cif_attr(at.attr) return 0 if fk == ast.ASTKind.Name: - nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(cl.func) + nm: rawptr[ast.Name] = rawptr[ast.Name](cl.func) if nm.id is not None and self._is_cif_attr(nm.id) != 0: return 1 return 0 @@ -122,7 +122,7 @@ class StmtGenCifMixin: return 0 def _cif_name_value(self, pool: rawptr[memhub.MemBuddy], - trans: HT.Translator | t.CPtr, + trans: rawptr[HT.Translator], name: str) -> int: """查宏名值: 本地 CDefine → 跨模块 CDefine → 平台宏。 @@ -146,8 +146,8 @@ class StmtGenCifMixin: return 0 def _cif_attr_value(self, pool: rawptr[memhub.MemBuddy], - trans: HT.Translator | t.CPtr, - at: ast.Attribute | t.CPtr) -> int: + trans: rawptr[HT.Translator], + at: rawptr[ast.Attribute]) -> int: """Attribute 宏值: platmacro.IS_WINDOWS → 本地 CDefine(attr) → 跨模块 CDefine。 命中置 self.CifEvalOk=1;未命中置 0。 @@ -157,7 +157,7 @@ class StmtGenCifMixin: return 0 if at.value.kind() != ast.ASTKind.Name: return 0 - vn: ast.Name | t.CPtr = (ast.Name | t.CPtr)(at.value) + vn: rawptr[ast.Name] = rawptr[ast.Name](at.value) if vn.id is None: return 0 v: int = self.Gen.TypeGenCDef.lookup_cdefine_constant(at.attr) @@ -191,8 +191,8 @@ class StmtGenCifMixin: return 0 def _cif_eval_node(self, pool: rawptr[memhub.MemBuddy], - trans: HT.Translator | t.CPtr, - node: ast.AST | t.CPtr) -> int: + trans: rawptr[HT.Translator], + node: rawptr[ast.AST]) -> int: """递归常量求值 CIf 表达式。 支持: Constant(int) / Name(CDefine/跨模块/平台宏) / Attribute(跨模块 CDefine) @@ -205,7 +205,7 @@ class StmtGenCifMixin: return 0 k: int = node.kind() if k == ast.ASTKind.Constant: - cn: ast.Constant | t.CPtr = (ast.Constant | t.CPtr)(node) + cn: rawptr[ast.Constant] = rawptr[ast.Constant](node) if cn.const_kind == ast.CONST_INT: self.CifEvalOk = 1 return cn.int_val @@ -214,16 +214,16 @@ class StmtGenCifMixin: if k == ast.ASTKind.Call: return self._cif_eval_call(pool, trans, node) if k == ast.ASTKind.Name: - nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(node) + nm: rawptr[ast.Name] = rawptr[ast.Name](node) if nm.id is None: self.CifEvalOk = 0 return 0 return self._cif_name_value(pool, trans, nm.id) if k == ast.ASTKind.Attribute: - at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(node) + at: rawptr[ast.Attribute] = rawptr[ast.Attribute](node) return self._cif_attr_value(pool, trans, at) if k == ast.ASTKind.UnaryOp: - uop: ast.UnaryOp | t.CPtr = (ast.UnaryOp | t.CPtr)(node) + uop: rawptr[ast.UnaryOp] = rawptr[ast.UnaryOp](node) if uop.operand is None: self.CifEvalOk = 0 return 0 @@ -238,7 +238,7 @@ class StmtGenCifMixin: return 0 if k == ast.ASTKind.BoolOp: bo: ast.BoolOp | t.CPtr = (ast.BoolOp | t.CPtr)(node) - vals: list[ast.AST | t.CPtr] | t.CPtr = bo.values + vals: list[rawptr[ast.AST]] | t.CPtr = bo.values if vals is None: self.CifEvalOk = 0 return 0 @@ -267,7 +267,7 @@ class StmtGenCifMixin: if self.CifEvalOk == 0: return 0 ops_list: list[int] | t.CPtr = (list[int] | t.CPtr)(cmp.ops) - comps: list[ast.AST | t.CPtr] | t.CPtr = cmp.comparators + comps: list[rawptr[ast.AST]] | t.CPtr = cmp.comparators if ops_list is None or comps is None: self.CifEvalOk = 0 return 0 @@ -293,7 +293,7 @@ class StmtGenCifMixin: lv = rv return 1 if k == ast.ASTKind.BinOp: - bop: ast.BinOp | t.CPtr = (ast.BinOp | t.CPtr)(node) + bop: rawptr[ast.BinOp] = rawptr[ast.BinOp](node) lv: int = self._cif_eval_node(pool, trans, bop.left) if self.CifEvalOk == 0: return 0 @@ -342,14 +342,14 @@ class StmtGenCifMixin: v: llvmlite.Value | t.CPtr = self.Gen.VarGen.lookup_var(symtab, name) if v is None or v.Ty is None: return -1 - pointee: llvmlite.LLVMType | t.CPtr = v.Ty.Pointee + pointee: rawptr[llvmlite.LLVMType] = v.Ty.Pointee if pointee is not None and self.Gen.ExprGenBase.is_ptr_type(pointee) != 0: return 1 return 0 def _cif_eval_call(self, pool: rawptr[memhub.MemBuddy], - trans: HT.Translator | t.CPtr, - node: ast.AST | t.CPtr) -> int: + trans: rawptr[HT.Translator], + node: rawptr[ast.AST]) -> int: """编译期函数调用求值:ctraits.isptr(x)。 命中置 self.CifEvalOk=1 返回 1/0;未识别调用置 0 返回 0。 @@ -357,31 +357,31 @@ class StmtGenCifMixin: self.CifEvalOk = 0 if node is None or trans is None: return 0 - cl: ast.Call | t.CPtr = (ast.Call | t.CPtr)(node) + cl: rawptr[ast.Call] = rawptr[ast.Call](node) if cl is None or cl.func is None: return 0 fk: int = cl.func.kind() if fk != ast.ASTKind.Attribute: return 0 - at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(cl.func) + at: rawptr[ast.Attribute] = rawptr[ast.Attribute](cl.func) if at.value is None or at.attr is None: return 0 if at.value.kind() != ast.ASTKind.Name: return 0 - vn: ast.Name | t.CPtr = (ast.Name | t.CPtr)(at.value) + vn: rawptr[ast.Name] = rawptr[ast.Name](at.value) if vn.id is None: return 0 if string.strcmp(vn.id, "ctraits") != 0 or string.strcmp(at.attr, "isptr") != 0: return 0 - cargs: list[ast.AST | t.CPtr] | t.CPtr = cl.args + cargs: list[rawptr[ast.AST]] | t.CPtr = cl.args if cargs is None or len(cargs) < 1: self.CifEvalOk = 0 return 0 - arg0: ast.AST | t.CPtr = cargs.get(0) + arg0: rawptr[ast.AST] = cargs.get(0) if arg0 is None or arg0.kind() != ast.ASTKind.Name: self.CifEvalOk = 0 return 0 - nm0: ast.Name | t.CPtr = (ast.Name | t.CPtr)(arg0) + nm0: rawptr[ast.Name] = rawptr[ast.Name](arg0) if nm0.id is None: self.CifEvalOk = 0 return 0 @@ -393,31 +393,31 @@ class StmtGenCifMixin: return r def _evaluate_cif_test(self, pool: rawptr[memhub.MemBuddy], - trans: HT.Translator | t.CPtr, - test: ast.AST | t.CPtr) -> int: + trans: rawptr[HT.Translator], + test: rawptr[ast.AST]) -> int: """求值 CIf 调用(test 必须是 c.CIf 系调用)。 成功: 置 self.CifEvalOk=1,返回条件值(0/1) 失败(运行时变量/未知结构): 置 self.CifEvalOk=0,返回 0 """ self.CifEvalOk = 0 - cl: ast.Call | t.CPtr = (ast.Call | t.CPtr)(test) + cl: rawptr[ast.Call] = rawptr[ast.Call](test) if cl is None or cl.func is None: return 0 kind: str = None fk: int = cl.func.kind() if fk == ast.ASTKind.Attribute: - at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(cl.func) + at: rawptr[ast.Attribute] = rawptr[ast.Attribute](cl.func) kind = at.attr elif fk == ast.ASTKind.Name: - nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(cl.func) + nm: rawptr[ast.Name] = rawptr[ast.Name](cl.func) kind = nm.id if kind is None: return 0 - cargs: list[ast.AST | t.CPtr] | t.CPtr = cl.args + cargs: list[rawptr[ast.AST]] | t.CPtr = cl.args if cargs is None or len(cargs) < 1: return 0 - arg0: ast.AST | t.CPtr = cargs.get(0) + arg0: rawptr[ast.AST] = cargs.get(0) if string.strcmp(kind, "CIf") == 0: v: int = self._cif_eval_node(pool, trans, arg0) if self.CifEvalOk == 0: @@ -426,20 +426,20 @@ class StmtGenCifMixin: # CIfdef / CIfndef: 判定宏名是否已定义 defined: int = 0 if arg0 is not None and arg0.kind() == ast.ASTKind.Name: - nm0: ast.Name | t.CPtr = (ast.Name | t.CPtr)(arg0) + nm0: rawptr[ast.Name] = rawptr[ast.Name](arg0) if nm0.id is None: return 0 self._cif_name_value(pool, trans, nm0.id) defined = self.CifEvalOk elif arg0 is not None and arg0.kind() == ast.ASTKind.Constant: - cn0: ast.Constant | t.CPtr = (ast.Constant | t.CPtr)(arg0) + cn0: rawptr[ast.Constant] = rawptr[ast.Constant](arg0) if cn0.const_kind == ast.CONST_STR and cn0.str_val is not None: self._cif_name_value(pool, trans, cn0.str_val) defined = self.CifEvalOk else: return 0 elif arg0 is not None and arg0.kind() == ast.ASTKind.Attribute: - at0: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(arg0) + at0: rawptr[ast.Attribute] = rawptr[ast.Attribute](arg0) self._cif_attr_value(pool, trans, at0) defined = self.CifEvalOk else: @@ -457,8 +457,8 @@ class StmtGenCifMixin: # 翻译返回值(若有)并生成 ret 指令;裸 return 按函数返回类型生成 # 默认零值(void→ret void,ptr→null,float→0.0,其余→零值)。 # ============================================================ - def translate_return(self, trans: HT.Translator | t.CPtr, - node: ast.AST | t.CPtr) -> int: + def translate_return(self, trans: rawptr[HT.Translator], + node: rawptr[ast.AST]) -> int: """翻译 Return 语句""" rt: ast.Return | t.CPtr = (ast.Return | t.CPtr)(node) if rt is None: @@ -466,14 +466,14 @@ class StmtGenCifMixin: pool: rawptr[memhub.MemBuddy] = trans.Pool builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder - mod: llvmlite.LLVMModule | t.CPtr = trans.Module + mod: rawptr[llvmlite.LLVMModule] = trans.Module val: llvmlite.Value | t.CPtr = None if rt.value is not None: # return a, b → 打包匿名 struct 值(多返回值,函数返回类型 tuple[T1,T2]) if rt.value.kind() == ast.ASTKind.Tuple: - rtp: ast.Tuple | t.CPtr = (ast.Tuple | t.CPtr)(rt.value) - rtp_elts: list[ast.AST | t.CPtr] | t.CPtr = rtp.elts + rtp: rawptr[ast.Tuple] = rawptr[ast.Tuple](rt.value) + rtp_elts: list[rawptr[ast.AST]] | t.CPtr = rtp.elts rt_n: sizet = 0 if rtp_elts is not None: rt_n = len(rtp_elts) @@ -481,8 +481,8 @@ class StmtGenCifMixin: rt_vals: sizet | t.CPtr = pool.alloc(8 * 16) if rt_vals is not None: rt_val_ok: int = 1 - rt_head: llvmlite.ParamNode | t.CPtr = None - rt_tail: llvmlite.ParamNode | t.CPtr = None + rt_head: rawptr[llvmlite.Function] = None + rt_tail: rawptr[llvmlite.Function] = None rvi: sizet for rvi in range(rt_n): ev_i: llvmlite.Value | t.CPtr = self.Gen.ExprGen.translate_value( @@ -500,7 +500,7 @@ class StmtGenCifMixin: if rv_i is None or rv_i.Ty is None: rt_val_ok = 0 break - rn: llvmlite.ParamNode | t.CPtr = llvmlite.new_param_node(pool, rv_i.Ty) + rn: rawptr[llvmlite.Function] = llvmlite.new_param_node(pool, rv_i.Ty) if rn is None: rt_val_ok = 0 break @@ -509,7 +509,7 @@ class StmtGenCifMixin: else: llvmlite.paramnode_set_next(rt_tail, rn) rt_tail = rn - rt_struct_ty: llvmlite.LLVMType | t.CPtr = None + rt_struct_ty: rawptr[llvmlite.LLVMType] = None if rt_val_ok != 0 and rt_head is not None: rt_struct_ty = llvmlite.Struct(pool, rt_head, rt_n, None) rt_tmp: llvmlite.Value | t.CPtr = None @@ -532,14 +532,14 @@ class StmtGenCifMixin: # 注意: lookup_var 返回的是存储 self 的 alloca (Ptr(Ptr(StructTy))) # 需要 load 得到实际的 self 指针 (Ptr(StructTy)) if rt.value.kind() == ast.ASTKind.Name: - ret_nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(rt.value) + ret_nm: rawptr[ast.Name] = rawptr[ast.Name](rt.value) if ret_nm is not None and ret_nm.id is not None \ and string.strcmp(ret_nm.id, "self") == 0: self_ptr: llvmlite.Value | t.CPtr = self.Gen.VarGen.lookup_var( trans.SymTab, "self") if self_ptr is not None: # 检查 self_ptr 是否是 Ptr(Ptr(...))(alloca 存储指针) - self_pointee_ty: llvmlite.LLVMType | t.CPtr = None + self_pointee_ty: rawptr[llvmlite.LLVMType] = None match self_ptr.Ty: case llvmlite.LLVMType.Ptr(inner_ty): self_pointee_ty = inner_ty @@ -552,8 +552,8 @@ class StmtGenCifMixin: # P1-A(上下文位宽传播):把当前函数的返回类型作为 target_ty 传入, # 使 `return 12345`(-> uint64)直接物化 i64 常量,与 `return u64(12345)` # 一致,并省去下方返回类型对齐生成的 zext。 - ret_val_ty: llvmlite.LLVMType | t.CPtr = None - cur_func_rv: llvmlite.Function | t.CPtr = trans._cur_func + ret_val_ty: rawptr[llvmlite.LLVMType] = None + cur_func_rv: rawptr[llvmlite.Function] = trans._cur_func if cur_func_rv is not None: ret_val_ty = llvmlite.function_get_ret_ty(cur_func_rv) # [C①] 返回注解上下文:记录本次 return 的直接值节点,供裸名泛型 @@ -570,11 +570,11 @@ class StmtGenCifMixin: # ptr 函数生成 ret ptr null,浮点函数生成 ConstFloat(0.0), # 否则 ret i32 0(浮点漏处理会报 llc: value doesn't match function result type) if val is None: - cur_func: llvmlite.Function | t.CPtr = trans._cur_func + cur_func: rawptr[llvmlite.Function] = trans._cur_func is_void_ret: int = 0 is_ptr_ret: int = 0 is_float_ret: int = 0 - ret_ty: llvmlite.LLVMType | t.CPtr = None + ret_ty: rawptr[llvmlite.LLVMType] = None if cur_func is not None: ret_ty = llvmlite.function_get_ret_ty(cur_func) if ret_ty is not None: @@ -609,8 +609,8 @@ class StmtGenCifMixin: # i1 → 更宽整数用 zext(bool 语义:1 保持 1,而非 sext 的 0xFF) # 注意:当 val 是整数而 ret_ty 是 ptr 时(即使 bits 相同,如 i64 vs ptr), # 也必须 inttoptr 转换,否则 llc 报 "value doesn't match function result type" - cur_func_rt: llvmlite.Function | t.CPtr = trans._cur_func - ret_ty_rt: llvmlite.LLVMType | t.CPtr = None + cur_func_rt: rawptr[llvmlite.Function] = trans._cur_func + ret_ty_rt: rawptr[llvmlite.LLVMType] = None if cur_func_rt is not None and val is not None and val.Ty is not None: ret_ty_rt = llvmlite.function_get_ret_ty(cur_func_rt) # void 函数 return :丢弃值 + ret void(Python 语义合法;此前 @@ -655,8 +655,8 @@ class StmtGenCifMixin: # 指针 → 指针且元素类型不同(如 t\.CVoid(x, CPtr) 得到 i8*, # 函数返回类型是类指针 Circle* 时)需 bitcast 回, # 否则 llc 报 "value doesn't match function result type"。 - val_pointee: llvmlite.LLVMType | t.CPtr = None - ret_pointee: llvmlite.LLVMType | t.CPtr = None + val_pointee: rawptr[llvmlite.LLVMType] = None + ret_pointee: rawptr[llvmlite.LLVMType] = None match val.Ty: case llvmlite.LLVMType.Ptr(v_inner): val_pointee = v_inner @@ -692,15 +692,15 @@ class StmtGenCifMixin: # br label %end # end: # ============================================================ - def translate_if(self, trans: HT.Translator | t.CPtr, - node: ast.AST | t.CPtr) -> int: + def translate_if(self, trans: rawptr[HT.Translator], + node: rawptr[ast.AST]) -> int: """翻译 if/elif/else 语句""" if node is None: return 0 pool: rawptr[memhub.MemBuddy] = trans.Pool builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder - func: llvmlite.Function | t.CPtr = trans._cur_func + func: rawptr[llvmlite.Function] = trans._cur_func if builder is None or func is None: return 0 @@ -714,18 +714,18 @@ class StmtGenCifMixin: cif_val: int = self._evaluate_cif_test(pool, trans, if_node.test) if self.CifEvalOk != 0: if cif_val != 0: - body_cif: list[ast.AST | t.CPtr] | t.CPtr = if_node.children + body_cif: list[rawptr[ast.AST]] | t.CPtr = if_node.children if body_cif is not None: bc_cif: sizet = len(body_cif) bi_cif: sizet for bi_cif in range(bc_cif): - stmt_cif: ast.AST | t.CPtr = body_cif.get(bi_cif) + stmt_cif: rawptr[ast.AST] = body_cif.get(bi_cif) if stmt_cif is not None: self.Gen.StmtGen.translate_stmt(trans, stmt_cif) else: - orelse_cif: list[ast.AST | t.CPtr] | t.CPtr = if_node.orelse + orelse_cif: list[rawptr[ast.AST]] | t.CPtr = if_node.orelse if orelse_cif is not None and len(orelse_cif) == 1: - sub_cif: ast.AST | t.CPtr = orelse_cif.get(0) + sub_cif: rawptr[ast.AST] = orelse_cif.get(0) if sub_cif is not None and sub_cif.kind() == ast.ASTKind.If: # elif: 递归(子 If 的 test 仍会走 CIf 判定或运行时翻译) self.translate_if(trans, sub_cif) @@ -735,7 +735,7 @@ class StmtGenCifMixin: oc_cif: sizet = len(orelse_cif) oi_cif: sizet for oi_cif in range(oc_cif): - stmt_cif2: ast.AST | t.CPtr = orelse_cif.get(oi_cif) + stmt_cif2: rawptr[ast.AST] = orelse_cif.get(oi_cif) if stmt_cif2 is not None: self.Gen.StmtGen.translate_stmt(trans, stmt_cif2) return 0 @@ -776,7 +776,7 @@ class StmtGenCifMixin: # 检查是否有 else 分支 has_else: int = 0 - orelse_list: list[ast.AST | t.CPtr] | t.CPtr = if_node.orelse + orelse_list: list[rawptr[ast.AST]] | t.CPtr = if_node.orelse if orelse_list is not None: if len(orelse_list) > 0: has_else = 1 @@ -798,11 +798,11 @@ class StmtGenCifMixin: # 末句 If 全 return 被 fail-fast 误判"流程掉出末尾"的根因链一环) trans._ctrl_merge_reachable = 1 llvmlite.position_at_end(builder, then_bb) - body: list[ast.AST | t.CPtr] | t.CPtr = if_node.children + body: list[rawptr[ast.AST]] | t.CPtr = if_node.children if body is not None: body_count: sizet = len(body) for bi in range(body_count): - stmt: ast.AST | t.CPtr = body.get(bi) + stmt: rawptr[ast.AST] = body.get(bi) if stmt is not None: self.Gen.StmtGen.translate_stmt(trans, stmt) @@ -828,7 +828,7 @@ class StmtGenCifMixin: llvmlite.position_at_end(builder, else_bb) else_count: sizet = len(orelse_list) for ei in range(else_count): - stmt: ast.AST | t.CPtr = orelse_list.get(ei) + stmt: rawptr[ast.AST] = orelse_list.get(ei) if stmt is not None: self.Gen.StmtGen.translate_stmt(trans, stmt) if llvmlite.builder_cur_block_is_terminated(builder) == 0: @@ -864,15 +864,15 @@ class StmtGenCifMixin: # br label %cond # end: # ============================================================ - def translate_while(self, trans: HT.Translator | t.CPtr, - node: ast.AST | t.CPtr) -> int: + def translate_while(self, trans: rawptr[HT.Translator], + node: rawptr[ast.AST]) -> int: """翻译 while 循环语句""" if node is None: return 0 pool: rawptr[memhub.MemBuddy] = trans.Pool builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder - func: llvmlite.Function | t.CPtr = trans._cur_func + func: rawptr[llvmlite.Function] = trans._cur_func if builder is None or func is None: return 0 @@ -929,11 +929,11 @@ class StmtGenCifMixin: trans._break_bb = end_bb trans._continue_bb = cond_bb - body: list[ast.AST | t.CPtr] | t.CPtr = while_node.children + body: list[rawptr[ast.AST]] | t.CPtr = while_node.children if body is not None: body_count: sizet = len(body) for bi in range(body_count): - stmt: ast.AST | t.CPtr = body.get(bi) + stmt: rawptr[ast.AST] = body.get(bi) if stmt is not None: self.Gen.StmtGen.translate_stmt(trans, stmt) @@ -964,27 +964,27 @@ class StmtGenCifMixin: # _NodeHasBreak / _StmtHasBreak: 扫描本层 break(跳过嵌套 While/For # 子树——嵌套循环的 break 归内层,不影响外层 merge 可达性) # ============================================================ - def _IsConstTrue(self, test: ast.AST | t.CPtr) -> int: + def _IsConstTrue(self, test: rawptr[ast.AST]) -> int: """while 条件为常量真(1 / True)返回 1""" if test is None: return 0 if test.kind() == ast.ASTKind.Constant: - cn: ast.Constant | t.CPtr = (ast.Constant | t.CPtr)(test) + cn: rawptr[ast.Constant] = rawptr[ast.Constant](test) if cn.const_kind == ast.CONST_INT and cn.int_val != 0: return 1 if cn.const_kind == ast.CONST_BOOL and cn.int_val != 0: return 1 return 0 - def _NodeHasBreak(self, node: ast.AST | t.CPtr) -> int: + def _NodeHasBreak(self, node: rawptr[ast.AST]) -> int: """递归扫描节点子树(跳过嵌套 While/For 子树),含 Break 返回 1""" if node is None: return 0 - ch: list[ast.AST | t.CPtr] | t.CPtr = node.children + ch: list[rawptr[ast.AST]] | t.CPtr = node.children if ch is not None: n: sizet = len(ch) for bi in range(n): - c: ast.AST | t.CPtr = ch.get(bi) + c: rawptr[ast.AST] = ch.get(bi) if c is None: continue k: int = c.kind() @@ -996,13 +996,13 @@ class StmtGenCifMixin: return 1 return 0 - def _StmtHasBreak(self, body: list[ast.AST | t.CPtr] | t.CPtr) -> int: + def _StmtHasBreak(self, body: list[rawptr[ast.AST]] | t.CPtr) -> int: """语句列表是否含本层 break(嵌套循环的 break 归内层)""" if body is None: return 0 n: sizet = len(body) for bi in range(n): - s: ast.AST | t.CPtr = body.get(bi) + s: rawptr[ast.AST] = body.get(bi) if s is None: continue k: int = s.kind() @@ -1035,15 +1035,15 @@ class StmtGenCifMixin: # br label %cond # end: # ============================================================ - def translate_for(self, trans: HT.Translator | t.CPtr, - node: ast.AST | t.CPtr) -> int: + def translate_for(self, trans: rawptr[HT.Translator], + node: rawptr[ast.AST]) -> int: """翻译 for i in range(...) 循环语句""" if node is None: return 0 pool: rawptr[memhub.MemBuddy] = trans.Pool builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder - func: llvmlite.Function | t.CPtr = trans._cur_func + func: rawptr[llvmlite.Function] = trans._cur_func if builder is None or func is None: return 0 @@ -1051,7 +1051,7 @@ class StmtGenCifMixin: for_node: ast.For | t.CPtr = (ast.For | t.CPtr)(node) # 1. 获取循环变量(Name 单变量 / Tuple 多变量) - target: ast.AST | t.CPtr = for_node.target + target: rawptr[ast.AST] = for_node.target if target is None: return 0 tk: int = target.kind() @@ -1059,20 +1059,20 @@ class StmtGenCifMixin: return 0 var_name: str = None if tk == ast.ASTKind.Name: - target_nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(target) + target_nm: rawptr[ast.Name] = rawptr[ast.Name](target) var_name = target_nm.id if var_name is None: return 0 # 2. 解析迭代器:支持 range() 和指针迭代 - iter_node: ast.AST | t.CPtr = for_node.iter + iter_node: rawptr[ast.AST] = for_node.iter if iter_node is None: return 0 # 检查是否是 range() 调用 is_range_iter: int = 0 if iter_node.kind() == ast.ASTKind.Call: - call_pre: ast.Call | t.CPtr = (ast.Call | t.CPtr)(iter_node) + call_pre: rawptr[ast.Call] = rawptr[ast.Call](iter_node) fn_pre: str = self.Gen.ExprGenBase.get_func_name(call_pre.func) if fn_pre is not None: if string.strcmp(fn_pre, "range") == 0: @@ -1093,12 +1093,12 @@ class StmtGenCifMixin: return self._handle_list_literal_iter(trans, for_node, var_name, iter_node) # enumerate(x):for i, v in enumerate(x)(多变量迭代) if iter_node.kind() == ast.ASTKind.Call: - call_mi: ast.Call | t.CPtr = (ast.Call | t.CPtr)(iter_node) + call_mi: rawptr[ast.Call] = rawptr[ast.Call](iter_node) fn_mi: str = self.Gen.ExprGenBase.get_func_name(call_mi.func) if fn_mi is not None and string.strcmp(fn_mi, "enumerate") == 0: if tk != ast.ASTKind.Tuple: self.Gen.TypeGenErr.fatal_error(iter_node, "enumerate 迭代需要两个循环变量 (for i, v in enumerate(x))") - tup_ie: ast.Tuple | t.CPtr = (ast.Tuple | t.CPtr)(target) + tup_ie: rawptr[ast.Tuple] = rawptr[ast.Tuple](target) t1_buf_ie: bytes = pool.alloc(128) t2_buf_ie: bytes = pool.alloc(128) if t1_buf_ie is None or t2_buf_ie is None: @@ -1111,7 +1111,7 @@ class StmtGenCifMixin: if fn_mi is not None and string.strcmp(fn_mi, "zip") == 0: if tk != ast.ASTKind.Tuple: self.Gen.TypeGenErr.fatal_error(iter_node, "zip 迭代需要两个循环变量 (for a, b in zip(...))") - tup_iz: ast.Tuple | t.CPtr = (ast.Tuple | t.CPtr)(target) + tup_iz: rawptr[ast.Tuple] = rawptr[ast.Tuple](target) t1_buf_iz: bytes = pool.alloc(128) t2_buf_iz: bytes = pool.alloc(128) if t1_buf_iz is None or t2_buf_iz is None: @@ -1123,7 +1123,7 @@ class StmtGenCifMixin: return self._handle_zip_iter(trans, for_node, t1_buf_iz, t2_buf_iz, call_mi) # list[T] 容器变量:按 __count__ 动态长度迭代 if iter_node.kind() == ast.ASTKind.Name and trans is not None: - nm_lst: ast.Name | t.CPtr = (ast.Name | t.CPtr)(iter_node) + nm_lst: rawptr[ast.Name] = rawptr[ast.Name](iter_node) if nm_lst.id is not None: ve_lst: GenTypes.VarEntry | t.CPtr = self.Gen.VarGen.lookup_var_entry( trans.SymTab, nm_lst.id) @@ -1156,7 +1156,7 @@ class StmtGenCifMixin: trans._funcs, trans._func_count, trans) if ov_val is not None and ov_val.Ty is not None \ and self.Gen.ExprGenBase.is_ptr_type(ov_val.Ty) != 0: - ov_st: llvmlite.LLVMType | t.CPtr = self.Gen.StructGen.get_struct_type_from_value( + ov_st: rawptr[llvmlite.LLVMType] = self.Gen.StructGen.get_struct_type_from_value( ov_val) if ov_st is not None: ov_cn: str = self.Gen.StructGen.get_class_name_by_type(pool, ov_st) @@ -1164,13 +1164,13 @@ class StmtGenCifMixin: oi_lookup: str = pool.alloc(128) if oi_lookup is not None: viperlib.snprintf(oi_lookup, 128, "%s.__iter__", ov_cn) - oi_fn: llvmlite.Function | t.CPtr = self.Gen.CallGenBase.find_func_in_module( + oi_fn: rawptr[llvmlite.Function] = self.Gen.CallGenBase.find_func_in_module( trans.Module, oi_lookup) if oi_fn is not None: on_lookup: str = pool.alloc(128) if on_lookup is not None: viperlib.snprintf(on_lookup, 128, "%s.__next__", ov_cn) - on_fn: llvmlite.Function | t.CPtr = self.Gen.CallGenBase.find_func_in_module( + on_fn: rawptr[llvmlite.Function] = self.Gen.CallGenBase.find_func_in_module( trans.Module, on_lookup) if on_fn is not None: return self._handle_oop_iter( @@ -1179,7 +1179,7 @@ class StmtGenCifMixin: # 避免 translate_value 触发 list[T] 特化崩溃或语义歧义。 ik: int = iter_node.kind() if ik == ast.ASTKind.Constant: - cn_ik: ast.Constant | t.CPtr = (ast.Constant | t.CPtr)(iter_node) + cn_ik: rawptr[ast.Constant] = rawptr[ast.Constant](iter_node) if cn_ik.const_kind != ast.CONST_STR: self.Gen.TypeGenErr.fatal_error( iter_node, @@ -1191,15 +1191,15 @@ class StmtGenCifMixin: "for 迭代不支持字典/集合/元组字面量,请使用 range()、t.CArray 数组或列表字面量") return self._handle_ptr_iter(trans, for_node, var_name) - call: ast.Call | t.CPtr = (ast.Call | t.CPtr)(iter_node) + call: rawptr[ast.Call] = rawptr[ast.Call](iter_node) # 3. 解析 range 参数: range(stop) / range(start, stop) / range(start, stop, step) - args: list[ast.AST | t.CPtr] | t.CPtr = call.args + args: list[rawptr[ast.AST]] | t.CPtr = call.args if args is None: return 0 arg_count: sizet = len(args) - i32_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int32(pool) + i32_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int32(pool) start_val: llvmlite.Value | t.CPtr = llvmlite.const_int32(pool, 0) stop_val: llvmlite.Value | t.CPtr = None step_val: llvmlite.Value | t.CPtr = llvmlite.const_int32(pool, 1) @@ -1240,18 +1240,18 @@ class StmtGenCifMixin: # 修复 _find_provider 的 range(top-1, -1, -1) 循环体不执行(i < -1 恒假)。 step_neg_const: int = 0 if arg_count >= 3: - step_arg_node: ast.AST | t.CPtr = args.get(2) + step_arg_node: rawptr[ast.AST] = args.get(2) if step_arg_node is not None: skn: int = step_arg_node.kind() if skn == ast.ASTKind.UnaryOp: - uop_r: ast.UnaryOp | t.CPtr = (ast.UnaryOp | t.CPtr)(step_arg_node) + uop_r: rawptr[ast.UnaryOp] = rawptr[ast.UnaryOp](step_arg_node) if uop_r.op == ast.OpKind.USub and uop_r.operand is not None: if uop_r.operand.kind() == ast.ASTKind.Constant: - uoc_r: ast.Constant | t.CPtr = (ast.Constant | t.CPtr)(uop_r.operand) + uoc_r: rawptr[ast.Constant] = rawptr[ast.Constant](uop_r.operand) if uoc_r.int_val > 0: step_neg_const = 1 elif skn == ast.ASTKind.Constant: - skc_r: ast.Constant | t.CPtr = (ast.Constant | t.CPtr)(step_arg_node) + skc_r: rawptr[ast.Constant] = rawptr[ast.Constant](step_arg_node) if skc_r.int_val < 0: step_neg_const = 1 @@ -1259,7 +1259,7 @@ class StmtGenCifMixin: # 不固定 i32:固定 i32 alloca 会截断 uint64 上界(range(heap_end, new_end, 4096) # 生成 trunc i64→i32 → 高 32 位丢失 → 映射地址错误)。仅当循环变量尚未声明时生效; # 已声明变量沿用其 alloca 元素类型(见下方 loop_var_ty 解引用)。 - loop_store_ty: llvmlite.LLVMType | t.CPtr = i32_ty + loop_store_ty: rawptr[llvmlite.LLVMType] = i32_ty range_arg_bits: int = 0 if arg_count == 1: if stop_val is not None and stop_val.Ty is not None: @@ -1308,18 +1308,18 @@ class StmtGenCifMixin: # 此处无条件退回有符号谓词(slt/sgt),与 3.6 的无符号优化不冲突。 stop_neg_const: int = 0 if arg_count >= 2: - stop_arg_node: ast.AST | t.CPtr = args.get(1) + stop_arg_node: rawptr[ast.AST] = args.get(1) if stop_arg_node is not None: stn_k: int = stop_arg_node.kind() if stn_k == ast.ASTKind.UnaryOp: - stop_uop: ast.UnaryOp | t.CPtr = (ast.UnaryOp | t.CPtr)(stop_arg_node) + stop_uop: rawptr[ast.UnaryOp] = rawptr[ast.UnaryOp](stop_arg_node) if stop_uop.op == ast.OpKind.USub and stop_uop.operand is not None: if stop_uop.operand.kind() == ast.ASTKind.Constant: - stop_uc: ast.Constant | t.CPtr = (ast.Constant | t.CPtr)(stop_uop.operand) + stop_uc: rawptr[ast.Constant] = rawptr[ast.Constant](stop_uop.operand) if stop_uc.int_val > 0: stop_neg_const = 1 elif stn_k == ast.ASTKind.Constant: - stop_c: ast.Constant | t.CPtr = (ast.Constant | t.CPtr)(stop_arg_node) + stop_c: rawptr[ast.Constant] = rawptr[ast.Constant](stop_arg_node) if stop_c.int_val < 0: stop_neg_const = 1 if stop_neg_const != 0: @@ -1350,7 +1350,7 @@ class StmtGenCifMixin: # 获取循环变量的实际元素类型(alloca 是指针类型,需解引用 Pointee) # 当循环变量已声明为 i64(如 sizet),使用 i64 而非硬编码 i32 # 避免 load i32, i64* / store i32, i64* 类型不匹配 - loop_var_ty: llvmlite.LLVMType | t.CPtr = i32_ty + loop_var_ty: rawptr[llvmlite.LLVMType] = i32_ty if var_alloca is not None and var_alloca.Ty is not None: match var_alloca.Ty: case llvmlite.LLVMType.Ptr(pointee_ty): @@ -1429,11 +1429,11 @@ class StmtGenCifMixin: trans._break_bb = end_bb trans._continue_bb = incr_bb - body: list[ast.AST | t.CPtr] | t.CPtr = for_node.children + body: list[rawptr[ast.AST]] | t.CPtr = for_node.children if body is not None: body_count: sizet = len(body) for bi in range(body_count): - stmt: ast.AST | t.CPtr = body.get(bi) + stmt: rawptr[ast.AST] = body.get(bi) if stmt is not None: self.Gen.StmtGen.translate_stmt(trans, stmt) @@ -1474,48 +1474,48 @@ class StmtGenCifMixin: # enumerate(x) → for i, v in enumerate(x):i 为序号,v 为元素 # zip(a, b) → for x, y in zip(a, b):任一源耗尽即终止 # ============================================================ - def _extract_tuple_names(self, tup: ast.Tuple | t.CPtr, + def _extract_tuple_names(self, tup: rawptr[ast.Tuple], out1: str, out2: str) -> int: """从 Tuple target 提取前两个 Name 变量名,写入 out1/out2,成功返回 1""" if tup is None or tup.elts is None or out1 is None or out2 is None: return 0 - elts: list[ast.AST | t.CPtr] | t.CPtr = tup.elts + elts: list[rawptr[ast.AST]] | t.CPtr = tup.elts n: sizet = len(elts) if n < 2: return 0 - e0: ast.AST | t.CPtr = elts.get(0) - e1: ast.AST | t.CPtr = elts.get(1) + e0: rawptr[ast.AST] = elts.get(0) + e1: rawptr[ast.AST] = elts.get(1) if e0 is None or e1 is None: return 0 if e0.kind() != ast.ASTKind.Name or e1.kind() != ast.ASTKind.Name: return 0 - n0: ast.Name | t.CPtr = (ast.Name | t.CPtr)(e0) - n1: ast.Name | t.CPtr = (ast.Name | t.CPtr)(e1) + n0: rawptr[ast.Name] = rawptr[ast.Name](e0) + n1: rawptr[ast.Name] = rawptr[ast.Name](e1) if n0.id is None or n1.id is None: return 0 string.strcpy(out1, n0.id) string.strcpy(out2, n1.id) return 1 - def _seq_kind(self, trans: HT.Translator | t.CPtr, - src: ast.AST | t.CPtr) -> int: + def _seq_kind(self, trans: rawptr[HT.Translator], + src: rawptr[ast.AST]) -> int: """判断迭代源类型: SEQ_KIND_RANGE / STR / LIST,不支持返回 0""" if src is None: return 0 k: int = src.kind() if k == ast.ASTKind.Call: - cl_s: ast.Call | t.CPtr = (ast.Call | t.CPtr)(src) + cl_s: rawptr[ast.Call] = rawptr[ast.Call](src) fn_s: str = self.Gen.ExprGenBase.get_func_name(cl_s.func) if fn_s is not None and string.strcmp(fn_s, "range") == 0: return GenTypes.SEQ_KIND_RANGE return 0 if k == ast.ASTKind.Constant: - cn_s: ast.Constant | t.CPtr = (ast.Constant | t.CPtr)(src) + cn_s: rawptr[ast.Constant] = rawptr[ast.Constant](src) if cn_s is not None and cn_s.const_kind == ast.CONST_STR: return GenTypes.SEQ_KIND_STR return 0 if k == ast.ASTKind.Name: - nm_s: ast.Name | t.CPtr = (ast.Name | t.CPtr)(src) + nm_s: rawptr[ast.Name] = rawptr[ast.Name](src) if nm_s.id is not None and trans is not None: ve_s: GenTypes.VarEntry | t.CPtr = self.Gen.VarGen.lookup_var_entry( trans.SymTab, nm_s.id) @@ -1527,11 +1527,11 @@ class StmtGenCifMixin: return GenTypes.SEQ_KIND_STR return 0 - def _build_seq_loop(self, trans: HT.Translator | t.CPtr, + def _build_seq_loop(self, trans: rawptr[HT.Translator], for_node: ast.For | t.CPtr, t1: str, t2: str, - src1: ast.AST | t.CPtr, - src2: ast.AST | t.CPtr, + src1: rawptr[ast.AST], + src2: rawptr[ast.AST], n_srcs: int) -> int: """生成序列迭代循环(enumerate: n_srcs=1 / zip: n_srcs=2) @@ -1540,12 +1540,12 @@ class StmtGenCifMixin: """ pool: rawptr[memhub.MemBuddy] = trans.Pool builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder - func: llvmlite.Function | t.CPtr = trans._cur_func + func: rawptr[llvmlite.Function] = trans._cur_func - i32_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int32(pool) - i64_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int64(pool) - i8_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int8(pool) - i8_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, i8_ty) + i32_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int32(pool) + i64_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int64(pool) + i8_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int8(pool) + i8_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, i8_ty) # ---- 源 1 准备 ---- kind1: int = self._seq_kind(trans, src1) @@ -1558,15 +1558,15 @@ class StmtGenCifMixin: l1_count: llvmlite.Value | t.CPtr = None l1_data: llvmlite.Value | t.CPtr = None l1_esize: llvmlite.Value | t.CPtr = None - elem1_ty: llvmlite.LLVMType | t.CPtr = i8_ptr_ty + elem1_ty: rawptr[llvmlite.LLVMType] = i8_ptr_ty if kind1 == GenTypes.SEQ_KIND_RANGE: elem1_ty = i32_ty r1_start = llvmlite.const_int64(pool, 0) r1_step = llvmlite.const_int64(pool, 1) r1_stop = llvmlite.const_int64(pool, 0) # 先赋中间变量再取 args(cast 链式属性访问会推断错字段偏移) - call_src1: ast.Call | t.CPtr = (ast.Call | t.CPtr)(src1) - cargs1: list[ast.AST | t.CPtr] | t.CPtr = call_src1.args + call_src1: rawptr[ast.Call] = rawptr[ast.Call](src1) + cargs1: list[rawptr[ast.AST]] | t.CPtr = call_src1.args if cargs1 is not None: n1: sizet = len(cargs1) if n1 >= 1: @@ -1617,7 +1617,7 @@ class StmtGenCifMixin: # ---- 源 2 准备(zip)---- kind2: int = 0 - elem2_ty: llvmlite.LLVMType | t.CPtr = elem1_ty + elem2_ty: rawptr[llvmlite.LLVMType] = elem1_ty s2_ptr: llvmlite.Value | t.CPtr = None l2_count: llvmlite.Value | t.CPtr = None l2_data: llvmlite.Value | t.CPtr = None @@ -1635,8 +1635,8 @@ class StmtGenCifMixin: r2_step = llvmlite.const_int64(pool, 1) r2_stop = llvmlite.const_int64(pool, 0) # 先赋中间变量再取 args(cast 链式属性访问会推断错字段偏移) - call_src2: ast.Call | t.CPtr = (ast.Call | t.CPtr)(src2) - cargs2: list[ast.AST | t.CPtr] | t.CPtr = call_src2.args + call_src2: rawptr[ast.Call] = rawptr[ast.Call](src2) + cargs2: list[rawptr[ast.AST]] | t.CPtr = call_src2.args if cargs2 is not None: n2: sizet = len(cargs2) if n2 >= 1: @@ -1772,13 +1772,13 @@ class StmtGenCifMixin: v1 = llvmlite.build_load(builder, i8_ptr_ty, addr1) # store t1 / t2 if t1_alloca is not None and t1_alloca.Ty is not None: - t1_ty: llvmlite.LLVMType | t.CPtr = t1_alloca.Ty.Pointee + t1_ty: rawptr[llvmlite.LLVMType] = t1_alloca.Ty.Pointee if n_srcs == 1: # enumerate: t1 = 序号(trunc i64 → i32) idx32: llvmlite.Value | t.CPtr = llvmlite.build_trunc(builder, cur_idx, i32_ty) llvmlite.build_store(builder, idx32, t1_alloca) if t2_alloca is not None and t2_alloca.Ty is not None and v1 is not None: - t2_ty: llvmlite.LLVMType | t.CPtr = t2_alloca.Ty.Pointee + t2_ty: rawptr[llvmlite.LLVMType] = t2_alloca.Ty.Pointee v1c: llvmlite.Value | t.CPtr = self.Gen.ExprGenBase.coerce_to_type(builder, v1, t2_ty, src1) llvmlite.build_store(builder, v1c, t2_alloca) else: @@ -1798,7 +1798,7 @@ class StmtGenCifMixin: addr2: llvmlite.Value | t.CPtr = llvmlite.build_gep(builder, i8_ty, l2_data, off2) v2 = llvmlite.build_load(builder, i8_ptr_ty, addr2) if t2_alloca is not None and t2_alloca.Ty is not None and v2 is not None: - t2_ty2: llvmlite.LLVMType | t.CPtr = t2_alloca.Ty.Pointee + t2_ty2: rawptr[llvmlite.LLVMType] = t2_alloca.Ty.Pointee v2c: llvmlite.Value | t.CPtr = self.Gen.ExprGenBase.coerce_to_type(builder, v2, t2_ty2, src2) llvmlite.build_store(builder, v2c, t2_alloca) @@ -1808,11 +1808,11 @@ class StmtGenCifMixin: trans._break_bb = end_bb trans._continue_bb = incr_bb - body: list[ast.AST | t.CPtr] | t.CPtr = for_node.children + body: list[rawptr[ast.AST]] | t.CPtr = for_node.children if body is not None: body_count: sizet = len(body) for bi in range(body_count): - stmt: ast.AST | t.CPtr = body.get(bi) + stmt: rawptr[ast.AST] = body.get(bi) if stmt is not None: self.Gen.StmtGen.translate_stmt(trans, stmt) @@ -1859,13 +1859,13 @@ class StmtGenCifMixin: # br label %cond # end: # ============================================================ - def _handle_ptr_iter(self, trans: HT.Translator | t.CPtr, + def _handle_ptr_iter(self, trans: rawptr[HT.Translator], for_node: ast.For | t.CPtr, var_name: str) -> int: """指针迭代: for x in ptr: 直到解引用为空""" pool: rawptr[memhub.MemBuddy] = trans.Pool builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder - func: llvmlite.Function | t.CPtr = trans._cur_func + func: rawptr[llvmlite.Function] = trans._cur_func # 翻译迭代器表达式,获取指针值 ptr_val: llvmlite.Value | t.CPtr = self.Gen.ExprGen.translate_value( @@ -1882,7 +1882,7 @@ class StmtGenCifMixin: self.Gen.TypeGenErr.fatal_error(for_node, "指针迭代: 迭代器不是指针类型") # 获取元素类型 - elem_ty: llvmlite.LLVMType | t.CPtr = ptr_val.Ty.Pointee + elem_ty: rawptr[llvmlite.LLVMType] = ptr_val.Ty.Pointee if elem_ty is None: self.Gen.TypeGenErr.fatal_error(for_node, "指针迭代: 无法获取元素类型") @@ -1901,7 +1901,7 @@ class StmtGenCifMixin: if elem_bits == 0 and elem_is_ptr2 == 0 and elem_fbits2 == 0: self.Gen.TypeGenErr.fatal_error(for_node, "指针迭代: 元素类型不是整数/指针/浮点,无法检查空终止符") - i32_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int32(pool) + i32_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int32(pool) # 创建循环变量 alloca(存储元素值) var_alloca: llvmlite.Value | t.CPtr = self.Gen.VarGen.lookup_var( @@ -1969,11 +1969,11 @@ class StmtGenCifMixin: trans._break_bb = end_bb trans._continue_bb = incr_bb - body: list[ast.AST | t.CPtr] | t.CPtr = for_node.children + body: list[rawptr[ast.AST]] | t.CPtr = for_node.children if body is not None: body_count: sizet = len(body) for bi in range(body_count): - stmt: ast.AST | t.CPtr = body.get(bi) + stmt: rawptr[ast.AST] = body.get(bi) if stmt is not None: self.Gen.StmtGen.translate_stmt(trans, stmt) @@ -2023,18 +2023,18 @@ class StmtGenCifMixin: # %n = add i32 %i, 1 ; store %n ; br %cond # end: # ============================================================ - def _handle_array_iter(self, trans: HT.Translator | t.CPtr, + def _handle_array_iter(self, trans: rawptr[HT.Translator], for_node: ast.For | t.CPtr, var_name: str, array_val: llvmlite.Value | t.CPtr) -> int: """数组迭代: for x in arr: 按数组长度迭代""" pool: rawptr[memhub.MemBuddy] = trans.Pool builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder - func: llvmlite.Function | t.CPtr = trans._cur_func + func: rawptr[llvmlite.Function] = trans._cur_func # 解析数组类型 [N x elem_ty] - arr_ty: llvmlite.LLVMType | t.CPtr = array_val.Ty - elem_ty: llvmlite.LLVMType | t.CPtr = None + arr_ty: rawptr[llvmlite.LLVMType] = array_val.Ty + elem_ty: rawptr[llvmlite.LLVMType] = None elem_count: int = 0 match arr_ty: case llvmlite.LLVMType.Array(et, n): @@ -2051,7 +2051,7 @@ class StmtGenCifMixin: self.Gen.TypeGenErr.fatal_error(for_node, "数组迭代: 临时存储分配失败") llvmlite.build_store(builder, array_val, arr_tmp) - i32_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int32(pool) + i32_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int32(pool) # 循环变量 alloca(存储元素值) var_alloca: llvmlite.Value | t.CPtr = self.Gen.VarGen.lookup_var( @@ -2136,11 +2136,11 @@ class StmtGenCifMixin: trans._break_bb = end_bb trans._continue_bb = incr_bb - body: list[ast.AST | t.CPtr] | t.CPtr = for_node.children + body: list[rawptr[ast.AST]] | t.CPtr = for_node.children if body is not None: body_count: sizet = len(body) for bi in range(body_count): - stmt: ast.AST | t.CPtr = body.get(bi) + stmt: rawptr[ast.AST] = body.get(bi) if stmt is not None: self.Gen.StmtGen.translate_stmt(trans, stmt) @@ -2169,10 +2169,10 @@ class StmtGenCifMixin: # # 元素类型取第一个元素的值类型,其余元素 coerce 到该类型。 # ============================================================ - def _handle_list_literal_iter(self, trans: HT.Translator | t.CPtr, + def _handle_list_literal_iter(self, trans: rawptr[HT.Translator], for_node: ast.For | t.CPtr, var_name: str, - list_node: ast.AST | t.CPtr) -> int: + list_node: rawptr[ast.AST]) -> int: """列表字面量迭代: for x in [a, b, c]: 按元素顺序迭代""" pool: rawptr[memhub.MemBuddy] = trans.Pool builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder @@ -2180,23 +2180,23 @@ class StmtGenCifMixin: lst: ast.List | t.CPtr = (ast.List | t.CPtr)(list_node) if lst is None or lst.elts is None: self.Gen.TypeGenErr.fatal_error(for_node, "列表字面量迭代: 空列表") - elts: list[ast.AST | t.CPtr] | t.CPtr = lst.elts + elts: list[rawptr[ast.AST]] | t.CPtr = lst.elts elts_count: sizet = len(elts) if elts_count <= 0: self.Gen.TypeGenErr.fatal_error(for_node, "列表字面量迭代: 空列表") # 翻译第一个元素,确定元素类型 - first_el: ast.AST | t.CPtr = elts.get(0) + first_el: rawptr[ast.AST] = elts.get(0) first_val: llvmlite.Value | t.CPtr = self.Gen.ExprGen.translate_value( builder, pool, trans.Module, first_el, trans._funcs, trans._func_count, trans) if first_val is None or first_val.Ty is None: self.Gen.TypeGenErr.fatal_error(first_el, "列表字面量迭代: 无法确定元素类型") - elem_ty: llvmlite.LLVMType | t.CPtr = first_val.Ty + elem_ty: rawptr[llvmlite.LLVMType] = first_val.Ty # 构建 [N x elem_ty] 数组值:临时 alloca 逐元素写入后 load # 同样必须在 entry 块创建,避免非 entry alloca 被降为动态 alloca(见 _handle_array_iter) - arr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Array(pool, elem_ty, elts_count) + arr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Array(pool, elem_ty, elts_count) tmp_alloca: llvmlite.Value | t.CPtr = self.Gen.VarGen._alloca_at_entry(builder, arr_ty) if tmp_alloca is None: self.Gen.TypeGenErr.fatal_error(for_node, "列表字面量迭代: 临时数组分配失败") @@ -2207,7 +2207,7 @@ class StmtGenCifMixin: # 写其余元素(coerce 到 elem_ty) i: sizet = 1 while i < elts_count: - el_node: ast.AST | t.CPtr = elts.get(i) + el_node: rawptr[ast.AST] = elts.get(i) el_val: llvmlite.Value | t.CPtr = self.Gen.ExprGen.translate_value( builder, pool, trans.Module, el_node, trans._funcs, trans._func_count, trans) @@ -2254,18 +2254,18 @@ class StmtGenCifMixin: # %n = add i64 %i, 1 ; store ; br %cond # end: # ============================================================ - def _handle_list_iter(self, trans: HT.Translator | t.CPtr, + def _handle_list_iter(self, trans: rawptr[HT.Translator], for_node: ast.For | t.CPtr, var_name: str, list_val: llvmlite.Value | t.CPtr) -> int: """list[T] 容器迭代: for v in lst: 按 __count__ 动态长度迭代""" pool: rawptr[memhub.MemBuddy] = trans.Pool builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder - func: llvmlite.Function | t.CPtr = trans._cur_func + func: rawptr[llvmlite.Function] = trans._cur_func - i64_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int64(pool) - i8_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int8(pool) - i8_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, i8_ty) + i64_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int64(pool) + i8_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int8(pool) + i8_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, i8_ty) # 读取 __count__ (偏移 8, GEP index 1) cnt_ptr: llvmlite.Value | t.CPtr = llvmlite.build_gep( @@ -2334,11 +2334,11 @@ class StmtGenCifMixin: trans._break_bb = end_bb trans._continue_bb = incr_bb - body: list[ast.AST | t.CPtr] | t.CPtr = for_node.children + body: list[rawptr[ast.AST]] | t.CPtr = for_node.children if body is not None: body_count: sizet = len(body) for bi in range(body_count): - stmt: ast.AST | t.CPtr = body.get(bi) + stmt: rawptr[ast.AST] = body.get(bi) if stmt is not None: self.Gen.StmtGen.translate_stmt(trans, stmt) @@ -2361,7 +2361,7 @@ class StmtGenCifMixin: trans._ctrl_merge_reachable = 1 return new_vars - def _handle_dict_iter(self, trans: HT.Translator | t.CPtr, + def _handle_dict_iter(self, trans: rawptr[HT.Translator], for_node: ast.For | t.CPtr, var_name: str, dict_val: llvmlite.Value | t.CPtr) -> int: @@ -2374,11 +2374,11 @@ class StmtGenCifMixin: """ pool: rawptr[memhub.MemBuddy] = trans.Pool builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder - func: llvmlite.Function | t.CPtr = trans._cur_func + func: rawptr[llvmlite.Function] = trans._cur_func - i64_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int64(pool) - i8_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int8(pool) - i8_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, i8_ty) + i64_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int64(pool) + i8_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int8(pool) + i8_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, i8_ty) # 读取 __count__(槽 2,字节偏移 16) cnt_ptr: llvmlite.Value | t.CPtr = llvmlite.build_gep( @@ -2445,11 +2445,11 @@ class StmtGenCifMixin: trans._break_bb = end_bb trans._continue_bb = incr_bb - body: list[ast.AST | t.CPtr] | t.CPtr = for_node.children + body: list[rawptr[ast.AST]] | t.CPtr = for_node.children if body is not None: body_count: sizet = len(body) for bi in range(body_count): - stmt: ast.AST | t.CPtr = body.get(bi) + stmt: rawptr[ast.AST] = body.get(bi) if stmt is not None: self.Gen.StmtGen.translate_stmt(trans, stmt) @@ -2498,7 +2498,7 @@ class StmtGenCifMixin: # _translate_method 注入,raise StopIteration 时置 1(translate_raise); # VpiReader stub 声明同步该参数(_inject_method_declare)。 # ============================================================ - def _handle_oop_iter(self, trans: HT.Translator | t.CPtr, + def _handle_oop_iter(self, trans: rawptr[HT.Translator], for_node: ast.For | t.CPtr, var_name: str, class_name: str, @@ -2506,8 +2506,8 @@ class StmtGenCifMixin: """OOP iter 协议: for x in obj: 调用 __iter__/__next__ 迭代""" pool: rawptr[memhub.MemBuddy] = trans.Pool builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder - func: llvmlite.Function | t.CPtr = trans._cur_func - mod: llvmlite.LLVMModule | t.CPtr = trans.Module + func: rawptr[llvmlite.Function] = trans._cur_func + mod: rawptr[llvmlite.LLVMModule] = trans.Module if builder is None or func is None or mod is None: return 0 @@ -2521,12 +2521,12 @@ class StmtGenCifMixin: if iter_lookup is None: return 0 viperlib.snprintf(iter_lookup, 128, "%s.__iter__", class_name) - iter_fn: llvmlite.Function | t.CPtr = self.Gen.CallGenBase.find_func_in_module( + iter_fn: rawptr[llvmlite.Function] = self.Gen.CallGenBase.find_func_in_module( mod, iter_lookup) if iter_fn is None: self.Gen.TypeGenErr.fatal_error( for_node, f"OOP 迭代: 类 '{class_name}' 没有 __iter__ 方法") - iter_ret_ty: llvmlite.LLVMType | t.CPtr = llvmlite.function_get_ret_ty(iter_fn) + iter_ret_ty: rawptr[llvmlite.LLVMType] = llvmlite.function_get_ret_ty(iter_fn) iter_fn_name: str = llvmlite.function_get_name(iter_fn) if iter_ret_ty is None or iter_fn_name is None: return 0 @@ -2534,7 +2534,7 @@ class StmtGenCifMixin: iter_self: llvmlite.Value | t.CPtr = obj_val iter_first: llvmlite.Param | t.CPtr = llvmlite.function_get_param_head(iter_fn) if iter_first is not None: - iter_self_ty: llvmlite.LLVMType | t.CPtr = llvmlite.param_get_ty(iter_first) + iter_self_ty: rawptr[llvmlite.LLVMType] = llvmlite.param_get_ty(iter_first) if iter_self_ty is not None: iter_self = llvmlite.build_bitcast(builder, obj_val, iter_self_ty) if iter_self is None: @@ -2550,12 +2550,12 @@ class StmtGenCifMixin: if next_lookup is None: return 0 viperlib.snprintf(next_lookup, 128, "%s.__next__", class_name) - next_fn: llvmlite.Function | t.CPtr = self.Gen.CallGenBase.find_func_in_module( + next_fn: rawptr[llvmlite.Function] = self.Gen.CallGenBase.find_func_in_module( mod, next_lookup) if next_fn is None: self.Gen.TypeGenErr.fatal_error( for_node, f"OOP 迭代: 类 '{class_name}' 没有 __next__ 方法") - next_ret_ty: llvmlite.LLVMType | t.CPtr = llvmlite.function_get_ret_ty(next_fn) + next_ret_ty: rawptr[llvmlite.LLVMType] = llvmlite.function_get_ret_ty(next_fn) next_fn_name: str = llvmlite.function_get_name(next_fn) if next_ret_ty is None or next_fn_name is None: return 0 @@ -2572,7 +2572,7 @@ class StmtGenCifMixin: new_vars = 1 # 4. stop flag alloca(i1,初始 0) - i1_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int1(pool) + i1_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int1(pool) flag_alloca: llvmlite.Value | t.CPtr = llvmlite.build_alloca(builder, i1_ty) if flag_alloca is None: return 0 @@ -2605,7 +2605,7 @@ class StmtGenCifMixin: next_self: llvmlite.Value | t.CPtr = iter_result next_first: llvmlite.Param | t.CPtr = llvmlite.function_get_param_head(next_fn) if next_first is not None: - next_self_ty: llvmlite.LLVMType | t.CPtr = llvmlite.param_get_ty(next_first) + next_self_ty: rawptr[llvmlite.LLVMType] = llvmlite.param_get_ty(next_first) if next_self_ty is not None and iter_result.Ty is not None: next_self = llvmlite.build_bitcast(builder, iter_result, next_self_ty) if next_self is None: @@ -2637,11 +2637,11 @@ class StmtGenCifMixin: old_continue: llvmlite.BasicBlock | t.CPtr = trans._continue_bb trans._break_bb = end_bb trans._continue_bb = step_bb - body: list[ast.AST | t.CPtr] | t.CPtr = for_node.children + body: list[rawptr[ast.AST]] | t.CPtr = for_node.children if body is not None: body_count: sizet = len(body) for bi in range(body_count): - stmt: ast.AST | t.CPtr = body.get(bi) + stmt: rawptr[ast.AST] = body.get(bi) if stmt is not None: self.Gen.StmtGen.translate_stmt(trans, stmt) trans._break_bb = old_break @@ -2657,27 +2657,27 @@ class StmtGenCifMixin: trans._ctrl_merge_reachable = 1 return new_vars - def _handle_enumerate_iter(self, trans: HT.Translator | t.CPtr, + def _handle_enumerate_iter(self, trans: rawptr[HT.Translator], for_node: ast.For | t.CPtr, t1: str, t2: str, - call: ast.Call | t.CPtr) -> int: + call: rawptr[ast.Call]) -> int: """enumerate 迭代: for i, v in enumerate(x)""" if call is None or call.args is None: return 0 - cargs: list[ast.AST | t.CPtr] | t.CPtr = call.args + cargs: list[rawptr[ast.AST]] | t.CPtr = call.args if len(cargs) < 1: self.Gen.TypeGenErr.fatal_error(for_node, "enumerate 需要至少一个参数") return self._build_seq_loop(trans, for_node, t1, t2, cargs.get(0), None, 1) - def _handle_zip_iter(self, trans: HT.Translator | t.CPtr, + def _handle_zip_iter(self, trans: rawptr[HT.Translator], for_node: ast.For | t.CPtr, t1: str, t2: str, - call: ast.Call | t.CPtr) -> int: + call: rawptr[ast.Call]) -> int: """zip 迭代: for a, b in zip(x, y)""" if call is None or call.args is None: # fail-fast: zip 参数缺失 self.Gen.TypeGenErr.fatal_error(call, "zip 参数缺失", "SyntaxError") - cargs: list[ast.AST | t.CPtr] | t.CPtr = call.args + cargs: list[rawptr[ast.AST]] | t.CPtr = call.args if len(cargs) < 2: self.Gen.TypeGenErr.fatal_error(for_node, "zip 需要至少两个参数") return self._build_seq_loop(trans, for_node, t1, t2, cargs.get(0), cargs.get(1), 2) diff --git a/App/lib/core/Gen/Stmt/StmtGenDeclMixin.vp b/App/lib/core/Gen/Stmt/StmtGenDeclMixin.vp index d696ce3..08caf79 100644 --- a/App/lib/core/Gen/Stmt/StmtGenDeclMixin.vp +++ b/App/lib/core/Gen/Stmt/StmtGenDeclMixin.vp @@ -40,26 +40,26 @@ ENUM_MEMBER_MAX: t.CDefine = 128 class StmtGenDeclMixin(StmtGenCifMixin.StmtGenCifMixin): """声明/枚举/nonlocal 访问(StmtGen 拆分 2/3,继承 Cif)""" - def translate_global(self, trans: HT.Translator | t.CPtr, - node: ast.AST | t.CPtr) -> int: + def translate_global(self, trans: rawptr[HT.Translator], + node: rawptr[ast.AST]) -> int: """翻译 global 语句:记录 global 变量名""" gn: ast.Global | t.CPtr = (ast.Global | t.CPtr)(node) if gn is None: return 0 - names: list[ast.AST | t.CPtr] | t.CPtr = gn.names + names: list[rawptr[ast.AST]] | t.CPtr = gn.names if names is None: return 0 n: sizet = len(names) for i in range(n): - nm_node: ast.AST | t.CPtr = names.get(i) + nm_node: rawptr[ast.AST] = names.get(i) if nm_node is not None and nm_node.kind() == ast.ASTKind.Name: - nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(nm_node) + nm: rawptr[ast.Name] = rawptr[ast.Name](nm_node) if nm.id is not None: GenApi.add_global_name(trans, nm.id) return 0 - def translate_nonlocal(self, trans: HT.Translator | t.CPtr, - node: ast.AST | t.CPtr) -> int: + def translate_nonlocal(self, trans: rawptr[HT.Translator], + node: rawptr[ast.AST]) -> int: """翻译 nonlocal 语句:记录 nonlocal 变量名及其类型 类型信息通过查找父作用域的 alloca 获取(用于 env 指针数组方案的类型恢复)。 @@ -67,17 +67,17 @@ class StmtGenDeclMixin(StmtGenCifMixin.StmtGenCifMixin): nl: ast.Nonlocal | t.CPtr = (ast.Nonlocal | t.CPtr)(node) if nl is None: return 0 - names: list[ast.AST | t.CPtr] | t.CPtr = nl.names + names: list[rawptr[ast.AST]] | t.CPtr = nl.names if names is None: return 0 n: sizet = len(names) for i in range(n): - nm_node: ast.AST | t.CPtr = names.get(i) + nm_node: rawptr[ast.AST] = names.get(i) if nm_node is not None and nm_node.kind() == ast.ASTKind.Name: - nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(nm_node) + nm: rawptr[ast.Name] = rawptr[ast.Name](nm_node) if nm.id is not None: # 查找父作用域中的变量 alloca,获取类型信息 - var_ty: llvmlite.LLVMType | t.CPtr = None + var_ty: rawptr[llvmlite.LLVMType] = None var_alloca: llvmlite.Value | t.CPtr = self.Gen.VarGen.lookup_var( trans.SymTab, nm.id) if var_alloca is not None and var_alloca.Ty is not None: @@ -94,21 +94,21 @@ class StmtGenDeclMixin(StmtGenCifMixin.StmtGenCifMixin): GenApi.add_nonlocal_name(trans, nm.id, var_ty) return 0 - def translate_expr_stmt(self, trans: HT.Translator | t.CPtr, - node: ast.AST | t.CPtr) -> int: + def translate_expr_stmt(self, trans: rawptr[HT.Translator], + node: rawptr[ast.AST]) -> int: """翻译表达式语句(printf 调用等)""" ex: ast.Expr | t.CPtr = (ast.Expr | t.CPtr)(node) if ex is None: return 0 - call_node: ast.AST | t.CPtr = ex.value + call_node: rawptr[ast.AST] = ex.value if call_node is None: return 0 ck: int = call_node.kind() if ck != ast.ASTKind.Call: return 0 - cl: ast.Call | t.CPtr = (ast.Call | t.CPtr)(call_node) - func_node: ast.AST | t.CPtr = cl.func + cl: rawptr[ast.Call] = rawptr[ast.Call](call_node) + func_node: rawptr[ast.AST] = cl.func if func_node is None: return 0 @@ -131,8 +131,8 @@ class StmtGenDeclMixin(StmtGenCifMixin.StmtGenCifMixin): trans._funcs, trans._func_count, trans) return 0 - def pre_scan_allocas(self, trans: HT.Translator | t.CPtr, - node: ast.AST | t.CPtr) -> int: + def pre_scan_allocas(self, trans: rawptr[HT.Translator], + node: rawptr[ast.AST]) -> int: """预扫描语句中的 AnnAssign,提前创建 alloca 递归分支/循环/异常体:if/else/for/while/try 分支内的 AnnAssign 局部 @@ -182,7 +182,7 @@ class StmtGenDeclMixin(StmtGenCifMixin.StmtGenCifMixin): self.pre_scan_allocas(trans, wh_n.orelse.get(bi_pre_we)) return 0 if k == ast.ASTKind.Try: - tr_n: ast.Try | t.CPtr = (ast.Try | t.CPtr)(node) + tr_n: rawptr[ast.Try] = rawptr[ast.Try](node) if tr_n.children is not None: bn_pre_t: sizet = len(tr_n.children) for bi_pre_t in range(bn_pre_t): @@ -190,9 +190,9 @@ class StmtGenDeclMixin(StmtGenCifMixin.StmtGenCifMixin): if tr_n.handlers is not None: bn_pre_th: sizet = len(tr_n.handlers) for bi_pre_th in range(bn_pre_th): - eh_pre: ast.AST | t.CPtr = tr_n.handlers.get(bi_pre_th) + eh_pre: rawptr[ast.AST] = tr_n.handlers.get(bi_pre_th) if eh_pre is not None and eh_pre.kind() == ast.ASTKind.ExceptHandler: - ehc_pre: ast.ExceptHandler | t.CPtr = (ast.ExceptHandler | t.CPtr)(eh_pre) + ehc_pre: rawptr[ast.ExceptHandler] = rawptr[ast.ExceptHandler](eh_pre) if ehc_pre.children is not None: bn_pre_ehb: sizet = len(ehc_pre.children) for bi_pre_ehb in range(bn_pre_ehb): @@ -207,18 +207,18 @@ class StmtGenDeclMixin(StmtGenCifMixin.StmtGenCifMixin): self.pre_scan_allocas(trans, tr_n.finalbody.get(bi_pre_tf)) return 0 if k == ast.ASTKind.With: - wth: ast.With | t.CPtr = (ast.With | t.CPtr)(node) + wth: rawptr[ast.With] = rawptr[ast.With](node) if wth.children is not None: bn_pre_wb: sizet = len(wth.children) for bi_pre_wb in range(bn_pre_wb): self.pre_scan_allocas(trans, wth.children.get(bi_pre_wb)) return 0 if k == ast.ASTKind.Match: - mt_n: ast.Match | t.CPtr = (ast.Match | t.CPtr)(node) + mt_n: rawptr[ast.Match] = rawptr[ast.Match](node) if mt_n.cases is not None: bn_pre_mc: sizet = len(mt_n.cases) for bi_pre_mc in range(bn_pre_mc): - mc_pre: ast.AST | t.CPtr = mt_n.cases.get(bi_pre_mc) + mc_pre: rawptr[ast.AST] = mt_n.cases.get(bi_pre_mc) if mc_pre is not None and mc_pre.kind() == ast.ASTKind.MatchCase: mcc_pre: ast.MatchCase | t.CPtr = (ast.MatchCase | t.CPtr)(mc_pre) if mcc_pre.children is not None: @@ -228,8 +228,8 @@ class StmtGenDeclMixin(StmtGenCifMixin.StmtGenCifMixin): return 0 return 0 - def pre_scan_scope_decls(self, trans: HT.Translator | t.CPtr, - node: ast.AST | t.CPtr) -> int: + def pre_scan_scope_decls(self, trans: rawptr[HT.Translator], + node: rawptr[ast.AST]) -> int: """预扫描 Global/Nonlocal 声明,提前注册作用域名称""" if node is None: return 0 @@ -240,10 +240,10 @@ class StmtGenDeclMixin(StmtGenCifMixin.StmtGenCifMixin): return self.translate_nonlocal(trans, node) return 0 - def translate_break(self, trans: HT.Translator | t.CPtr) -> int: + def translate_break(self, trans: rawptr[HT.Translator]) -> int: """翻译 break 语句:跳转到循环 end 块""" builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder - func: llvmlite.Function | t.CPtr = trans._cur_func + func: rawptr[llvmlite.Function] = trans._cur_func pool: rawptr[memhub.MemBuddy] = trans.Pool if builder is None or func is None: @@ -263,10 +263,10 @@ class StmtGenDeclMixin(StmtGenCifMixin.StmtGenCifMixin): llvmlite.position_at_end(builder, dead_bb) return 0 - def translate_continue(self, trans: HT.Translator | t.CPtr) -> int: + def translate_continue(self, trans: rawptr[HT.Translator]) -> int: """翻译 continue 语句:跳转到循环 cond/incr 块""" builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder - func: llvmlite.Function | t.CPtr = trans._cur_func + func: rawptr[llvmlite.Function] = trans._cur_func pool: rawptr[memhub.MemBuddy] = trans.Pool if builder is None or func is None: @@ -286,7 +286,7 @@ class StmtGenDeclMixin(StmtGenCifMixin.StmtGenCifMixin): llvmlite.position_at_end(builder, dead_bb) return 0 - def get_stmt_kind_name(self, node: ast.AST | t.CPtr) -> str: + def get_stmt_kind_name(self, node: rawptr[ast.AST]) -> str: """获取语句类型名""" if node is None: return None @@ -296,7 +296,7 @@ class StmtGenDeclMixin(StmtGenCifMixin.StmtGenCifMixin): # 簇 D:nonlocal/闭包 env 访问(迁移自 HandlesNonlocal.vp) # ============================================================ - def _is_void_type(self, ty: llvmlite.LLVMType | t.CPtr) -> int: + def _is_void_type(self, ty: rawptr[llvmlite.LLVMType]) -> int: """判断是否为 Void 类型,是则返回 1,否则 0""" if ty is None: return 0 @@ -306,7 +306,7 @@ class StmtGenDeclMixin(StmtGenCifMixin.StmtGenCifMixin): case _: return 0 - def get_env_ptr_var(self, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: + def get_env_ptr_var(self, trans: rawptr[HT.Translator]) -> llvmlite.Value | t.CPtr: """获取或创建 _env_ptr 变量(存储闭包 env 指针)""" env_var: llvmlite.Value | t.CPtr = self.Gen.VarGen.lookup_var( trans.SymTab, "_env_ptr") @@ -315,15 +315,15 @@ class StmtGenDeclMixin(StmtGenCifMixin.StmtGenCifMixin): # 创建 alloca 存储 env pool: rawptr[memhub.MemBuddy] = trans.Pool builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder - i8_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int8(pool) - i8_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, i8_ty) + i8_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int8(pool) + i8_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, i8_ty) alloca: llvmlite.Value | t.CPtr = llvmlite.build_alloca(builder, i8_ptr_ty) if alloca is None: return None self.Gen.VarGen.define_var(trans.SymTab, "_env_ptr", alloca) return alloca - def _load_raw_var_ptr(self, trans: HT.Translator | t.CPtr, + def _load_raw_var_ptr(self, trans: rawptr[HT.Translator], name: str) -> llvmlite.Value | t.CPtr: """从闭包 env 加载 nonlocal 变量的原始指针(i8*) @@ -335,9 +335,9 @@ class StmtGenDeclMixin(StmtGenCifMixin.StmtGenCifMixin): pool: rawptr[memhub.MemBuddy] = trans.Pool builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder - i8_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int8(pool) - i8_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, i8_ty) - i8_ptr_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, i8_ptr_ty) + i8_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int8(pool) + i8_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, i8_ty) + i8_ptr_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, i8_ptr_ty) # 1. 加载 env_ptr env_alloca: llvmlite.Value | t.CPtr = self.get_env_ptr_var(trans) @@ -359,7 +359,7 @@ class StmtGenDeclMixin(StmtGenCifMixin.StmtGenCifMixin): return None return llvmlite.build_load(builder, i8_ptr_ty, ptr_addr) - def load_nonlocal_var(self, trans: HT.Translator | t.CPtr, + def load_nonlocal_var(self, trans: rawptr[HT.Translator], name: str) -> llvmlite.Value | t.CPtr: """从闭包 env 加载 nonlocal 变量值 @@ -373,19 +373,19 @@ class StmtGenDeclMixin(StmtGenCifMixin.StmtGenCifMixin): builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder # 获取变量类型(从注册时存储的类型信息) - var_ty: llvmlite.LLVMType | t.CPtr = GenApi.get_nonlocal_type(trans, name) + var_ty: rawptr[llvmlite.LLVMType] = GenApi.get_nonlocal_type(trans, name) if var_ty is None or self._is_void_type(var_ty) != 0: # 类型缺失/无效直接报错终止(fail-fast),避免生成 "load void, void*" 非法 IR self.Gen.TypeGenErr.fatal_error(None, f"nonlocal 变量 '{name}' 类型缺失,无法 load", "TypeError") # bitcast raw i8* to var_ty* - var_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, var_ty) + var_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, var_ty) var_ptr: llvmlite.Value | t.CPtr = llvmlite.build_bitcast(builder, raw_ptr, var_ptr_ty) if var_ptr is None: return None return llvmlite.build_load(builder, var_ty, var_ptr) - def get_nonlocal_var_ptr(self, trans: HT.Translator | t.CPtr, + def get_nonlocal_var_ptr(self, trans: rawptr[HT.Translator], name: str) -> llvmlite.Value | t.CPtr: """获取 nonlocal 变量的存储指针(var_ty*),用于 store 操作 @@ -399,13 +399,13 @@ class StmtGenDeclMixin(StmtGenCifMixin.StmtGenCifMixin): builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder # 获取变量类型 - var_ty: llvmlite.LLVMType | t.CPtr = GenApi.get_nonlocal_type(trans, name) + var_ty: rawptr[llvmlite.LLVMType] = GenApi.get_nonlocal_type(trans, name) if var_ty is None or self._is_void_type(var_ty) != 0: # 类型缺失/无效直接报错终止(fail-fast),避免生成 "bitcast ... to void*" 非法 IR self.Gen.TypeGenErr.fatal_error(None, f"nonlocal 变量 '{name}' 类型缺失,无法 load", "TypeError") # bitcast raw i8* to var_ty* - var_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, var_ty) + var_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, var_ty) return llvmlite.build_bitcast(builder, raw_ptr, var_ptr_ty) # ============================================================ @@ -449,7 +449,7 @@ class StmtGenDeclMixin(StmtGenCifMixin.StmtGenCifMixin): def register_enum(self, pool: rawptr[memhub.MemBuddy], name: str, - base_ty: llvmlite.LLVMType | t.CPtr) -> GenTypes.EnumEntry | t.CPtr: + base_ty: rawptr[llvmlite.LLVMType]) -> GenTypes.EnumEntry | t.CPtr: """注册枚举类型,返回 EnumEntry 指针""" if self.init_enum_table(pool) == 0: return None @@ -487,7 +487,7 @@ class StmtGenDeclMixin(StmtGenCifMixin.StmtGenCifMixin): # 注意:StdlibAlloc 是 StructGenMixin 字段,本 Mixin 方法体不能直接 self.StdlibAlloc # (NoVTable 按本 Mixin 字段布局编译),走模块级委托。 if self.Gen.StructGen.get_stdlib_alloc() != 0: - base_ty_copy: llvmlite.LLVMType | t.CPtr = llvmlite.DeepCopyType( + base_ty_copy: rawptr[llvmlite.LLVMType] = llvmlite.DeepCopyType( CompilerFactory.factory.PermPool, base_ty) if base_ty_copy is not None: entry.BaseTy = base_ty_copy @@ -504,7 +504,7 @@ class StmtGenDeclMixin(StmtGenCifMixin.StmtGenCifMixin): enum_entry: GenTypes.EnumEntry | t.CPtr, member_name: str, member_val: int64, - member_ty: llvmlite.LLVMType | t.CPtr) -> int: + member_ty: rawptr[llvmlite.LLVMType]) -> int: """向枚举添加成员,返回成员索引(-1 失败)""" if enum_entry is None or member_name is None or member_ty is None: return -1 @@ -574,7 +574,7 @@ class StmtGenDeclMixin(StmtGenCifMixin.StmtGenCifMixin): return 1 return 0 - def get_enum_base_type(self, enum_name: str) -> llvmlite.LLVMType | t.CPtr: + def get_enum_base_type(self, enum_name: str) -> rawptr[llvmlite.LLVMType]: """按枚举类名获取基准类型""" entry: GenTypes.EnumEntry | t.CPtr = self.find_enum(enum_name) if entry is not None: diff --git a/App/lib/core/Gen/Stmt/StmtGenMixin.vp b/App/lib/core/Gen/Stmt/StmtGenMixin.vp index f42f0a2..e175e21 100644 --- a/App/lib/core/Gen/Stmt/StmtGenMixin.vp +++ b/App/lib/core/Gen/Stmt/StmtGenMixin.vp @@ -37,8 +37,8 @@ import lib.core.Gen.Stmt.StmtGenDeclMixin as StmtGenDeclMixin class StmtGenMixin(StmtGenDeclMixin.StmtGenDeclMixin): """语句/流程翻译 Mixin(拆分后顶层,继承 Decl)""" - def translate_stmt(self, trans: HT.Translator | t.CPtr, - node: ast.AST | t.CPtr) -> int: + def translate_stmt(self, trans: rawptr[HT.Translator], + node: rawptr[ast.AST]) -> int: """翻译单条语句,返回新增的变量数(深度守卫包装器,原逻辑见 _translate_stmt_impl)""" if trans is not None: if trans.TranslateDepth >= HT.TRANSLATE_MAX_DEPTH: @@ -50,8 +50,8 @@ class StmtGenMixin(StmtGenDeclMixin.StmtGenDeclMixin): trans.TranslateDepth -= 1 return mret - def _translate_stmt_impl(self, trans: HT.Translator | t.CPtr, - node: ast.AST | t.CPtr) -> int: + def _translate_stmt_impl(self, trans: rawptr[HT.Translator], + node: rawptr[ast.AST]) -> int: """翻译单条语句,返回新增的变量数""" if node is None: return 0 @@ -107,8 +107,8 @@ class StmtGenMixin(StmtGenDeclMixin.StmtGenDeclMixin): self.Gen.TypeGenErr.fatal_error(node, f"未知语句类型 kind={k}", "SyntaxError") return 0 - def translate_delete(self, trans: HT.Translator | t.CPtr, - node: ast.AST | t.CPtr) -> int: + def translate_delete(self, trans: rawptr[HT.Translator], + node: rawptr[ast.AST]) -> int: """翻译 del 语句,返回 0""" if trans is None or node is None: return 0 @@ -116,32 +116,32 @@ class StmtGenMixin(StmtGenDeclMixin.StmtGenDeclMixin): if dnode is None or dnode.targets is None: return 0 pool: rawptr[memhub.MemBuddy] = trans.Pool - mod: llvmlite.LLVMModule | t.CPtr = trans.Module + mod: rawptr[llvmlite.LLVMModule] = trans.Module builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder if pool is None or mod is None or builder is None: return 0 tn: sizet = len(dnode.targets) for ti in range(tn): - tgt: ast.AST | t.CPtr = dnode.targets.get(ti) + tgt: rawptr[ast.AST] = dnode.targets.get(ti) if tgt is None: continue # del obj.attr → property deleter if tgt.kind() == ast.ASTKind.Attribute: - del_at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(tgt) + del_at: rawptr[ast.Attribute] = rawptr[ast.Attribute](tgt) if del_at is not None: self.Gen.CallGenProp._try_property_deleter( pool, builder, mod, del_at, trans) # del obj[key] → __delitem__(obj, key)(对齐 TPC HandlesDelete.py)。 # 不能静默忽略 Subscript 目标——否则 del 不生效(len 不变)。 elif tgt.kind() == ast.ASTKind.Subscript: - dl_sub: ast.Subscript | t.CPtr = (ast.Subscript | t.CPtr)(tgt) + dl_sub: rawptr[ast.Subscript] = rawptr[ast.Subscript](tgt) if dl_sub is not None and dl_sub.value is not None and dl_sub.slice is not None: dl_obj: llvmlite.Value | t.CPtr = self.Gen.ExprGen.translate_value( builder, pool, mod, dl_sub.value, None, 0, trans) dl_idx: llvmlite.Value | t.CPtr = self.Gen.ExprGen.translate_value( builder, pool, mod, dl_sub.slice, None, 0, trans) if dl_obj is not None and dl_idx is not None: - dl_st: llvmlite.LLVMType | t.CPtr = self.Gen.StructGen.get_struct_type_from_value( + dl_st: rawptr[llvmlite.LLVMType] = self.Gen.StructGen.get_struct_type_from_value( dl_obj) if dl_st is not None: dl_cls: str = self.Gen.StructGen.get_class_name_by_type(pool, dl_st) @@ -149,17 +149,17 @@ class StmtGenMixin(StmtGenDeclMixin.StmtGenDeclMixin): dl_lookup: str = pool.alloc(128) if dl_lookup is not None: viperlib.snprintf(dl_lookup, 128, "%s.__delitem__", dl_cls) - dl_fn: llvmlite.Function | t.CPtr = self.Gen.CallGenBase.find_func_in_module( + dl_fn: rawptr[llvmlite.Function] = self.Gen.CallGenBase.find_func_in_module( mod, dl_lookup) if dl_fn is not None: - dl_ret: llvmlite.LLVMType | t.CPtr = llvmlite.function_get_ret_ty(dl_fn) + dl_ret: rawptr[llvmlite.LLVMType] = llvmlite.function_get_ret_ty(dl_fn) dl_fn_name: str = llvmlite.function_get_name(dl_fn) if dl_ret is not None and dl_fn_name is not None: # self 参数(容器)按 __delitem__ 首参类型对齐 dl_self: llvmlite.Value | t.CPtr = dl_obj dl_first: llvmlite.Param | t.CPtr = llvmlite.function_get_param_head(dl_fn) if dl_first is not None: - dl_self_ty: llvmlite.LLVMType | t.CPtr = llvmlite.param_get_ty(dl_first) + dl_self_ty: rawptr[llvmlite.LLVMType] = llvmlite.param_get_ty(dl_first) if dl_self_ty is not None: dl_self = llvmlite.build_bitcast(builder, dl_obj, dl_self_ty) if dl_self is not None: @@ -185,26 +185,26 @@ class StmtGenMixin(StmtGenDeclMixin.StmtGenDeclMixin): # v1 未实现 finalbody(TestFBProject 未使用;finally+return 交互复杂, # 后续按 TPC HandlesTry.py L188-214 的 pending_ret 方案扩展)。 # ============================================================ - def translate_try(self, trans: HT.Translator | t.CPtr, - node: ast.AST | t.CPtr) -> int: + def translate_try(self, trans: rawptr[HT.Translator], + node: rawptr[ast.AST]) -> int: """翻译 try/except 语句,返回 0""" if trans is None or node is None: return 0 - tr: ast.Try | t.CPtr = (ast.Try | t.CPtr)(node) + tr: rawptr[ast.Try] = rawptr[ast.Try](node) if tr is None: return 0 pool: rawptr[memhub.MemBuddy] = trans.Pool builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder - func: llvmlite.Function | t.CPtr = trans._cur_func + func: rawptr[llvmlite.Function] = trans._cur_func if pool is None or builder is None or func is None: return 0 if llvmlite.builder_cur_block_is_terminated(builder) != 0: return 0 # ---- 1. 异常编码/消息 alloca(当前 try 上下文)---- - i32_ty_t: llvmlite.LLVMType | t.CPtr = llvmlite.Int32(pool) - i8_ty_t: llvmlite.LLVMType | t.CPtr = llvmlite.Int8(pool) - i8_ptr_ty_t: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, i8_ty_t) + i32_ty_t: rawptr[llvmlite.LLVMType] = llvmlite.Int32(pool) + i8_ty_t: rawptr[llvmlite.LLVMType] = llvmlite.Int8(pool) + i8_ptr_ty_t: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, i8_ty_t) if i32_ty_t is None or i8_ptr_ty_t is None: return 0 exception_code: llvmlite.Value | t.CPtr = llvmlite.build_alloca(builder, i32_ty_t) @@ -272,7 +272,7 @@ class StmtGenMixin(StmtGenDeclMixin.StmtGenDeclMixin): if tr.children is not None: tb_n: sizet = len(tr.children) for tbi in range(tb_n): - stmt_t: ast.AST | t.CPtr = tr.children.get(tbi) + stmt_t: rawptr[ast.AST] = tr.children.get(tbi) if stmt_t is not None: self.translate_stmt(trans, stmt_t) # 正常走完 try 体:清异常码,进 else(若有)或 After @@ -294,7 +294,7 @@ class StmtGenMixin(StmtGenDeclMixin.StmtGenDeclMixin): builder, i32_ty_t, exception_code) next_check_t: llvmlite.BasicBlock | t.CPtr = None for i_t in range(n_handlers_t): - hdr_t: ast.ExceptHandler | t.CPtr = (ast.ExceptHandler | t.CPtr)( + hdr_t: rawptr[ast.ExceptHandler] = rawptr[ast.ExceptHandler]( tr.handlers.get(i_t)) match_bb_t: llvmlite.BasicBlock | t.CPtr = match_bbs.get(i_t) if i_t > 0 and next_check_t is not None: @@ -307,11 +307,11 @@ class StmtGenMixin(StmtGenDeclMixin.StmtGenDeclMixin): else: # 展开匹配编码集(handler.type 自身 + 全部子孙异常类) hname_t: str = None - htype_t: ast.AST | t.CPtr = hdr_t.type + htype_t: rawptr[ast.AST] = hdr_t.type if htype_t.kind() == ast.ASTKind.Name: - hname_t = ((ast.Name | t.CPtr)(htype_t)).id + hname_t = (rawptr[ast.Name](htype_t)).id elif htype_t.kind() == ast.ASTKind.Attribute: - hname_t = ((ast.Attribute | t.CPtr)(htype_t)).attr + hname_t = (rawptr[ast.Attribute](htype_t)).attr # 匹配编码缓冲:必须是 int*(i32 步长)——collect_descendant_codes 按 # out_codes[i](4 字节)写入;用 sizet*(8 字节)读会读出 64 位拼接垃圾 # (多码时 code[i+1]<<32|code[i];单码时高位恰为 0 掩盖)。 @@ -391,14 +391,14 @@ class StmtGenMixin(StmtGenDeclMixin.StmtGenDeclMixin): # ---- 7. Except 体 ---- for i_t in range(n_handlers_t): - hdr2_t: ast.ExceptHandler | t.CPtr = (ast.ExceptHandler | t.CPtr)( + hdr2_t: rawptr[ast.ExceptHandler] = rawptr[ast.ExceptHandler]( tr.handlers.get(i_t)) except_bb2_t: llvmlite.BasicBlock | t.CPtr = except_bbs.get(i_t) llvmlite.position_at_end(builder, except_bb2_t) if hdr2_t is not None and hdr2_t.children is not None: hn2_t: sizet = len(hdr2_t.children) for hi2 in range(hn2_t): - stmt2_t: ast.AST | t.CPtr = hdr2_t.children.get(hi2) + stmt2_t: rawptr[ast.AST] = hdr2_t.children.get(hi2) if stmt2_t is not None: self.translate_stmt(trans, stmt2_t) if llvmlite.builder_cur_block_is_terminated(builder) == 0: @@ -410,7 +410,7 @@ class StmtGenMixin(StmtGenDeclMixin.StmtGenDeclMixin): if tr.orelse is not None: en_t: sizet = len(tr.orelse) for ei in range(en_t): - stmt3_t: ast.AST | t.CPtr = tr.orelse.get(ei) + stmt3_t: rawptr[ast.AST] = tr.orelse.get(ei) if stmt3_t is not None: self.translate_stmt(trans, stmt3_t) if llvmlite.builder_cur_block_is_terminated(builder) == 0: @@ -423,8 +423,8 @@ class StmtGenMixin(StmtGenDeclMixin.StmtGenDeclMixin): trans._eh_msg_ptr = old_msg_t return 0 - def translate_raise(self, trans: HT.Translator | t.CPtr, - node: ast.AST | t.CPtr) -> int: + def translate_raise(self, trans: rawptr[HT.Translator], + node: rawptr[ast.AST]) -> int: """翻译 raise 语句,返回 0 对齐 TPC HandlesRaise.py 的 try-except 语义(v1 迁移): @@ -440,7 +440,7 @@ class StmtGenMixin(StmtGenDeclMixin.StmtGenDeclMixin): return 0 pool: rawptr[memhub.MemBuddy] = trans.Pool builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder - mod: llvmlite.LLVMModule | t.CPtr = trans.Module + mod: rawptr[llvmlite.LLVMModule] = trans.Module if pool is None or builder is None or mod is None: return 0 rn: ast.Raise | t.CPtr = (ast.Raise | t.CPtr)(node) @@ -454,18 +454,18 @@ class StmtGenMixin(StmtGenDeclMixin.StmtGenDeclMixin): ek: int = rn.exc.kind() is_stop_iter: int = 0 if ek == ast.ASTKind.Name: - enm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(rn.exc) + enm: rawptr[ast.Name] = rawptr[ast.Name](rn.exc) if enm.id is not None and string.strcmp(enm.id, "StopIteration") == 0: is_stop_iter = 1 elif ek == ast.ASTKind.Call: - ecl: ast.Call | t.CPtr = (ast.Call | t.CPtr)(rn.exc) + ecl: rawptr[ast.Call] = rawptr[ast.Call](rn.exc) if ecl.func is not None and ecl.func.kind() == ast.ASTKind.Name: - ecn: ast.Name | t.CPtr = (ast.Name | t.CPtr)(ecl.func) + ecn: rawptr[ast.Name] = rawptr[ast.Name](ecl.func) if ecn.id is not None and string.strcmp(ecn.id, "StopIteration") == 0: is_stop_iter = 1 if is_stop_iter != 0: if trans._stop_iter_flag_ptr is not None: - i1_ty_r: llvmlite.LLVMType | t.CPtr = llvmlite.Int1(pool) + i1_ty_r: rawptr[llvmlite.LLVMType] = llvmlite.Int1(pool) if i1_ty_r is not None: one_i1_r: llvmlite.Value | t.CPtr = llvmlite.ConstInt( pool, i1_ty_r, 1, "1") @@ -479,19 +479,19 @@ class StmtGenMixin(StmtGenDeclMixin.StmtGenDeclMixin): exc_code: int = 1 exc_msg: llvmlite.Value | t.CPtr = None if ek == ast.ASTKind.Constant: - cst_r: ast.Constant | t.CPtr = (ast.Constant | t.CPtr)(rn.exc) + cst_r: rawptr[ast.Constant] = rawptr[ast.Constant](rn.exc) if cst_r is not None and cst_r.const_kind == ast.CONST_INT: exc_code = cst_r.int_val elif ek == ast.ASTKind.Name: - enm2: ast.Name | t.CPtr = (ast.Name | t.CPtr)(rn.exc) + enm2: rawptr[ast.Name] = rawptr[ast.Name](rn.exc) if enm2.id is not None: exc_code = self.Gen.ClassGenBase.lookup_exception_code(enm2.id) if exc_code == 0: exc_code = 1 elif ek == ast.ASTKind.Call: - ecl2: ast.Call | t.CPtr = (ast.Call | t.CPtr)(rn.exc) + ecl2: rawptr[ast.Call] = rawptr[ast.Call](rn.exc) if ecl2.func is not None and ecl2.func.kind() == ast.ASTKind.Name: - ecn2: ast.Name | t.CPtr = (ast.Name | t.CPtr)(ecl2.func) + ecn2: rawptr[ast.Name] = rawptr[ast.Name](ecl2.func) if ecn2.id is not None: exc_code = self.Gen.ClassGenBase.lookup_exception_code(ecn2.id) if exc_code == 0: @@ -537,7 +537,7 @@ class StmtGenMixin(StmtGenDeclMixin.StmtGenDeclMixin): # (void→ret_void,ptr→null,float→0.0,其余→零值)。当前块已 # 终结(前一条是 raise/return)时跳过,避免在终止块后插指令。 # ============================================================ - def _eh_ret_default(self, trans: HT.Translator | t.CPtr, + def _eh_ret_default(self, trans: rawptr[HT.Translator], pool: rawptr[memhub.MemBuddy], builder: llvmlite.IRBuilder | t.CPtr) -> int: """异常路径返回当前函数默认零值,返回 0""" @@ -545,10 +545,10 @@ class StmtGenMixin(StmtGenDeclMixin.StmtGenDeclMixin): return 0 if llvmlite.builder_cur_block_is_terminated(builder) != 0: return 0 - cur_func: llvmlite.Function | t.CPtr = trans._cur_func + cur_func: rawptr[llvmlite.Function] = trans._cur_func if cur_func is None: return 0 - ret_ty: llvmlite.LLVMType | t.CPtr = llvmlite.function_get_ret_ty(cur_func) + ret_ty: rawptr[llvmlite.LLVMType] = llvmlite.function_get_ret_ty(cur_func) if ret_ty is None: return 0 match ret_ty: @@ -584,20 +584,20 @@ class StmtGenMixin(StmtGenDeclMixin.StmtGenDeclMixin): # 退出后恢复,避免内层覆盖导致外层 __exit__ 解析到错误对象。 # 对齐 TPC HandlesWith 语义(不含 __provides__ provider 机制)。 # ============================================================ - def translate_with(self, trans: HT.Translator | t.CPtr, - node: ast.AST | t.CPtr) -> int: + def translate_with(self, trans: rawptr[HT.Translator], + node: rawptr[ast.AST]) -> int: """翻译 with 语句,返回 0""" if trans is None or node is None: return 0 - wt: ast.With | t.CPtr = (ast.With | t.CPtr)(node) + wt: rawptr[ast.With] = rawptr[ast.With](node) if wt is None: return 0 pool: rawptr[memhub.MemBuddy] = trans.Pool builder: llvmlite.IRBuilder | t.CPtr = trans._cur_builder - mod: llvmlite.LLVMModule | t.CPtr = trans.Module + mod: rawptr[llvmlite.LLVMModule] = trans.Module if pool is None or builder is None or mod is None: return 0 - items: list[ast.AST | t.CPtr] | t.CPtr = wt.items + items: list[rawptr[ast.AST]] | t.CPtr = wt.items if items is None: return 0 n: sizet = len(items) @@ -614,7 +614,7 @@ class StmtGenMixin(StmtGenDeclMixin.StmtGenDeclMixin): # 1. 全部 item:构造 context 对象 + 调用 __enter__ + asname 绑定 for i in range(n): - item_node: ast.AST | t.CPtr = items.get(i) + item_node: rawptr[ast.AST] = items.get(i) if item_node is None: continue if item_node.kind() != ast.ASTKind.WithItem: @@ -632,14 +632,14 @@ class StmtGenMixin(StmtGenDeclMixin.StmtGenDeclMixin): # 与 AnnAssign 的 extract_class_name_from_annotation 一致,跨模块 # 方法调用靠 AnnotClassName 回退按模块名查 SHA1) cls_name: str = None - ce: ast.AST | t.CPtr = item.context_expr + ce: rawptr[ast.AST] = item.context_expr if ce.kind() == ast.ASTKind.Call: - cfn: ast.AST | t.CPtr = ((ast.Call | t.CPtr)(ce)).func + cfn: rawptr[ast.AST] = (rawptr[ast.Call](ce)).func if cfn is not None: if cfn.kind() == ast.ASTKind.Attribute: - ca: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(cfn) + ca: rawptr[ast.Attribute] = rawptr[ast.Attribute](cfn) if ca.value is not None and ca.value.kind() == ast.ASTKind.Name: - cmn: ast.Name | t.CPtr = (ast.Name | t.CPtr)(ca.value) + cmn: rawptr[ast.Name] = rawptr[ast.Name](ca.value) if cmn.id is not None: ml2: sizet = string.strlen(cmn.id) + string.strlen(ca.attr) + 2 mbuf: str = pool.alloc(ml2) @@ -649,7 +649,7 @@ class StmtGenMixin(StmtGenDeclMixin.StmtGenDeclMixin): if cls_name is None: cls_name = ca.attr elif cfn.kind() == ast.ASTKind.Name: - cls_name = ((ast.Name | t.CPtr)(cfn)).id + cls_name = (rawptr[ast.Name](cfn)).id # context 对象存入 __with_ctx(方法调用解析 self 用) ctx_alloca: llvmlite.Value | t.CPtr = llvmlite.build_alloca( builder, ctx_val.Ty) @@ -666,9 +666,9 @@ class StmtGenMixin(StmtGenDeclMixin.StmtGenDeclMixin): trans, pool, builder, mod, "__enter__") # asname 绑定(__enter__ 返回值,缺失时退回 context 对象) if item.optional_vars is not None: - ov: ast.AST | t.CPtr = item.optional_vars + ov: rawptr[ast.AST] = item.optional_vars if ov.kind() == ast.ASTKind.Name: - asname: str = ((ast.Name | t.CPtr)(ov)).id + asname: str = (rawptr[ast.Name](ov)).id if asname is not None: bind_val: llvmlite.Value | t.CPtr = enter_val if bind_val is None: @@ -695,11 +695,11 @@ class StmtGenMixin(StmtGenDeclMixin.StmtGenDeclMixin): trans, pool, builder, mod, fd_cls_bare, ctx_val) # 2. 翻译 body - body: list[ast.AST | t.CPtr] | t.CPtr = wt.children + body: list[rawptr[ast.AST]] | t.CPtr = wt.children if body is not None: bn: sizet = len(body) for bi in range(bn): - st: ast.AST | t.CPtr = body.get(bi) + st: rawptr[ast.AST] = body.get(bi) if st is not None: self.translate_stmt(trans, st) @@ -731,22 +731,22 @@ class StmtGenMixin(StmtGenDeclMixin.StmtGenDeclMixin): self.Gen.VarGen.define_var(trans.SymTab, "__with_ctx", old_ctx_alloca) return 0 - def _with_ctx_call(self, trans: HT.Translator | t.CPtr, + def _with_ctx_call(self, trans: rawptr[HT.Translator], pool: rawptr[memhub.MemBuddy], builder: llvmlite.IRBuilder | t.CPtr, - mod: llvmlite.LLVMModule | t.CPtr, + mod: rawptr[llvmlite.LLVMModule], method_name: str) -> llvmlite.Value | t.CPtr: """构造并翻译 __with_ctx.() 调用(__enter__/__exit__)""" if pool is None or method_name is None: return None - name_node: ast.AST | t.CPtr = ast.Name(pool, "__with_ctx", ast.ASTCtx.Load) + name_node: rawptr[ast.AST] = ast.Name(pool, "__with_ctx", ast.ASTCtx.Load) if name_node is None: return None - attr_node: ast.AST | t.CPtr = ast.Attribute( + attr_node: rawptr[ast.AST] = ast.Attribute( pool, name_node, method_name, ast.ASTCtx.Load) if attr_node is None: return None - call_node: ast.AST | t.CPtr = ast.Call(pool, attr_node, None, None) + call_node: rawptr[ast.AST] = ast.Call(pool, attr_node, None, None) if call_node is None: return None return self.Gen.ExprGen.translate_value( diff --git a/App/lib/core/Gen/StructGenMixin.vp b/App/lib/core/Gen/StructGenMixin.vp index 8042fe4..d713fab 100644 --- a/App/lib/core/Gen/StructGenMixin.vp +++ b/App/lib/core/Gen/StructGenMixin.vp @@ -365,7 +365,7 @@ class StructGenMixin: def register_struct(self, pool: rawptr[memhub.MemBuddy], name: str, - struct_ty: llvmlite.LLVMType | t.CPtr, + struct_ty: rawptr[llvmlite.LLVMType], sha1: str = None) -> GenTypes.StructEntry | t.CPtr: """注册结构体类型,返回 StructEntry 指针 @@ -539,8 +539,8 @@ class StructGenMixin: def add_field(self, pool: rawptr[memhub.MemBuddy], struct_entry: GenTypes.StructEntry | t.CPtr, field_name: str, - field_ty: llvmlite.LLVMType | t.CPtr, - default_val: ast.AST | t.CPtr = None, + field_ty: rawptr[llvmlite.LLVMType], + default_val: rawptr[ast.AST] = None, annot_class_name: str = None) -> int: """向结构体添加字段,返回字段索引(-1 失败) @@ -582,7 +582,7 @@ class StructGenMixin: dp_pool_sg: rawptr[memhub.MemBuddy] = CompilerFactory.factory.PermPool if dp_pool_sg is None: dp_pool_sg = pool - ty_copy: llvmlite.LLVMType | t.CPtr = llvmlite.DeepCopyType(dp_pool_sg, field_ty) + ty_copy: rawptr[llvmlite.LLVMType] = llvmlite.DeepCopyType(dp_pool_sg, field_ty) if ty_copy is not None: fe.Ty = ty_copy else: @@ -617,7 +617,7 @@ class StructGenMixin: return idx def _deep_copy_default_ast(self, pool: rawptr[memhub.MemBuddy], - default_val: ast.AST | t.CPtr) -> ast.AST | t.CPtr: + default_val: rawptr[ast.AST]) -> rawptr[ast.AST]: """深拷贝字段默认值 AST 到永久池(仅常量节点),跨 1b reset 存活。 字段默认值(fe.DefaultVal)除定义文件内 _generate_before_init 使用外, @@ -634,8 +634,8 @@ class StructGenMixin: return self._deep_copy_list_ast(pool, default_val) if default_val.kind() != ast.ASTKind.Constant: return None - src_c: ast.Constant | t.CPtr = (ast.Constant | t.CPtr)(default_val) - dst_c: ast.Constant | t.CPtr = (ast.Constant | t.CPtr)( + src_c: rawptr[ast.Constant] = rawptr[ast.Constant](default_val) + dst_c: rawptr[ast.Constant] = rawptr[ast.Constant]( pool.alloc(ast.Constant.__sizeof__())) if dst_c is None: return None @@ -658,10 +658,10 @@ class StructGenMixin: if s_copy is not None: string.strcpy(s_copy, src_c.str_val) dst_c.str_val = s_copy - return (ast.AST | t.CPtr)(dst_c) + return (rawptr[ast.AST])(dst_c) def _deep_copy_list_ast(self, pool: rawptr[memhub.MemBuddy], - default_val: ast.AST | t.CPtr) -> ast.AST | t.CPtr: + default_val: rawptr[ast.AST]) -> rawptr[ast.AST]: """深拷贝 List 节点(列表字面量默认值)到永久池,跨 1b reset 存活。 elts 容器手动在永久池构造(list 的 __pool__ 置 None:深拷贝的 elts @@ -684,13 +684,13 @@ class StructGenMixin: dst_l.end_col_offset = src_l.end_col_offset dst_l.ctx = src_l.ctx # 深拷贝 elts:stdlib 手动构造 list[AST | t.CPtr] 容器 - src_elts_l: list[ast.AST | t.CPtr] | t.CPtr = src_l.elts + src_elts_l: list[rawptr[ast.AST]] | t.CPtr = src_l.elts if src_elts_l is not None: cnt_l: sizet = len(src_elts_l) - lst_copy_l: list[ast.AST | t.CPtr] | t.CPtr = (list[ast.AST | t.CPtr] | t.CPtr)( - pool.alloc(list[ast.AST | t.CPtr].__sizeof__())) + lst_copy_l: list[rawptr[ast.AST]] | t.CPtr = (list[rawptr[ast.AST]] | t.CPtr)( + pool.alloc(list[rawptr[ast.AST]].__sizeof__())) if lst_copy_l is not None: - string.memset(lst_copy_l, 0, list[ast.AST | t.CPtr].__sizeof__()) + string.memset(lst_copy_l, 0, list[rawptr[ast.AST]].__sizeof__()) lst_copy_l.__count__ = cnt_l lst_copy_l.__capacity__ = cnt_l lst_copy_l.__elem_size__ = 8 @@ -701,14 +701,14 @@ class StructGenMixin: lst_copy_l.__data__ = data_l li_l: sizet for li_l in range(cnt_l): - elem_src_l: ast.AST | t.CPtr = src_elts_l.get(li_l) + elem_src_l: rawptr[ast.AST] = src_elts_l.get(li_l) if elem_src_l is not None: - elem_dst_l: ast.AST | t.CPtr = self._deep_copy_default_ast(pool, elem_src_l) + elem_dst_l: rawptr[ast.AST] = self._deep_copy_default_ast(pool, elem_src_l) if elem_dst_l is not None: - slot_l: ast.AST | t.CPtr = (ast.AST | t.CPtr)(uint64(data_l) + li_l * 8) + slot_l: rawptr[ast.AST] = (rawptr[ast.AST])(uint64(data_l) + li_l * 8) slot_l[0] = elem_dst_l dst_l.elts = lst_copy_l - return (ast.AST | t.CPtr)(dst_l) + return (rawptr[ast.AST])(dst_l) def get_struct_count(self) -> int: """返回当前已注册的结构体数量""" @@ -923,7 +923,7 @@ class StructGenMixin: reset_count += 1 return reset_count - def find_struct_by_type(self, struct_ty: llvmlite.LLVMType | t.CPtr) -> GenTypes.StructEntry | t.CPtr: + def find_struct_by_type(self, struct_ty: rawptr[llvmlite.LLVMType]) -> GenTypes.StructEntry | t.CPtr: """按类型指针查找结构体(指针值比较),返回 StructEntry 或 None 注意: 不能用 `entry.Ty is struct_ty` 的 is 比较——TPV 编译 is 时会触发 @@ -950,7 +950,7 @@ class StructGenMixin: return entry return None - def struct_type_is_packed(self, struct_ty: llvmlite.LLVMType | t.CPtr) -> int: + def struct_type_is_packed(self, struct_ty: rawptr[llvmlite.LLVMType]) -> int: """判断命名结构体是否 packed(@c.Attribute(t.attr.packed)),返回 1/0 先按类型指针身份匹配(find_struct_by_type,跨模块 deep copy 后仍 @@ -970,7 +970,7 @@ class StructGenMixin: return 0 return entry.IsPacked - def lookup_field(self, struct_ty: llvmlite.LLVMType | t.CPtr, + def lookup_field(self, struct_ty: rawptr[llvmlite.LLVMType], field_name: str) -> GenTypes.FieldEntry | t.CPtr: """按结构体类型和字段名查找字段信息 @@ -1074,7 +1074,7 @@ class StructGenMixin: def lookup_field_by_class(self, class_name: str, field_name: str, sha1: str = None, - node: ast.AST | t.CPtr = None, + node: rawptr[ast.AST] = None, from_imports: str = None) -> GenTypes.FieldEntry | t.CPtr: """按类名和字段名查找字段信息 @@ -1302,7 +1302,7 @@ class StructGenMixin: # 诊断:找到结构体但字段未找到 return None - def get_struct_type(self, class_name: str) -> llvmlite.LLVMType | t.CPtr: + def get_struct_type(self, class_name: str) -> rawptr[llvmlite.LLVMType]: """按类名获取结构体的 LLVM 类型""" entry: GenTypes.StructEntry | t.CPtr = self.find_struct(class_name) if entry is not None: @@ -1334,7 +1334,7 @@ class StructGenMixin: return 1 return 0 - def get_struct_type_from_value(self, val: llvmlite.Value | t.CPtr) -> llvmlite.LLVMType | t.CPtr: + def get_struct_type_from_value(self, val: llvmlite.Value | t.CPtr) -> rawptr[llvmlite.LLVMType]: """从 Value 的类型推断结构体类型 递归解 Ptr:支持 X|t.CPtr 联合简化产生的 Ptr(Ptr(Struct)) 对象指针 @@ -1344,13 +1344,13 @@ class StructGenMixin: """ if val is None or val.Ty is None: return None - ty: llvmlite.LLVMType | t.CPtr = val.Ty + ty: rawptr[llvmlite.LLVMType] = val.Ty while ty is not None: # 同类编译 bug(见 TypeGenResolve L1463 注释):case body 直接 # 更新 while 条件变量(ty = pointee)时自举编译出的 match 把赋值 # 写到 subject 快照槽,while 条件读旧槽 → 死循环。改法:case # 绑定到局部变量,match 外更新循环变量。 - nxt_ty: llvmlite.LLVMType | t.CPtr = None + nxt_ty: rawptr[llvmlite.LLVMType] = None match ty: case llvmlite.LLVMType.Ptr(pointee): nxt_ty = pointee @@ -1380,7 +1380,7 @@ class StructGenMixin: return 0 return entry.IsUnion - def is_union_by_type(self, struct_ty: llvmlite.LLVMType | t.CPtr) -> int: + def is_union_by_type(self, struct_ty: rawptr[llvmlite.LLVMType]) -> int: """按类型指针检查是否为联合体,返回 1=是 / 0=否 先尝试类型指针 == 比较,失败时回退到名称匹配 @@ -1462,7 +1462,7 @@ class StructGenMixin: return entry.HasNew def get_class_name_by_type(self, pool: rawptr[memhub.MemBuddy], - struct_ty: llvmlite.LLVMType | t.CPtr) -> str: + struct_ty: rawptr[llvmlite.LLVMType]) -> str: """按类型指针查找类名,返回类名字符串或 None""" if struct_ty is None or self.StructTable is None: return None @@ -1509,7 +1509,7 @@ class StructGenMixin: return entry2.Name return None - def _extract_struct_name(self, ty: llvmlite.LLVMType | t.CPtr) -> str: + def _extract_struct_name(self, ty: rawptr[llvmlite.LLVMType]) -> str: """从 LLVMType 提取 Struct 变体的 Name 字段,返回 None 非 Struct""" if ty is None: return None @@ -1760,8 +1760,8 @@ class StructGenMixin: return entry.FieldCount def ensure_struct_def_in_module(self, pool: rawptr[memhub.MemBuddy], - mod: llvmlite.LLVMModule | t.CPtr, - ty: llvmlite.LLVMType | t.CPtr): + mod: rawptr[llvmlite.LLVMModule], + ty: rawptr[llvmlite.LLVMType]): """确保跨模块结构体的完整定义在当前模块中可用(供 alloca 使用) 处理两种情况: @@ -1831,8 +1831,8 @@ class StructGenMixin: self._ensure_field_types_in_module(pool, mod, entry.Ty) def _ensure_field_types_in_module(self, pool: rawptr[memhub.MemBuddy], - mod: llvmlite.LLVMModule | t.CPtr, - ty: llvmlite.LLVMType | t.CPtr): + mod: rawptr[llvmlite.LLVMModule], + ty: rawptr[llvmlite.LLVMType]): """递归扫描类型树,确保值类型子结构体有完整定义""" if ty is None or mod is None or pool is None: return @@ -1841,7 +1841,7 @@ class StructGenMixin: case llvmlite.LLVMType.Struct(fields, fcount, sname): # 遍历字段链表 if fields is not None: - fld: llvmlite.ParamNode | t.CPtr = fields + fld: rawptr[llvmlite.Function] = fields cnt_ef: int = 0 while fld is not None: # 步数守卫:字段链表成环(内存损坏)导致无限遍历挂起 @@ -1885,13 +1885,13 @@ class StructGenMixin: return None return fe.Name - def get_field_type_ptr(self, fe: GenTypes.FieldEntry | t.CPtr) -> llvmlite.LLVMType | t.CPtr: + def get_field_type_ptr(self, fe: GenTypes.FieldEntry | t.CPtr) -> rawptr[llvmlite.LLVMType]: """获取 FieldEntry 的字段类型,返回 None=未设置""" if fe is None: return None return fe.Ty - def get_field_default_ptr(self, fe: GenTypes.FieldEntry | t.CPtr) -> ast.AST | t.CPtr: + def get_field_default_ptr(self, fe: GenTypes.FieldEntry | t.CPtr) -> rawptr[ast.AST]: """获取 FieldEntry 的默认值 AST 节点,返回 None=无默认值""" if fe is None: return None diff --git a/App/lib/core/Gen/Translator.vp b/App/lib/core/Gen/Translator.vp index 5d4a41f..949f7a1 100644 --- a/App/lib/core/Gen/Translator.vp +++ b/App/lib/core/Gen/Translator.vp @@ -71,11 +71,11 @@ class Translator: """翻译器:管理编译状态,委托 Handles 模块执行翻译""" # LLVM 上下文(共享状态) - Module: llvmlite.LLVMModule | t.CPtr + Module: rawptr[llvmlite.LLVMModule] Pool: rawptr[memhub.MemBuddy] # 函数表 - _funcs: GenTypes.FuncEntry | t.CPtr + _funcs: rawptr[GenTypes.FuncEntry] _func_count: int # 协程(TPV-M1 async def / await / coro.coro_run) @@ -133,13 +133,13 @@ class Translator: _from_imports: str # 当前翻译上下文 - _cur_func: llvmlite.Function | t.CPtr + _cur_func: rawptr[llvmlite.Function] _cur_builder: llvmlite.IRBuilder | t.CPtr # 当前赋值语句的注解节点(AnnAssign 翻译 rhs 前设置,Assign 翻译前清空)。 # 供 c.Deref(i8*) 推断读取宽度:v: int = c.Deref(p) → bitcast i32* load # (对齐 TPC HandlesSpecialCall._infer_deref_target_type;否则固定读 1 字节 + sext 截断)。 - CurAssignAnnot: ast.AST | t.CPtr + CurAssignAnnot: rawptr[ast.AST] # 当前赋值语句的 RHS 节点(AnnAssign 翻译 rhs 前设置,rhs 翻译后清除)。 # 供 c.Deref 判定"是否为赋值直接 RHS":仅 v: int = c.Deref(p) 时用 @@ -147,17 +147,17 @@ class Translator: # 调用中(如 while c.Deref(p) != 0、total += int(c.Deref(p)))不推断, # 否则 i8* 会被残留 CurAssignAnnot 误判为 i32* 读 4 字节(对齐 TPC # _infer_deref_target_type 的直接 RHS 检查)。 - CurAssignNode: ast.AST | t.CPtr + CurAssignNode: rawptr[ast.AST] # 当前函数的返回注解节点(translate_function_def 进入函数体前设置,退出时 # 恢复外层函数的值)。供裸名泛型构造回退推断类型实参:`-> Stack[int]` 里 # `return Stack()` 用注解里的 int 特化(与 CurAssignAnnot 同类的上下文通道)。 - CurFuncRetAnnot: ast.AST | t.CPtr + CurFuncRetAnnot: rawptr[ast.AST] # 当前 Return 语句的直接值节点(translate_return 翻译返回值前设置,翻译后 # 清除)。与 CurAssignNode 同款的 identity 判定:仅「裸名泛型构造就是 return # 的直接值」时才用 CurFuncRetAnnot(嵌套调用如 return f(Stack()) 不推断)。 - CurRetNode: ast.AST | t.CPtr + CurRetNode: rawptr[ast.AST] # 循环控制流目标(break/continue) _break_bb: llvmlite.BasicBlock | t.CPtr @@ -415,7 +415,7 @@ class Translator: # ============================================================ # 主翻译入口 # ============================================================ - def translate(self, tree: ast.AST | t.CPtr) -> int: + def translate(self, tree: rawptr[ast.AST]) -> int: """将 AST 翻译为 LLVM IR""" if tree is None: return 1 @@ -428,7 +428,7 @@ class Translator: self._init_state(pool) # 创建 LLVM 模块 - mod: llvmlite.LLVMModule | t.CPtr = llvmlite.new_module(pool, "main") + mod: rawptr[llvmlite.LLVMModule] = llvmlite.new_module(pool, "main") if mod is None: VLogger.error("NewModule returned NULL", "TR") return 1 @@ -441,12 +441,12 @@ class Translator: llvmlite.module_set_target(mod, triple) # 类型 - i32_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int32(pool) - i8_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int8(pool) - i8_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, i8_ty) + i32_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int32(pool) + i8_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int8(pool) + i8_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, i8_ty) # 声明 printf - printf_func: llvmlite.Function | t.CPtr = llvmlite.create_declare( + printf_func: rawptr[llvmlite.Function] = llvmlite.create_declare( pool, mod, "printf", i32_ty) if printf_func is None: VLogger.error("CreateDeclare printf returned NULL", "TR") @@ -456,32 +456,32 @@ class Translator: # 声明 LLVM va_start/va_end intrinsic(供 *args 函数体内使用) # declare void @llvm.va_start(i8*) # declare void @llvm.va_end(i8*) - void_ty_decl: llvmlite.LLVMType | t.CPtr = llvmlite.Void(pool) - va_start_func: llvmlite.Function | t.CPtr = llvmlite.create_declare( + void_ty_decl: rawptr[llvmlite.LLVMType] = llvmlite.Void(pool) + va_start_func: rawptr[llvmlite.Function] = llvmlite.create_declare( pool, mod, "llvm.va_start", void_ty_decl) if va_start_func is not None: llvmlite.add_param(pool, va_start_func, i8_ptr_ty, "ap") - va_end_func: llvmlite.Function | t.CPtr = llvmlite.create_declare( + va_end_func: rawptr[llvmlite.Function] = llvmlite.create_declare( pool, mod, "llvm.va_end", void_ty_decl) if va_end_func is not None: llvmlite.add_param(pool, va_end_func, i8_ptr_ty, "ap") # 声明 malloc(闭包分配用) - malloc_func: llvmlite.Function | t.CPtr = llvmlite.create_declare( + malloc_func: rawptr[llvmlite.Function] = llvmlite.create_declare( pool, mod, "malloc", i8_ptr_ty) if malloc_func is not None: - i64_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int64(pool) + i64_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int64(pool) llvmlite.add_param(pool, malloc_func, i64_ty, "size") # 检查用户是否定义了 main 函数 has_user_main: int = 0 - ch: list[ast.AST | t.CPtr] | t.CPtr = tree.children + ch: list[rawptr[ast.AST]] | t.CPtr = tree.children if ch is not None: cn_count: sizet = len(ch) for ci in range(cn_count): - child: ast.AST | t.CPtr = ch.get(ci) + child: rawptr[ast.AST] = ch.get(ci) if child is not None and child.kind() == ast.ASTKind.FunctionDef: - fd: ast.FunctionDef | t.CPtr = (ast.FunctionDef | t.CPtr)(child) + fd: rawptr[ast.FunctionDef] = rawptr[ast.FunctionDef](child) if fd is not None and fd.name is not None: if string.strcmp(fd.name, "main") == 0: has_user_main = 1 @@ -504,9 +504,9 @@ class Translator: # 包装 main 函数(无用户 main 时)→ 委托 HandlesMain # ============================================================ def _translate_wrapper_main(self, pool: rawptr[memhub.MemBuddy], - mod: llvmlite.LLVMModule | t.CPtr, - tree: ast.AST | t.CPtr, - i32_ty: llvmlite.LLVMType | t.CPtr): + mod: rawptr[llvmlite.LLVMModule], + tree: rawptr[ast.AST], + i32_ty: rawptr[llvmlite.LLVMType]): """委托 GenApi.create_wrapper_main() 创建包装 main(trans 单参)""" added: int = GenApi.create_wrapper_main(self, tree, i32_ty) @@ -514,8 +514,8 @@ class Translator: # 模块级翻译(用户已定义 main)→ 委托 HandlesMain # ============================================================ def _translate_module_level(self, pool: rawptr[memhub.MemBuddy], - mod: llvmlite.LLVMModule | t.CPtr, - tree: ast.AST | t.CPtr): + mod: rawptr[llvmlite.LLVMModule], + tree: rawptr[ast.AST]): """委托 GenApi.translate_children() 翻译模块级语句(trans 单参)""" # 全量翻译模式下,先处理导入语句,再创建前向声明,解决前向引用问题 if self._declare_only == 0: @@ -523,11 +523,11 @@ class Translator: # (前向声明需要解析类型注解,如 t.CArray[str] 依赖 t 模块已导入) # 记录最后处理的 import 行号,供 vpi 注入错误上下文帧定位 cur_imp_lineno: int = 0 - ch: list[ast.AST | t.CPtr] | t.CPtr = tree.children + ch: list[rawptr[ast.AST]] | t.CPtr = tree.children if ch is not None: cn_count: sizet = len(ch) for ci in range(cn_count): - child: ast.AST | t.CPtr = ch.get(ci) + child: rawptr[ast.AST] = ch.get(ci) if child is None: continue kd: int = child.kind() @@ -567,7 +567,7 @@ class Translator: # 通过 lookup_module_var 检测已存在并跳过(HandlesMain.py:206-209) if ch is not None: for ci in range(cn_count): - child: ast.AST | t.CPtr = ch.get(ci) + child: rawptr[ast.AST] = ch.get(ci) if child is None: continue kd_mv: int = child.kind() @@ -586,7 +586,7 @@ class Translator: # - 构造调用 func 裸名 Name(list/dict):dict(bd) # - Subscript 的 value 裸名 Name(list/dict):list[int] def _inject_auto_container_visibility(self, pool: rawptr[memhub.MemBuddy], - tree: ast.AST | t.CPtr): + tree: rawptr[ast.AST]): """检测 list/dict 容器使用,注入容器类可见性""" if tree is None or tree.children is None: return @@ -685,7 +685,7 @@ class Translator: stdlib.free(nm_buf) return 0 - def _scan_container_usage(self, node: ast.AST | t.CPtr, + def _scan_container_usage(self, node: rawptr[ast.AST], need_list_box: t.CPtr, need_dict_box: t.CPtr): """递归扫描 AST 语句结构,检测 list/dict 容器使用""" @@ -693,31 +693,31 @@ class Translator: return k: int = node.kind() if k == ast.ASTKind.AnnAssign: - aa_s: ast.AnnAssign | t.CPtr = (ast.AnnAssign | t.CPtr)(node) + aa_s: rawptr[ast.AnnAssign] = rawptr[ast.AnnAssign](node) if aa_s.annotation is not None: self._check_container_type_node(aa_s.annotation, need_list_box, need_dict_box) elif k == ast.ASTKind.Call: - cl_s: ast.Call | t.CPtr = (ast.Call | t.CPtr)(node) + cl_s: rawptr[ast.Call] = rawptr[ast.Call](node) if cl_s.func is not None: self._check_container_type_node(cl_s.func, need_list_box, need_dict_box) elif k == ast.ASTKind.Subscript: - sub_s: ast.Subscript | t.CPtr = (ast.Subscript | t.CPtr)(node) + sub_s: rawptr[ast.Subscript] = rawptr[ast.Subscript](node) if sub_s.value is not None: self._check_container_type_node(sub_s.value, need_list_box, need_dict_box) elif k == ast.ASTKind.FunctionDef: - fd_s: ast.FunctionDef | t.CPtr = (ast.FunctionDef | t.CPtr)(node) + fd_s: rawptr[ast.FunctionDef] = rawptr[ast.FunctionDef](node) if fd_s.returns is not None: self._check_container_type_node(fd_s.returns, need_list_box, need_dict_box) if fd_s.args is not None: - args_s: ast.Arguments | t.CPtr = (ast.Arguments | t.CPtr)(fd_s.args) + args_s: rawptr[ast.Arguments] = rawptr[ast.Arguments](fd_s.args) if args_s.args is not None: - args_list_s: list[ast.AST | t.CPtr] | t.CPtr = args_s.args + args_list_s: list[rawptr[ast.AST]] | t.CPtr = args_s.args an_s: sizet = len(args_list_s) ai_s: sizet for ai_s in range(an_s): - arg_s: ast.AST | t.CPtr = args_list_s.get(ai_s) + arg_s: rawptr[ast.AST] = args_list_s.get(ai_s) if arg_s is not None: - ag_s: ast.Arg | t.CPtr = (ast.Arg | t.CPtr)(arg_s) + ag_s: rawptr[ast.Arg] = rawptr[ast.Arg](arg_s) if ag_s.annotation is not None: self._check_container_type_node( ag_s.annotation, need_list_box, need_dict_box) @@ -729,12 +729,12 @@ class Translator: # translate_list_literal 阶段 fail-fast 提示 _list 未注册(需显式注解)。 # 递归语句块子节点 if node.children is not None: - ch_s: list[ast.AST | t.CPtr] | t.CPtr = node.children + ch_s: list[rawptr[ast.AST]] | t.CPtr = node.children n_s: sizet = len(ch_s) for ci_s in range(n_s): self._scan_container_usage(ch_s.get(ci_s), need_list_box, need_dict_box) - def _check_container_type_node(self, node: ast.AST | t.CPtr, + def _check_container_type_node(self, node: rawptr[ast.AST], need_list_box: t.CPtr, need_dict_box: t.CPtr): """检测类型位置节点是否为 list/dict(支持 Name / Subscript / BinOp 递归)""" @@ -742,25 +742,25 @@ class Translator: return k: int = node.kind() if k == ast.ASTKind.Name: - nm_s: ast.Name | t.CPtr = (ast.Name | t.CPtr)(node) + nm_s: rawptr[ast.Name] = rawptr[ast.Name](node) if nm_s.id is not None: if string.strcmp(nm_s.id, "dict") == 0: need_dict_box[0] = 1 elif string.strcmp(nm_s.id, "list") == 0: need_list_box[0] = 1 elif k == ast.ASTKind.Subscript: - sub_s: ast.Subscript | t.CPtr = (ast.Subscript | t.CPtr)(node) + sub_s: rawptr[ast.Subscript] = rawptr[ast.Subscript](node) if sub_s.value is not None: self._check_container_type_node(sub_s.value, need_list_box, need_dict_box) # rawptr[list[int]] / list[AST] 等:slice 里可能含 list,需下钻 if sub_s.slice is not None: self._check_container_type_node(sub_s.slice, need_list_box, need_dict_box) elif k == ast.ASTKind.BinOp: - bop_s: ast.BinOp | t.CPtr = (ast.BinOp | t.CPtr)(node) + bop_s: rawptr[ast.BinOp] = rawptr[ast.BinOp](node) self._check_container_type_node(ast.binop_get_left(bop_s), need_list_box, need_dict_box) self._check_container_type_node(ast.binop_get_right(bop_s), need_list_box, need_dict_box) - def _annotation_is_container(self, ann: ast.AST | t.CPtr) -> int: + def _annotation_is_container(self, ann: rawptr[ast.AST]) -> int: """注解是否为 list/dict 容器(Name 裸名或 Subscript list[...]/dict[...]) 数组初始化(t.CArray[...] / 裸数组注解)返回 0,避免 _scan_container_usage @@ -769,7 +769,7 @@ class Translator: while ann is not None: ak: int = ann.kind() if ak == ast.ASTKind.Name: - nm_c: ast.Name | t.CPtr = (ast.Name | t.CPtr)(ann) + nm_c: rawptr[ast.Name] = rawptr[ast.Name](ann) if nm_c.id is not None: if string.strcmp(nm_c.id, "list") == 0: return 1 @@ -777,7 +777,7 @@ class Translator: return 1 return 0 elif ak == ast.ASTKind.Subscript: - sub_c: ast.Subscript | t.CPtr = (ast.Subscript | t.CPtr)(ann) + sub_c: rawptr[ast.Subscript] = rawptr[ast.Subscript](ann) ann = sub_c.value else: return 0 diff --git a/App/lib/core/Gen/TranslatorGenMixin.vp b/App/lib/core/Gen/TranslatorGenMixin.vp index a08f7f5..97deddb 100644 --- a/App/lib/core/Gen/TranslatorGenMixin.vp +++ b/App/lib/core/Gen/TranslatorGenMixin.vp @@ -45,10 +45,10 @@ class TranslatorGenMixin: # Phase 1a 预注册所有 CExport/State 函数名到全局表。 # ============================================================ Gen: rawptr[Generator.Generator] - def _register_cexport_from_funcdef(self, trans: HT.Translator | t.CPtr, - node: ast.AST | t.CPtr) -> int: + def _register_cexport_from_funcdef(self, trans: rawptr[HT.Translator], + node: rawptr[ast.AST]) -> int: """预注册 CExport/State 函数到全局表(仅注册,不生成 IR)""" - fd: ast.FunctionDef | t.CPtr = (ast.FunctionDef | t.CPtr)(node) + fd: rawptr[ast.FunctionDef] = rawptr[ast.FunctionDef](node) if fd is None or fd.name is None: return 0 if trans is None or trans.ModuleSha1 is None: @@ -72,8 +72,8 @@ class TranslatorGenMixin: # 对应 TransPyC translator._translate_children() # 共享状态从 trans 获取,imported_modules/from_imports 更新到 trans # ============================================================ - def translate_children(self, trans: HT.Translator | t.CPtr, - tree: ast.AST | t.CPtr) -> int: + def translate_children(self, trans: rawptr[HT.Translator], + tree: rawptr[ast.AST]) -> int: """遍历 tree.children 并翻译每个子节点 Args: @@ -83,7 +83,7 @@ class TranslatorGenMixin: Returns: int: 新增的变量数 """ - ch: list[ast.AST | t.CPtr] | t.CPtr = tree.children + ch: list[rawptr[ast.AST]] | t.CPtr = tree.children if ch is None: return 0 @@ -91,7 +91,7 @@ class TranslatorGenMixin: added_total: int = 0 for ci in range(cn_count): - child: ast.AST | t.CPtr = ch.get(ci) + child: rawptr[ast.AST] = ch.get(ci) if child is None: continue kd: int = child.kind() @@ -149,8 +149,8 @@ class TranslatorGenMixin: # 避免 Phase2 翻译 App 文件时访问悬空结构体(UAF)。 # 仅解析类型触发特化,不验证结果(1b 全量翻译时重新解析)。 # ============================================================ - def _prescan_funcdef_signatures(self, trans: HT.Translator | t.CPtr, - fd: ast.FunctionDef | t.CPtr) -> None: + def _prescan_funcdef_signatures(self, trans: rawptr[HT.Translator], + fd: rawptr[ast.FunctionDef]) -> None: """预解析模块级函数签名的返回/参数类型,触发泛型类特化""" if trans is None or fd is None: return @@ -162,13 +162,13 @@ class TranslatorGenMixin: if fd.returns is not None: self.Gen.TypeGenResolve.resolve_annotation_type(pool, fd.returns, imp, fi, trans, 0) if fd.args is not None: - ags: ast.Arguments | t.CPtr = (ast.Arguments | t.CPtr)(fd.args) + ags: rawptr[ast.Arguments] = rawptr[ast.Arguments](fd.args) if ags.args is not None: - al: list[ast.AST | t.CPtr] | t.CPtr = ags.args + al: list[rawptr[ast.AST]] | t.CPtr = ags.args an: sizet = len(al) ai: sizet for ai in range(an): - ag: ast.Arg | t.CPtr = (ast.Arg | t.CPtr)(al.get(ai)) + ag: rawptr[ast.Arg] = rawptr[ast.Arg](al.get(ai)) if ag is not None and ag.annotation is not None: self.Gen.TypeGenResolve.resolve_annotation_type(pool, ag.annotation, imp, fi, trans, 0) @@ -179,7 +179,7 @@ class TranslatorGenMixin: # 用于模块级 t.CArray 列表字面量初始化(不依赖 builder,直接生成常量初始化器) # ============================================================ def _build_array_initializer_text(self, pool: rawptr[memhub.MemBuddy], - var_ty: llvmlite.LLVMType | t.CPtr, + var_ty: rawptr[llvmlite.LLVMType], list_node: ast.List | t.CPtr) -> str: """从 AST List 节点生成 LLVM IR 数组初始化器文本,None 失败""" if var_ty is None or list_node is None: @@ -192,7 +192,7 @@ class TranslatorGenMixin: return None # 从 var_ty 提取数组元素类型和数量 - elem_ty: llvmlite.LLVMType | t.CPtr = None + elem_ty: rawptr[llvmlite.LLVMType] = None arr_count: int = 0 match var_ty: case llvmlite.LLVMType.Array(et, cnt): @@ -220,7 +220,7 @@ class TranslatorGenMixin: is_int_elem = 0 # 获取列表元素(通过 ln.elts 而非 list_node.elts,确保类型正确识别) - elts: list[ast.AST | t.CPtr] | t.CPtr = ln.elts + elts: list[rawptr[ast.AST]] | t.CPtr = ln.elts if elts is None: return None elts_count: sizet = len(elts) @@ -266,7 +266,7 @@ class TranslatorGenMixin: while i_n < cnt_total_n: sub_n: str = None if i_n < elts_count: - en_n: ast.AST | t.CPtr = elts.get(i_n) + en_n: rawptr[ast.AST] = elts.get(i_n) if en_n is not None: ek_n: int = en_n.kind() if ek_n == ast.ASTKind.List: @@ -292,12 +292,12 @@ class TranslatorGenMixin: viperlib.snprintf(buf_n + pos_n, buf_size_n - pos_n, "]") return buf_n for zi in range(elts_count): - ze: ast.AST | t.CPtr = elts.get(zi) + ze: rawptr[ast.AST] = elts.get(zi) if ze is None: continue zk: int = ze.kind() if zk == ast.ASTKind.Constant: - zc: ast.Constant | t.CPtr = (ast.Constant | t.CPtr)(ze) + zc: rawptr[ast.Constant] = rawptr[ast.Constant](ze) if zc is None: continue # None(CONST_NONE)视为零:函数指针数组 @@ -335,12 +335,12 @@ class TranslatorGenMixin: while i < cnt_total: elem_val: int64 = 0 if i < elts_count: - elem_node: ast.AST | t.CPtr = elts.get(i) + elem_node: rawptr[ast.AST] = elts.get(i) # 直接从 Constant 节点提取 int_val(避免 extract_cdefine_int_value 的 int 截断) if elem_node is not None: ek: int = elem_node.kind() if ek == ast.ASTKind.Constant: - ec: ast.Constant | t.CPtr = (ast.Constant | t.CPtr)(elem_node) + ec: rawptr[ast.Constant] = rawptr[ast.Constant](elem_node) # CONST_CHAR 字符字面量(如 `_ps2_set1 = ['\x1b', '1', ...]`): # int_val 即字符码(不识别则字符元素全编成 0)。 if ec is not None and (ec.const_kind == ast.CONST_INT or ec.const_kind == ast.CONST_CHAR): @@ -370,7 +370,7 @@ class TranslatorGenMixin: # 零填充到数组长度;空串返回 zeroinitializer)。 # 不能用字符串指针 GEP 初始化器:会导致 @g = global [N x i8] 类型不匹配。 def _build_string_array_initializer_text(self, pool: rawptr[memhub.MemBuddy], - var_ty: llvmlite.LLVMType | t.CPtr, + var_ty: rawptr[llvmlite.LLVMType], str_val: str) -> str: """字符串字面量初始化数组全局,返回初始化器文本或 None""" if var_ty is None or str_val is None: @@ -412,7 +412,7 @@ class TranslatorGenMixin: # 用于 b64_tab: t.CArray[char, None] = "ABC..." 等字符串初始化指针类型 # ============================================================ def _build_string_ptr_initializer(self, pool: rawptr[memhub.MemBuddy], - mod: llvmlite.LLVMModule | t.CPtr, + mod: rawptr[llvmlite.LLVMModule], var_name: str, str_val: str) -> str: """为字符串字面量创建内部常量全局并返回 GEP 初始化器文本,None 失败""" @@ -442,7 +442,7 @@ class TranslatorGenMixin: return init_buf def _stg_field_zero_text(self, pool: rawptr[memhub.MemBuddy], - fty: llvmlite.LLVMType | t.CPtr, + fty: rawptr[llvmlite.LLVMType], ty_str: str) -> str: """按 LLVM 类型生成 storage struct 字段的零值初始化器文本 @@ -474,16 +474,16 @@ class TranslatorGenMixin: # 其余(浮点/字符串/None/名字/表达式)返回 None,由调用方按零值兜底。 # ============================================================ def _default_val_const_text(self, pool: rawptr[memhub.MemBuddy], - fty: llvmlite.LLVMType | t.CPtr, + fty: rawptr[llvmlite.LLVMType], ty_str: str, - dval: ast.AST | t.CPtr) -> str: + dval: rawptr[ast.AST]) -> str: """字段默认值 → "ty 值" 文本;不可折叠返回 None""" if dval is None or fty is None or ty_str is None: return None is_int: int = 0 dv_int: int64 = 0 if dval.kind() == ast.ASTKind.Constant: - dc: ast.Constant | t.CPtr = (ast.Constant | t.CPtr)(dval) + dc: rawptr[ast.Constant] = rawptr[ast.Constant](dval) if dc is not None: if dc.const_kind == ast.CONST_INT or dc.const_kind == ast.CONST_CHAR: dv_int = dc.int_val @@ -582,20 +582,20 @@ class TranslatorGenMixin: # AnnAssign/Assign 创建全局变量 @var_name 并注册到 SymTab 模块作用域 # 支持整数、列表字面量、字符串字面量初始值 # ============================================================ - def handle_module_level_var(self, trans: HT.Translator | t.CPtr, - node: ast.AST | t.CPtr) -> int: + def handle_module_level_var(self, trans: rawptr[HT.Translator], + node: rawptr[ast.AST]) -> int: """处理模块级变量声明,创建全局变量""" pool: rawptr[memhub.MemBuddy] = trans.Pool - mod: llvmlite.LLVMModule | t.CPtr = trans.Module + mod: rawptr[llvmlite.LLVMModule] = trans.Module # CDefine 注解: 编译期常量,不创建全局变量 # 注册到全局 CDefine 表供 t.CArray[elem_ty, NAME] 解析 k: int = node.kind() if k == ast.ASTKind.AnnAssign: - aa_cd: ast.AnnAssign | t.CPtr = (ast.AnnAssign | t.CPtr)(node) + aa_cd: rawptr[ast.AnnAssign] = rawptr[ast.AnnAssign](node) if aa_cd is not None and aa_cd.target is not None: if aa_cd.target.kind() == ast.ASTKind.Name: - nm_cd: ast.Name | t.CPtr = (ast.Name | t.CPtr)(aa_cd.target) + nm_cd: rawptr[ast.Name] = rawptr[ast.Name](aa_cd.target) if nm_cd.id is not None: if self.Gen.AssignGen.is_cdefine_annotation(aa_cd.annotation) != 0: # 浮点/整数自动识别注册(浮点 CDefine 如 vipermath U_M_PI) @@ -619,8 +619,8 @@ class TranslatorGenMixin: return 0 var_name: str = None - var_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int32(pool) - resolved_stg_ty: llvmlite.LLVMType | t.CPtr = None # 对象类全局:静态 storage 类型(BSS 实例) + var_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int32(pool) + resolved_stg_ty: rawptr[llvmlite.LLVMType] = None # 对象类全局:静态 storage 类型(BSS 实例) resolved_stg_entry: GenTypes.StructEntry | t.CPtr = None # 对象类全局:对应 StructEntry(vtable 初始化用) init_val: int64 = 0 init_fval: t.CDouble = 0.0 # init_kind==4(浮点字面量)时的数值 @@ -632,20 +632,20 @@ class TranslatorGenMixin: # (storage 会让 @g = &g.stg 恒非 NULL,破坏 `if _kw_head != None` 守卫, # 懒初始化代码永不执行)。 is_none_init: int = 0 - annot_node: ast.AST | t.CPtr = None # 类型注解节点(检测 t.CExport 标记) + annot_node: rawptr[ast.AST] = None # 类型注解节点(检测 t.CExport 标记) if k == ast.ASTKind.AnnAssign: - aa: ast.AnnAssign | t.CPtr = (ast.AnnAssign | t.CPtr)(node) + aa: rawptr[ast.AnnAssign] = rawptr[ast.AnnAssign](node) if aa is None or aa.target is None: return 0 if aa.target.kind() != ast.ASTKind.Name: return 0 - nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(aa.target) + nm: rawptr[ast.Name] = rawptr[ast.Name](aa.target) var_name = nm.id annot_node = aa.annotation # 解析类型 if aa.annotation is not None: - resolved: llvmlite.LLVMType | t.CPtr = self.Gen.TypeGenResolve.resolve_annotation_type( + resolved: rawptr[llvmlite.LLVMType] = self.Gen.TypeGenResolve.resolve_annotation_type( pool, aa.annotation, trans._imported_modules, trans._from_imports, trans, 0) if resolved is not None: # 对象类模块级变量(@t.Object/@t.CVTable:对象即指针)→ Ptr(struct): @@ -666,7 +666,7 @@ class TranslatorGenMixin: # 对象类联合注解(T | t.CPtr → T*):同样创建 storage;否则入口/方法 # 虚调用 load @g 得 NULL → 读 [NULL] 拿 vtable → #PF。 # var_ty 保持 Ptr(联合注解语义:指针全局),storage 承载对象实例。 - pointee_uv: llvmlite.LLVMType | t.CPtr = resolved.Pointee + pointee_uv: rawptr[llvmlite.LLVMType] = resolved.Pointee if pointee_uv is not None and pointee_uv.kind() == llvmlite.LLVMType.Struct: gv_entry_u: GenTypes.StructEntry | t.CPtr = self.Gen.StructGen.find_struct_by_type(pointee_uv) if gv_entry_u is not None \ @@ -685,7 +685,7 @@ class TranslatorGenMixin: if aa.value is not None: val_kind: int = aa.value.kind() if val_kind == ast.ASTKind.Constant: - cn: ast.Constant | t.CPtr = (ast.Constant | t.CPtr)(aa.value) + cn: rawptr[ast.Constant] = rawptr[ast.Constant](aa.value) if cn.const_kind == ast.CONST_NONE: is_none_init = 1 elif cn.const_kind == ast.CONST_INT: @@ -708,21 +708,21 @@ class TranslatorGenMixin: init_list_node = (ast.List | t.CPtr)(aa.value) init_kind = 2 elif k == ast.ASTKind.Assign: - asgn: ast.Assign | t.CPtr = (ast.Assign | t.CPtr)(node) + asgn: rawptr[ast.Assign] = rawptr[ast.Assign](node) if asgn is None or asgn.targets is None: return 0 - targets: list[ast.AST | t.CPtr] | t.CPtr = asgn.targets + targets: list[rawptr[ast.AST]] | t.CPtr = asgn.targets if len(targets) < 1: return 0 - t0: ast.AST | t.CPtr = targets.get(0) + t0: rawptr[ast.AST] = targets.get(0) if t0 is None or t0.kind() != ast.ASTKind.Name: return 0 - nm2: ast.Name | t.CPtr = (ast.Name | t.CPtr)(t0) + nm2: rawptr[ast.Name] = rawptr[ast.Name](t0) var_name = nm2.id if asgn.value is not None: val_kind2: int = asgn.value.kind() if val_kind2 == ast.ASTKind.Constant: - cn2: ast.Constant | t.CPtr = (ast.Constant | t.CPtr)(asgn.value) + cn2: rawptr[ast.Constant] = rawptr[ast.Constant](asgn.value) if cn2.const_kind == ast.CONST_NONE: is_none_init = 1 elif cn2.const_kind == ast.CONST_INT: @@ -817,7 +817,7 @@ class TranslatorGenMixin: # B5:@c.Attribute(t.attr.aligned(N)) 类的全局实例施加对齐(如 fpu_context 16 对齐, # FXSAVE 区域要求 16 字节对齐,否则 fxsave/fxrstor #GP)。 - al_ty: llvmlite.LLVMType | t.CPtr = var_ty + al_ty: rawptr[llvmlite.LLVMType] = var_ty match var_ty: case llvmlite.LLVMType.Ptr(pointee_al): al_ty = pointee_al @@ -1003,7 +1003,7 @@ class TranslatorGenMixin: self.Gen.VarGen.define_module_var(trans.SymTab, stg_key, stg_ref) # 创建 Value 引用(@mangled_name, 类型为 var_ty*) - var_ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(pool, var_ty) + var_ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(pool, var_ty) ref_name: str = pool.alloc(96) if ref_name is not None: # mangled 名带 SHA1 前缀(数字开头),引用必须加引号(对齐 make_global_ref) @@ -1018,7 +1018,7 @@ class TranslatorGenMixin: # 设置 AnnotClassName(联合类型如 Logger|t.CPtr 简化为 Ptr(i8) 时, # 属性访问需要通过 AnnotClassName 回退到类名查找结构体) if k == ast.ASTKind.AnnAssign: - aa_ml: ast.AnnAssign | t.CPtr = (ast.AnnAssign | t.CPtr)(node) + aa_ml: rawptr[ast.AnnAssign] = rawptr[ast.AnnAssign](node) if aa_ml is not None and aa_ml.annotation is not None: cls_nm_ml: str = self.Gen.TypeGenResolve.extract_class_name_from_annotation( aa_ml.annotation, trans._imported_modules, pool, trans._from_imports) @@ -1030,7 +1030,7 @@ class TranslatorGenMixin: # global_var_ptr_element(_argv 等字符串指针数组)。否则 # var[i] 退化为 1 字节字符步长 GEP + load i8 截断指针。 if aa_ml.annotation.kind() == ast.ASTKind.BinOp: - bop_ml: ast.BinOp | t.CPtr = (ast.BinOp | t.CPtr)(aa_ml.annotation) + bop_ml: rawptr[ast.BinOp] = rawptr[ast.BinOp](aa_ml.annotation) if bop_ml.op == ast.OpKind.BitOr: if self.Gen.AssignGen._annotation_contains_name( aa_ml.annotation, "str") != 0 \ @@ -1048,9 +1048,9 @@ class TranslatorGenMixin: # 创建 main() -> i32 函数 → 设置 trans._cur_func/_cur_builder → # 预扫描 alloca → 翻译子节点 → ret 0 # ============================================================ - def create_wrapper_main(self, trans: HT.Translator | t.CPtr, - tree: ast.AST | t.CPtr, - i32_ty: llvmlite.LLVMType | t.CPtr) -> int: + def create_wrapper_main(self, trans: rawptr[HT.Translator], + tree: rawptr[ast.AST], + i32_ty: rawptr[llvmlite.LLVMType]) -> int: """创建包装 main 函数并翻译所有顶层语句 Args: @@ -1062,9 +1062,9 @@ class TranslatorGenMixin: int: 新增的变量数 """ pool: rawptr[memhub.MemBuddy] = trans.Pool - mod: llvmlite.LLVMModule | t.CPtr = trans.Module + mod: rawptr[llvmlite.LLVMModule] = trans.Module - main_func: llvmlite.Function | t.CPtr = llvmlite.create_function( + main_func: rawptr[llvmlite.Function] = llvmlite.create_function( pool, mod, "main", i32_ty) if main_func is None: VLogger.error("CreateFunction main returned NULL", "TR") @@ -1089,11 +1089,11 @@ class TranslatorGenMixin: # 预处理模块级变量:为 AnnAssign/Assign 创建 LLVM 全局变量 # 必须在 pre_scan_allocas 之前执行,否则 PreScan 会创建局部 alloca, # 导致其他函数通过 SSA 编号引用 wrapper main 的局部变量(无效 IR) - ch: list[ast.AST | t.CPtr] | t.CPtr = tree.children + ch: list[rawptr[ast.AST]] | t.CPtr = tree.children if ch is not None: cn_count: sizet = len(ch) for ci in range(cn_count): - child: ast.AST | t.CPtr = ch.get(ci) + child: rawptr[ast.AST] = ch.get(ci) if child is not None: kd: int = child.kind() if kd == ast.ASTKind.AnnAssign or kd == ast.ASTKind.Assign: @@ -1103,7 +1103,7 @@ class TranslatorGenMixin: # (模块级变量已在上面注册到模块作用域,PreScan 的 lookup_current 会跳过它们) if ch is not None: for ci in range(cn_count): - child: ast.AST | t.CPtr = ch.get(ci) + child: rawptr[ast.AST] = ch.get(ci) if child is not None: self.Gen.StmtGenDecl.pre_scan_allocas(trans, child) @@ -1119,7 +1119,7 @@ class TranslatorGenMixin: # ============================================================ # global/nonlocal 名称管理(迁移自 HandlesTranslator.vp 模块级函数) # ============================================================ - def add_global_name(self, trans: HT.Translator | t.CPtr, name: str): + def add_global_name(self, trans: rawptr[HT.Translator], name: str): """添加一个 global 变量名""" if trans is None or name is None: return @@ -1144,7 +1144,7 @@ class TranslatorGenMixin: slot_ptr[0] = name trans._global_name_count += 1 - def is_global_name(self, trans: HT.Translator | t.CPtr, name: str) -> int: + def is_global_name(self, trans: rawptr[HT.Translator], name: str) -> int: """检查 name 是否在当前函数的 global 集合中""" if trans is None or name is None or trans._global_names is None: return 0 @@ -1157,8 +1157,8 @@ class TranslatorGenMixin: return 1 return 0 - def add_nonlocal_name(self, trans: HT.Translator | t.CPtr, name: str, - var_ty: llvmlite.LLVMType | t.CPtr = None): + def add_nonlocal_name(self, trans: rawptr[HT.Translator], name: str, + var_ty: rawptr[llvmlite.LLVMType] = None): """添加一个 nonlocal 变量名 Args: @@ -1201,7 +1201,7 @@ class TranslatorGenMixin: ty_addr2: uint64 = uint64(trans._nonlocal_types) + trans._nonlocal_name_count * 8 ty_slot2: str | t.CPtr = (t.CPtr)(ty_addr2) # var_ty 为 None 时直接报错终止(fail-fast),不再默认 i32 - stored_ty: llvmlite.LLVMType | t.CPtr = var_ty + stored_ty: rawptr[llvmlite.LLVMType] = var_ty if stored_ty is None: self.Gen.TypeGenErr.fatal_error(None, f"nonlocal 变量 '{name}' 类型缺失,无法注册", "TypeError") return @@ -1209,8 +1209,8 @@ class TranslatorGenMixin: trans._nonlocal_name_count += 1 trans._closure_env_count += 1 - def get_nonlocal_type(self, trans: HT.Translator | t.CPtr, - name: str) -> llvmlite.LLVMType | t.CPtr: + def get_nonlocal_type(self, trans: rawptr[HT.Translator], + name: str) -> rawptr[llvmlite.LLVMType]: """获取 nonlocal 变量的 LLVM 类型 Returns: 找到的类型指针,找不到返回 None @@ -1222,9 +1222,9 @@ class TranslatorGenMixin: return None ty_addr: uint64 = uint64(trans._nonlocal_types) + idx * 8 ty_slot: str | t.CPtr = (t.CPtr)(ty_addr) - return (llvmlite.LLVMType | t.CPtr)(ty_slot[0]) + return (rawptr[llvmlite.LLVMType])(ty_slot[0]) - def is_nonlocal_name(self, trans: HT.Translator | t.CPtr, name: str) -> int: + def is_nonlocal_name(self, trans: rawptr[HT.Translator], name: str) -> int: """检查 name 是否在当前函数的 nonlocal 集合中""" if trans is None or name is None or trans._nonlocal_names is None: return 0 @@ -1237,7 +1237,7 @@ class TranslatorGenMixin: return 1 return 0 - def get_nonlocal_index(self, trans: HT.Translator | t.CPtr, name: str) -> int: + def get_nonlocal_index(self, trans: rawptr[HT.Translator], name: str) -> int: """获取 nonlocal 变量在 env 中的索引(0-based),找不到返回 -1""" if trans is None or name is None or trans._nonlocal_names is None: return -1 @@ -1250,7 +1250,7 @@ class TranslatorGenMixin: return i return -1 - def clear_scope_names(self, trans: HT.Translator | t.CPtr): + def clear_scope_names(self, trans: rawptr[HT.Translator]): """清空当前函数的 global/nonlocal 名称集合(进入新函数时调用)""" if trans is None: return diff --git a/App/lib/core/Gen/Type/TypeGenBase.vp b/App/lib/core/Gen/Type/TypeGenBase.vp index 1bb21fd..1c82d2a 100644 --- a/App/lib/core/Gen/Type/TypeGenBase.vp +++ b/App/lib/core/Gen/Type/TypeGenBase.vp @@ -260,7 +260,7 @@ class TypeGenBase: """设置当前正在编译的模块 SHA1(Phase1 在模块开始翻译前调用)""" self.CurrentModuleSha1 = sha1 def _dbg_check_ast_floats(self, mb: rawptr[memhub.MemBuddy], - tree: ast.AST | t.CPtr, tag: str): + tree: rawptr[ast.AST], tag: str): """已移除调试插桩(占位保留签名,避免外部调用引用失败)""" pass def set_generic_context(self, tp_names: list[str] | t.CPtr, diff --git a/App/lib/core/Gen/Type/TypeGenCType.vp b/App/lib/core/Gen/Type/TypeGenCType.vp index d0e353c..2cc0744 100644 --- a/App/lib/core/Gen/Type/TypeGenCType.vp +++ b/App/lib/core/Gen/Type/TypeGenCType.vp @@ -439,7 +439,7 @@ class TypeGenCType(TypeGenBase.TypeGenBase): vn: sizet = len(self.CTypedefVisiting) if vn > 0: self.CTypedefVisiting.pop() - def _is_ctypedef_annotation(self, annotation: ast.AST | t.CPtr) -> int: + def _is_ctypedef_annotation(self, annotation: rawptr[ast.AST]) -> int: """检测类型注解是否为 t.CTypedef Args: @@ -453,7 +453,7 @@ class TypeGenCType(TypeGenBase.TypeGenBase): k_v: int = annotation.kind() if k_v != ast.ASTKind.Attribute: return 0 - at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(annotation) + at: rawptr[ast.Attribute] = rawptr[ast.Attribute](annotation) # 字段访问改用 ast 模块访问器(直接访问 at.attr 可能按 stub 类型生成错误 GEP, # 读垃圾地址 → strcmp 崩溃)。 at_attr_v: str = ast.attribute_get_attr(at) @@ -468,10 +468,10 @@ class TypeGenCType(TypeGenBase.TypeGenBase): if sep_ch_d != '\0' and sep_ch_d != ' ' and sep_ch_d != '\n' \ and sep_ch_d != '\r' and sep_ch_d != '\t' and sep_ch_d != '|': return 0 - at_val_v: ast.AST | t.CPtr = ast.attribute_get_value(at) + at_val_v: rawptr[ast.AST] = ast.attribute_get_value(at) if at_val_v is None or at_val_v.kind() != ast.ASTKind.Name: return 0 - mod_nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(at_val_v) + mod_nm: rawptr[ast.Name] = rawptr[ast.Name](at_val_v) mod_id_v: str = ast.name_get_id(mod_nm) if mod_id_v is None: return 0 @@ -484,7 +484,7 @@ class TypeGenCType(TypeGenBase.TypeGenBase): return 0 return 1 def ScanCTypedefDeclarations(self, pool: rawptr[memhub.MemBuddy], - tree: ast.AST | t.CPtr) -> int: + tree: rawptr[ast.AST]) -> int: """扫描 AST 顶层节点,注册所有 NAME: t.CTypedef = Type 声明 在 _translate_module_level 中、模块级变量预注册之前调用, @@ -499,19 +499,19 @@ class TypeGenCType(TypeGenBase.TypeGenBase): """ if pool is None or tree is None: return 0 - ch: list[ast.AST | t.CPtr] | t.CPtr = tree.children + ch: list[rawptr[ast.AST]] | t.CPtr = tree.children if ch is None: return 0 n: sizet = len(ch) count: int = 0 i: sizet for i in range(n): - child: ast.AST | t.CPtr = ch.get(i) + child: rawptr[ast.AST] = ch.get(i) if child is None: continue if child.kind() != ast.ASTKind.AnnAssign: continue - aa: ast.AnnAssign | t.CPtr = (ast.AnnAssign | t.CPtr)(child) + aa: rawptr[ast.AnnAssign] = rawptr[ast.AnnAssign](child) if aa.annotation is None: continue # 检测注解是否为 t.CTypedef @@ -520,7 +520,7 @@ class TypeGenCType(TypeGenBase.TypeGenBase): # 提取目标名称(必须是 Name 节点) if aa.target is None or aa.target.kind() != ast.ASTKind.Name: continue - tgt: ast.Name | t.CPtr = (ast.Name | t.CPtr)(aa.target) + tgt: rawptr[ast.Name] = rawptr[ast.Name](aa.target) tgt_id_v: str = ast.name_get_id(tgt) if tgt_id_v is None: continue @@ -607,7 +607,7 @@ class TypeGenCType(TypeGenBase.TypeGenBase): line_start = i + 1 i += 1 return count - def _eval_const_int_expr(self, node: ast.AST | t.CPtr, + def _eval_const_int_expr(self, node: rawptr[ast.AST], pool: rawptr[memhub.MemBuddy] = None, from_imports: str = None, imported_modules: str = None, @@ -632,7 +632,7 @@ class TypeGenCType(TypeGenBase.TypeGenBase): # Constant: 整数字面量 if k == ast.ASTKind.Constant: - cn: ast.Constant | t.CPtr = (ast.Constant | t.CPtr)(node) + cn: rawptr[ast.Constant] = rawptr[ast.Constant](node) if cn.const_kind == ast.CONST_INT: self.ConstEvalOk = 1 return cn.int_val @@ -641,7 +641,7 @@ class TypeGenCType(TypeGenBase.TypeGenBase): # Name: CDefine 常量名(本地表优先,未命中走跨模块查找) if k == ast.ASTKind.Name: - nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(node) + nm: rawptr[ast.Name] = rawptr[ast.Name](node) if nm.id is None: self.ConstEvalOk = 0 return 0 @@ -667,12 +667,12 @@ class TypeGenCType(TypeGenBase.TypeGenBase): # 复用跨模块 CDefine 查找:*:模块 → 源文件提取;re-export 常量由 # _lookup_cross_module_cdefine 的 from-import 递归子模块兜底) if k == ast.ASTKind.Attribute: - at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(node) + at: rawptr[ast.Attribute] = rawptr[ast.Attribute](node) if at.attr is None: self.ConstEvalOk = 0 return 0 if at.value is not None and at.value.kind() == ast.ASTKind.Name: - at_mod: ast.Name | t.CPtr = (ast.Name | t.CPtr)(at.value) + at_mod: rawptr[ast.Name] = rawptr[ast.Name](at.value) if at_mod.id is not None: if (from_imports is not None or imported_modules is not None) \ and pool is not None: @@ -694,7 +694,7 @@ class TypeGenCType(TypeGenBase.TypeGenBase): # BinOp: 算术/位运算 if k == ast.ASTKind.BinOp: - bop: ast.BinOp | t.CPtr = (ast.BinOp | t.CPtr)(node) + bop: rawptr[ast.BinOp] = rawptr[ast.BinOp](node) # 递归计算左操作数 lv: int = self._eval_const_int_expr(bop.left, pool, from_imports, imported_modules, depth + 1) if self.ConstEvalOk == 0: diff --git a/App/lib/core/Gen/Type/TypeGenErr.vp b/App/lib/core/Gen/Type/TypeGenErr.vp index dc68325..0ab81a6 100644 --- a/App/lib/core/Gen/Type/TypeGenErr.vp +++ b/App/lib/core/Gen/Type/TypeGenErr.vp @@ -105,7 +105,7 @@ class TypeGenErr(TypeGenBase.TypeGenBase): if err_msg is None or err_msg[0] == 0: err_msg = "语法错误" stdio.printf("SyntaxError: %s\n", err_msg) - def fatal_error(self, node: ast.AST | t.CPtr, msg: str, + def fatal_error(self, node: rawptr[ast.AST], msg: str, err_type: str = "SyntaxError", col_start: int = 0, col_end: int = 0): """以 Python 风格报错并退出(支持多帧、错误类型、列范围) @@ -181,35 +181,35 @@ class TypeGenErr(TypeGenBase.TypeGenBase): stdio.fflush(None) sys.exit(1) - def fatal_type_error(self, node: ast.AST | t.CPtr, msg: str, + def fatal_type_error(self, node: rawptr[ast.AST], msg: str, col_start: int = 0, col_end: int = 0): """以 Python 风格报错并退出(TypeError 版本)""" self.fatal_error(node, msg, "TypeError", col_start, col_end) def try_extract_callable_ret(self, pool: rawptr[memhub.MemBuddy], - annot: ast.AST | t.CPtr, + annot: rawptr[ast.AST], imported_modules: str, from_imports: str, - trans: HT.Translator | t.CPtr) -> llvmlite.LLVMType | t.CPtr: + trans: rawptr[HT.Translator]) -> rawptr[llvmlite.LLVMType]: """提取 t.Callable 注解的返回类型 LLVMType;非 Callable 注解返回 None""" if annot is None or annot.kind() != ast.ASTKind.Subscript: return None - sub_cr: ast.Subscript | t.CPtr = (ast.Subscript | t.CPtr)(annot) + sub_cr: rawptr[ast.Subscript] = rawptr[ast.Subscript](annot) if sub_cr.value is None or sub_cr.value.kind() != ast.ASTKind.Attribute: return None - at_cr: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(sub_cr.value) + at_cr: rawptr[ast.Attribute] = rawptr[ast.Attribute](sub_cr.value) if at_cr.attr is None or string.strcmp(at_cr.attr, "Callable") != 0: return None # slice 必须是 Tuple(elts=[args_list, ret_node]) if sub_cr.slice is None or sub_cr.slice.kind() != ast.ASTKind.Tuple: return None - tp_cr: ast.Tuple | t.CPtr = (ast.Tuple | t.CPtr)(sub_cr.slice) + tp_cr: rawptr[ast.Tuple] = rawptr[ast.Tuple](sub_cr.slice) if tp_cr.elts is None or len(tp_cr.elts) != 2: return None - ret_node_cr: ast.AST | t.CPtr = tp_cr.elts.get(1) + ret_node_cr: rawptr[ast.AST] = tp_cr.elts.get(1) if ret_node_cr is None: return None return self.Gen.TypeGenResolve.resolve_annotation_type(pool, ret_node_cr, imported_modules, from_imports, trans, 0) - def has_decorator_marker(self, node: ast.AST | t.CPtr, + def has_decorator_marker(self, node: rawptr[ast.AST], marker_name: str, depth: int = 0) -> int: """检测类型注解中是否包含指定的装饰器标记""" @@ -225,7 +225,7 @@ class TypeGenErr(TypeGenBase.TypeGenBase): # Attribute 节点: t.CExtern, t.State, t.CExport, t.CInline if k == ast.ASTKind.Attribute: - at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(node) + at: rawptr[ast.Attribute] = rawptr[ast.Attribute](node) if at.attr is not None: if string.strcmp(at.attr, marker_name) == 0: return 1 @@ -233,7 +233,7 @@ class TypeGenErr(TypeGenBase.TypeGenBase): # BinOp 节点: int | t.CExtern(递归检测左右子节点) if k == ast.ASTKind.BinOp: - bop: ast.BinOp | t.CPtr = (ast.BinOp | t.CPtr)(node) + bop: rawptr[ast.BinOp] = rawptr[ast.BinOp](node) if self.has_decorator_marker(bop.left, marker_name, depth + 1) != 0: return 1 if self.has_decorator_marker(bop.right, marker_name, depth + 1) != 0: @@ -241,7 +241,7 @@ class TypeGenErr(TypeGenBase.TypeGenBase): return 0 return 0 - def is_pass_body(self, body: list[ast.AST | t.CPtr] | t.CPtr) -> int: + def is_pass_body(self, body: list[rawptr[ast.AST]] | t.CPtr) -> int: """检测函数体是否为 pass(空体或仅含 pass 语句)""" if body is None: return 1 @@ -249,19 +249,19 @@ class TypeGenErr(TypeGenBase.TypeGenBase): if bn == 0: return 1 if bn == 1: - stmt: ast.AST | t.CPtr = body.get(0) + stmt: rawptr[ast.AST] = body.get(0) if stmt is not None and stmt.kind() == ast.ASTKind.Pass: return 1 return 0 # 获取 LLVM 整数类型的位宽 # 实现已收拢到 TSpec.SpecTypeBits(该块在 TypeSpec 模块中的唯一实现),此处只做委托。 # 私有调用点(self.get_llvm_type_bits)保持原样不受影响。 - def get_llvm_type_bits(self, ty: llvmlite.LLVMType | t.CPtr) -> int: + def get_llvm_type_bits(self, ty: rawptr[llvmlite.LLVMType]) -> int: """获取 LLVM 整数类型的位宽,非整数类型返回 0(委托 SpecTypeBits)""" return TSpec.SpecTypeBits(ty) def infer_expr_type(self, pool: rawptr[memhub.MemBuddy], - node: ast.AST | t.CPtr, - param_types: str) -> llvmlite.LLVMType | t.CPtr: + node: rawptr[ast.AST], + param_types: str) -> rawptr[llvmlite.LLVMType]: """推断表达式的 LLVM 类型 param_types 格式: "name:bits,name:bits,..." @@ -275,7 +275,7 @@ class TypeGenErr(TypeGenBase.TypeGenBase): return llvmlite.Int32(pool) elif k == ast.ASTKind.Name: - nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(node) + nm: rawptr[ast.Name] = rawptr[ast.Name](node) if nm.id is not None and param_types is not None: # 在 param_types 中查找: "name:bits" 格式 # 键按精确长度分配:固定 64 缓冲 + snprintf("%s:") 会静默截断超长参数名, @@ -306,10 +306,10 @@ class TypeGenErr(TypeGenBase.TypeGenBase): return llvmlite.Int32(pool) elif k == ast.ASTKind.BinOp: - binop: ast.BinOp | t.CPtr = (ast.BinOp | t.CPtr)(node) - lhs_ty: llvmlite.LLVMType | t.CPtr = self.infer_expr_type( + binop: rawptr[ast.BinOp] = rawptr[ast.BinOp](node) + lhs_ty: rawptr[llvmlite.LLVMType] = self.infer_expr_type( pool, binop.left, param_types) - rhs_ty: llvmlite.LLVMType | t.CPtr = self.infer_expr_type( + rhs_ty: rawptr[llvmlite.LLVMType] = self.infer_expr_type( pool, binop.right, param_types) lhs_bits: int = self.get_llvm_type_bits(lhs_ty) rhs_bits: int = self.get_llvm_type_bits(rhs_ty) @@ -319,20 +319,20 @@ class TypeGenErr(TypeGenBase.TypeGenBase): return llvmlite.Int32(pool) def infer_return_type(self, pool: rawptr[memhub.MemBuddy], - body: list[ast.AST | t.CPtr] | t.CPtr, - param_types: str) -> llvmlite.LLVMType | t.CPtr: + body: list[rawptr[ast.AST]] | t.CPtr, + param_types: str) -> rawptr[llvmlite.LLVMType]: """扫描函数体中的 return 语句,推断返回类型""" if body is None: return llvmlite.Int32(pool) - ret_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int32(pool) + ret_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int32(pool) bn: sizet = len(body) for bi in range(bn): - stmt: ast.AST | t.CPtr = body.get(bi) + stmt: rawptr[ast.AST] = body.get(bi) if stmt is not None and stmt.kind() == ast.ASTKind.Return: rt: ast.Return | t.CPtr = (ast.Return | t.CPtr)(stmt) if rt.value is not None: - expr_ty: llvmlite.LLVMType | t.CPtr = self.infer_expr_type( + expr_ty: rawptr[llvmlite.LLVMType] = self.infer_expr_type( pool, rt.value, param_types) if expr_ty is not None: cur_bits: int = self.get_llvm_type_bits(ret_ty) @@ -341,7 +341,7 @@ class TypeGenErr(TypeGenBase.TypeGenBase): ret_ty = expr_ty return ret_ty def body_has_value_return(self, pool: rawptr[memhub.MemBuddy], - body: list[ast.AST | t.CPtr] | t.CPtr) -> int: + body: list[rawptr[ast.AST]] | t.CPtr) -> int: """扫描函数体,判断是否存在返回非 None 值的 return 递归检查控制流语句(if/while/for/try/with/match)内层 return,但跳过 @@ -355,7 +355,7 @@ class TypeGenErr(TypeGenBase.TypeGenBase): return 0 bn: sizet = len(body) for bi in range(bn): - stmt: ast.AST | t.CPtr = body.get(bi) + stmt: rawptr[ast.AST] = body.get(bi) if stmt is None: continue k: int = stmt.kind() @@ -364,7 +364,7 @@ class TypeGenErr(TypeGenBase.TypeGenBase): if rt.value is not None: # return None(CONST_NONE)不算返回非 None 值 if rt.value.kind() == ast.ASTKind.Constant: - cn: ast.Constant | t.CPtr = (ast.Constant | t.CPtr)(rt.value) + cn: rawptr[ast.Constant] = rawptr[ast.Constant](rt.value) if cn.const_kind == ast.CONST_NONE: continue return 1 @@ -373,13 +373,13 @@ class TypeGenErr(TypeGenBase.TypeGenBase): elif k == ast.ASTKind.If or k == ast.ASTKind.While or \ k == ast.ASTKind.For or k == ast.ASTKind.Try or \ k == ast.ASTKind.With or k == ast.ASTKind.Match: - sub: list[ast.AST | t.CPtr] | t.CPtr = stmt.children + sub: list[rawptr[ast.AST]] | t.CPtr = stmt.children if sub is not None and len(sub) > 0: if self.body_has_value_return(pool, sub) != 0: return 1 return 0 def build_param_types_str(self, pool: rawptr[memhub.MemBuddy], - args_node: ast.AST | t.CPtr) -> str: + args_node: rawptr[ast.AST]) -> str: """构建参数类型编码字符串 "name:bits,name:bits,..." [D5·截断纪律] 旧实现按 `an * 32 + 1` 预估缓冲,再用 `_strappend` 以 @@ -392,10 +392,10 @@ class TypeGenErr(TypeGenBase.TypeGenBase): """ if args_node is None: return None - ags: ast.Arguments | t.CPtr = (ast.Arguments | t.CPtr)(args_node) + ags: rawptr[ast.Arguments] = rawptr[ast.Arguments](args_node) if ags.args is None: return None - alist: list[ast.AST | t.CPtr] | t.CPtr = ags.args + alist: list[rawptr[ast.AST]] | t.CPtr = ags.args an: sizet = len(alist) if an == 0: return None @@ -407,7 +407,7 @@ class TypeGenErr(TypeGenBase.TypeGenBase): bound: sizet = 1 # 末尾 NUL pre_i: sizet for pre_i in range(an): - pre_arg: ast.Arg | t.CPtr = (ast.Arg | t.CPtr)(alist.get(pre_i)) + pre_arg: rawptr[ast.Arg] = rawptr[ast.Arg](alist.get(pre_i)) if pre_arg is None or pre_arg.arg is None: continue bound += string.strlen(pre_arg.arg) + 1 + 12 + 1 @@ -418,19 +418,19 @@ class TypeGenErr(TypeGenBase.TypeGenBase): # 2) 单遍:解析类型 → 就地格式化条目 → 立即拼接(缓冲为上界,不会截断) cnt: sizet = 0 - i32_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int32(pool) + i32_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int32(pool) for ai in range(an): - arg: ast.Arg | t.CPtr = (ast.Arg | t.CPtr)(alist.get(ai)) + arg: rawptr[ast.Arg] = rawptr[ast.Arg](alist.get(ai)) if arg is None or arg.arg is None: continue - param_ty: llvmlite.LLVMType | t.CPtr = i32_ty + param_ty: rawptr[llvmlite.LLVMType] = i32_ty if arg.annotation is not None: # 统一口径:CTypedef 动态表优先,miss 回退 map_t_type # (阶段 2:删除 map_t_type 硬编码别名后,BYTE 等靠库 typedef) if arg.annotation.kind() == ast.ASTKind.Attribute: - at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(arg.annotation) + at: rawptr[ast.Attribute] = rawptr[ast.Attribute](arg.annotation) if at.attr is not None: - resolved: llvmlite.LLVMType | t.CPtr = self.Gen.TypeGenResolve.resolve_typedef_or_map(pool, at.attr, None, None) + resolved: rawptr[llvmlite.LLVMType] = self.Gen.TypeGenResolve.resolve_typedef_or_map(pool, at.attr, None, None) if resolved is not None: param_ty = resolved bits: int = self.get_llvm_type_bits(param_ty) diff --git a/App/lib/core/Gen/Type/TypeGenResolve.vp b/App/lib/core/Gen/Type/TypeGenResolve.vp index d900da2..a6c9ae8 100644 --- a/App/lib/core/Gen/Type/TypeGenResolve.vp +++ b/App/lib/core/Gen/Type/TypeGenResolve.vp @@ -36,14 +36,14 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): """类型映射/注解解析(map_t_type/resolve_annotation_type 等)""" def _get_type_name_from_annotation(self, pool: rawptr[memhub.MemBuddy], - node: ast.AST | t.CPtr) -> str: + node: rawptr[ast.AST]) -> str: """从类型注解节点提取类型名(支持 Name/Attribute/BinOp)""" if node is None: return None k: int = node.kind() # Constant: 字符串注解,直接返回字符串值 if k == ast.ASTKind.Constant: - cn: ast.Constant | t.CPtr = (ast.Constant | t.CPtr)(node) + cn: rawptr[ast.Constant] = rawptr[ast.Constant](node) cn_val_v: str = ast.constant_get_str_val(cn) if cn.const_kind == ast.CONST_STR and cn_val_v is not None: return cn_val_v @@ -51,7 +51,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): # Name: 直接返回 id(泛型特化上下文内先做 T 替换,避免 ndarray[T] 中 T 未解析 # 导致 _specialize_generic_class("ndarray", ["T"]) 二次递归崩溃) if k == ast.ASTKind.Name: - nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(node) + nm: rawptr[ast.Name] = rawptr[ast.Name](node) # 直接用字段:ast.name_get_id 是跨模块访问器,Phase A 阶段 exprs.vp # text.ll 未生成时该访问器是 stub(declare 无体)返回 None,导致 # 泛型类型实参提取失败(list[int] 的 int 被误判未提取)。 @@ -61,11 +61,11 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): # Phase A 阶段对应 text.ll 未生成时是 stub 无体返回 None → tn_raw 为空 → # Box[int](v) 泛型实参提取失败,与 Name 分支 L53-55 同源)。 if k == ast.ASTKind.Attribute: - at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(node) + at: rawptr[ast.Attribute] = rawptr[ast.Attribute](node) if at.attr is None: return None if at.value is not None and at.value.kind() == ast.ASTKind.Name: - mod_nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(at.value) + mod_nm: rawptr[ast.Name] = rawptr[ast.Name](at.value) if mod_nm.id is not None: total: sizet = string.strlen(mod_nm.id) + 1 + string.strlen(at.attr) + 1 buf: str = pool.alloc(total) @@ -83,7 +83,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): # None → 注册失败 → 同 vpi 后续裸类名 lookup_ctypedef 失败 fail-fast, # VKernel idt.vp irq_handler_t 根因)。 if k == ast.ASTKind.Subscript: - sub_s: ast.Subscript | t.CPtr = (ast.Subscript | t.CPtr)(node) + sub_s: rawptr[ast.Subscript] = rawptr[ast.Subscript](node) val_s: str = self._get_type_name_from_annotation(pool, sub_s.value) if val_s is None: return None @@ -102,7 +102,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): return None # BinOp (BitOr): 构造 "left|right" 格式 if k == ast.ASTKind.BinOp: - bop: ast.BinOp | t.CPtr = (ast.BinOp | t.CPtr)(node) + bop: rawptr[ast.BinOp] = rawptr[ast.BinOp](node) if bop.op == ast.OpKind.BitOr: left_str: str = self._get_type_name_from_annotation(pool, ast.binop_get_left(bop)) right_str: str = self._get_type_name_from_annotation(pool, ast.binop_get_right(bop)) @@ -118,7 +118,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): return None return None def _subscript_slice_to_str(self, pool: rawptr[memhub.MemBuddy], - node: ast.AST | t.CPtr) -> str: + node: rawptr[ast.AST]) -> str: """Subscript slice 节点转类型字符串(递归,支持 Name/Attribute/BinOp/Constant/List/Tuple/Subscript)""" if node is None: return None @@ -129,7 +129,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): return self._get_type_name_from_annotation(pool, node) # Constant:数值/字符串字面量(t.CArray[elem, 104] 的 count 等) if k2 == ast.ASTKind.Constant: - cn2: ast.Constant | t.CPtr = (ast.Constant | t.CPtr)(node) + cn2: rawptr[ast.Constant] = rawptr[ast.Constant](node) if cn2.const_kind == ast.CONST_INT: buf2: str = pool.alloc(24) if buf2 is not None: @@ -147,11 +147,11 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): # 内**不带括号**输出("x, y"),否则 "t.Callable[([int], int)]" # 的显式括号 Tuple slice 会让 ast.parse_expression 解析失败。 if k2 == ast.ASTKind.Tuple: - tup: ast.Tuple | t.CPtr = (ast.Tuple | t.CPtr)(node) + tup: rawptr[ast.Tuple] = rawptr[ast.Tuple](node) return self._list_elts_to_type_str(pool, tup.elts, "", "") return None def _list_elts_to_type_str(self, pool: rawptr[memhub.MemBuddy], - elts: list[ast.AST | t.CPtr] | t.CPtr, + elts: list[rawptr[ast.AST]] | t.CPtr, open_ch: str, close_ch: str) -> str: """元素列表转逗号分隔字符串(List/Tuple 共用),包上 open/close 括号 @@ -172,7 +172,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): total3: sizet = 2 # open + close(各按 1 字节算;实参为空串时多算无害) cnt3: sizet = 0 for i3 in range(n3): - e3: ast.AST | t.CPtr = elts.get(i3) + e3: rawptr[ast.AST] = elts.get(i3) if e3 is None: continue es3: str = self._subscript_slice_to_str(pool, e3) @@ -193,7 +193,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): string.strcat(buf4, open_ch) wrote3: sizet = 0 for i4 in range(n3): - e4: ast.AST | t.CPtr = elts.get(i4) + e4: rawptr[ast.AST] = elts.get(i4) if e4 is None: continue es4: str = self._subscript_slice_to_str(pool, e4) @@ -237,7 +237,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): 收敛同一类型的不同书写(ast.AST / AST → f467978339422f32.AST), 消除跨模块特化名分裂(undefined symbol: 7cadfe07e983fd90.list[AST].set 根因: - 一侧注解写 "list[ast.AST | t.CPtr]"、另一侧写 "list[AST | t.CPtr]", + 一侧注解写 "list[rawptr[ast.AST]]"、另一侧写 "list[AST | t.CPtr]", 生成两个不同特化名 → 结构体/方法注册与调用不一致)。 规则(自顶向下): @@ -495,7 +495,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): def _parse_type_string(self, pool: rawptr[memhub.MemBuddy], type_str: str, - ctx: int) -> ast.AST | t.CPtr: + ctx: int) -> rawptr[ast.AST]: """将类型名字符串解析为 AST 节点 正确处理 '|' 与 '.' 周围的空格(如 "ParsedArgs | t.CPtr"): @@ -533,9 +533,9 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): return None string.strncpy(left_buf, type_str, left_len) left_buf[left_len] = '\0' - left_node: ast.AST | t.CPtr = self._parse_type_string(pool, left_buf, ctx) + left_node: rawptr[ast.AST] = self._parse_type_string(pool, left_buf, ctx) # 右段前导空格由递归入口跳过 - right_node: ast.AST | t.CPtr = self._parse_type_string( + right_node: rawptr[ast.AST] = self._parse_type_string( pool, type_str + pipe_idx + 1, ctx) stdlib.free(left_buf) if left_node is not None and right_node is not None: @@ -587,8 +587,8 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): base_buf_m[base_len_m] = '\0' string.strncpy(inner_buf_m, type_str + bracket_idx + 1, inner_len_m) inner_buf_m[inner_len_m] = '\0' - base_node_m: ast.AST | t.CPtr = self._parse_type_string(pool, base_buf_m, ctx) - slice_node_m: ast.AST | t.CPtr = self._parse_type_string(pool, inner_buf_m, ctx) + base_node_m: rawptr[ast.AST] = self._parse_type_string(pool, base_buf_m, ctx) + slice_node_m: rawptr[ast.AST] = self._parse_type_string(pool, inner_buf_m, ctx) stdlib.free(base_buf_m) stdlib.free(inner_buf_m) if base_node_m is not None and slice_node_m is not None: @@ -601,18 +601,18 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): # 优先 ast.parse_expression(单表达式入口,返回 Expression 包装节点) expr_node: ast.Expression | t.CPtr = ast.parse_expression(type_str, pool) if expr_node is not None: - expr_body: ast.AST | t.CPtr = expr_node.body + expr_body: rawptr[ast.AST] = expr_node.body if expr_body is not None: return expr_body # 备选:ast.parse 文件级(TPV parser 的 _parse_test 单表达式入口对 # 复杂 slice 如 "t.Callable[[int], int]" 解析失败,但文件级 # _parse_expr_stmt 可解析裸表达式语句——vpi 同语法已验证 # parse_tokens 成功,故此处用文件级 parse 兜底) - tree_s: ast.AST | t.CPtr = ast.parse(type_str, pool) + tree_s: rawptr[ast.AST] = ast.parse(type_str, pool) if tree_s is not None: - ch_s: list[ast.AST | t.CPtr] | t.CPtr = tree_s.children + ch_s: list[rawptr[ast.AST]] | t.CPtr = tree_s.children if ch_s is not None and len(ch_s) > 0: - st0: ast.AST | t.CPtr = ch_s.get(0) + st0: rawptr[ast.AST] = ch_s.get(0) if st0 is not None and st0.kind() == ast.ASTKind.Expr: ex0: ast.Expr | t.CPtr = (ast.Expr | t.CPtr)(st0) if ex0.value is not None: @@ -637,7 +637,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): return None string.strncpy(mod_buf, type_str, mod_len) mod_buf[mod_len] = '\0' - module_node: ast.AST | t.CPtr = ast.Name(pool, mod_buf, ctx) + module_node: rawptr[ast.AST] = ast.Name(pool, mod_buf, ctx) # attr 段 trim 尾随空格 attr_str: str = type_str + dot_idx + 1 attr_len: sizet = string.strlen(attr_str) @@ -649,7 +649,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): return None string.strncpy(attr_buf, attr_str, attr_len) attr_buf[attr_len] = '\0' - attr_node: ast.AST | t.CPtr = ast.Attribute(pool, module_node, attr_buf, ctx) + attr_node: rawptr[ast.AST] = ast.Attribute(pool, module_node, attr_buf, ctx) stdlib.free(mod_buf) stdlib.free(attr_buf) return attr_node @@ -660,7 +660,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): return None string.strncpy(name_buf, type_str, seg_len) name_buf[seg_len] = '\0' - name_node: ast.AST | t.CPtr = ast.Name(pool, name_buf, ctx) + name_node: rawptr[ast.AST] = ast.Name(pool, name_buf, ctx) stdlib.free(name_buf) return name_node def set_current_file(self, file_path: str) -> None: @@ -673,7 +673,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): name: str, imported_modules: str, from_imports: str, - trans: HT.Translator | t.CPtr = None) -> llvmlite.LLVMType | t.CPtr: + trans: rawptr[HT.Translator] = None) -> rawptr[llvmlite.LLVMType]: """统一口径:CTypedef 动态表优先展开,miss 回退 map_t_type 硬编码 供 resolve_annotation_type 之外的旁路调用点(TypeGenErr/ClassGenEnum/ @@ -686,10 +686,10 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): ts_rt: str = self.Gen.TypeGenCType.lookup_ctypedef(name) if ts_rt is not None and self.Gen.TypeGenCType.CTypedefFound != 0: if self.Gen.TypeGenCType._ctypedef_push_visiting(pool, name) == 0: - inner_rt: ast.AST | t.CPtr = self._parse_type_string(pool, ts_rt, ast.ASTCtx.Load) + inner_rt: rawptr[ast.AST] = self._parse_type_string(pool, ts_rt, ast.ASTCtx.Load) if inner_rt is not None: self.Gen.TypeGenCType.CTypedefResolveDepth += 1 - ity_rt: llvmlite.LLVMType | t.CPtr = self.resolve_annotation_type( + ity_rt: rawptr[llvmlite.LLVMType] = self.resolve_annotation_type( pool, inner_rt, imported_modules, from_imports, trans, 1) self.Gen.TypeGenCType.CTypedefResolveDepth -= 1 self.Gen.TypeGenCType._ctypedef_pop_visiting() @@ -701,11 +701,11 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): # __sizeof__/REnum 等旁路查表(get_type_size_bytes 等)也能命中 builtins。 btd_r: str = self._lookup_builtins_typedef(pool, name) if btd_r is not None: - btd_node_r: ast.AST | t.CPtr = self._parse_type_string(pool, btd_r, ast.ASTCtx.Load) + btd_node_r: rawptr[ast.AST] = self._parse_type_string(pool, btd_r, ast.ASTCtx.Load) if btd_node_r is not None: if self.Gen.TypeGenCType.CTypedefResolveDepth < TypeGenMixin.MAX_CTYPEDEF_DEPTH: self.Gen.TypeGenCType.CTypedefResolveDepth += 1 - btd_ty_r: llvmlite.LLVMType | t.CPtr = self.resolve_annotation_type( + btd_ty_r: rawptr[llvmlite.LLVMType] = self.resolve_annotation_type( pool, btd_node_r, imported_modules, from_imports, trans, 1) self.Gen.TypeGenCType.CTypedefResolveDepth -= 1 if btd_ty_r is not None: @@ -718,11 +718,11 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): if lib_ts is None: lib_ts = self._lookup_library_typedef(pool, "w32.win32base", name) if lib_ts is not None: - lib_node: ast.AST | t.CPtr = self._parse_type_string(pool, lib_ts, ast.ASTCtx.Load) + lib_node: rawptr[ast.AST] = self._parse_type_string(pool, lib_ts, ast.ASTCtx.Load) if lib_node is not None: if self.Gen.TypeGenCType.CTypedefResolveDepth < TypeGenMixin.MAX_CTYPEDEF_DEPTH: self.Gen.TypeGenCType.CTypedefResolveDepth += 1 - lib_ty: llvmlite.LLVMType | t.CPtr = self.resolve_annotation_type( + lib_ty: rawptr[llvmlite.LLVMType] = self.resolve_annotation_type( pool, lib_node, imported_modules, from_imports, trans, 1) self.Gen.TypeGenCType.CTypedefResolveDepth -= 1 if lib_ty is not None: @@ -739,7 +739,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): """ if name is None: return 0 - ty_sz: llvmlite.LLVMType | t.CPtr = self.resolve_typedef_or_map(pool, name, imported_modules, from_imports) + ty_sz: rawptr[llvmlite.LLVMType] = self.resolve_typedef_or_map(pool, name, imported_modules, from_imports) if ty_sz is None: return 0 bits_sz: int = self.Gen.TypeGenErr.get_llvm_type_bits(ty_sz) @@ -1291,7 +1291,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): and string.strcmp(ts_x, type_str) != 0: return self._expand_typedef_ref(pool, ts_x, depth + 1) return type_str - def _long_llvm_ty(self, pool: rawptr[memhub.MemBuddy]) -> llvmlite.LLVMType | t.CPtr: + def _long_llvm_ty(self, pool: rawptr[memhub.MemBuddy]) -> rawptr[llvmlite.LLVMType]: """C 的 long / unsigned long 的目标平台 LLVM 类型 Windows 目标(LLP64)下 long = 32 位——对齐 TPC @@ -1312,7 +1312,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): return llvmlite.Int32(pool) return llvmlite.Int64(pool) def map_t_type(self, pool: rawptr[memhub.MemBuddy], - type_name: str) -> llvmlite.LLVMType | t.CPtr: + type_name: str) -> rawptr[llvmlite.LLVMType]: """将 t.CXxx / c.CXxx 类型名映射到 LLVMType 注意: str = i8* = str = bytes @@ -1431,7 +1431,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): elif string.strcmp(type_name, "double") == 0: return llvmlite.Double(pool) return None - def _is_t_attr(self, node: ast.AST | t.CPtr, + def _is_t_attr(self, node: rawptr[ast.AST], attr_name: str, imported_modules: str) -> int: """检测节点是否是 t.attr_name 形式(含 from t import attr_name 的裸名) @@ -1445,14 +1445,14 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): if node is None or attr_name is None: return 0 if node.kind() == ast.ASTKind.Attribute: - at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(node) + at: rawptr[ast.Attribute] = rawptr[ast.Attribute](node) if at.attr is None: return 0 if string.strcmp(at.attr, attr_name) != 0: return 0 if at.value is None or at.value.kind() != ast.ASTKind.Name: return 0 - val_nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(at.value) + val_nm: rawptr[ast.Name] = rawptr[ast.Name](at.value) if val_nm.id is None: return 0 if string.strcmp(val_nm.id, "t") == 0: @@ -1462,7 +1462,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): return 0 # 裸名形式: from t import attr_name → Name(id == attr_name) if node.kind() == ast.ASTKind.Name: - nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(node) + nm: rawptr[ast.Name] = rawptr[ast.Name](node) if nm.id is None: return 0 if string.strcmp(nm.id, attr_name) != 0: @@ -1472,17 +1472,17 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): return 0 return 1 return 0 - def _is_cptr_marker(self, node: ast.AST | t.CPtr, + def _is_cptr_marker(self, node: rawptr[ast.AST], imported_modules: str) -> int: """检测节点是否为 CPtr 指针标记,返回 1=是 / 0=否""" if self._is_t_attr(node, "CPtr", imported_modules) != 0: return 1 if node is not None and node.kind() == ast.ASTKind.Name: - nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(node) + nm: rawptr[ast.Name] = rawptr[ast.Name](node) if nm.id is not None and string.strcmp(nm.id, "CPtr") == 0: return 1 return 0 - def _is_cptr_subscript(self, node: ast.AST | t.CPtr) -> int: + def _is_cptr_subscript(self, node: rawptr[ast.AST]) -> int: """检测节点是否为 t.CPtr[T] 下标指针类型(t.CPtr[t.CPtr] / t.CPtr[int] 等) 用于联合类型 X | t.CPtr[T] 的指针层级合并(TPC 联合合并规则: @@ -1491,29 +1491,29 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): """ if node is None or node.kind() != ast.ASTKind.Subscript: return 0 - sub: ast.Subscript | t.CPtr = (ast.Subscript | t.CPtr)(node) + sub: rawptr[ast.Subscript] = rawptr[ast.Subscript](node) if sub.value is None or sub.value.kind() != ast.ASTKind.Attribute: return 0 - at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(sub.value) + at: rawptr[ast.Attribute] = rawptr[ast.Attribute](sub.value) if at.attr is None or string.strcmp(at.attr, "CPtr") != 0: return 0 if at.value is None or at.value.kind() != ast.ASTKind.Name: return 0 - nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(at.value) + nm: rawptr[ast.Name] = rawptr[ast.Name](at.value) if nm.id is None or string.strcmp(nm.id, "t") != 0: return 0 return 1 - def _is_cvoid_marker(self, node: ast.AST | t.CPtr, + def _is_cvoid_marker(self, node: rawptr[ast.AST], imported_modules: str) -> int: """检测节点是否为 CVoid 指针标记,返回 1=是 / 0=否""" if self._is_t_attr(node, "CVoid", imported_modules) != 0: return 1 if node is not None and node.kind() == ast.ASTKind.Name: - nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(node) + nm: rawptr[ast.Name] = rawptr[ast.Name](node) if nm.id is not None and string.strcmp(nm.id, "CVoid") == 0: return 1 return 0 - def annotation_to_str(self, annot: ast.AST | t.CPtr) -> str: + def annotation_to_str(self, annot: rawptr[ast.AST]) -> str: """将类型注解 AST 转换为可读字符串,返回 None=无法提取 注意:返回的字符串可能由 malloc 分配,调用方无需释放(错误路径用)。 @@ -1524,21 +1524,21 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): # Constant 节点: 字符串注解 if k == ast.ASTKind.Constant: - cn: ast.Constant | t.CPtr = (ast.Constant | t.CPtr)(annot) + cn: rawptr[ast.Constant] = rawptr[ast.Constant](annot) if cn.const_kind == ast.CONST_STR and cn.str_val is not None: return cn.str_val return "" # Name 节点: bool, int, MemBuddy if k == ast.ASTKind.Name: - nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(annot) + nm: rawptr[ast.Name] = rawptr[ast.Name](annot) if nm.id is not None: return nm.id return "" # Attribute 节点: t.CBool, memhub.MemBuddy if k == ast.ASTKind.Attribute: - at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(annot) + at: rawptr[ast.Attribute] = rawptr[ast.Attribute](annot) if at.attr is None: return "" if at.value is not None: @@ -1555,7 +1555,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): # Subscript 节点: list[...], t.CArray[...] if k == ast.ASTKind.Subscript: - sub: ast.Subscript | t.CPtr = (ast.Subscript | t.CPtr)(annot) + sub: rawptr[ast.Subscript] = rawptr[ast.Subscript](annot) base: str = self.annotation_to_str(sub.value) if base is not None: buf2: str = stdlib.malloc(string.strlen(base) + 5) @@ -1567,7 +1567,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): # BinOp 节点: A | B (联合类型) if k == ast.ASTKind.BinOp: - bo: ast.BinOp | t.CPtr = (ast.BinOp | t.CPtr)(annot) + bo: rawptr[ast.BinOp] = rawptr[ast.BinOp](annot) left_s: str = self.annotation_to_str(bo.left) right_s: str = self.annotation_to_str(bo.right) if left_s is not None and right_s is not None: @@ -1599,7 +1599,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): if string.strcmp(name, "CInline") == 0: return 1 return 0 - def extract_class_name_from_annotation(self, node: ast.AST | t.CPtr, + def extract_class_name_from_annotation(self, node: rawptr[ast.AST], imported_modules: str, pool: rawptr[memhub.MemBuddy] = None, from_imports: str = None) -> str: @@ -1619,7 +1619,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): # Constant 节点: 字符串注解(如 'MemManager'),简单类名直接返回 if k == ast.ASTKind.Constant: - cn: ast.Constant | t.CPtr = (ast.Constant | t.CPtr)(node) + cn: rawptr[ast.Constant] = rawptr[ast.Constant](node) if cn.const_kind == ast.CONST_STR and cn.str_val is not None: # 仅处理简单类名(不含 . 和 |),复杂形式返回 None if string.strchr(cn.str_val, 46) is None and string.strchr(cn.str_val, 124) is None: @@ -1642,7 +1642,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): # Name 节点: MemBuddy → "MemBuddy" if k == ast.ASTKind.Name: - nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(node) + nm: rawptr[ast.Name] = rawptr[ast.Name](node) if nm.id is None: return None # 泛型特化上下文:T → 具体类型(特化方法体内局部变量注解 @@ -1669,14 +1669,14 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): # Attribute 节点: memhub.MemBuddy → "memhub.MemBuddy"(模块限定名) if k == ast.ASTKind.Attribute: - at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(node) + at: rawptr[ast.Attribute] = rawptr[ast.Attribute](node) if at.attr is None: return None # t.XXX 内置类型:返回 XXX(如 uint32 → "CUInt32T"), # 供 AnnotClassName 记录变量类型名(_type_name_unsigned 判断无符号性时使用)。 # 消费方(find_struct/lookup_field_by_class)对非结构体名返回 None 优雅降级。 if at.value is not None and at.value.kind() == ast.ASTKind.Name: - val_nm2: ast.Name | t.CPtr = (ast.Name | t.CPtr)(at.value) + val_nm2: rawptr[ast.Name] = rawptr[ast.Name](at.value) if val_nm2.id is not None and string.strcmp(val_nm2.id, "t") == 0: return at.attr # import 别名还原:val_nm2.id 可能是 "import X as Y" 的别名 Y @@ -1705,7 +1705,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): # BinOp 节点: 联合类型 A | B if k == ast.ASTKind.BinOp: - bop: ast.BinOp | t.CPtr = (ast.BinOp | t.CPtr)(node) + bop: rawptr[ast.BinOp] = rawptr[ast.BinOp](node) if bop.op == ast.OpKind.BitOr: left_is_cptr: int = self._is_cptr_marker(bop.left, imported_modules) right_is_cptr: int = self._is_cptr_marker(bop.right, imported_modules) @@ -1734,7 +1734,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): # list[AST | t.CPtr] → "list[ast.AST|t.CPtr]"(pool 可用时) # 与 resolve_annotation_type 的 mangled name 格式一致,使 find_struct 能找到特化结构体 if k == ast.ASTKind.Subscript: - sub: ast.Subscript | t.CPtr = (ast.Subscript | t.CPtr)(node) + sub: rawptr[ast.Subscript] = rawptr[ast.Subscript](node) if sub.value is None: return None # rawptr[T] 是内建裸指针(等价 t.CPtr[T]),AnnotClassName 应取 pointee @@ -1742,14 +1742,14 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): # lookup_field_by_class 报"类 'rawptr' 未注册"(json.__parser _peek # 参数 s: rawptr[ParseState] 根因)。 if sub.value.kind() == ast.ASTKind.Name: - rp_nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(sub.value) + rp_nm: rawptr[ast.Name] = rawptr[ast.Name](sub.value) if rp_nm.id is not None and string.strcmp(rp_nm.id, "rawptr") == 0: if sub.slice is not None: return self.extract_class_name_from_annotation( sub.slice, imported_modules, pool, from_imports) return None # 递归取 base 时必须把 from_imports 一并下传:否则同一份注解在派发名/查表键/ - # 注册键三处算出的 mangled 名不一致(如 list[ast.AST | t.CPtr] 的元素段), + # 注册键三处算出的 mangled 名不一致(如 list[rawptr[ast.AST]] 的元素段), # 出现「alloca 裸 list* / pass1 按 list[ast.ASTptr] / pass2 按 list[ast.ClassDefptr]」 # 的分裂崩溃。其余调用点均已传。 base_name: str = self.extract_class_name_from_annotation( @@ -1764,9 +1764,9 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): slice_name: str = None if sub.slice.kind() == ast.ASTKind.Tuple: # Tuple slice: dict[str, int] → "str,int" - sub_tup: ast.Tuple | t.CPtr = (ast.Tuple | t.CPtr)(sub.slice) + sub_tup: rawptr[ast.Tuple] = rawptr[ast.Tuple](sub.slice) if sub_tup.elts is not None: - tup_elts_sn: list[ast.AST | t.CPtr] | t.CPtr = sub_tup.elts + tup_elts_sn: list[rawptr[ast.AST]] | t.CPtr = sub_tup.elts tn_sn: sizet = len(tup_elts_sn) # 计算总长度 tup_total: sizet = 1 @@ -1774,7 +1774,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): for ti_sn in range(tn_sn): if ti_sn > 0: tup_total += 1 - elt_node: ast.AST | t.CPtr = tup_elts_sn.get(ti_sn) + elt_node: rawptr[ast.AST] = tup_elts_sn.get(ti_sn) elt_name_raw: str = self._get_type_name_from_annotation(pool, elt_node) elt_name: str = self._norm_type_arg_name(pool, elt_name_raw, from_imports) if elt_name is not None: @@ -1785,7 +1785,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): for ti_sn in range(tn_sn): if ti_sn > 0: string.strcat(tup_buf, ",") - elt_node2: ast.AST | t.CPtr = tup_elts_sn.get(ti_sn) + elt_node2: rawptr[ast.AST] = tup_elts_sn.get(ti_sn) elt_name2_raw: str = self._get_type_name_from_annotation(pool, elt_node2) elt_name2: str = self._norm_type_arg_name(pool, elt_name2_raw, from_imports) if elt_name2 is not None: @@ -1813,12 +1813,12 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): return None def _resolve_generic_subscript_ty(self, pool: rawptr[memhub.MemBuddy], - sub: ast.Subscript | t.CPtr, + sub: rawptr[ast.Subscript], gen_cls_name: str, - trans: HT.Translator | t.CPtr, + trans: rawptr[HT.Translator], imported_modules: str, from_imports: str, - depth: int = 0) -> llvmlite.LLVMType | t.CPtr: + depth: int = 0) -> rawptr[llvmlite.LLVMType]: """解析泛型类类型注解(特化或查找已注册结构体),失败返回 None""" if pool is None or sub is None or gen_cls_name is None: return None @@ -1827,35 +1827,35 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): # 用于函数 `-> tuple[str, t.CUnsignedShort]`(如 binascii.b2a_hqx) # 与调用端 `a, b = f()` 的打包/解包。 if string.strcmp(gen_cls_name, "tuple") == 0: - tp_elts: list[ast.AST | t.CPtr] | t.CPtr = None + tp_elts: list[rawptr[ast.AST]] | t.CPtr = None tp_count: sizet = 0 if sub.slice.kind() == ast.ASTKind.Tuple: - tp_tup: ast.Tuple | t.CPtr = (ast.Tuple | t.CPtr)(sub.slice) + tp_tup: rawptr[ast.Tuple] = rawptr[ast.Tuple](sub.slice) if tp_tup.elts is not None: tp_elts = tp_tup.elts tp_count = len(tp_elts) else: - # [FIX] elem_size=8(ast.AST | t.CPtr 指针 8 字节),原传 1 → get 只读 + # [FIX] elem_size=8(rawptr[ast.AST] 指针 8 字节),原传 1 → get 只读 # 1 字节拼指针(高 56 位残留)→ tuple 元素解析垃圾 - tp_single: list[ast.AST | t.CPtr] | t.CPtr = list[ast.AST | t.CPtr](pool, 8) + tp_single: list[rawptr[ast.AST]] | t.CPtr = list[rawptr[ast.AST]](pool, 8) if tp_single is not None: tp_single.append(sub.slice) tp_elts = tp_single tp_count = 1 if tp_count == 0 or tp_elts is None: return None - tup_head: llvmlite.ParamNode | t.CPtr = None - tup_tail: llvmlite.ParamNode | t.CPtr = None + tup_head: rawptr[llvmlite.Function] = None + tup_tail: rawptr[llvmlite.Function] = None tui: sizet for tui in range(tp_count): - tup_elt: ast.AST | t.CPtr = tp_elts.get(tui) + tup_elt: rawptr[ast.AST] = tp_elts.get(tui) if tup_elt is None: continue - tup_ety: llvmlite.LLVMType | t.CPtr = self.resolve_annotation_type( + tup_ety: rawptr[llvmlite.LLVMType] = self.resolve_annotation_type( pool, tup_elt, imported_modules, from_imports, trans, depth + 1) if tup_ety is None: return None - tup_node: llvmlite.ParamNode | t.CPtr = llvmlite.new_param_node(pool, tup_ety) + tup_node: rawptr[llvmlite.Function] = llvmlite.new_param_node(pool, tup_ety) if tup_node is None: return None if tup_head is None: @@ -1869,13 +1869,13 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): # 先收集类型实参名,再分配缓冲区拼接 mangled name(elem_size=8:str 是指针) gen_arg_names: list[str] | t.CPtr = list[str](pool, 8) if sub.slice.kind() == ast.ASTKind.Tuple: - gen_tp: ast.Tuple | t.CPtr = (ast.Tuple | t.CPtr)(sub.slice) - gen_elts: list[ast.AST | t.CPtr] | t.CPtr = gen_tp.elts + gen_tp: rawptr[ast.Tuple] = rawptr[ast.Tuple](sub.slice) + gen_elts: list[rawptr[ast.AST]] | t.CPtr = gen_tp.elts if gen_elts is not None: gen_en: sizet = len(gen_elts) gen_ei: sizet for gen_ei in range(gen_en): - gen_elt: ast.AST | t.CPtr = gen_elts.get(gen_ei) + gen_elt: rawptr[ast.AST] = gen_elts.get(gen_ei) gen_tn_raw: str = self._get_type_name_from_annotation(pool, gen_elt) # 类型参数 SHA1 规范化(ast.AST/AST → f467978339422f32.AST), # 与特化注册名一致,消除跨模块特化名分裂 @@ -1910,7 +1910,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): string.strcat(gen_mangled, gen_atn) string.strcat(gen_mangled, "]") # 查找已特化的 struct(特化由实例化调用 list[int](pool) 触发) - gen_spec_ty: llvmlite.LLVMType | t.CPtr = self.Gen.StructGen.get_struct_type(gen_mangled) + gen_spec_ty: rawptr[llvmlite.LLVMType] = self.Gen.StructGen.get_struct_type(gen_mangled) if gen_spec_ty is not None: # Phase B 补译泛型特化类方法体:Phase 1a 特化时只注册结构体不译方法体, # Phase B 解析字段类型命中已注册结构体时本会早返回 → 方法体永不生成 @@ -1929,7 +1929,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): # 未特化:尝试主动触发泛型特化(与 TPC _HandleSubscript 对齐) # 当 trans 可用时,检查是否是泛型模板并触发特化 if trans is not None: - template_cd_chk: ast.ClassDef | t.CPtr = self.Gen.ClassGenGeneric._find_generic_template(gen_cls_name) + template_cd_chk: rawptr[ast.ClassDef] = self.Gen.ClassGenGeneric._find_generic_template(gen_cls_name) if template_cd_chk is not None: type_args_chk: list[str] | t.CPtr = self.Gen.CallGenCtor._extract_type_args_from_slice( pool, sub.slice, from_imports) @@ -1943,7 +1943,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): if spec_name_chk is not None: gen_spec_ty = self.Gen.StructGen.get_struct_type(gen_mangled) # gen_mangled 由本函数自行拼接,而 _specialize_generic_class 内部还会对 - # 每个实参再规范化一次,两处命名可能不一致(如元素注解 `ast.AST | t.CPtr` + # 每个实参再规范化一次,两处命名可能不一致(如元素注解 `rawptr[ast.AST]` # 本函数拼 "list[.AST|t.CPtr]",特化侧规范化 "list[.ASTptr]") # → 按 gen_mangled 重查恒 miss → 静默退化为裸 list* → .get() 误分派截断。 # spec_name_chk 是特化侧返回的权威特化名,必须按它重查。 @@ -1974,11 +1974,11 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): # 未特化:返回 None(不报错,让后续流程处理) return None def resolve_annotation_type(self, pool: rawptr[memhub.MemBuddy], - node: ast.AST | t.CPtr, + node: rawptr[ast.AST], imported_modules: str, from_imports: str, - trans: HT.Translator | t.CPtr = None, - depth: int = 0) -> llvmlite.LLVMType | t.CPtr: + trans: rawptr[HT.Translator] = None, + depth: int = 0) -> rawptr[llvmlite.LLVMType]: """解析类型注解节点为 LLVMType Args: @@ -2002,18 +2002,18 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): # Constant 节点: 字符串注解(如 'MemManager'),当作无引号的 Name/Attribute/BinOp 处理 if k == ast.ASTKind.Constant: - cn: ast.Constant | t.CPtr = (ast.Constant | t.CPtr)(node) + cn: rawptr[ast.Constant] = rawptr[ast.Constant](node) if cn.const_kind == ast.CONST_NONE: return llvmlite.Void(pool) if cn.const_kind == ast.CONST_STR and cn.str_val is not None: - sub_node: ast.AST | t.CPtr = self._parse_type_string(pool, cn.str_val, ast.ASTCtx.Load) + sub_node: rawptr[ast.AST] = self._parse_type_string(pool, cn.str_val, ast.ASTCtx.Load) if sub_node is not None: return self.resolve_annotation_type(pool, sub_node, imported_modules, from_imports, trans, depth + 1) return None # Name 节点: str, int, bytes, from-import 名称, class 名称等 if k == ast.ASTKind.Name: - nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(node) + nm: rawptr[ast.Name] = rawptr[ast.Name](node) if nm.id is None: return None # 泛型类型参数 T 替换:在泛型特化上下文中,将 T 替换为具体类型 @@ -2061,7 +2061,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): self.Gen.TypeGenErr.fatal_error( nm, f"泛型类型实参污染:实参 '{gp_ta}' 包含类型参数名,无法特化", "TypeError") # 用具体类型名递归解析(支持 BinOp/Attribute 类型实参) - gp_sub_node: ast.AST | t.CPtr = self._parse_type_string(pool, gp_ta, nm.ctx) + gp_sub_node: rawptr[ast.AST] = self._parse_type_string(pool, gp_ta, nm.ctx) if gp_sub_node is not None: return self.resolve_annotation_type(pool, gp_sub_node, imported_modules, from_imports, trans, depth + 1) # 已规范化 sha1 前缀名 "{16hex}.Class"(_norm_type_arg_name 产物,如泛型 @@ -2086,7 +2086,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): return llvmlite.Ptr(pool, sp_entry2.Ty) return sp_entry2.Ty # 兜底:按完整前缀名直接查(部分注册键即全名) - sp_full2: llvmlite.LLVMType | t.CPtr = self.Gen.StructGen.get_struct_type(nm.id) + sp_full2: rawptr[llvmlite.LLVMType] = self.Gen.StructGen.get_struct_type(nm.id) if sp_full2 is not None: return sp_full2 return None @@ -2148,7 +2148,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): return llvmlite.Ptr(pool, fi_entry.Ty) return fi_entry.Ty if self.Gen.StructGen.is_struct_visible(nm.id) != 0: - struct_ty: llvmlite.LLVMType | t.CPtr = self.Gen.StructGen.get_struct_type(nm.id) + struct_ty: rawptr[llvmlite.LLVMType] = self.Gen.StructGen.get_struct_type(nm.id) if struct_ty is not None: nm_entry_s: GenTypes.StructEntry | t.CPtr = self.Gen.StructGen.find_struct_by_type(struct_ty) nm_has_new_s: int = 0 @@ -2170,10 +2170,10 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): # 循环检测:将当前 CTypedef 名加入正在解析列表 if self.Gen.TypeGenCType._ctypedef_push_visiting(pool, nm.id) == 0: # 用 _parse_type_string 把类型字符串转回 AST,递归解析 - inner_node: ast.AST | t.CPtr = self._parse_type_string(pool, ctypedef_str, nm.ctx) + inner_node: rawptr[ast.AST] = self._parse_type_string(pool, ctypedef_str, nm.ctx) if inner_node is not None: self.Gen.TypeGenCType.CTypedefResolveDepth += 1 - inner_ty: llvmlite.LLVMType | t.CPtr = self.resolve_annotation_type( + inner_ty: rawptr[llvmlite.LLVMType] = self.resolve_annotation_type( pool, inner_node, imported_modules, from_imports, trans, depth + 1) self.Gen.TypeGenCType.CTypedefResolveDepth -= 1 self.Gen.TypeGenCType._ctypedef_pop_visiting() @@ -2185,7 +2185,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): # 这些是跨模块通用的 C typedef 名,即使 from-import 查找失败也能解析 # 注意:from-import 的结构体名若未注册,get_struct_type 已返回 None, # 此处 map_t_type 对结构体名也返回 None,由上层 declare_only 机制延迟到下一遍 - mapped_ty_fallback: llvmlite.LLVMType | t.CPtr = self.map_t_type(pool, nm.id) + mapped_ty_fallback: rawptr[llvmlite.LLVMType] = self.map_t_type(pool, nm.id) if mapped_ty_fallback is not None: return mapped_ty_fallback # [阶段1a] from-import 别名反查(正常库分析):from t import CInt as XXX @@ -2206,9 +2206,9 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): oa_buf[oa_i] = orig_alias[oa_i] oa_buf[oa_len] = '\0' # 用原始名重建节点递归解析(depth 守卫复用 resolve 上限) - orig_node_a: ast.AST | t.CPtr = self._parse_type_string(pool, oa_buf, nm.ctx) + orig_node_a: rawptr[ast.AST] = self._parse_type_string(pool, oa_buf, nm.ctx) if orig_node_a is not None: - alias_ty: llvmlite.LLVMType | t.CPtr = self.resolve_annotation_type( + alias_ty: rawptr[llvmlite.LLVMType] = self.resolve_annotation_type( pool, orig_node_a, imported_modules, from_imports, trans, depth + 1) if alias_ty is not None: return alias_ty @@ -2217,9 +2217,9 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): # t.CPtr)。命中展开类型表达式后递归解析,仍失败才由调用方报错。 btd_n: str = self._lookup_builtins_typedef(pool, nm.id) if btd_n is not None: - btd_node_n: ast.AST | t.CPtr = self._parse_type_string(pool, btd_n, nm.ctx) + btd_node_n: rawptr[ast.AST] = self._parse_type_string(pool, btd_n, nm.ctx) if btd_node_n is not None: - btd_ty_n: llvmlite.LLVMType | t.CPtr = self.resolve_annotation_type( + btd_ty_n: rawptr[llvmlite.LLVMType] = self.resolve_annotation_type( pool, btd_node_n, imported_modules, from_imports, trans, depth + 1) if btd_ty_n is not None: return btd_ty_n @@ -2231,9 +2231,9 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): if lib_ts_n is None: lib_ts_n = self._lookup_library_typedef(pool, "w32.win32base", nm.id) if lib_ts_n is not None: - lib_node_n: ast.AST | t.CPtr = self._parse_type_string(pool, lib_ts_n, nm.ctx) + lib_node_n: rawptr[ast.AST] = self._parse_type_string(pool, lib_ts_n, nm.ctx) if lib_node_n is not None: - lib_ty_n: llvmlite.LLVMType | t.CPtr = self.resolve_annotation_type( + lib_ty_n: rawptr[llvmlite.LLVMType] = self.resolve_annotation_type( pool, lib_node_n, imported_modules, from_imports, trans, depth + 1) if lib_ty_n is not None: return lib_ty_n @@ -2241,12 +2241,12 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): # Attribute 节点: int, uint64, namespace_defs.PlainStruct 等 if k == ast.ASTKind.Attribute: - at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(node) + at: rawptr[ast.Attribute] = rawptr[ast.Attribute](node) if at.attr is None: return None # 检查 value 是否是 Name('t') 或 Name('c') if at.value is not None and at.value.kind() == ast.ASTKind.Name: - val_name: ast.Name | t.CPtr = (ast.Name | t.CPtr)(at.value) + val_name: rawptr[ast.Name] = rawptr[ast.Name](at.value) if val_name.id is not None: # t/c 是内建库(SHA1 豁免),显式写 t.XXX 即确指内建库, # 不依赖 imported_modules(t 可能不在其中,如 vpi 注入上下文) @@ -2289,23 +2289,23 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): ctypedef_attr: str = self.Gen.TypeGenCType.lookup_ctypedef(at.attr) if ctypedef_attr is not None and self.Gen.TypeGenCType.CTypedefFound != 0: if self.Gen.TypeGenCType._ctypedef_push_visiting(pool, at.attr) == 0: - inner_attr: ast.AST | t.CPtr = self._parse_type_string(pool, ctypedef_attr, ast.ASTCtx.Load) + inner_attr: rawptr[ast.AST] = self._parse_type_string(pool, ctypedef_attr, ast.ASTCtx.Load) if inner_attr is not None: self.Gen.TypeGenCType.CTypedefResolveDepth += 1 - inner_ty_attr: llvmlite.LLVMType | t.CPtr = self.resolve_annotation_type( + inner_ty_attr: rawptr[llvmlite.LLVMType] = self.resolve_annotation_type( pool, inner_attr, imported_modules, from_imports, trans, depth + 1) self.Gen.TypeGenCType.CTypedefResolveDepth -= 1 self.Gen.TypeGenCType._ctypedef_pop_visiting() if inner_ty_attr is not None: return inner_ty_attr # 先尝试内置类型映射(int 等) - mapped_ty: llvmlite.LLVMType | t.CPtr = self.map_t_type(pool, at.attr) + mapped_ty: rawptr[llvmlite.LLVMType] = self.map_t_type(pool, at.attr) if mapped_ty is not None: return mapped_ty # 模块限定类类型:Module.ClassName(命名空间隔离) # SHA1 前缀形态优先用完整名 "{sha1}.{Class}" 精确命中定义侧 # struct(get_struct_type 类名回退可能命中跨模块同名类) - full_attr_ty: llvmlite.LLVMType | t.CPtr = None + full_attr_ty: rawptr[llvmlite.LLVMType] = None # val_name.id 是模块名段:恰为 16 位小写 hex 才是 SHA1 别名 #(判定走唯一真源 GenApi.is_sha1_hex16,C10 收敛)。 if is_builtin_attr == 0 and GenApi.is_sha1_hex16(val_name.id) != 0: @@ -2327,7 +2327,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): if mod_sha1_v is not None: full_q_v: str = self._concat_sha1_class(pool, mod_sha1_v, at.attr) if full_q_v is not None: - full_ty_v: llvmlite.LLVMType | t.CPtr = self.Gen.StructGen.get_struct_type(full_q_v) + full_ty_v: rawptr[llvmlite.LLVMType] = self.Gen.StructGen.get_struct_type(full_q_v) if full_ty_v is not None: return full_ty_v mod_entry_v: GenTypes.StructEntry | t.CPtr = self.Gen.StructGen.find_struct_by_module(at.attr, mod_sha1_v) @@ -2340,7 +2340,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): # 模块名未登记(未编译/未扫描):同样不裸名回退 else: # t/c 内置库限定:裸名回退合法(内置类名无跨模块冲突) - mod_struct_ty: llvmlite.LLVMType | t.CPtr = self.Gen.StructGen.get_struct_type(at.attr) + mod_struct_ty: rawptr[llvmlite.LLVMType] = self.Gen.StructGen.get_struct_type(at.attr) if mod_struct_ty is not None: return mod_struct_ty # 模块限定枚举类型:Module.EnumClass(如 fat32_types.FRESULT, @@ -2354,11 +2354,11 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): mod_td_str: str = self.Gen.TypeGenCType.lookup_ctypedef(at.attr) if mod_td_str is not None and self.Gen.TypeGenCType.CTypedefFound != 0: if self.Gen.TypeGenCType._ctypedef_push_visiting(pool, at.attr) == 0: - mod_td_inner: ast.AST | t.CPtr = self._parse_type_string( + mod_td_inner: rawptr[ast.AST] = self._parse_type_string( pool, mod_td_str, at.ctx) if mod_td_inner is not None: self.Gen.TypeGenCType.CTypedefResolveDepth += 1 - mod_td_ty: llvmlite.LLVMType | t.CPtr = self.resolve_annotation_type( + mod_td_ty: rawptr[llvmlite.LLVMType] = self.resolve_annotation_type( pool, mod_td_inner, imported_modules, from_imports, trans, depth + 1) self.Gen.TypeGenCType.CTypedefResolveDepth -= 1 self.Gen.TypeGenCType._ctypedef_pop_visiting() @@ -2371,7 +2371,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): # at.value 是 Attribute 而非 Name,递归提取最终类名(at.attr)查结构体表 # find_struct 支持模块限定名回退,此处用最外层 attr(简单类名)即可 if at.value is not None and at.value.kind() == ast.ASTKind.Attribute: - nested_struct_ty: llvmlite.LLVMType | t.CPtr = self.Gen.StructGen.get_struct_type(at.attr) + nested_struct_ty: rawptr[llvmlite.LLVMType] = self.Gen.StructGen.get_struct_type(at.attr) if nested_struct_ty is not None: return nested_struct_ty # 嵌套模块限定的枚举类(fat32_types.FRESULT 三级名):查枚举基类型 @@ -2384,11 +2384,11 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): nested_td_str: str = self.Gen.TypeGenCType.lookup_ctypedef(at.attr) if nested_td_str is not None and self.Gen.TypeGenCType.CTypedefFound != 0: if self.Gen.TypeGenCType._ctypedef_push_visiting(pool, at.attr) == 0: - nested_inner: ast.AST | t.CPtr = self._parse_type_string( + nested_inner: rawptr[ast.AST] = self._parse_type_string( pool, nested_td_str, at.ctx) if nested_inner is not None: self.Gen.TypeGenCType.CTypedefResolveDepth += 1 - nested_ty: llvmlite.LLVMType | t.CPtr = self.resolve_annotation_type( + nested_ty: rawptr[llvmlite.LLVMType] = self.resolve_annotation_type( pool, nested_inner, imported_modules, from_imports, trans, depth + 1) self.Gen.TypeGenCType.CTypedefResolveDepth -= 1 self.Gen.TypeGenCType._ctypedef_pop_visiting() @@ -2396,7 +2396,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): return nested_ty else: self.Gen.TypeGenCType._ctypedef_pop_visiting() - mapped_ty_na: llvmlite.LLVMType | t.CPtr = self.map_t_type(pool, at.attr) + mapped_ty_na: rawptr[llvmlite.LLVMType] = self.map_t_type(pool, at.attr) if mapped_ty_na is not None: return mapped_ty_na # 嵌套模块限定 typedef 兜底(w32.win32base.HANDLE = t.CTypedef = @@ -2408,9 +2408,9 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): if mod_path_na is not None: lib_td_na: str = self._lookup_library_typedef(pool, mod_path_na, at.attr) if lib_td_na is not None: - td_node_na: ast.AST | t.CPtr = self._parse_type_string(pool, lib_td_na, at.ctx) + td_node_na: rawptr[ast.AST] = self._parse_type_string(pool, lib_td_na, at.ctx) if td_node_na is not None: - td_ty_na: llvmlite.LLVMType | t.CPtr = self.resolve_annotation_type( + td_ty_na: rawptr[llvmlite.LLVMType] = self.resolve_annotation_type( pool, td_node_na, imported_modules, from_imports, trans, depth + 1) if td_ty_na is not None: return td_ty_na @@ -2422,7 +2422,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): # 2. t.CPtr → i8* (void* 等价于 i8*) # 3. ActualType | DecoratorMarker → ActualType(忽略装饰器标记如 CExport/CExtern) if k == ast.ASTKind.BinOp: - bop: ast.BinOp | t.CPtr = (ast.BinOp | t.CPtr)(node) + bop: rawptr[ast.BinOp] = rawptr[ast.BinOp](node) if bop.op == ast.OpKind.BitOr: # 检测 t.CPtr 标记(指针包装标记,支持 t.CPtr 与 from t import CPtr 裸名) left_is_cptr: int = self._is_cptr_marker(bop.left, imported_modules) @@ -2430,7 +2430,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): if left_is_cptr != 0 or right_is_cptr != 0: # 有 CPtr 标记:解析非 CPtr 一边的实际类型,包装为 Ptr # left 是 CPtr → other 是 right;right 是 CPtr → other 是 left - other_node: ast.AST | t.CPtr = bop.left + other_node: rawptr[ast.AST] = bop.left if left_is_cptr != 0: other_node = bop.right # 检测另一边是否是 t\.CVoid (void* = i8*) @@ -2439,20 +2439,20 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): other_is_cvoid: int = 0 if other_node is not None: if other_node.kind() == ast.ASTKind.Attribute: - oat2: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(other_node) + oat2: rawptr[ast.Attribute] = rawptr[ast.Attribute](other_node) if oat2.attr is not None and string.strcmp(oat2.attr, "CVoid") == 0: if oat2.value is not None and oat2.value.kind() == ast.ASTKind.Name: - ov2: ast.Name | t.CPtr = (ast.Name | t.CPtr)(oat2.value) + ov2: rawptr[ast.Name] = rawptr[ast.Name](oat2.value) if ov2.id is not None and string.strcmp(ov2.id, "t") == 0: other_is_cvoid = 1 elif other_node.kind() == ast.ASTKind.Name: - onm2: ast.Name | t.CPtr = (ast.Name | t.CPtr)(other_node) + onm2: rawptr[ast.Name] = rawptr[ast.Name](other_node) if onm2.id is not None and string.strcmp(onm2.id, "CVoid") == 0: if self.Gen.ImportsGen.is_module_imported(imported_modules, "t") != 0: other_is_cvoid = 1 if other_is_cvoid != 0: return llvmlite.Ptr(pool, llvmlite.Int8(pool)) - other_ty: llvmlite.LLVMType | t.CPtr = self.resolve_annotation_type( + other_ty: rawptr[llvmlite.LLVMType] = self.resolve_annotation_type( pool, other_node, imported_modules, from_imports, trans, depth + 1) # 仅裸名(Name)场景验证解析结果必须是已注册 struct: # 损坏节点可能解析出基础类型垃圾(如 Int8 → Ptr(i8))。 @@ -2475,7 +2475,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): keep_other_ty: int = 0 tpn_g2: list[str] | t.CPtr = self.Gen.TypeGenBase.GenericTpNames if tpn_g2 is not None: - other_nm_x: ast.Name | t.CPtr = (ast.Name | t.CPtr)(other_node) + other_nm_x: rawptr[ast.Name] = rawptr[ast.Name](other_node) gtn_nx: sizet = len(tpn_g2) gtn_ix: sizet for gtn_ix in range(gtn_nx): @@ -2490,7 +2490,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): # int → 联合退化为 i8* → int_ptr[0]=val 写 1 字节截断、 # 读回符号扩展(DictTest key5=500 读出 -12 根因)。 if keep_other_ty == 0 and other_node is not None and other_node.kind() == ast.ASTKind.Name: - other_nm_b: ast.Name | t.CPtr = (ast.Name | t.CPtr)(other_node) + other_nm_b: rawptr[ast.Name] = rawptr[ast.Name](other_node) if other_nm_b.id is not None: if string.strcmp(other_nm_b.id, "int") == 0 or \ string.strcmp(other_nm_b.id, "char") == 0 or \ @@ -2511,7 +2511,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): # 恒为"追加 1 层指针",唯一例外是 struct 引用语义时吸收这 1 层 # (判据 = Ptr 的 pointee 是否为已注册 struct,find_struct_by_type 命中即吸收)。 if keep_other_ty == 0 and other_node is not None and other_node.kind() == ast.ASTKind.Name: - other_nm_td: ast.Name | t.CPtr = (ast.Name | t.CPtr)(other_node) + other_nm_td: rawptr[ast.Name] = rawptr[ast.Name](other_node) if other_nm_td.id is not None: td_res_is_ptr: int = 0 match other_ty: @@ -2523,7 +2523,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): case _: td_res_is_ptr = 0 if td_res_is_ptr == 0: - td_alias_ty: llvmlite.LLVMType | t.CPtr = self.resolve_typedef_or_map( + td_alias_ty: rawptr[llvmlite.LLVMType] = self.resolve_typedef_or_map( pool, other_nm_td.id, imported_modules, from_imports, trans) if td_alias_ty is not None: keep_other_ty = 1 @@ -2540,11 +2540,11 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): # 仅裸名(Name)场景回退:Attribute 场景 resolve 已成功。 other_cls_nm: str = None if other_node is not None and other_node.kind() == ast.ASTKind.Name: - other_nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(other_node) + other_nm: rawptr[ast.Name] = rawptr[ast.Name](other_node) if other_nm.id is not None: other_cls_nm = other_nm.id if other_cls_nm is not None: - other_cls_ty: llvmlite.LLVMType | t.CPtr = self.Gen.StructGen.get_struct_type(other_cls_nm) + other_cls_ty: rawptr[llvmlite.LLVMType] = self.Gen.StructGen.get_struct_type(other_cls_nm) if other_cls_ty is not None: return llvmlite.Ptr(pool, other_cls_ty) # 类名未注册:可能是前向自我引用(如 json 的 @@ -2559,8 +2559,8 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): # X | t.CPtr[T] → 指针层级合并(对齐 TPC HandlesTypeMerge.py L864-884: # CPtr 侧贡献 PtrCount,另一侧提供 BaseType),如 uint8 | t.CPtr[t.CPtr] → u8**。 # 不处理会落到"无 CPtr 标记"分支返回左值 i8 → c.Deref 报"参数不是指针类型"。 - cptr_sub_side: ast.AST | t.CPtr = None - cptr_other: ast.AST | t.CPtr = None + cptr_sub_side: rawptr[ast.AST] = None + cptr_other: rawptr[ast.AST] = None if self._is_cptr_subscript(bop.left) != 0: cptr_sub_side = bop.left cptr_other = bop.right @@ -2568,21 +2568,21 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): cptr_sub_side = bop.right cptr_other = bop.left if cptr_sub_side is not None and cptr_other is not None: - cptr_sub_ty: llvmlite.LLVMType | t.CPtr = self.resolve_annotation_type( + cptr_sub_ty: rawptr[llvmlite.LLVMType] = self.resolve_annotation_type( pool, cptr_sub_side, imported_modules, from_imports, trans, depth + 1) - cptr_other_ty: llvmlite.LLVMType | t.CPtr = self.resolve_annotation_type( + cptr_other_ty: rawptr[llvmlite.LLVMType] = self.resolve_annotation_type( pool, cptr_other, imported_modules, from_imports, trans, depth + 1) if cptr_sub_ty is not None and cptr_other_ty is not None: # 计算 CPtr 侧外层 Ptr 嵌套数(如 t.CPtr[t.CPtr]=i8** → 2 层) cptr_level: int = 0 - cur_lvl: llvmlite.LLVMType | t.CPtr = cptr_sub_ty + cur_lvl: rawptr[llvmlite.LLVMType] = cptr_sub_ty while cur_lvl is not None: # 注意:不能在 case body 内直接更新 while 条件变量 # (cur_lvl = cur_lvl.Pointee)——自举编译出的 match 会把 # 赋值写到 subject 快照槽,while 条件仍读旧槽 → 死循环 # (gen2 编 FuncTest 卡死根因,gdb 反汇编 +3770-3819 确认)。 # 改法:case 绑定 pointee 到局部变量,match 外更新循环变量。 - nxt_lvl: llvmlite.LLVMType | t.CPtr = None + nxt_lvl: rawptr[llvmlite.LLVMType] = None match cur_lvl: case llvmlite.LLVMType.Ptr(pointee): cptr_level += 1 @@ -2591,7 +2591,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): break cur_lvl = nxt_lvl # 结果 = 另一侧类型外包 N 层 Ptr - res_ty: llvmlite.LLVMType | t.CPtr = cptr_other_ty + res_ty: rawptr[llvmlite.LLVMType] = cptr_other_ty li2: int = 0 while li2 < cptr_level: res_ty = llvmlite.Ptr(pool, res_ty) @@ -2599,11 +2599,11 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): return res_ty # 无 CPtr 标记:返回第一个非 None(装饰器标记如 CExport/CExtern 被忽略) - left_ty: llvmlite.LLVMType | t.CPtr = self.resolve_annotation_type( + left_ty: rawptr[llvmlite.LLVMType] = self.resolve_annotation_type( pool, bop.left, imported_modules, from_imports, trans, depth + 1) if left_ty is not None: return left_ty - right_ty: llvmlite.LLVMType | t.CPtr = self.resolve_annotation_type( + right_ty: rawptr[llvmlite.LLVMType] = self.resolve_annotation_type( pool, bop.right, imported_modules, from_imports, trans, depth + 1) if right_ty is not None: return right_ty @@ -2615,12 +2615,12 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): # value 是 Attribute(Name('t'), 'CArray') 或 Name('list')(泛型类) # slice 是 Tuple(elts=[elem_ty_node, count_node]) 或单 elem_ty_node if k == ast.ASTKind.Subscript: - sub: ast.Subscript | t.CPtr = (ast.Subscript | t.CPtr)(node) + sub: rawptr[ast.Subscript] = rawptr[ast.Subscript](node) if sub.value is None or sub.slice is None: self.Gen.TypeGenErr.fatal_type_error(node, "Subscript 节点缺少 value 或 slice") # 泛型类类型注解: list[int] → 查找已特化的 struct(value 是 Name 泛型类名) if sub.value.kind() == ast.ASTKind.Name: - gen_nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(sub.value) + gen_nm: rawptr[ast.Name] = rawptr[ast.Name](sub.value) if gen_nm.id is not None: # 裸名 CArray(from t import * 场景):与 t.CArray 语义等价——否则走泛型 # 模板查找失败 → 字段类型退化 Ptr(i8) → 默认值 List 字面量误走动态 list @@ -2628,26 +2628,26 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): if string.strcmp(gen_nm.id, "CArray") == 0 or string.strcmp(gen_nm.id, "rawarray") == 0: # 单参数: CArray[elem_ty] → Ptr(elem_ty)(静态推导长度数组) if sub.slice.kind() != ast.ASTKind.Tuple: - elem_n: llvmlite.LLVMType | t.CPtr = self.resolve_annotation_type( + elem_n: rawptr[llvmlite.LLVMType] = self.resolve_annotation_type( pool, sub.slice, imported_modules, from_imports, trans, depth + 1) if elem_n is None: return None return llvmlite.Ptr(pool, elem_n) # 双参数: CArray[elem_ty, count] → [count x elem_ty] - tup_n: ast.Tuple | t.CPtr = (ast.Tuple | t.CPtr)(sub.slice) + tup_n: rawptr[ast.Tuple] = rawptr[ast.Tuple](sub.slice) if tup_n.elts is None or len(tup_n.elts) < 2: return None - elem_node_n: ast.AST | t.CPtr = tup_n.elts.get(0) - count_node_n: ast.AST | t.CPtr = tup_n.elts.get(1) + elem_node_n: rawptr[ast.AST] = tup_n.elts.get(0) + count_node_n: rawptr[ast.AST] = tup_n.elts.get(1) if elem_node_n is None or count_node_n is None: return None - elem_ty_n: llvmlite.LLVMType | t.CPtr = self.resolve_annotation_type( + elem_ty_n: rawptr[llvmlite.LLVMType] = self.resolve_annotation_type( pool, elem_node_n, imported_modules, from_imports, trans, depth + 1) if elem_ty_n is None: return None # count=None → Ptr(elem)(等价单参) if count_node_n.kind() == ast.ASTKind.Constant: - cnt_n: ast.Constant | t.CPtr = (ast.Constant | t.CPtr)(count_node_n) + cnt_n: rawptr[ast.Constant] = rawptr[ast.Constant](count_node_n) if cnt_n.const_kind == ast.CONST_NONE: return llvmlite.Ptr(pool, elem_ty_n) count_n: int = self.Gen.TypeGenCType._eval_const_int_expr( @@ -2660,13 +2660,13 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): # "函数返回类型解析失败:注解不可解析"。 if string.strcmp(gen_nm.id, "rawptr") == 0: if sub.slice.kind() != ast.ASTKind.Tuple: - rp_elem: llvmlite.LLVMType | t.CPtr = self.resolve_annotation_type( + rp_elem: rawptr[llvmlite.LLVMType] = self.resolve_annotation_type( pool, sub.slice, imported_modules, from_imports, trans, depth + 1) if rp_elem is None: return None return llvmlite.Ptr(pool, rp_elem) return None - gen_ty_nm: llvmlite.LLVMType | t.CPtr = self._resolve_generic_subscript_ty( + gen_ty_nm: rawptr[llvmlite.LLVMType] = self._resolve_generic_subscript_ty( pool, sub, gen_nm.id, trans, imported_modules, from_imports, depth + 1) if gen_ty_nm is not None: @@ -2676,7 +2676,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): # 下方 builtins 兜底若也未命中,仍按旧行为返回 None(多遍 # 收敛/上层报错),不落到"仅支持 t.CArray/t.Callable"fatal。 if sub.value.kind() == ast.ASTKind.Name: - gen_nm_fb: ast.Name | t.CPtr = (ast.Name | t.CPtr)(sub.value) + gen_nm_fb: rawptr[ast.Name] = rawptr[ast.Name](sub.value) if gen_nm_fb.id is not None: fb_td: str = self._lookup_builtins_typedef(pool, gen_nm_fb.id) if fb_td is not None: @@ -2690,9 +2690,9 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): string.strcat(fb_str, "[") string.strcat(fb_str, fb_slice) string.strcat(fb_str, "]") - fb_node: ast.AST | t.CPtr = self._parse_type_string(pool, fb_str, ast.ASTCtx.Load) + fb_node: rawptr[ast.AST] = self._parse_type_string(pool, fb_str, ast.ASTCtx.Load) if fb_node is not None: - fb_ty: llvmlite.LLVMType | t.CPtr = self.resolve_annotation_type( + fb_ty: rawptr[llvmlite.LLVMType] = self.resolve_annotation_type( pool, fb_node, imported_modules, from_imports, trans, depth + 1) if fb_ty is not None: return fb_ty @@ -2700,7 +2700,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): # 检查 value 是否是 Attribute(t.CArray / t.Callable / 模块限定泛型类如 numpy.ndarray[T]) if sub.value.kind() != ast.ASTKind.Attribute: self.Gen.TypeGenErr.fatal_type_error(node, "不支持的 Subscript 类型注解(仅支持 t.CArray / t.Callable)") - arr_at: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(sub.value) + arr_at: rawptr[ast.Attribute] = rawptr[ast.Attribute](sub.value) if arr_at.attr is None: self.Gen.TypeGenErr.fatal_type_error(node, "Subscript Attribute 缺少 attr") # 模块限定泛型类: numpy.ndarray[t.CDouble] → 裸类名 ndarray 走泛型特化 @@ -2711,7 +2711,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): imported_modules, from_imports, depth + 1) if arr_at.value is None or arr_at.value.kind() != ast.ASTKind.Name: self.Gen.TypeGenErr.fatal_type_error(node, "t.CArray / t.Callable 必须通过模块名限定") - arr_val_name: ast.Name | t.CPtr = (ast.Name | t.CPtr)(arr_at.value) + arr_val_name: rawptr[ast.Name] = rawptr[ast.Name](arr_at.value) if arr_val_name.id is None: self.Gen.TypeGenErr.fatal_type_error(node, "Subscript 模块名为 None") # 函数指针类型: t.Callable[[A, B], Ret] → i8* @@ -2728,7 +2728,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): if string.strcmp(arr_val_name.id, "t") != 0 and string.strcmp(arr_val_name.id, "c") != 0 \ and self.Gen.ImportsGen.is_module_imported(imported_modules, arr_val_name.id) == 0: self.Gen.TypeGenErr.fatal_type_error(node, "t.CPtr 模块未导入") - inner_cptr_ty: llvmlite.LLVMType | t.CPtr = self.resolve_annotation_type( + inner_cptr_ty: rawptr[llvmlite.LLVMType] = self.resolve_annotation_type( pool, sub.slice, imported_modules, from_imports, trans, depth + 1) if inner_cptr_ty is None: # 元素类型依赖未就绪(如 t.CPtr[类] 中类尚未注册):返回 None 交上层多遍 @@ -2745,26 +2745,26 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): # 单参数形式: t.CArray[elem_ty] → Ptr(elem_ty) # 相当于 t.CArray[elem_ty, None],表示静态推导长度数组 if sub.slice.kind() != ast.ASTKind.Tuple: - elem_ty_single: llvmlite.LLVMType | t.CPtr = self.resolve_annotation_type( + elem_ty_single: rawptr[llvmlite.LLVMType] = self.resolve_annotation_type( pool, sub.slice, imported_modules, from_imports, trans, depth + 1) if elem_ty_single is None: # 元素类型依赖未就绪(同 L1807 注释):返回 None 交多遍收敛 return None return llvmlite.Ptr(pool, elem_ty_single) # 双参数形式: t.CArray[elem_ty, count] → [count x elem_ty] - tup: ast.Tuple | t.CPtr = (ast.Tuple | t.CPtr)(sub.slice) + tup: rawptr[ast.Tuple] = rawptr[ast.Tuple](sub.slice) if tup.elts is None: self.Gen.TypeGenErr.fatal_type_error(node, "t.CArray Tuple 缺少 elts") - elts_list: list[ast.AST | t.CPtr] | t.CPtr = tup.elts + elts_list: list[rawptr[ast.AST]] | t.CPtr = tup.elts elts_n: sizet = len(elts_list) if elts_n < 2: self.Gen.TypeGenErr.fatal_type_error(node, "t.CArray Tuple 元素不足") - elem_node: ast.AST | t.CPtr = elts_list.get(0) - count_node: ast.AST | t.CPtr = elts_list.get(1) + elem_node: rawptr[ast.AST] = elts_list.get(0) + count_node: rawptr[ast.AST] = elts_list.get(1) if elem_node is None or count_node is None: self.Gen.TypeGenErr.fatal_type_error(node, "t.CArray Tuple 元素为 None") # 递归解析元素类型 - elem_ty: llvmlite.LLVMType | t.CPtr = self.resolve_annotation_type( + elem_ty: rawptr[llvmlite.LLVMType] = self.resolve_annotation_type( pool, elem_node, imported_modules, from_imports, trans, depth + 1) if elem_ty is None: # 元素类型依赖未就绪(如 t.CArray[类, N] 中类尚未注册):返回 None 交上层多遍 @@ -2778,7 +2778,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): # t.CArray[elem_ty, 2 * MAX] 常量表达式静态计算 → [2*MAX x elem_ty] count_val: int = 0 if count_node.kind() == ast.ASTKind.Constant: - cnt_cn: ast.Constant | t.CPtr = (ast.Constant | t.CPtr)(count_node) + cnt_cn: rawptr[ast.Constant] = rawptr[ast.Constant](count_node) if cnt_cn.const_kind == ast.CONST_NONE: return llvmlite.Ptr(pool, elem_ty) # 统一用 _eval_const_int_expr 计算常量整数表达式 diff --git a/App/lib/core/Gen/Type/TypeSpec.vp b/App/lib/core/Gen/Type/TypeSpec.vp index 437b90d..8f1e182 100644 --- a/App/lib/core/Gen/Type/TypeSpec.vp +++ b/App/lib/core/Gen/Type/TypeSpec.vp @@ -93,7 +93,7 @@ def _spec_name_eq(text: str, start: sizet, end: sizet, lit: str) -> int: # 基名 = 先截断第一个 '[' 起的泛型实参,再取**最后一个 '.' 之后**的部分 # (去模块名 / LLVM 注册名的模块 sha1 前缀)。例: # "e94ef9e139461915.list[ast.ASTptr]" → "list" -# "list[ast.AST | t.CPtr]" → "list" +# "list[rawptr[ast.AST]]" → "list" # "memhub.MemBuddy" → "MemBuddy"(≠ list/dict) # # 用途:替换容器种类判断里的 strstr 子串匹配(Debugger/_Type.md D20)—— @@ -237,7 +237,7 @@ class TypeSpec: ElemBits: int # 元素槽位宽(元素语义三元组 1/3) IsElemPtr: int # 元素是否为指针(1=是)(2/3) DerefBase: int # 基址是否需二次解引用(1=是)(3/3) - Ty: llvmlite.LLVMType | t.CPtr # 解析结果缓存(可空) + Ty: rawptr[llvmlite.LLVMType] # 解析结果缓存(可空) # ============================================================ @@ -1122,14 +1122,14 @@ def SpecBitWidth(sp: TypeSpec | t.CPtr) -> int: # ⚠️ 规避自举 match codegen 缺陷:`case` 体内直接更新外层 while 条件变量会把赋值 # 写进 subject 快照槽,while 条件读旧槽 ⇒ 死循环。故此处 `case` 只绑定局部 `nxt`, # 循环变量在 match **外**更新。 -def SpecTypePtrLevel(ty: llvmlite.LLVMType | t.CPtr) -> int: +def SpecTypePtrLevel(ty: rawptr[llvmlite.LLVMType]) -> int: """计算指针层级,0=非指针,1=一级指针,2=二级指针…""" if ty is None: return 0 level: int = 0 - cur: llvmlite.LLVMType | t.CPtr = ty + cur: rawptr[llvmlite.LLVMType] = ty while cur is not None: - nxt: llvmlite.LLVMType | t.CPtr = None + nxt: rawptr[llvmlite.LLVMType] = None match cur: case llvmlite.LLVMType.Ptr(pointee): level += 1 @@ -1149,7 +1149,7 @@ def SpecTypePtrLevel(ty: llvmlite.LLVMType | t.CPtr) -> int: # 副本一旦分叉会出现「同一类型在两处算出不同位宽」的隐蔽不一致。 # 非整数类型(指针/浮点/结构体等)返回 0 —— 0 是"非整数"的表态,不是兜底位宽。 # ============================================================ -def SpecTypeBits(ty: llvmlite.LLVMType | t.CPtr) -> int: +def SpecTypeBits(ty: rawptr[llvmlite.LLVMType]) -> int: """获取 LLVM 整数类型的位宽,非整数类型返回 0""" if ty is None: return 0 @@ -1315,7 +1315,7 @@ def _spec_llvm_text(sp: TypeSpec | t.CPtr, buf: str, buf_size: sizet, # 本函数当前**无调用点**(S2 只入库;接线在后续步骤)。 # ============================================================ def SpecFromLLVMType(arena: TypeSpecArena | t.CPtr, - ty: llvmlite.LLVMType | t.CPtr) -> TypeSpec | t.CPtr: + ty: rawptr[llvmlite.LLVMType]) -> TypeSpec | t.CPtr: """把已解析的 LLVM 类型翻译成 TypeSpec;不支持或为 None 时返回 None""" if arena is None or ty is None: return None @@ -1341,7 +1341,7 @@ def SpecFromLLVMType(arena: TypeSpecArena | t.CPtr, def _spec_from_ptr(arena: TypeSpecArena | t.CPtr, - pointee: llvmlite.LLVMType | t.CPtr) -> TypeSpec | t.CPtr: + pointee: rawptr[llvmlite.LLVMType]) -> TypeSpec | t.CPtr: """Ptr(pointee) → TypeSpec(PtrLevel/ElemBits/IsElemPtr 由 NewTypePtr 填)""" inner: TypeSpec | t.CPtr = SpecFromLLVMType(arena, pointee) if inner is None: @@ -1350,7 +1350,7 @@ def _spec_from_ptr(arena: TypeSpecArena | t.CPtr, def _spec_from_array(arena: TypeSpecArena | t.CPtr, - elem_ty: llvmlite.LLVMType | t.CPtr, + elem_ty: rawptr[llvmlite.LLVMType], count: int) -> TypeSpec | t.CPtr: """[count x elem] → TypeSpec(ArrayCount/ElemBits/IsElemPtr 由 NewTypeArray 填)""" inner: TypeSpec | t.CPtr = SpecFromLLVMType(arena, elem_ty) @@ -1360,8 +1360,8 @@ def _spec_from_array(arena: TypeSpecArena | t.CPtr, def _spec_from_func(arena: TypeSpecArena | t.CPtr, - ret: llvmlite.LLVMType | t.CPtr, - params: llvmlite.ParamNode | t.CPtr, + ret: rawptr[llvmlite.LLVMType], + params: rawptr[llvmlite.Function], pcount: int) -> TypeSpec | t.CPtr: """函数类型 → TypeSpec(形参沿 ParamNode 链表遍历;IsVarArg 恒 0,见上)""" ret_s: TypeSpec | t.CPtr = SpecFromLLVMType(arena, ret) @@ -1373,10 +1373,10 @@ def _spec_from_func(arena: TypeSpecArena | t.CPtr, params_arr: sizet | t.CPtr = CompilerFactory.factory.PermPool.alloc(8 * pcount) if params_arr is None: return None - node: llvmlite.ParamNode | t.CPtr = params + node: rawptr[llvmlite.Function] = params i: int = 0 while node is not None and i < pcount: - pty: llvmlite.LLVMType | t.CPtr = llvmlite.paramnode_get_ty(node) + pty: rawptr[llvmlite.LLVMType] = llvmlite.paramnode_get_ty(node) ps: TypeSpec | t.CPtr = SpecFromLLVMType(arena, pty) if ps is None: return None diff --git a/App/lib/core/Gen/VarGenMixin.vp b/App/lib/core/Gen/VarGenMixin.vp index 42fed5c..b339f8f 100644 --- a/App/lib/core/Gen/VarGenMixin.vp +++ b/App/lib/core/Gen/VarGenMixin.vp @@ -249,7 +249,7 @@ class VarGenMixin: """由 alloca 的值类型构造 TypeSpec,不适用/失败返回 None""" if alloca is None or alloca.Ty is None: return None - ty: llvmlite.LLVMType | t.CPtr = alloca.Ty + ty: rawptr[llvmlite.LLVMType] = alloca.Ty if self.Gen.ExprGenBase.is_ptr_type(ty) != 0: ty = ty.Pointee arena: TSpec.TypeSpecArena | t.CPtr = self.Gen.TypeGenBase.ensure_spec_arena() @@ -261,7 +261,7 @@ class VarGenMixin: # LLVM IR 要求指令支配所有使用点,故所有 alloca 须在函数入口块生成。 # 实现:临时切换 builder.CurBlock 到入口块,生成 alloca 后恢复。 def _alloca_at_entry(self, builder: llvmlite.IRBuilder | t.CPtr, - ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: + ty: rawptr[llvmlite.LLVMType]) -> llvmlite.Value | t.CPtr: """在函数入口块生成 alloca,返回 alloca 值 使用 llvmlite.build_alloca_at_entry 在入口块终止指令之前插入 alloca, @@ -277,7 +277,7 @@ class VarGenMixin: vars_ptr: GenTypes.VarEntry | t.CPtr, var_count: int, name: str, - ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: + ty: rawptr[llvmlite.LLVMType]) -> llvmlite.Value | t.CPtr: """查找或创建变量 alloca""" existing: llvmlite.Value | t.CPtr = self.find_var(vars_ptr, var_count, name) if existing is not None: @@ -482,7 +482,7 @@ class VarGenMixin: pool: rawptr[memhub.MemBuddy], builder: llvmlite.IRBuilder | t.CPtr, name: str, - ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: + ty: rawptr[llvmlite.LLVMType]) -> llvmlite.Value | t.CPtr: """查找或创建变量 alloca(在当前作用域)""" existing: llvmlite.Value | t.CPtr = self.lookup_current(symtab, name) if existing is not None: diff --git a/App/main.vp b/App/main.vp index 8eec716..d672ea2 100644 --- a/App/main.vp +++ b/App/main.vp @@ -123,7 +123,7 @@ def main() -> int: # 初始化 VLogger 并打印启动日志 VLogger.init_logger() - log: VLogger.Logger | t.CPtr = VLogger.logger + log: VLogger.Logger = VLogger.logger if log is None: log.error("TransPyV Failed to parse parameters") @@ -131,7 +131,7 @@ def main() -> int: sys._init_argv() # 创建参数解析器 - parser: argparse.ArgumentParser | t.CPtr = argparse.ArgumentParser("TransPyV", "TransPyV command-line parameter parser", pool=mb) + parser: argparse.ArgumentParser = argparse.ArgumentParser("TransPyV", "TransPyV command-line parameter parser", pool=mb) # 注册参数(与 Projectrans.py main() 一致) parser.add_argument("--project", None, argparse.STRING, 0, None, False, argparse.STORE, "Project VPJ path, by default it looks in the current directory") @@ -434,10 +434,10 @@ Target: %s src_buf[bytes_read] = 0 # 解析 AST(拆分为词法+语法两阶段,便于调试) ast._init_tables(mb) - lx: ast.Lexer | t.CPtr = ast.new_lexer(mb) + lx: rawptr[ast.Lexer] = ast.new_lexer(mb) ast._lexer_init(lx, src_buf, mb) - tokens: ast.Token | t.CPtr = ast.tokenize(lx) - tree: ast.AST | t.CPtr = ast.parse_tokens(mb, tokens) + tokens: rawptr[ast.Token] = ast.tokenize(lx) + tree: rawptr[ast.AST] = ast.parse_tokens(mb, tokens) if tree is None: log.error("AST 解析失败", "ast") argparse.release(args) diff --git a/Test/App/nested_match_test.vp b/Test/App/nested_match_test.vp index 4e0e504..5945354 100644 --- a/Test/App/nested_match_test.vp +++ b/Test/App/nested_match_test.vp @@ -44,7 +44,7 @@ def test_single_match() -> int: """Test 1: 单层 match(基线测试)""" stdio.printf("--- Test 1: 单层 match LLVMType ---\n") - ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int32(_mbuddy) + ty: rawptr[llvmlite.LLVMType] = llvmlite.Int32(_mbuddy) if ty is None: stdio.printf("FAIL: Int32 returned None\n") return 1 @@ -69,8 +69,8 @@ def test_nested_match_other() -> int: """ stdio.printf("--- Test 2: 嵌套 match(case 块内 match 另一值)---\n") - ty_outer: llvmlite.LLVMType | t.CPtr = llvmlite.Int32(_mbuddy) - ty_inner: llvmlite.LLVMType | t.CPtr = llvmlite.Int8(_mbuddy) + ty_outer: rawptr[llvmlite.LLVMType] = llvmlite.Int32(_mbuddy) + ty_inner: rawptr[llvmlite.LLVMType] = llvmlite.Int8(_mbuddy) match ty_outer: case llvmlite.LLVMType.Int(bits): @@ -99,8 +99,8 @@ def test_nested_match_pointee() -> int: stdio.printf("--- Test 3: 嵌套 match pointee ---\n") # 构造 Ptr(Int32) 类型 - inner_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int32(_mbuddy) - ptr_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(_mbuddy, inner_ty) + inner_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int32(_mbuddy) + ptr_ty: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(_mbuddy, inner_ty) match ptr_ty: case llvmlite.LLVMType.Ptr(pointee): @@ -130,12 +130,12 @@ def test_three_level_nested() -> int: stdio.printf("--- Test 4: 3 层嵌套 match ---\n") # 构造 Ptr(Ptr(Int32)) 类型 - innermost: llvmlite.LLVMType | t.CPtr = llvmlite.Int32(_mbuddy) - mid_ptr: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(_mbuddy, innermost) - outer_ptr: llvmlite.LLVMType | t.CPtr = llvmlite.Ptr(_mbuddy, mid_ptr) + innermost: rawptr[llvmlite.LLVMType] = llvmlite.Int32(_mbuddy) + mid_ptr: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(_mbuddy, innermost) + outer_ptr: rawptr[llvmlite.LLVMType] = llvmlite.Ptr(_mbuddy, mid_ptr) # 另一个值用于第 3 层 match - extra_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int16(_mbuddy) + extra_ty: rawptr[llvmlite.LLVMType] = llvmlite.Int16(_mbuddy) match outer_ptr: case llvmlite.LLVMType.Ptr(p1): @@ -176,13 +176,13 @@ def test_nested_match_in_if() -> int: """ stdio.printf("--- Test 5: if 块内嵌套 match ---\n") - ty: llvmlite.LLVMType | t.CPtr = llvmlite.Float(_mbuddy) + ty: rawptr[llvmlite.LLVMType] = llvmlite.Float(_mbuddy) if ty is not None: match ty: case llvmlite.LLVMType.Float(bits): # 在 Float 的 case 块内再 match - ty2: llvmlite.LLVMType | t.CPtr = llvmlite.Double(_mbuddy) + ty2: rawptr[llvmlite.LLVMType] = llvmlite.Double(_mbuddy) match ty2: case llvmlite.LLVMType.Float(bits2): stdio.printf("Float(%d) + Double(%d) OK\n", bits, bits2) @@ -209,8 +209,8 @@ def test_nested_match_mismatch() -> int: stdio.printf("--- Test 6: 嵌套 match 不同变体(default 分支)---\n") # 外层是 Int,内层是 Float - 验证内层 match 不会误匹配 Int - ty_outer: llvmlite.LLVMType | t.CPtr = llvmlite.Int32(_mbuddy) - ty_inner: llvmlite.LLVMType | t.CPtr = llvmlite.Float(_mbuddy) + ty_outer: rawptr[llvmlite.LLVMType] = llvmlite.Int32(_mbuddy) + ty_inner: rawptr[llvmlite.LLVMType] = llvmlite.Float(_mbuddy) match ty_outer: case llvmlite.LLVMType.Int(bits):