将部分 while 简化为 for

This commit is contained in:
TermiNexus committed 2026-08-23 00:21:17 +08:00
1 parent ec2feea15b
commit a6e28c71f5
19 files changed
+50 -74

No files matched your search

+5 -5
View File
@@ -408,9 +408,9 @@ def RunMultiFileProject(mb: memhub.MemBuddy | t.CPtr,
if includes_dir is not None and includes_binary_dir is not None:
store_count_inc_pre: int = StubMergerStore.GetSha1StoreCount()
if store_count_inc_pre > 0:
store_sha1_inc_pre: bytes | t.CPtr = StubMergerStore.GetSha1StoreArrPtr()
store_rel_inc_pre: bytes | t.CPtr = StubMergerStore.GetSha1StoreRelArrPtr()
store_incdir_inc_pre: bytes | t.CPtr = StubMergerStore.GetSha1StoreIncdirArrPtr()
store_sha1_inc_pre: bytes = StubMergerStore.GetSha1StoreArrPtr()
store_rel_inc_pre: bytes = StubMergerStore.GetSha1StoreRelArrPtr()
store_incdir_inc_pre: bytes = StubMergerStore.GetSha1StoreIncdirArrPtr()
deps_filled_pre: int = 0
PHASE_A_INC_MAX_PASSES: t.CInt = 3
# [修复] 记录预注册失败的 includes:多遍后仍失败 → 报错终止编译。
@@ -923,8 +923,8 @@ def RunMultiFileProject(mb: memhub.MemBuddy | t.CPtr,
if store_sha1_arr_mi is not None and store_mod_arr_mi is not None:
store_count_mi = StubMergerIR._BuildIncludesSha1Map(
temp_dir, td_len_pb, store_sha1_arr_mi, store_mod_arr_mi)
store_rel_arr_mi: bytes | t.CPtr = StubMergerStore.GetSha1StoreRelArrPtr()
store_incdir_arr_mi: bytes | t.CPtr = StubMergerStore.GetSha1StoreIncdirArrPtr()
store_rel_arr_mi: bytes = StubMergerStore.GetSha1StoreRelArrPtr()
store_incdir_arr_mi: bytes = StubMergerStore.GetSha1StoreIncdirArrPtr()
if store_count_mi > 0:
# 拓扑排序可达 includes:被依赖模块先完整翻译。跨模块 vtable 生成
+4 -4
View File
@@ -341,16 +341,16 @@ def LookupIncludesDeps(sha1: str) -> str:
idx2: t.CSizeT = t.CSizeT(i) * StubMerger.MAX_DEPS_STR_LEN
return StubMerger._includes_deps_str + idx2
return None
def GetSha1StoreArrPtr() -> bytes | t.CPtr:
def GetSha1StoreArrPtr() -> bytes:
"""返回 SHA1 数组指针(每个条目 17 字节)"""
return StubMerger._sha1_store_arr
def GetSha1StoreModArrPtr() -> bytes | t.CPtr:
def GetSha1StoreModArrPtr() -> bytes:
"""返回模块名数组指针(每个条目 64 字节)"""
return StubMerger._sha1_store_mod
def GetSha1StoreRelArrPtr() -> bytes | t.CPtr:
def GetSha1StoreRelArrPtr() -> bytes:
"""返回相对路径数组指针(每个条目 StubMerger.MAX_REL_PATH_LEN 字节)"""
return StubMerger._sha1_store_rel
def GetSha1StoreIncdirArrPtr() -> bytes | t.CPtr:
def GetSha1StoreIncdirArrPtr() -> bytes:
"""返回所属 includes 根目录数组指针(每个条目 StubMerger.MAX_INC_DIR_LEN 字节,空串表示不属于任何 includes 目录)"""
return StubMerger._sha1_store_incdir
# ============================================================
+1 -3
View File
@@ -596,8 +596,7 @@ class AssignGenMixin:
elts_count: t.CSizeT = len(elts)
# 为每个元素生成 GEP + store
i: t.CSizeT = 0
while i < elts_count:
for i in range(elts_count):
elem_node: ast.AST | t.CPtr = elts.get(i)
elem_val: llvmlite.Value | t.CPtr = self.Gen.ExprGen.translate_value(
builder, pool, mod, elem_node, None, 0, trans)
@@ -614,7 +613,6 @@ class AssignGenMixin:
store_val = self.Gen.ExprGenBase.coerce_to_type(
builder, elem_val, elem_ptr.Ty.Pointee, elem_node)
llvmlite.build_store(builder, store_val, elem_ptr)
i += 1
return 0
+4 -3
View File
@@ -145,8 +145,8 @@ class CallGenBase:
"""从 SHA1 存储器的 rel_path 计算模块所属包名(目录部分,'/' → '.')"""
if pool is None or mod_sha1 is None:
return None
rel_arr_ptr: bytes | t.CPtr = StubMergerStore.GetSha1StoreRelArrPtr()
sha1_arr_ptr: bytes | t.CPtr = StubMergerStore.GetSha1StoreArrPtr()
rel_arr_ptr: bytes = StubMergerStore.GetSha1StoreRelArrPtr()
sha1_arr_ptr: bytes = StubMergerStore.GetSha1StoreArrPtr()
count: int = StubMergerStore.GetSha1StoreCount()
if rel_arr_ptr is None or sha1_arr_ptr is None or count <= 0:
return None
@@ -651,7 +651,7 @@ class CallGenBase:
# ============================================================
# ============================================================
def SetTempDir(self, temp_dir: str):
def SetTempDir(self, temp_dir: str) -> None:
"""设置 temp 目录路径(统一写入 Gen.CallGenBase 真源,跨子对象共享)"""
if self.Gen is None:
return
@@ -699,6 +699,7 @@ class CallGenBase:
if c != ' ' and c != '\t':
break
s += 1
# 去除尾部空白
e: t.CSizeT = end
while e > s:
+1 -7
View File
@@ -22,13 +22,7 @@ import lib.core.Gen.CallGenBase as CallGenBase
# ============================================================
# CallGenCBuiltin - CallGenMixin 拆分 2/9:c.* 内建 + asm + llvmir
#
# 按功能域从 CallGenMixin.vp 拆出(500~1500 行/文件架构重构):
# translate_c_deref/derefas/set/addr/load + c.Asm 全套 + c.LLVMIR。
# 继承 CallGenBase。
#
# @t.NoVTable:静态绑定(方法沿 MRO 直接调用 + this 调整)。
# CallGenCBuiltin
# ============================================================
+1 -3
View File
@@ -930,8 +930,7 @@ class CallGenCtor(CallGenBase.CallGenBase):
return None
string.memset(extra_args, 0, 8 * 32)
ai: t.CSizeT = 0
while ai < can:
for ai in range(can):
if ai >= 32:
# 定长 8*32 槽:超过 32 个实参继续写会越界污染 pool 相邻块,fail-fast
self.Gen.TypeGenErr.fatal_error(
@@ -943,7 +942,6 @@ class CallGenCtor(CallGenBase.CallGenBase):
builder, pool, mod, arg_node, None, 0, trans)
if arg_val is not None:
extra_args[ai] = t.CSizeT(arg_val)
ai += 1
# 存储指针:默认用 alloca,如果有 __new__ 则用 __new__ 返回的指针
# __new__ 是可选的,仅当泛型类模板定义了 __new__ 方法时才调用
+6 -11
View File
@@ -369,11 +369,10 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin):
string.memset(names, 0, 8 * (ISINSTANCE_CLASS_MAX + 1))
string.memset(queue, 0, 8 * ISINSTANCE_CLASS_MAX)
string.memset(visited, 0, 8 * ISINSTANCE_CLASS_MAX)
qcount: int = 0
qcount: int = 1
outcount: int = 0
vcount: int = 0
queue[0] = t.CSizeT(class_name)
qcount = 1
queue[0] = t.CSizeT(class_name) # 存疑
while qcount > 0:
qcount -= 1
cur_addr: t.CSizeT = queue[qcount]
@@ -751,7 +750,7 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin):
builder: llvmlite.IRBuilder | t.CPtr,
mod: llvmlite.LLVMModule | t.CPtr,
cl: ast.Call | t.CPtr,
trans: HT.Translator | t.CPtr = None):
trans: HT.Translator | t.CPtr = None) -> None:
"""翻译 printf 调用(特殊处理格式字符串)"""
cargs: list[ast.AST | t.CPtr] | t.CPtr = cl.args
if cargs is None:
@@ -812,7 +811,7 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin):
builder: llvmlite.IRBuilder | t.CPtr,
mod: llvmlite.LLVMModule | t.CPtr,
cl: ast.Call | t.CPtr,
trans: HT.Translator | t.CPtr = None):
trans: HT.Translator | t.CPtr = None) -> None:
"""翻译 print 调用(类型感知格式化 + 默认换行)"""
cargs: list[ast.AST | t.CPtr] | t.CPtr = cl.args
if cargs is None:
@@ -1231,14 +1230,12 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin):
if name is None or self.GlobalDefaults is None:
return None
entry_size: t.CSizeT = GenTypes.FuncDefaultsEntry.__sizeof__()
i: int = 0
while i < self.GlobalDefaultsCount:
for i in range(self.GlobalDefaultsCount):
entry_addr: t.CUInt64T = t.CUInt64T(self.GlobalDefaults) + i * entry_size
entry: GenTypes.FuncDefaultsEntry | t.CPtr = (GenTypes.FuncDefaultsEntry | t.CPtr)(t.CVoid(entry_addr, t.CPtr))
if entry.Name is not None:
if string.strcmp(entry.Name, name) == 0:
return entry
i += 1
return None
@@ -1282,14 +1279,12 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin):
if name is None or funcs is None:
return None
entry_size: t.CSizeT = GenTypes.FuncEntry.__sizeof__()
i: int = 0
while i < func_count:
for i in range(func_count):
entry_addr: t.CUInt64T = t.CUInt64T(funcs) + i * entry_size
entry: GenTypes.FuncEntry | t.CPtr = (GenTypes.FuncEntry | t.CPtr)(t.CVoid(entry_addr, t.CPtr))
if entry.Name is not None:
if string.strcmp(entry.Name, name) == 0:
return entry
i += 1
return None
+1 -3
View File
@@ -850,8 +850,7 @@ class CallGenMixin(CallGenBase.CallGenBase):
# 填充缺失参数
if df_defaults is not None and df_default_count > 0 and can < df_param_count:
df_offset: int = df_param_count - df_default_count
df_di: int = 0
while df_di < df_default_count:
for df_di in range(df_default_count):
df_param_idx: int = df_offset + df_di
if df_param_idx >= can:
# 优先用 stdlib 常量快照重建(gd_entry.Defaults 的 pool 内 AST 可能已被 reset 回收)
@@ -872,7 +871,6 @@ class CallGenMixin(CallGenBase.CallGenBase):
else:
tail.Next = df_arg_val
tail = df_arg_val
df_di += 1
# 使用模块中的实际函数名(可能带 SHA1 前缀,如 "83210a72e829a086.atoi")
# t.CExtern/t.State/t.CExport 函数不加 SHA1 前缀,使用裸名
+1 -1
View File
@@ -59,7 +59,7 @@ class ClassGenGeneric(ClassGenBase.ClassGenBase):
return 1
def _register_generic_template(self, pool: memhub.MemBuddy | t.CPtr,
cd: ast.ClassDef | t.CPtr,
module_sha1: str):
module_sha1: str) -> None:
"""注册泛型类模板(类名 + ClassDef 节点 + 来源模块 SHA1)"""
if self.GenericClassNames is None:
self.GenericClassNames = list[str](pool, 8)
+2 -2
View File
@@ -53,11 +53,11 @@ class ExprGenCdef(ExprGenBase.ExprGenBase):
if Config.IncludesDir is None:
return None
# 从 StubMerger 全局存储器获取相对路径数组
rel_arr_ptr: bytes | t.CPtr = StubMergerStore.GetSha1StoreRelArrPtr()
rel_arr_ptr: bytes = StubMergerStore.GetSha1StoreRelArrPtr()
count: int = StubMergerStore.GetSha1StoreCount()
if rel_arr_ptr is None or count <= 0:
return None
sha1_arr_ptr: bytes | t.CPtr = StubMergerStore.GetSha1StoreArrPtr()
sha1_arr_ptr: bytes = StubMergerStore.GetSha1StoreArrPtr()
if sha1_arr_ptr is None:
return None
# 遍历查找匹配的 SHA1
+2 -2
View File
@@ -167,7 +167,7 @@ class ExprGenCls(ExprGenBase.ExprGenBase):
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,
out_mod: str | t.CPtr, out_sym: str | t.CPtr) -> int:
out_mod: str, out_sym: str) -> int:
"""解析 Name 符号的 docstring 归属,写入 out_mod/out_sym,成功返回 1
判定顺序:本地变量(函数变量)→ 结构体类(含跨模块预注册)→ 模块名。
@@ -205,7 +205,7 @@ class ExprGenCls(ExprGenBase.ExprGenBase):
return 1
def _resolve_doc_symbol_attr(self, trans: HT.Translator | t.CPtr,
at: ast.Attribute | t.CPtr,
out_mod: str | t.CPtr, out_sym: str | t.CPtr) -> int:
out_mod: str, out_sym: str) -> int:
"""解析嵌套 Attribute 链的 docstring 归属,写入 out_mod/out_sym
支持形态:remote.remote_func / remote.RemoteClass /
+1 -1
View File
@@ -1345,7 +1345,7 @@ class StmtGenCifMixin:
# zip(a, b) → for x, y in zip(a, b):任一源耗尽即终止
# ============================================================
def _extract_tuple_names(self, tup: ast.Tuple | t.CPtr,
out1: str | t.CPtr, out2: str | t.CPtr) -> int:
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
+3 -4
View File
@@ -82,7 +82,7 @@ class StructGenMixin:
# 同模块函数调用改 self.方法;签名与 HandlesStruct 原函数一致)
# ============================================================
def set_stdlib_alloc(self, flag: int):
def set_stdlib_alloc(self, flag: int) -> None:
"""设置 OOM 回收分配模式:1=1b 阶段(新条目用 stdlib),0=注册阶段(用 pool)"""
self.StdlibAlloc = flag
@@ -91,7 +91,7 @@ class StructGenMixin:
避免跨 Mixin 直接读 self.StdlibAlloc——Mixin 方法体按自身块内索引编译)"""
return self.StdlibAlloc
def reset_visible_structs(self, pool: memhub.MemBuddy | t.CPtr, strict: int):
def reset_visible_structs(self, pool: memhub.MemBuddy | t.CPtr, strict: int) -> None:
"""重置可见性状态(每个文件翻译前调用)
pool: 内存分配器(严格模式下创建 HashTable)
@@ -105,7 +105,7 @@ class StructGenMixin:
# 宽松模式:全部可见,不需要 HashTable
self.VisibleStructs = None
def add_visible_struct(self, pool: memhub.MemBuddy | t.CPtr, name: str):
def add_visible_struct(self, pool: memhub.MemBuddy | t.CPtr, name: str) -> None:
"""添加可见结构体名(类定义时和 from-import 时调用)"""
if name is None:
return
@@ -694,7 +694,6 @@ class StructGenMixin:
# 必须传 entry.Name(register_struct 复制 + _update_renum_alias_class_ptr
# 统一后的池指针),传调用方 class_name(AnnotClassName 等不同指针)
# 恒不匹配 → 返回 -1 → 回退失效。
import lib.core.Handles.HandlesClassDef as HandlesClassDef
rn_cls_l: str = entry.Name
if rn_cls_l is None:
rn_cls_l = class_name
+3 -3
View File
@@ -127,7 +127,7 @@ class TypeGenBase:
entry_size: t.CSizeT = GenTypes.TraceFrame.__sizeof__()
addr: t.CUInt64T = t.CUInt64T(self.TraceFrames) + i * entry_size
return (GenTypes.TraceFrame | t.CPtr)(t.CVoid(addr, t.CPtr))
def push_trace(self, file_name: str, lineno: int, col_start: int = 0, col_end: int = 0):
def push_trace(self, file_name: str, lineno: int, col_start: int = 0, col_end: int = 0) -> None:
"""压入一个翻译上下文帧(进入新的翻译作用域时调用)"""
if self._ensure_trace_init() == 0:
return
@@ -141,7 +141,7 @@ class TypeGenBase:
frame.col_start = col_start
frame.col_end = col_end
self.TraceCount += 1
def pop_trace(self):
def pop_trace(self) -> None:
"""弹出栈顶帧(退出翻译作用域时调用)"""
if self.TraceCount <= 0:
return
@@ -152,7 +152,7 @@ class TypeGenBase:
frame.lineno = 0
frame.col_start = 0
frame.col_end = 0
def clear_trace(self):
def clear_trace(self) -> None:
"""清空调用栈(每个文件翻译开始前调用)"""
i: int
for i in range(self.TraceCount):
+1 -1
View File
@@ -78,7 +78,7 @@ class TypeGenErr(TypeGenBase.TypeGenBase):
def read_source_line(self, file_path: str, lineno: int) -> str:
"""公开包装:从源文件读取第 lineno 行内容(供 traceback 展示)"""
return self._read_source_line(file_path, lineno)
def dump_parse_traceback(self, file_path: str):
def dump_parse_traceback(self, file_path: str) -> None:
"""解析失败时以 Python 风格输出 traceback(仿 fatal_error)"""
err_line: int = ast.get_parse_err_line()
err_col: int = ast.get_parse_err_col()
+1 -1
View File
@@ -180,7 +180,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase):
name_node: ast.AST | t.CPtr = ast.Name(pool, name_buf, ctx)
stdlib.free(name_buf)
return name_node
def set_current_file(self, file_path: str):
def set_current_file(self, file_path: str) -> None:
"""设置当前编译的文件名(供报错使用)"""
self.CurrentFile = file_path
def get_current_file(self) -> str:
+2 -2
View File
@@ -800,7 +800,7 @@ def _const_int_for_cdefine(pool: memhub.MemBuddy | t.CPtr,
# ============================================================
def _resolve_doc_symbol_attr(trans: HT.Translator | t.CPtr,
at: ast.Attribute | t.CPtr,
out_mod: str | t.CPtr, out_sym: str | t.CPtr) -> int:
out_mod: str, out_sym: str) -> int:
"""解析嵌套 Attribute 链的 docstring 归属(委托到 gen._resolve_doc_symbol_attr,定义于 ExprGenCls)"""
g: Generator.Generator | t.CPtr = (Generator.Generator | t.CPtr)(t.CVoid(_g_gen, t.CPtr))
if g is not None:
@@ -812,7 +812,7 @@ def _resolve_doc_symbol_attr(trans: HT.Translator | t.CPtr,
# 解析 Name 符号的 docstring 归属 — 模块级委托
# ============================================================
def _resolve_doc_symbol_name(trans: HT.Translator | t.CPtr, name_id: str,
out_mod: str | t.CPtr, out_sym: str | t.CPtr) -> int:
out_mod: str, out_sym: str) -> int:
"""解析 Name 符号的 docstring 归属(委托到 gen._resolve_doc_symbol_name,定义于 ExprGenCls)"""
g: Generator.Generator | t.CPtr = (Generator.Generator | t.CPtr)(t.CVoid(_g_gen, t.CPtr))
if g is not None:
+6 -12
View File
@@ -264,24 +264,21 @@ def nowarn_register() -> int:
def info(msg: str, category: str = "") -> int:
"""输出 INFO 级别日志。"""
log: Logger | t.CPtr = get_logger()
if log is not None:
return log.info(msg, category)
if log is not None: return log.info(msg, category)
return 0
def warning(msg: str, category: str = "") -> int:
"""输出 WARN 级别日志。"""
log: Logger | t.CPtr = get_logger()
if log is not None:
return log.warning(msg, category)
if log is not None: return log.warning(msg, category)
return 0
def error(msg: str, category: str = "") -> int:
"""输出 ERROR 级别日志并立即终止进程。"""
log: Logger | t.CPtr = get_logger()
if log is not None:
return log.error(msg, category)
if log is not None: return log.error(msg, category)
# logger 不可用时也直接退出
sys.exit(1)
return 0
@@ -290,22 +287,19 @@ def error(msg: str, category: str = "") -> int:
def success(msg: str, category: str = "") -> int:
"""输出 SUCCESS 级别日志。"""
log: Logger | t.CPtr = get_logger()
if log is not None:
return log.success(msg, category)
if log is not None: return log.success(msg, category)
return 0
def critical(msg: str, category: str = "") -> int:
"""输出 CRITICAL 级别日志(致命错误,红底白字)。"""
log: Logger | t.CPtr = get_logger()
if log is not None:
return log.critical(msg, category)
if log is not None: return log.critical(msg, category)
return 0
def debug(msg: str, category: str = "") -> int:
"""输出 DEBUG 级别日志。"""
log: Logger | t.CPtr = get_logger()
if log is not None:
return log.debug(msg, category)
if log is not None: return log.debug(msg, category)
return 0
+5 -6
View File
@@ -99,7 +99,6 @@ def main() -> int:
lib._mbuddy = mb
# P2: 创建项目级 Generator 单例(Phase1/Phase2/BuildPipeline 全程复用;
# HandlesType 等旧模块函数经延迟 import 委托到 gen 方法,实现对象化过渡)
gen: GenGenerator.Generator | t.CPtr = mb.alloc(GenGenerator.Generator.__sizeof__())
if gen is None:
stdio.printf("FAIL: Generator alloc failed\n")
@@ -133,11 +132,11 @@ def main() -> int:
parser.add_argument("--clean", None, argparse.BOOL, 0, None, False, argparse.STORE_TRUE, "Clean output and temp directories")
parser.add_argument("--run", None, argparse.BOOL, 0, None, False, argparse.STORE_TRUE, "Run the generated executable after compilation")
parser.add_argument("--rebuild-includes", None, argparse.BOOL, 0, None, False, argparse.STORE_TRUE, "Delete the includes.binary precompiled cache and rebuild all the includes")
parser.add_argument("--clear-cache", None, argparse.BOOL, 0, None, False, argparse.STORE_TRUE, "Clear .transpyc_cache global cache")
parser.add_argument("--asan", None, argparse.BOOL, 0, None, False, argparse.STORE_TRUE, "ASan mode: .ll first opt -passes=asan then link -fsanitize=address")
parser.add_argument("--nowarn-register", None, argparse.BOOL, 0, None, False, argparse.STORE_TRUE, "Suppress Phase A dependency WARN")
parser.add_argument("--version", "-v", argparse.BOOL, 0, None, False, argparse.STORE_TRUE, "Show version and exit")
parser.add_argument("--help", "-h", argparse.BOOL, 0, None, False, argparse.STORE_TRUE, "Show help and exit")
parser.add_argument("--clear-cache", None, argparse.BOOL, 0, None, False, argparse.STORE_TRUE, "Clear .transpyc_cache global cache")
parser.add_argument("--asan", None, argparse.BOOL, 0, None, False, argparse.STORE_TRUE, "ASan mode: .ll first opt -passes=asan then link -fsanitize=address")
parser.add_argument("--nowarn-register", None, argparse.BOOL, 0, None, False, argparse.STORE_TRUE, "Suppress Phase A dependency WARN")
parser.add_argument("--version", "-v", argparse.BOOL, 0, None, False, argparse.STORE_TRUE, "Show version and exit")
parser.add_argument("--help", "-h", argparse.BOOL, 0, None, False, argparse.STORE_TRUE, "Show help and exit")
# 解析命令行参数
args: argparse.ParsedArgs | t.CPtr = parser.parse_args(sys._argc, sys._argv)