diff --git a/App/lib/Phase/BuildPipeline.vp b/App/lib/Phase/BuildPipeline.vp index f631f68..1c09b4a 100644 --- a/App/lib/Phase/BuildPipeline.vp +++ b/App/lib/Phase/BuildPipeline.vp @@ -569,8 +569,7 @@ def run_llc_parallel(tasks: bytes, task_count: int, max_threads: int) -> int: # --phase2command 模式:不 spawn 线程,把 opt(ASan)+ llc 命令全部写入 bat if _phase2_cmd_path is not None: for pi2 in range(task_count): - tsk_p: LlcTask | t.CPtr = (LlcTask | t.CPtr)(t.CVoid( - uint64(tasks) + sizet(pi2) * LlcTask.__sizeof__(), t.CPtr)) + tsk_p: LlcTask | t.CPtr = (LlcTask | t.CPtr)(uint64(tasks) + sizet(pi2) * LlcTask.__sizeof__()) if tsk_p is None: continue if tsk_p.OptCmd is not None: @@ -596,8 +595,7 @@ def run_llc_parallel(tasks: bytes, task_count: int, max_threads: int) -> int: batch_n = task_count - batch_start # 本批 spawn for j in range(batch_n): - tsk: LlcTask | t.CPtr = (LlcTask | t.CPtr)(t.CVoid( - uint64(tasks) + sizet(batch_start + j) * slot_size, t.CPtr)) + tsk: LlcTask | t.CPtr = (LlcTask | t.CPtr)(uint64(tasks) + sizet(batch_start + j) * slot_size) th: vthreading.Thread | t.CPtr = vthreading.Thread(_llc_task_worker, t.CPtr(tsk)) th.start() # start() 后立即取出句柄(Thread 对象栈地址可能被后续构造复用, @@ -611,8 +609,7 @@ def run_llc_parallel(tasks: bytes, task_count: int, max_threads: int) -> int: w32.win32base.CloseHandle(h_j) # 本批结果检查 for j in range(batch_n): - tsk2: LlcTask | t.CPtr = (LlcTask | t.CPtr)(t.CVoid( - uint64(tasks) + sizet(batch_start + j) * slot_size, t.CPtr)) + tsk2: LlcTask | t.CPtr = (LlcTask | t.CPtr)(uint64(tasks) + sizet(batch_start + j) * slot_size) if tsk2 is not None and tsk2.Result != 0: # 失败:打印模块 sha1 + 退出码 + 完整命令(.ll 路径即命令末参数) VLogger.error(f"llc 编译失败: {(tsk2.ModuleSha1 if tsk2.ModuleSha1 is not None else "?")} (exit={tsk2.ExitCode} cmd={(tsk2.LlcCmd if tsk2.LlcCmd is not None else "?")})", "LLC") diff --git a/App/lib/Phase/Phase1/Phase1Main.vp b/App/lib/Phase/Phase1/Phase1Main.vp index 9f3ea31..388c60e 100644 --- a/App/lib/Phase/Phase1/Phase1Main.vp +++ b/App/lib/Phase/Phase1/Phase1Main.vp @@ -256,7 +256,7 @@ def _BuildReachableResult(mb: rawptr[memhub.MemBuddy], if StubMerger._sha1_store_incdir[iidx] == '\0': continue eaddr: uint64 = uint64(result.Entries) + uint64(result.Count) * entry_size - entry: IncludesScanner.FileEntry | t.CPtr = (IncludesScanner.FileEntry | t.CPtr)(t.CVoid(eaddr, t.CPtr)) + entry: IncludesScanner.FileEntry | t.CPtr = (IncludesScanner.FileEntry | t.CPtr)(eaddr) if entry is None: continue # SHA1 深拷贝(store 槽 17 字节) @@ -507,7 +507,7 @@ def RunPhase1(mb: rawptr[memhub.MemBuddy], includes_dir: str, temp_dir: str, topo_order, topo_count_box, temp_dir, td_len_ts_call) if ret_topo == 0: - tc_ptr: t.CPtr = (int | t.CPtr)(t.CVoid(topo_count_box, t.CPtr)) + tc_ptr: t.CPtr = (int | t.CPtr)(topo_count_box) if tc_ptr is not None: topo_count = tc_ptr[0] VLogger.info(f"拓扑排序: {class_count_scanned} 个类, {topo_count} 个文件按依赖顺序处理", "Phase1") @@ -550,12 +550,12 @@ def RunPhase1(mb: rawptr[memhub.MemBuddy], includes_dir: str, temp_dir: str, file_idx: int = i if topo_count > 0: od_addr: uint64 = uint64(topo_order) + i * 4 - od_ptr: t.CPtr = (int | t.CPtr)(t.CVoid(od_addr, t.CPtr)) + od_ptr: t.CPtr = (int | t.CPtr)(t.CPtr(od_addr)) if od_ptr is not None: file_idx = od_ptr[0] entry_addr_r: uint64 = uint64(result.Entries) + file_idx * entry_size - entry_r: IncludesScanner.FileEntry | t.CPtr = (IncludesScanner.FileEntry | t.CPtr)(t.CVoid(entry_addr_r, t.CPtr)) + entry_r: IncludesScanner.FileEntry | t.CPtr = (IncludesScanner.FileEntry | t.CPtr)(entry_addr_r) if entry_r is None: p1a_fl += 1 continue @@ -715,7 +715,7 @@ def RunPhase1(mb: rawptr[memhub.MemBuddy], includes_dir: str, temp_dir: str, t_pv0: uint64 = w32.win32base.GetTickCount64() for i_pv in range(result.Count): entry_addr_pv: uint64 = uint64(result.Entries) + i_pv * entry_size - entry_pv: IncludesScanner.FileEntry | t.CPtr = (IncludesScanner.FileEntry | t.CPtr)(t.CVoid(entry_addr_pv, t.CPtr)) + entry_pv: IncludesScanner.FileEntry | t.CPtr = (IncludesScanner.FileEntry | t.CPtr)(entry_addr_pv) if entry_pv is None or entry_pv.Sha1 is None: p1bpre_failed += 1 continue @@ -836,11 +836,11 @@ def RunPhase1(mb: rawptr[memhub.MemBuddy], includes_dir: str, temp_dir: str, file_idx_b: int = i if topo_count > 0: od_addr_b: uint64 = uint64(topo_order) + sizet(i) * 4 - od_ptr_b: t.CPtr = (int | t.CPtr)(t.CVoid(od_addr_b, t.CPtr)) + od_ptr_b: t.CPtr = (int | t.CPtr)(od_addr_b) if od_ptr_b is not None: file_idx_b = od_ptr_b[0] entry_addr: uint64 = uint64(result.Entries) + sizet(file_idx_b) * entry_size - entry: IncludesScanner.FileEntry | t.CPtr = (IncludesScanner.FileEntry | t.CPtr)(t.CVoid(entry_addr, t.CPtr)) + entry: IncludesScanner.FileEntry | t.CPtr = (IncludesScanner.FileEntry | t.CPtr)(entry_addr) if entry is None: failed += 1 continue diff --git a/App/lib/Phase/Phase1/Phase1Scan.vp b/App/lib/Phase/Phase1/Phase1Scan.vp index b06c9a4..971bf3b 100644 --- a/App/lib/Phase/Phase1/Phase1Scan.vp +++ b/App/lib/Phase/Phase1/Phase1Scan.vp @@ -79,7 +79,7 @@ def _ScanClassInheritance(mb: rawptr[memhub.MemBuddy], # class_names_buf/parent_names_buf/def_sha1s_buf 与 generic_file_indices 在调用前分配、位于本 mark 之前,reset 不影响。 scan_mark: sizet = mb.mark() entry_addr: uint64 = uint64(result.Entries) + i * entry_size - entry: IncludesScanner.FileEntry | t.CPtr = (IncludesScanner.FileEntry | t.CPtr)(t.CVoid(entry_addr, t.CPtr)) + entry: IncludesScanner.FileEntry | t.CPtr = (IncludesScanner.FileEntry | t.CPtr)(entry_addr) if entry is None or entry.Sha1 is None: continue @@ -154,12 +154,12 @@ def _ScanClassInheritance(mb: rawptr[memhub.MemBuddy], if tp_scan is not None: file_has_generic = 1 if generic_file_count_box is not None: - gfc_ptr_scan: t.CPtr = (int | t.CPtr)(t.CVoid(generic_file_count_box, t.CPtr)) + gfc_ptr_scan: t.CPtr = (int | t.CPtr)(generic_file_count_box) if gfc_ptr_scan is not None: gfc_scan: int = gfc_ptr_scan[0] if gfc_scan < Phase1.MAX_FILE_DEPS and generic_file_indices is not None: gi_addr_scan: uint64 = uint64(generic_file_indices) + gfc_scan * 4 - gi_ptr_scan: t.CPtr = (int | t.CPtr)(t.CVoid(gi_addr_scan, t.CPtr)) + gi_ptr_scan: t.CPtr = (int | t.CPtr)(gi_addr_scan) if gi_ptr_scan is not None: gi_ptr_scan[0] = i gfc_ptr_scan[0] = gfc_scan + 1 @@ -265,7 +265,7 @@ def _PreRegisterAllGenericTemplates(mb: rawptr[memhub.MemBuddy], for i in range(result.Count): entry_addr_pg: uint64 = uint64(result.Entries) + i * p1e_size entry_pg: IncludesScanner.FileEntry | t.CPtr = ( - IncludesScanner.FileEntry | t.CPtr)(t.CVoid(entry_addr_pg, t.CPtr)) + IncludesScanner.FileEntry | t.CPtr)(entry_addr_pg) if entry_pg is None or entry_pg.Sha1 is None: continue # 读取文件 diff --git a/App/lib/Phase/Phase1/Phase1Topo.vp b/App/lib/Phase/Phase1/Phase1Topo.vp index e292361..65e812d 100644 --- a/App/lib/Phase/Phase1/Phase1Topo.vp +++ b/App/lib/Phase/Phase1/Phase1Topo.vp @@ -91,7 +91,7 @@ def _TopoSortFiles(mb: rawptr[memhub.MemBuddy], # sha1→file_index 映射(简单线性查找,文件数不多) for i in range(result.Count): entry_addr: uint64 = uint64(result.Entries) + i * entry_size - entry: IncludesScanner.FileEntry | t.CPtr = (IncludesScanner.FileEntry | t.CPtr)(t.CVoid(entry_addr, t.CPtr)) + entry: IncludesScanner.FileEntry | t.CPtr = (IncludesScanner.FileEntry | t.CPtr)(entry_addr) if entry is None or entry.Sha1 is None: continue @@ -141,7 +141,7 @@ def _TopoSortFiles(mb: rawptr[memhub.MemBuddy], # 读取当前依赖数量 cnt_addr: uint64 = uint64(file_dep_counts) + fi * 4 - cnt_ptr: t.CPtr = (int | t.CPtr)(t.CVoid(cnt_addr, t.CPtr)) + cnt_ptr: t.CPtr = (int | t.CPtr)(cnt_addr) if cnt_ptr is None: break cur_cnt: int = cnt_ptr[0] @@ -209,7 +209,7 @@ def _TopoSortFiles(mb: rawptr[memhub.MemBuddy], break # 去重 + 加边:fi_imp 依赖 fj_imp(InDegree[fi_imp]++) cnt_addr_imp: uint64 = uint64(file_dep_counts) + fi_imp * 4 - cnt_ptr_imp: t.CPtr = (int | t.CPtr)(t.CVoid(cnt_addr_imp, t.CPtr)) + cnt_ptr_imp: t.CPtr = (int | t.CPtr)(cnt_addr_imp) if cnt_ptr_imp is None: break cur_cnt_imp: int = cnt_ptr_imp[0] @@ -235,9 +235,9 @@ def _TopoSortFiles(mb: rawptr[memhub.MemBuddy], # 依赖为 0 的先处理,处理后减少依赖它的文件入度 for fi in range(file_count): cnt_addr3: uint64 = uint64(file_dep_counts) + fi * 4 - cnt_ptr3: t.CPtr = (int | t.CPtr)(t.CVoid(cnt_addr3, t.CPtr)) + cnt_ptr3: t.CPtr = (int | t.CPtr)(cnt_addr3) ind_addr3: uint64 = uint64(file_indegrees) + fi * 4 - ind_ptr3: t.CPtr = (int | t.CPtr)(t.CVoid(ind_addr3, t.CPtr)) + ind_ptr3: t.CPtr = (int | t.CPtr)(ind_addr3) if cnt_ptr3 is not None and ind_ptr3 is not None: ind_ptr3[0] = cnt_ptr3[0] @@ -249,12 +249,12 @@ def _TopoSortFiles(mb: rawptr[memhub.MemBuddy], for fi in range(file_count): # 检查处理状态 proc_addr4: uint64 = uint64(file_processed) + fi * 4 - proc_ptr4: t.CPtr = (int | t.CPtr)(t.CVoid(proc_addr4, t.CPtr)) + proc_ptr4: t.CPtr = (int | t.CPtr)(proc_addr4) if proc_ptr4 is None or proc_ptr4[0] != 0: continue # 检查入度 ind_addr4: uint64 = uint64(file_indegrees) + fi * 4 - ind_ptr4: t.CPtr = (int | t.CPtr)(t.CVoid(ind_addr4, t.CPtr)) + ind_ptr4: t.CPtr = (int | t.CPtr)(ind_addr4) if ind_ptr4 is None or ind_ptr4[0] > 0: continue @@ -263,12 +263,12 @@ def _TopoSortFiles(mb: rawptr[memhub.MemBuddy], target_sha1: str = file_sha1s_buf + fi * Phase1.SHA1_LEN for ri in range(result.Count): ea_r: uint64 = uint64(result.Entries) + ri * entry_size - ent_r: IncludesScanner.FileEntry | t.CPtr = (IncludesScanner.FileEntry | t.CPtr)(t.CVoid(ea_r, t.CPtr)) + ent_r: IncludesScanner.FileEntry | t.CPtr = (IncludesScanner.FileEntry | t.CPtr)(ea_r) if ent_r is not None and ent_r.Sha1 is not None: if string.strcmp(ent_r.Sha1, target_sha1) == 0: # 写入输出索引数组 out_idx_addr: uint64 = uint64(out_order) + out_idx * 4 - out_int_ptr: t.CPtr = (int | t.CPtr)(t.CVoid(out_idx_addr, t.CPtr)) + out_int_ptr: t.CPtr = (int | t.CPtr)(out_idx_addr) if out_int_ptr is not None: out_int_ptr[0] = ri out_idx += 1 @@ -281,12 +281,12 @@ def _TopoSortFiles(mb: rawptr[memhub.MemBuddy], # 减少依赖该文件的其他文件的入度 for fj in range(file_count): proc_addr5: uint64 = uint64(file_processed) + fj * 4 - proc_ptr5: t.CPtr = (int | t.CPtr)(t.CVoid(proc_addr5, t.CPtr)) + proc_ptr5: t.CPtr = (int | t.CPtr)(proc_addr5) if proc_ptr5 is None or proc_ptr5[0] != 0: continue # 读取 fj 的依赖数量 cnt_addr5: uint64 = uint64(file_dep_counts) + fj * 4 - cnt_ptr5: t.CPtr = (int | t.CPtr)(t.CVoid(cnt_addr5, t.CPtr)) + cnt_ptr5: t.CPtr = (int | t.CPtr)(cnt_addr5) if cnt_ptr5 is None: continue fj_dep_cnt: int = cnt_ptr5[0] @@ -294,7 +294,7 @@ def _TopoSortFiles(mb: rawptr[memhub.MemBuddy], dep_slot5: str = file_deps_buf + fj * Phase1.MAX_DEP_EDGES * Phase1.SHA1_LEN + di * Phase1.SHA1_LEN if string.strcmp(dep_slot5, target_sha1) == 0: ind_addr5: uint64 = uint64(file_indegrees) + fj * 4 - ind_ptr5: t.CPtr = (int | t.CPtr)(t.CVoid(ind_addr5, t.CPtr)) + ind_ptr5: t.CPtr = (int | t.CPtr)(ind_addr5) if ind_ptr5 is not None: ind_ptr5[0] = ind_ptr5[0] - 1 break @@ -310,7 +310,7 @@ def _TopoSortFiles(mb: rawptr[memhub.MemBuddy], if rem_idx is not None and rem_depcnt is not None: for fi in range(file_count): proc_addr7: uint64 = uint64(file_processed) + fi * 4 - proc_ptr7: t.CPtr = (int | t.CPtr)(t.CVoid(proc_addr7, t.CPtr)) + proc_ptr7: t.CPtr = (int | t.CPtr)(proc_addr7) if proc_ptr7 is not None and proc_ptr7[0] == 0: rem_idx[rem_count] = fi rem_depcnt[rem_count] = 0 @@ -324,7 +324,7 @@ def _TopoSortFiles(mb: rawptr[memhub.MemBuddy], if fi_b == fi_a: continue cnt_addr_b: uint64 = uint64(file_dep_counts) + fi_b * 4 - cnt_ptr_b: t.CPtr = (int | t.CPtr)(t.CVoid(cnt_addr_b, t.CPtr)) + cnt_ptr_b: t.CPtr = (int | t.CPtr)(cnt_addr_b) if cnt_ptr_b is None: continue cnt_b: int = cnt_ptr_b[0] @@ -347,17 +347,17 @@ def _TopoSortFiles(mb: rawptr[memhub.MemBuddy], for i_a in range(rem_count): fi_a2: int = rem_idx[i_a] proc_addr8: uint64 = uint64(file_processed) + fi_a2 * 4 - proc_ptr8: t.CPtr = (int | t.CPtr)(t.CVoid(proc_addr8, t.CPtr)) + proc_ptr8: t.CPtr = (int | t.CPtr)(proc_addr8) if proc_ptr8 is None or proc_ptr8[0] != 0: continue target_sha1_2: str = file_sha1s_buf + fi_a2 * Phase1.SHA1_LEN for ri in range(result.Count): ea_r2: uint64 = uint64(result.Entries) + ri * entry_size - ent_r2: IncludesScanner.FileEntry | t.CPtr = (IncludesScanner.FileEntry | t.CPtr)(t.CVoid(ea_r2, t.CPtr)) + ent_r2: IncludesScanner.FileEntry | t.CPtr = (IncludesScanner.FileEntry | t.CPtr)(ea_r2) if ent_r2 is not None and ent_r2.Sha1 is not None: if string.strcmp(ent_r2.Sha1, target_sha1_2) == 0: out_idx_addr2: uint64 = uint64(out_order) + out_idx * 4 - out_int_ptr2: t.CPtr = (int | t.CPtr)(t.CVoid(out_idx_addr2, t.CPtr)) + out_int_ptr2: t.CPtr = (int | t.CPtr)(out_idx_addr2) if out_int_ptr2 is not None: out_int_ptr2[0] = ri out_idx += 1 @@ -367,7 +367,7 @@ def _TopoSortFiles(mb: rawptr[memhub.MemBuddy], stdlib.free(rem_depcnt) # 写入输出数量 - out_count_ptr: t.CPtr = (int | t.CPtr)(t.CVoid(out_count, t.CPtr)) + out_count_ptr: t.CPtr = (int | t.CPtr)(out_count) if out_count_ptr is not None: out_count_ptr[0] = out_idx diff --git a/App/lib/Phase/Phase2/__init__.vp b/App/lib/Phase/Phase2/__init__.vp index a81b84b..64751f6 100644 --- a/App/lib/Phase/Phase2/__init__.vp +++ b/App/lib/Phase/Phase2/__init__.vp @@ -130,7 +130,7 @@ def _ScanDirForPyFiles(mb: rawptr[memhub.MemBuddy], sha1_val: str = IncludesScanner.compute_file_sha1(mb, full_path) if sha1_val is not None: ea: uint64 = uint64(entries) + file_count * entry_size - ent: SrcFileEntry | t.CPtr = (SrcFileEntry | t.CPtr)(t.CVoid(ea, t.CPtr)) + ent: SrcFileEntry | t.CPtr = (SrcFileEntry | t.CPtr)(ea) if ent is not None: ent.Path = full_path ent.Sha1 = sha1_val @@ -231,7 +231,7 @@ def _ScanDirForAsmFiles(mb: rawptr[memhub.MemBuddy], sha1_val: str = IncludesScanner.compute_file_sha1(mb, full_path) if sha1_val is not None: ea: uint64 = uint64(entries) + file_count * entry_size - ent: SrcFileEntry | t.CPtr = (SrcFileEntry | t.CPtr)(t.CVoid(ea, t.CPtr)) + ent: SrcFileEntry | t.CPtr = (SrcFileEntry | t.CPtr)(ea) if ent is not None: ent.Path = full_path ent.Sha1 = sha1_val @@ -266,7 +266,7 @@ def _PreRegisterAppGenericTemplates(mb: rawptr[memhub.MemBuddy], handled: int = 0 for i in range(file_count): ea_pa: uint64 = uint64(entries) + i * entry_size - ent_pa: SrcFileEntry | t.CPtr = (SrcFileEntry | t.CPtr)(t.CVoid(ea_pa, t.CPtr)) + ent_pa: SrcFileEntry | t.CPtr = (SrcFileEntry | t.CPtr)(ea_pa) if ent_pa is None or ent_pa.Path is None or ent_pa.Sha1 is None: continue # 读取文件 @@ -705,7 +705,7 @@ def RunMultiFileProject(mb: rawptr[memhub.MemBuddy], app_filled: int = 0 for i in range(file_count): ea_am: uint64 = uint64(entries) + i * entry_size - ent_am: SrcFileEntry | t.CPtr = (SrcFileEntry | t.CPtr)(t.CVoid(ea_am, t.CPtr)) + ent_am: SrcFileEntry | t.CPtr = (SrcFileEntry | t.CPtr)(ea_am) if ent_am is None or ent_am.Path is None or ent_am.Sha1 is None: continue # 计算相对路径(去除 source_dir 前缀,保留目录结构) @@ -747,7 +747,7 @@ def RunMultiFileProject(mb: rawptr[memhub.MemBuddy], vpi_failed_p2: int = 0 for i_vp2 in range(file_count): ea_vp2: uint64 = uint64(entries) + i_vp2 * entry_size - ent_vp2: SrcFileEntry | t.CPtr = (SrcFileEntry | t.CPtr)(t.CVoid(ea_vp2, t.CPtr)) + ent_vp2: SrcFileEntry | t.CPtr = (SrcFileEntry | t.CPtr)(ea_vp2) if ent_vp2 is None or ent_vp2.Path is None or ent_vp2.Sha1 is None: vpi_failed_p2 += 1 VLogger.error("[Phase A-pre-vpi] 源文件条目无效(Path/Sha1 缺失),跳过", "PhaseA") @@ -874,7 +874,7 @@ def RunMultiFileProject(mb: rawptr[memhub.MemBuddy], is_app_file_inc: int = 0 for i_app_inc in range(file_count): ea_app_inc: uint64 = uint64(entries) + i_app_inc * entry_size - ent_app_inc: SrcFileEntry | t.CPtr = (SrcFileEntry | t.CPtr)(t.CVoid(ea_app_inc, t.CPtr)) + ent_app_inc: SrcFileEntry | t.CPtr = (SrcFileEntry | t.CPtr)(ea_app_inc) if ent_app_inc is not None and ent_app_inc.Sha1 is not None \ and string.strcmp(ent_app_inc.Sha1, inc_sha1_pre) == 0: is_app_file_inc = 1 @@ -935,7 +935,7 @@ def RunMultiFileProject(mb: rawptr[memhub.MemBuddy], struct_count_before: int = GenApi.get_struct_count() for i in range(file_count): ea_pre: uint64 = uint64(entries) + i * entry_size - ent_pre: SrcFileEntry | t.CPtr = (SrcFileEntry | t.CPtr)(t.CVoid(ea_pre, t.CPtr)) + ent_pre: SrcFileEntry | t.CPtr = (SrcFileEntry | t.CPtr)(ea_pre) if ent_pre is None or ent_pre.Path is None: continue pkg_pre: str = None @@ -986,7 +986,7 @@ def RunMultiFileProject(mb: rawptr[memhub.MemBuddy], if done_flags[i] != 0: continue ea: uint64 = uint64(entries) + i * entry_size - ent: SrcFileEntry | t.CPtr = (SrcFileEntry | t.CPtr)(t.CVoid(ea, t.CPtr)) + ent: SrcFileEntry | t.CPtr = (SrcFileEntry | t.CPtr)(ea) # 计时点 0:本文件处理开始(translate 段起点) t_pa0: uint64 = w32.win32base.GetTickCount64() if ent is None or ent.Path is None: @@ -1111,7 +1111,7 @@ def RunMultiFileProject(mb: rawptr[memhub.MemBuddy], for i_err in range(file_count): if done_flags[i_err] == 0: ea_err: uint64 = uint64(entries) + i_err * entry_size - ent_err: SrcFileEntry | t.CPtr = (SrcFileEntry | t.CPtr)(t.CVoid(ea_err, t.CPtr)) + ent_err: SrcFileEntry | t.CPtr = (SrcFileEntry | t.CPtr)(ea_err) if ent_err is not None and ent_err.Path is not None: if ent_err.Sha1 is not None: _PhaseADumpFailGraph(temp_dir, td_len_fail, ent_err.Path, ent_err.Sha1) @@ -1166,7 +1166,7 @@ def RunMultiFileProject(mb: rawptr[memhub.MemBuddy], for i in range(file_count): ea: uint64 = uint64(entries) + i * entry_size - ent: SrcFileEntry | t.CPtr = (SrcFileEntry | t.CPtr)(t.CVoid(ea, t.CPtr)) + ent: SrcFileEntry | t.CPtr = (SrcFileEntry | t.CPtr)(ea) if ent is None or ent.Path is None or ent.Sha1 is None: continue # 单文件三步计时起点(GetTickCount64,ms) @@ -1198,8 +1198,7 @@ def RunMultiFileProject(mb: rawptr[memhub.MemBuddy], if llc_ir_path is None: VLogger.error("llc 输入路径构造失败", "PhaseB") sys.exit(1) - tslot: BuildPipeline.LlcTask | t.CPtr = (BuildPipeline.LlcTask | t.CPtr)(t.CVoid( - uint64(llc_tasks) + sizet(llc_task_count) * BuildPipeline.LlcTask.__sizeof__(), t.CPtr)) + tslot: BuildPipeline.LlcTask | t.CPtr = (BuildPipeline.LlcTask | t.CPtr)(uint64(llc_tasks) + sizet(llc_task_count) * BuildPipeline.LlcTask.__sizeof__()) if BuildPipeline.init_llc_task(tslot, llc_ir_path, output_dir, ent.Sha1, cc_cmd, cc_flags) != 0: VLogger.error(f"llc 任务构造失败: {ent.Path}", "PhaseB") @@ -1252,8 +1251,7 @@ def RunMultiFileProject(mb: rawptr[memhub.MemBuddy], # 释放 llc 任务(命令串 + 记录) ti: int = 0 while ti < llc_task_count: - tfree: BuildPipeline.LlcTask | t.CPtr = (BuildPipeline.LlcTask | t.CPtr)(t.CVoid( - uint64(llc_tasks) + sizet(ti) * BuildPipeline.LlcTask.__sizeof__(), t.CPtr)) + tfree: BuildPipeline.LlcTask | t.CPtr = (BuildPipeline.LlcTask | t.CPtr)(uint64(llc_tasks) + sizet(ti) * BuildPipeline.LlcTask.__sizeof__()) BuildPipeline.free_llc_task(tfree) ti += 1 stdlib.free(llc_tasks) @@ -1264,7 +1262,7 @@ def RunMultiFileProject(mb: rawptr[memhub.MemBuddy], asm_compiled: int = 0 for ai_as in range(asm_file_count): ea_as: uint64 = uint64(asm_entries) + ai_as * entry_size - ent_as: SrcFileEntry | t.CPtr = (SrcFileEntry | t.CPtr)(t.CVoid(ea_as, t.CPtr)) + ent_as: SrcFileEntry | t.CPtr = (SrcFileEntry | t.CPtr)(ea_as) if ent_as is None or ent_as.Path is None or ent_as.Sha1 is None: continue aret_as: int = BuildPipeline.asm_to_obj( @@ -1381,7 +1379,7 @@ def RunMultiFileProject(mb: rawptr[memhub.MemBuddy], app_skip_mi: int = 0 for ai_mi in range(file_count): ea_ap: uint64 = uint64(entries) + ai_mi * entry_size - ent_ap: SrcFileEntry | t.CPtr = (SrcFileEntry | t.CPtr)(t.CVoid(ea_ap, t.CPtr)) + ent_ap: SrcFileEntry | t.CPtr = (SrcFileEntry | t.CPtr)(ea_ap) if ent_ap is not None and ent_ap.Sha1 is not None: if string.strcmp(ent_ap.Sha1, inc_sha1_mi) == 0: app_skip_mi = 1 @@ -1653,7 +1651,7 @@ def RunMultiFileProject(mb: rawptr[memhub.MemBuddy], app_skip_pc: int = 0 for ai_pc in range(file_count): ea_pc: uint64 = uint64(entries) + ai_pc * entry_size - ent_pc: SrcFileEntry | t.CPtr = (SrcFileEntry | t.CPtr)(t.CVoid(ea_pc, t.CPtr)) + ent_pc: SrcFileEntry | t.CPtr = (SrcFileEntry | t.CPtr)(ea_pc) if ent_pc is not None and ent_pc.Sha1 is not None: if string.strcmp(ent_pc.Sha1, rsha1_pc) == 0: app_skip_pc = 1 diff --git a/App/lib/Stub/StubGen/VpiReader.vp b/App/lib/Stub/StubGen/VpiReader.vp index f7b0ea5..44672d9 100644 --- a/App/lib/Stub/StubGen/VpiReader.vp +++ b/App/lib/Stub/StubGen/VpiReader.vp @@ -95,7 +95,7 @@ def _vpi_idx_hash(key: bytes) -> uint64: def _vpi_idx_slot(idx_base: bytes, si: sizet) -> sizet | t.CPtr: """取索引第 si 个槽(8 字节,存 slot_index+1;0=空槽)""" - return (sizet | t.CPtr)(t.CVoid(uint64(idx_base) + uint64(si) * 8, t.CPtr)) + return (sizet | t.CPtr)(uint64(idx_base) + uint64(si) * 8) def _vpi_idx_find(keys: bytes, key_stride: int, idx_base: bytes, @@ -1528,9 +1528,9 @@ def _resolve_vpi_ret_annot_str(pool: rawptr[memhub.MemBuddy], wrap_i_cs += 1 return res_ty_cs if has_cvoid != 0: - # t.CVoid | t.State:State 是装饰器标记(编译侧忽略),t.CVoid → void。 + # t\.CVoid | t.State:State 是装饰器标记(编译侧忽略),t\.CVoid → void。 # 此前缺此分支 → first_ty=None → 返回 None → 跨模块函数返回类型 - # fail-fast(CPythonTest Py_Initialize() -> t.CVoid | t.State 根因)。 + # fail-fast(CPythonTest Py_Initialize() -> t\.CVoid | t.State 根因)。 return llvmlite.Void(pool) if first_ty is not None: return first_ty @@ -2580,8 +2580,7 @@ def _inject_class_struct_declare(pool: rawptr[memhub.MemBuddy], first_node_c: llvmlite.ParamNode | t.CPtr = None prev_node_c: llvmlite.ParamNode | t.CPtr = None for fi_c in range(field_count): - fty_c: llvmlite.LLVMType | t.CPtr = (llvmlite.LLVMType | t.CPtr)( - t.CVoid(field_types_buf[fi_c], t.CPtr)) + 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__()) if pnode_c is None: continue @@ -2639,9 +2638,8 @@ def _inject_class_struct_declare(pool: rawptr[memhub.MemBuddy], # add_field 内部按 StdlibAlloc 复制字段名到 perm_pool,跨 reset 存活。 afi_c: int = 0 for afi_c in range(field_count): - af_name_c: str = (str)(t.CVoid(field_names_buf[afi_c], t.CPtr)) - af_ty_c: llvmlite.LLVMType | t.CPtr = (llvmlite.LLVMType | t.CPtr)( - t.CVoid(field_types_buf[afi_c], t.CPtr)) + 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]) GenApi.add_field(pool, entry_c, af_name_c, af_ty_c) GenApi.add_visible_struct(pool, cls_name) return 1 diff --git a/App/lib/Stub/StubMerger/StubMergerBuild.vp b/App/lib/Stub/StubMerger/StubMergerBuild.vp index 32a759b..29e1997 100644 --- a/App/lib/Stub/StubMerger/StubMergerBuild.vp +++ b/App/lib/Stub/StubMerger/StubMergerBuild.vp @@ -792,8 +792,7 @@ def _BuildReachableSha1Set(mb: rawptr[memhub.MemBuddy], source_dir: str, if scan_res_r is not None: es_r: sizet = IncludesScanner.FileEntry.__sizeof__() for e_i_r in range(scan_res_r.Count): - e_r: IncludesScanner.FileEntry | t.CPtr = (IncludesScanner.FileEntry | t.CPtr)( - t.CVoid(uint64(scan_res_r.Entries) + uint64(e_i_r) * es_r, t.CPtr)) + e_r: IncludesScanner.FileEntry | t.CPtr = (IncludesScanner.FileEntry | t.CPtr)(uint64(scan_res_r.Entries) + uint64(e_i_r) * es_r) if e_r is None or e_r.Path is None: continue # 文件级 mark:parse 完立即回收 AST(App 全量 parse 驻留会 OOM) @@ -914,7 +913,7 @@ def _BuildReachableSha1Set(mb: rawptr[memhub.MemBuddy], source_dir: str, stdlib.free(worklist) stdlib.free(processed) return -1 - wl_pos_slot: sizet | t.CPtr = (sizet | t.CPtr)(t.CVoid(wl_pos, t.CPtr)) + wl_pos_slot: sizet | t.CPtr = (sizet | t.CPtr)(wl_pos) wl_pos_slot[0] = 0 while wl_pos_slot[0] < wl_len: @@ -987,10 +986,10 @@ def _BuildReachableSha1Set(mb: rawptr[memhub.MemBuddy], source_dir: str, # 输出槽防御性初始化(成功路径必全写;未找到/未命中时仅 free 槽本身) # 槽联合必须用 (sizet | t.CPtr):t.CPtr|t.CPtr 会被折叠成 t.CPtr, # [0] 变成 1 字节访问 → 指针被截断(0x2e 崩溃根因)。CSizeT 成员为 - # 8 字节,经 t.CVoid 显式做 u64↔指针转换。 - abs_slot: sizet | t.CPtr = (sizet | t.CPtr)(t.CVoid(out_abs, t.CPtr)) - rel_slot: sizet | t.CPtr = (sizet | t.CPtr)(t.CVoid(out_rel, t.CPtr)) - inc_slot: sizet | t.CPtr = (sizet | t.CPtr)(t.CVoid(out_inc, t.CPtr)) + # 8 字节,经 t\.CVoid 显式做 u64↔指针转换。 + abs_slot: sizet | t.CPtr = (sizet | t.CPtr)(out_abs) + rel_slot: sizet | t.CPtr = (sizet | t.CPtr)(out_rel) + inc_slot: sizet | t.CPtr = (sizet | t.CPtr)(out_inc) abs_slot[0] = 0 rel_slot[0] = 0 inc_slot[0] = 0 @@ -1003,9 +1002,9 @@ def _BuildReachableSha1Set(mb: rawptr[memhub.MemBuddy], source_dir: str, stdlib.free(out_inc) stdlib.free(mod_buf) continue - abs_path: str = (str)(t.CVoid(abs_slot[0], t.CPtr)) - rel_path: str = (str)(t.CVoid(rel_slot[0], t.CPtr)) - inc_dir: str = (str)(t.CVoid(inc_slot[0], t.CPtr)) + abs_path: str = str(abs_slot[0]) + rel_path: str = str(rel_slot[0]) + inc_dir: str = str(inc_slot[0]) # 读文件 + 计算 SHA1(CRLF→LF,与 IncludesScanner 一致) sha1_r2: str = IncludesScanner.compute_file_sha1(mb, abs_path) diff --git a/App/lib/Stub/StubMerger/StubMergerCollect.vp b/App/lib/Stub/StubMerger/StubMergerCollect.vp index 43b8f99..46caccc 100644 --- a/App/lib/Stub/StubMerger/StubMergerCollect.vp +++ b/App/lib/Stub/StubMerger/StubMergerCollect.vp @@ -238,7 +238,7 @@ def WriteIncludesSha1Map(mb: rawptr[memhub.MemBuddy], temp_dir: str, written_count: int = 0 for i in range(scan_result.Count): ea_w: uint64 = uint64(scan_result.Entries) + i * entry_size_w - ent_w: rawptr[IncludesScanner.FileEntry] = (rawptr[IncludesScanner.FileEntry])(t.CVoid(ea_w, t.CPtr)) + ent_w: rawptr[IncludesScanner.FileEntry] = (rawptr[IncludesScanner.FileEntry])(ea_w) if ent_w is None or ent_w.Sha1 is None or ent_w.RelPath is None: continue # 若提供过滤集合,只写入集合中的条目 diff --git a/App/lib/Stub/StubMerger/StubMergerStore.vp b/App/lib/Stub/StubMerger/StubMergerStore.vp index 378e6c9..f479ec6 100644 --- a/App/lib/Stub/StubMerger/StubMergerStore.vp +++ b/App/lib/Stub/StubMerger/StubMergerStore.vp @@ -71,7 +71,7 @@ def PopulateSha1MapStore(scan_result: IncludesScanner.ScanResult | t.CPtr) -> in if StubMerger._sha1_store_count >= StubMerger.MAX_INCLUDES: VLogger.error("includes SHA1 存储超上限,终止", "StubMerger") ea: uint64 = uint64(scan_result.Entries) + i * entry_size_p - ent: IncludesScanner.FileEntry | t.CPtr = (IncludesScanner.FileEntry | t.CPtr)(t.CVoid(ea, t.CPtr)) + ent: IncludesScanner.FileEntry | t.CPtr = (IncludesScanner.FileEntry | t.CPtr)(ea) if ent is None or ent.Sha1 is None or ent.RelPath is None: p_bad += 1 continue @@ -514,13 +514,13 @@ def GetSha1StoreArr(out_sha1_arr: t.CPtr, out_mod_arr: t.CPtr, out_rel_arr: t.CP return -1 if StubMerger._sha1_store_arr is None or StubMerger._sha1_store_mod is None or StubMerger._sha1_store_rel is None: return -1 - sp: t.CPtr = (t.CPtr | t.CPtr)(t.CVoid(out_sha1_arr, t.CPtr)) # 存疑 + sp: t.CPtr = (t.CPtr | t.CPtr)(out_sha1_arr) # 存疑 if sp is not None: sp[0] = StubMerger._sha1_store_arr - mp: t.CPtr = (t.CPtr | t.CPtr)(t.CVoid(out_mod_arr, t.CPtr)) + mp: t.CPtr = (t.CPtr | t.CPtr)(out_mod_arr) if mp is not None: mp[0] = StubMerger._sha1_store_mod - rp: t.CPtr = (t.CPtr | t.CPtr)(t.CVoid(out_rel_arr, t.CPtr)) + rp: t.CPtr = (t.CPtr | t.CPtr)(out_rel_arr) if rp is not None: rp[0] = StubMerger._sha1_store_rel return StubMerger._sha1_store_count diff --git a/App/lib/core/Gen/AssignGenMixin.vp b/App/lib/core/Gen/AssignGenMixin.vp index 83435d1..55ba5e5 100644 --- a/App/lib/core/Gen/AssignGenMixin.vp +++ b/App/lib/core/Gen/AssignGenMixin.vp @@ -25,7 +25,7 @@ import lib.core.Gen.GenApi as GenApi @t.NoVTable class AssignGenMixin: - Gen: Generator.Generator | t.CPtr + Gen: rawptr[Generator.Generator] """赋值翻译 Mixin(P6 方法化)""" RecoverFound: int diff --git a/App/lib/core/Gen/AsyncGenMixin.vp b/App/lib/core/Gen/AsyncGenMixin.vp index 868e0eb..4f38962 100644 --- a/App/lib/core/Gen/AsyncGenMixin.vp +++ b/App/lib/core/Gen/AsyncGenMixin.vp @@ -1180,8 +1180,7 @@ class AsyncGenMixin(CallGenBase.CallGenBase): # 后续 position_at_end 都作用于同一 builder 对象,_cur_builder 引用不变。 trans._cur_func = func trans._cur_builder = builder - seg_bb: llvmlite.BasicBlock | t.CPtr = (llvmlite.BasicBlock | t.CPtr)( - t.CVoid(state_bbs[0], t.CPtr)) + seg_bb: llvmlite.BasicBlock | t.CPtr = (llvmlite.BasicBlock | t.CPtr)(state_bbs[0]) llvmlite.position_at_end(builder, seg_bb) self._handle_segment(trans, builder, pool, mod, fd.children) # 函数体自然结束 → 隐式 return(ret=0 + done=1 + br exit) @@ -1739,8 +1738,7 @@ class AsyncGenMixin(CallGenBase.CallGenBase): # 注意:state_bbs 数组存的是块指针(sizet),必须下标取值, # 不能取元素地址(uint64(数组)+idx*8 是地址,会导致 position # 到非法块 → IR 指令链损坏 → RenumberSSA/FunctionPrint 崩溃)。 - return (llvmlite.BasicBlock | t.CPtr)( - t.CVoid(trans._coro_state_bbs[state_no], t.CPtr)) + 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: """取当前 resume 的帧类型:从 _coro_frames 反查(当前 async 名未知时用帧指针类型不可行, @@ -1839,10 +1837,7 @@ class AsyncGenMixin(CallGenBase.CallGenBase): llvmlite.build_store(builder, exc_code, trans._coro_exc_ptr) # 跳 try except / 终止 if trans._coro_try_stack_count > 0: - tbb_r: llvmlite.BasicBlock | t.CPtr = ( - llvmlite.BasicBlock | t.CPtr)(t.CVoid( - trans._coro_try_stack[trans._coro_try_stack_count - 1], - t.CPtr)) + tbb_r: llvmlite.BasicBlock | t.CPtr = (llvmlite.BasicBlock | t.CPtr)(trans._coro_try_stack[trans._coro_try_stack_count - 1]) llvmlite.build_br(builder, tbb_r) else: done_r: llvmlite.Value | t.CPtr = llvmlite.const_int32(pool, 1) @@ -1958,7 +1953,7 @@ class AsyncGenMixin(CallGenBase.CallGenBase): for hi in range(nhandlers): h_node: ast.AST | t.CPtr = tr.handlers.get(hi) check_bb: llvmlite.BasicBlock | t.CPtr = ( - llvmlite.BasicBlock | t.CPtr)(t.CVoid(check_bbs[hi], t.CPtr)) + llvmlite.BasicBlock | t.CPtr)(check_bbs[hi]) llvmlite.position_at_end(builder, check_bb) catch_all: int = 0 ncodes: int = 0 @@ -1975,12 +1970,11 @@ class AsyncGenMixin(CallGenBase.CallGenBase): ename, codes_buf, 64) next_check: llvmlite.BasicBlock | t.CPtr = None if hi + 1 < nhandlers: - next_check = (llvmlite.BasicBlock | t.CPtr)( - t.CVoid(check_bbs[hi + 1], t.CPtr)) + next_check = (llvmlite.BasicBlock | t.CPtr)(check_bbs[hi + 1]) else: next_check = unmatched_bb handler_bb: llvmlite.BasicBlock | t.CPtr = ( - llvmlite.BasicBlock | t.CPtr)(t.CVoid(handler_bbs[hi], t.CPtr)) + llvmlite.BasicBlock | t.CPtr)(handler_bbs[hi]) if catch_all != 0: llvmlite.build_br(builder, handler_bb) else: @@ -2007,7 +2001,7 @@ class AsyncGenMixin(CallGenBase.CallGenBase): for hi in range(nhandlers): h_node2: ast.AST | t.CPtr = tr.handlers.get(hi) handler_bb2: llvmlite.BasicBlock | t.CPtr = ( - llvmlite.BasicBlock | t.CPtr)(t.CVoid(handler_bbs[hi], 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) @@ -2470,10 +2464,7 @@ class AsyncGenMixin(CallGenBase.CallGenBase): builder, i8_ptr_ty_a, child_msg_ptr) llvmlite.build_store(builder, child_msg, trans._coro_msg_ptr) if trans._coro_try_stack_count > 0: - tbb: llvmlite.BasicBlock | t.CPtr = ( - llvmlite.BasicBlock | t.CPtr)(t.CVoid( - trans._coro_try_stack[trans._coro_try_stack_count - 1], - t.CPtr)) + tbb: llvmlite.BasicBlock | t.CPtr = (llvmlite.BasicBlock | t.CPtr)(trans._coro_try_stack[trans._coro_try_stack_count - 1]) llvmlite.build_br(builder, tbb) else: done_x: llvmlite.Value | t.CPtr = llvmlite.const_int32(pool, 1) @@ -2683,14 +2674,14 @@ class AsyncGenMixin(CallGenBase.CallGenBase): addr: uint64 = uint64(trans._coro_frames) + i * 16 pair: str | t.CPtr = (t.CPtr)(addr) if pair[0] is not None and string.strcmp(pair[0], name) == 0: - pair[1] = (str)(t.CVoid(sizet(frame_ty), t.CPtr)) + pair[1] = str(frame_ty) return 0 if cnt >= HT.MAX_CORO_FUNCS: return 1 pair2_addr: uint64 = uint64(trans._coro_frames) + cnt * 16 pair2: str | t.CPtr = (t.CPtr)(pair2_addr) pair2[0] = name - pair2[1] = (str)(t.CVoid(sizet(frame_ty), t.CPtr)) + pair2[1] = str(frame_ty) trans._coro_frame_count = cnt + 1 return 0 @@ -2707,7 +2698,7 @@ 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)(t.CVoid(ty_addr, t.CPtr)) + return (llvmlite.LLVMType | t.CPtr)(ty_addr) return None return None diff --git a/App/lib/core/Gen/BaseGenMixin.vp b/App/lib/core/Gen/BaseGenMixin.vp index 89bbce1..8bc16a3 100644 --- a/App/lib/core/Gen/BaseGenMixin.vp +++ b/App/lib/core/Gen/BaseGenMixin.vp @@ -14,7 +14,7 @@ class BaseGenMixin: """生成器状态容器(基座)""" # 内存/IR 状态 - Gen: Generator.Generator | t.CPtr + Gen: rawptr[Generator.Generator] Pool: rawptr[memhub.MemBuddy] # 内存池 Module: llvmlite.LLVMModule | t.CPtr # 当前 LLVM 模块 Builder: llvmlite.IRBuilder | t.CPtr # 当前 IRBuilder diff --git a/App/lib/core/Gen/Call/CallGenBase.vp b/App/lib/core/Gen/Call/CallGenBase.vp index cf982d4..2e2f072 100644 --- a/App/lib/core/Gen/Call/CallGenBase.vp +++ b/App/lib/core/Gen/Call/CallGenBase.vp @@ -57,7 +57,7 @@ class CallGenBase: """调用分派最底层父类(字段 + 模块符号查找 + 返回类型解析基础设施)""" # --- c.cexport 注册表(原 _g_cexport_sha1_arr/_g_cexport_func_arr/_g_cexport_count) --- - Gen: Generator.Generator | t.CPtr + Gen: rawptr[Generator.Generator] CexportSha1Arr: bytes CexportFuncArr: bytes CexportCount: int diff --git a/App/lib/core/Gen/Call/CallGenCBuiltin.vp b/App/lib/core/Gen/Call/CallGenCBuiltin.vp index bf86bbe..8fa499f 100644 --- a/App/lib/core/Gen/Call/CallGenCBuiltin.vp +++ b/App/lib/core/Gen/Call/CallGenCBuiltin.vp @@ -113,7 +113,7 @@ class CallGenCBuiltin(CallGenBase.CallGenBase): case llvmlite.LLVMType.Int(pointee_width): # 允许推断:c.Deref 是赋值语句直接 RHS(v: int = c.Deref(p)) # 或处于类型转换链包裹中(如 vt: t.CPtr = - # t.CVoid(c.Deref(p)))。嵌套在 while 条件/比较/binop/ + # t\.CVoid(c.Deref(p)))。嵌套在 while 条件/比较/binop/ # 其他调用中(如 while c.Deref(p) != 0、total += # int(c.Deref(p)))不推断,否则 i8* 会被残留 # CurAssignAnnot 误判为 i32* 读 4 字节 → StringIterTest @@ -361,8 +361,6 @@ class CallGenCBuiltin(CallGenBase.CallGenBase): if trans is not None: # self/cls 对象引用:c.Addr(self) 返回对象指针本身(Ptr(Struct)), # 而非指针变量的地址(Ptr(Ptr(Struct)))。方法与 Attribute 分支 - # (c.Addr(self.field) 先 load self)语义一致,供 - # return t.CVoid(c.Addr(self), CPtr) 返回 this 使用。 if string.strcmp(nm.id, "self") == 0 or string.strcmp(nm.id, "cls") == 0: self_entry: GenTypes.VarEntry | t.CPtr = self.Gen.VarGen.lookup_var_entry( trans.SymTab, nm.id) @@ -968,7 +966,7 @@ class CallGenCBuiltin(CallGenBase.CallGenBase): """获取操作数数组中第 idx 个元素的指针""" entry_size: sizet = GenTypes.AsmOperand.__sizeof__() entry_addr: uint64 = uint64(base) + idx * entry_size - return (GenTypes.AsmOperand | t.CPtr)(t.CVoid(entry_addr, t.CPtr)) + return (GenTypes.AsmOperand | t.CPtr)(entry_addr) def _asm_is_c_call(self, node: ast.Call | t.CPtr) -> str: @@ -1340,7 +1338,7 @@ class CallGenCBuiltin(CallGenBase.CallGenBase): continue if clobber_count < ASM_MAX_CLOBBERS: cl_addr: uint64 = uint64(clobbers) + clobber_count * 8 - cl_ptr: str | t.CPtr = (str | t.CPtr)(t.CVoid(cl_addr, t.CPtr)) + cl_ptr: str | t.CPtr = (str | t.CPtr)(cl_addr) cl_ptr[0] = cstr clobber_count += 1 @@ -1363,7 +1361,7 @@ class CallGenCBuiltin(CallGenBase.CallGenBase): continue if clobber_count < ASM_MAX_CLOBBERS: pcl_addr: uint64 = uint64(clobbers) + clobber_count * 8 - pcl_ptr: str | t.CPtr = (str | t.CPtr)(t.CVoid(pcl_addr, t.CPtr)) + pcl_ptr: str | t.CPtr = (str | t.CPtr)(pcl_addr) pcl_ptr[0] = pstr clobber_count += 1 @@ -1400,7 +1398,7 @@ class CallGenCBuiltin(CallGenBase.CallGenBase): pty5: llvmlite.LLVMType | t.CPtr = None # 优先收集时按序缓存的直接类型,再回退从槽读回 if out_ptys is not None and out_seq < out_pty_n: - pty5 = (llvmlite.LLVMType | t.CPtr)(t.CVoid(out_ptys[out_seq], t.CPtr)) + pty5 = (llvmlite.LLVMType | t.CPtr)(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 @@ -1561,7 +1559,7 @@ class CallGenCBuiltin(CallGenBase.CallGenBase): # 追加 clobber 约束 ~{name} for cidx in range(clobber_count): cl_addr2: uint64 = uint64(clobbers) + cidx * 8 - cname: str = (str | t.CPtr)(t.CVoid(cl_addr2, t.CPtr))[0] + cname: str = (str | t.CPtr)(cl_addr2)[0] if cname is None or cname[0] == '\0': continue if first_const == 0: @@ -1808,8 +1806,8 @@ class CallGenCBuiltin(CallGenBase.CallGenBase): # LOut 写回: store %llvmirN, * %var oi: int for oi in range(out_count): - oa: llvmlite.Value | t.CPtr = (llvmlite.Value | t.CPtr)(t.CVoid(out_alloca[oi], t.CPtr)) - rn: str = (str)(t.CVoid(out_regname[oi], t.CPtr)) + oa: llvmlite.Value | t.CPtr = (llvmlite.Value | t.CPtr)(out_alloca[oi]) + rn: str = str(out_regname[oi]) if oa is None or oa.Ty is None or oa.Ty.Pointee is None or rn is None: continue reg_val: llvmlite.Value | t.CPtr = llvmlite.new_value(pool) diff --git a/App/lib/core/Gen/Call/CallGenCall.vp b/App/lib/core/Gen/Call/CallGenCall.vp index de8384e..2152289 100644 --- a/App/lib/core/Gen/Call/CallGenCall.vp +++ b/App/lib/core/Gen/Call/CallGenCall.vp @@ -95,12 +95,12 @@ class CallGenCall(CallGenBase.CallGenBase): # 2. 获取方法在虚表中的索引(用 entry 直接查找) method_index: int = -1 if vc_entry is not None and vc_entry.VTableMethods is not None: - methods_arr: sizet | t.CPtr = (sizet | t.CPtr)(t.CVoid(vc_entry.VTableMethods, t.CPtr)) + methods_arr: sizet | t.CPtr = (sizet | t.CPtr)(vc_entry.VTableMethods) for mi in range(vc_entry.VTableMethodCount): mname_addr: sizet = methods_arr[mi] if mname_addr == 0: continue - mname: str = (str | t.CPtr)(t.CVoid(mname_addr, t.CPtr)) + mname: str = (str | t.CPtr)(mname_addr) if mname is not None and string.strcmp(mname, method_name) == 0: method_index = mi break @@ -407,7 +407,7 @@ class CallGenCall(CallGenBase.CallGenBase): arg_addr: sizet = extra_args[ei] if arg_addr == 0: continue - av: llvmlite.Value | t.CPtr = (llvmlite.Value | t.CPtr)(t.CVoid(arg_addr, t.CPtr)) + av: llvmlite.Value | t.CPtr = (llvmlite.Value | t.CPtr)(arg_addr) if av is not None: llvmlite.value_set_next(av, None) llvmlite.value_set_next(tail, av) @@ -623,12 +623,12 @@ class CallGenCall(CallGenBase.CallGenBase): if cmop_entry is not None: cmop_has_vt = cmop_entry.HasVTable if cmop_has_vt == 1 and cmop_entry.VTableMethods is not None: - cmop_methods_arr: sizet | t.CPtr = (sizet | t.CPtr)(t.CVoid(cmop_entry.VTableMethods, t.CPtr)) + cmop_methods_arr: sizet | t.CPtr = (sizet | t.CPtr)(cmop_entry.VTableMethods) for cmop_mi in range(cmop_entry.VTableMethodCount): cmop_mname_addr: sizet = cmop_methods_arr[cmop_mi] if cmop_mname_addr == 0: continue - cmop_mname: str = (str | t.CPtr)(t.CVoid(cmop_mname_addr, t.CPtr)) + cmop_mname: str = (str | t.CPtr)(cmop_mname_addr) if cmop_mname is not None and string.strcmp(cmop_mname, method_name) == 0: cmop_method_idx = cmop_mi break @@ -798,7 +798,7 @@ class CallGenCall(CallGenBase.CallGenBase): mro_ptr: sizet | t.CPtr = self.Gen.StructGen.get_mro_chain(pool, class_name) mi: int = 1 while mro_ptr is not None and mro_ptr[mi] != 0: - anc: str = (str | t.CPtr)(t.CVoid(mro_ptr[mi], t.CPtr)) + anc: str = (str | t.CPtr)(mro_ptr[mi]) if anc is not None: parent_lookup: str = pool.alloc(128) if parent_lookup is not None: @@ -956,7 +956,7 @@ class CallGenCall(CallGenBase.CallGenBase): mro_s0: sizet | t.CPtr = self.Gen.StructGen.get_mro_chain(pool, class_name) mi_s0: int = 1 while mro_s0 is not None and mro_s0[mi_s0] != 0 and ret_anc_sha1 is None: - anc_s0: str = (str | t.CPtr)(t.CVoid(mro_s0[mi_s0], t.CPtr)) + anc_s0: str = (str | t.CPtr)(mro_s0[mi_s0]) if anc_s0 is not None: ret_anc_sha1 = self.Gen.StructGen.get_struct_sha1(anc_s0) mi_s0 += 1 @@ -1074,7 +1074,7 @@ class CallGenCall(CallGenBase.CallGenBase): mro_t2: sizet | t.CPtr = self.Gen.StructGen.get_mro_chain(pool, class_name) mi_t2: int = 1 while mro_t2 is not None and mro_t2[mi_t2] != 0 and looked_up_ty is None: - anc_t2: str = (str | t.CPtr)(t.CVoid(mro_t2[mi_t2], t.CPtr)) + anc_t2: str = (str | t.CPtr)(mro_t2[mi_t2]) if anc_t2 is not None and string.strcmp(anc_t2, class_name) != 0: anc_sha1_t2: str = self.Gen.StructGen.get_struct_sha1(anc_t2) looked_up_ty = self._LookupMethodRetTyFromTextLL( @@ -1094,7 +1094,7 @@ class CallGenCall(CallGenBase.CallGenBase): mro_v2: sizet | t.CPtr = self.Gen.StructGen.get_mro_chain(pool, class_name) mi_v2: int = 1 while mro_v2 is not None and mro_v2[mi_v2] != 0 and vpi_ret_ty is None: - anc_v2: str = (str | t.CPtr)(t.CVoid(mro_v2[mi_v2], t.CPtr)) + anc_v2: str = (str | t.CPtr)(mro_v2[mi_v2]) if anc_v2 is not None and string.strcmp(anc_v2, class_name) != 0: anc_sha1_v2: str = self.Gen.StructGen.get_struct_sha1(anc_v2) vpi_ret_ty = self._lookup_method_ret_ty_via_vpi( @@ -1132,7 +1132,7 @@ class CallGenCall(CallGenBase.CallGenBase): mi_p2: int = 1 anc_missing_p2: int = 0 while mro_p2 is not None and mro_p2[mi_p2] != 0: - anc_p2: str = (str | t.CPtr)(t.CVoid(mro_p2[mi_p2], t.CPtr)) + anc_p2: str = (str | t.CPtr)(mro_p2[mi_p2]) if anc_p2 is not None: anc_sha1_p2: str = self.Gen.StructGen.get_struct_sha1(anc_p2) if anc_sha1_p2 is None \ @@ -1210,7 +1210,7 @@ class CallGenCall(CallGenBase.CallGenBase): is_first_parent_th: int = 0 mro_fp_th: sizet | t.CPtr = self.Gen.StructGen.get_mro_chain(pool, class_name) if mro_fp_th is not None and mro_fp_th[1] != 0: - first_parent_th: str = (str | t.CPtr)(t.CVoid(mro_fp_th[1], t.CPtr)) + first_parent_th: str = (str | t.CPtr)(mro_fp_th[1]) if first_parent_th is not None and string.strcmp(first_parent_th, mc_anc) == 0: is_first_parent_th = 1 anc_entry_th: GenTypes.StructEntry | t.CPtr = self.Gen.StructGen.find_struct(mc_anc) @@ -1641,12 +1641,12 @@ class CallGenCall(CallGenBase.CallGenBase): if mc_entry is not None: mc_has_vt = mc_entry.HasVTable if mc_has_vt == 1 and mc_entry.VTableMethods is not None: - mc_methods_arr: sizet | t.CPtr = (sizet | t.CPtr)(t.CVoid(mc_entry.VTableMethods, t.CPtr)) + mc_methods_arr: sizet | t.CPtr = (sizet | t.CPtr)(mc_entry.VTableMethods) for mc_mi in range(mc_entry.VTableMethodCount): mc_mname_addr: sizet = mc_methods_arr[mc_mi] if mc_mname_addr == 0: continue - mc_mname: str = (str | t.CPtr)(t.CVoid(mc_mname_addr, t.CPtr)) + mc_mname: str = (str | t.CPtr)(mc_mname_addr) if mc_mname is not None and string.strcmp(mc_mname, method_name) == 0: mc_method_idx = mc_mi break @@ -1935,7 +1935,7 @@ class CallGenCall(CallGenBase.CallGenBase): mro_sp: sizet | t.CPtr = self.Gen.StructGen.get_mro_chain(pool, cur_class) mi_sp: int = 1 while mro_sp is not None and mro_sp[mi_sp] != 0: - anc_sp: str = (str | t.CPtr)(t.CVoid(mro_sp[mi_sp], t.CPtr)) + anc_sp: str = (str | t.CPtr)(mro_sp[mi_sp]) if anc_sp is not None: probe_sp: str = pool.alloc(160) if probe_sp is not None: diff --git a/App/lib/core/Gen/Call/CallGenDispatch.vp b/App/lib/core/Gen/Call/CallGenDispatch.vp index ad0217d..37251bb 100644 --- a/App/lib/core/Gen/Call/CallGenDispatch.vp +++ b/App/lib/core/Gen/Call/CallGenDispatch.vp @@ -396,7 +396,7 @@ class CallGenDispatch(CallGenBase.CallGenBase): tc_arg2_nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(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.CVoid(x, CPtr)) + # 形式 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) if tc_arg2_bn.id is not None and string.strcmp(tc_arg2_bn.id, "CPtr") == 0: diff --git a/App/lib/core/Gen/Call/CallGenLeafKit.vp b/App/lib/core/Gen/Call/CallGenLeafKit.vp index eb527fa..c51fe4c 100644 --- a/App/lib/core/Gen/Call/CallGenLeafKit.vp +++ b/App/lib/core/Gen/Call/CallGenLeafKit.vp @@ -76,7 +76,7 @@ def _gfn_hash(name: str) -> uint64: def _gfn_idx_slot(idx_base: sizet | t.CPtr, si: sizet) -> sizet | t.CPtr: """取索引第 si 个槽(8 字节,存槽下标+1;0=空槽)""" - return (sizet | t.CPtr)(t.CVoid(uint64(idx_base) + uint64(si) * 8, t.CPtr)) + return (sizet | t.CPtr)(uint64(idx_base) + uint64(si) * 8) def _gfn_idx_find(funcs: GenTypes.FuncEntry | t.CPtr, @@ -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)(t.CVoid(entry_addr, t.CPtr)) + entry: GenTypes.FuncEntry | t.CPtr = (GenTypes.FuncEntry | t.CPtr)(entry_addr) if entry is not None and entry.Name is not None: if string.strcmp(entry.Name, name) == 0: return se @@ -334,7 +334,7 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin): self.Gen.TypeGenErr.fatal_error(cls_node, "isinstance() 参数类型推断失败", "TypeError") ci: int = 0 while cls_names[ci] != 0: - cn: str = (str | t.CPtr)(t.CVoid(cls_names[ci], t.CPtr)) + cn: str = (str | t.CPtr)(cls_names[ci]) if cn is not None: if self.Gen.StructGen.is_novtable_by_name(cn) != 0 \ or self.Gen.StructGen.has_vtable_by_name(cn) == 0: @@ -358,7 +358,7 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin): if subs is not None: k: int = 0 while subs[k] != 0: - scn: str = (str | t.CPtr)(t.CVoid(subs[k], t.CPtr)) + scn: str = (str | t.CPtr)(subs[k]) if scn is not None: sub_i8: llvmlite.Value | t.CPtr = self._make_vtable_ref_i8( pool, builder, mod, scn, trans) @@ -446,14 +446,14 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin): while qcount > 0: qcount -= 1 cur_addr: sizet = queue[qcount] - cur: str = (str | t.CPtr)(t.CVoid(cur_addr, t.CPtr)) + cur: str = (str | t.CPtr)(cur_addr) if cur is None: continue dup: int = 0 for vi in range(vcount): va: sizet = visited[vi] if va != 0: - vn: str = (str | t.CPtr)(t.CVoid(va, t.CPtr)) + vn: str = (str | t.CPtr)(va) if vn is not None and string.strcmp(vn, cur) == 0: dup = 1 break @@ -477,11 +477,11 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin): if e2 is None or e2.Name is None: continue if e2.ParentCount > 0 and e2.ParentNames is not None: - parr: sizet | t.CPtr = (sizet | t.CPtr)(t.CVoid(e2.ParentNames, t.CPtr)) + parr: sizet | t.CPtr = (sizet | t.CPtr)(e2.ParentNames) for j in range(e2.ParentCount): pa: sizet = parr[j] if pa != 0: - pn: str = (str | t.CPtr)(t.CVoid(pa, t.CPtr)) + pn: str = (str | t.CPtr)(pa) if pn is not None and string.strcmp(pn, cur) == 0: if qcount < ISINSTANCE_CLASS_MAX: queue[qcount] = sizet(e2.Name) @@ -554,7 +554,7 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin): if mro is not None: k: int = 0 while mro[k] != 0: - mn: str = (str | t.CPtr)(t.CVoid(mro[k], t.CPtr)) + mn: str = (str | t.CPtr)(mro[k]) if mn is not None and string.strcmp(mn, class_name) == 0: return 1 k += 1 @@ -734,8 +734,7 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin): for i in range(self.FuncptrCount): idx: sizet = sizet(i) * 64 if string.strcmp(self.FuncptrNames + idx, name) == 0: - return (llvmlite.LLVMType | t.CPtr)( - t.CVoid(self.FuncptrRets[i], t.CPtr)) + return (llvmlite.LLVMType | t.CPtr)(self.FuncptrRets[i]) return None @@ -1047,8 +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)( - t.CVoid(uint64(self.GlobalFuncs) + fi_t * entry_size, t.CPtr)) + fe_t: GenTypes.FuncEntry | t.CPtr = (GenTypes.FuncEntry | t.CPtr)((uint64(self.GlobalFuncs) + fi_t * entry_size)) if fe_t is not None: return fe_t.Func # 索引可信(Built==GlobalFuncCount | 查询名非空)⇒ 未命中即"确无同名条目": @@ -1060,7 +1058,7 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin): fallback_entry: GenTypes.FuncEntry | t.CPtr = None for i in range(func_count): entry_addr: uint64 = uint64(funcs) + i * entry_size - entry: GenTypes.FuncEntry | t.CPtr = (GenTypes.FuncEntry | t.CPtr)(t.CVoid(entry_addr, t.CPtr)) + entry: GenTypes.FuncEntry | t.CPtr = (GenTypes.FuncEntry | t.CPtr)(entry_addr) if entry is not None and entry.Name is not None: # 快速路径:同名要求首字符相等(strcmp 判等蕴含首字符相等), # 首字符不同者直接跳过 strcmp,避免全表每槽一次函数调用。 @@ -1101,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)(t.CVoid(entry_addr, t.CPtr)) + entry: GenTypes.FuncEntry | t.CPtr = (GenTypes.FuncEntry | t.CPtr)(entry_addr) entry.Name = name entry.Func = func entry.Defaults = defaults @@ -1161,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)(t.CVoid(entry_addr, t.CPtr)) + entry: GenTypes.FuncEntry | t.CPtr = (GenTypes.FuncEntry | t.CPtr)(entry_addr) # Name 深拷贝到 stdlib 区:全局表跨文件永久存活,pool 内名字会被 1b 每文件 # reset_to(mark1) 回收导致悬空(vtable 生成 find_func_global 后 strcmp 崩溃) name_len: sizet = string.strlen(name) @@ -1235,8 +1233,7 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin): arena, llvmlite.param_get_ty(cur)) if ps is None: return None - slot: sizet | t.CPtr = (sizet | t.CPtr)( - t.CVoid(uint64(params_arr) + uint64(i * 8), t.CPtr)) + slot: sizet | t.CPtr = (sizet | t.CPtr)(uint64(params_arr) + uint64(i * 8)) if slot is None: return None slot[0] = sizet(ps) @@ -1266,13 +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)( - t.CVoid(uint64(self.GlobalFuncs) + gi * entry_size, t.CPtr)) + entry_g: GenTypes.FuncEntry | t.CPtr = (GenTypes.FuncEntry | t.CPtr)(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)(t.CVoid(entry_addr, t.CPtr)) + entry: GenTypes.FuncEntry | t.CPtr = (GenTypes.FuncEntry | t.CPtr)(entry_addr) if entry.Name is not None: # 快速路径:同名要求首字符相等(strcmp 判等蕴含首字符相等), # 首字符不同者直接跳过 strcmp。 @@ -1329,7 +1325,7 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin): return 1 entry_size: sizet = GenTypes.FuncDefaultsEntry.__sizeof__() entry_addr: uint64 = uint64(self.GlobalDefaults) + self.GlobalDefaultsCount * entry_size - entry: GenTypes.FuncDefaultsEntry | t.CPtr = (GenTypes.FuncDefaultsEntry | t.CPtr)(t.CVoid(entry_addr, t.CPtr)) + entry: GenTypes.FuncDefaultsEntry | t.CPtr = (GenTypes.FuncDefaultsEntry | t.CPtr)(entry_addr) # Name 深拷贝到 stdlib(全局表跨文件永久存活) nm_len: sizet = string.strlen(name) nm_copy: str = CompilerFactory.factory.PermPool.alloc(nm_len + 1) @@ -1363,7 +1359,7 @@ 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)(t.CVoid(uint64(defaults), t.CPtr)) + dl: list[ast.AST | t.CPtr] | t.CPtr = (list[ast.AST | t.CPtr] | t.CPtr)(uint64(defaults)) di: int for di in range(default_count): dnode: ast.AST | t.CPtr = dl.get(di) @@ -1428,7 +1424,7 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin): entry_size: sizet = GenTypes.FuncDefaultsEntry.__sizeof__() for i in range(self.GlobalDefaultsCount): entry_addr: uint64 = uint64(self.GlobalDefaults) + i * entry_size - entry: GenTypes.FuncDefaultsEntry | t.CPtr = (GenTypes.FuncDefaultsEntry | t.CPtr)(t.CVoid(entry_addr, t.CPtr)) + entry: GenTypes.FuncDefaultsEntry | t.CPtr = (GenTypes.FuncDefaultsEntry | t.CPtr)(entry_addr) if entry.Name is None: continue if string.strcmp(entry.Name, name) != 0: @@ -1469,7 +1465,7 @@ class CallGenLeafKit(CallGenCBuiltin.CallGenCBuiltin): 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: - sv: str = (str | t.CPtr)(t.CVoid(gd_entry.ConstStrs[di], t.CPtr)) + sv: str = (str | t.CPtr)(gd_entry.ConstStrs[di]) return self.Gen.ExprGenConst.create_global_string(builder, pool, mod, sv, trans) # 无法重建的(如 CONST_FLOAT/复杂表达式)返回 None,调用方回退到 AST return None @@ -1484,7 +1480,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)(t.CVoid(entry_addr, t.CPtr)) + entry: GenTypes.FuncEntry | t.CPtr = (GenTypes.FuncEntry | t.CPtr)(entry_addr) if entry.Name is not None: # 快速路径:strcmp 判等蕴含首字符相等,首字符不同者跳过 strcmp if entry.Name[0] == name[0] and string.strcmp(entry.Name, name) == 0: @@ -1510,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)(t.CVoid(entry_addr, t.CPtr)) + entry: GenTypes.FuncEntry | t.CPtr = (GenTypes.FuncEntry | t.CPtr)(entry_addr) if entry is None or entry.Name is None: continue # 快速路径:strcmp 判等要求首字符相等,首字符不同者跳过 strcmp diff --git a/App/lib/core/Gen/Call/CallGenMixin.vp b/App/lib/core/Gen/Call/CallGenMixin.vp index 807e401..48edd8c 100644 --- a/App/lib/core/Gen/Call/CallGenMixin.vp +++ b/App/lib/core/Gen/Call/CallGenMixin.vp @@ -1173,7 +1173,7 @@ 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)(t.CVoid(uint64(df_defaults), t.CPtr)) + 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) if df_default_node is not None: df_arg_val = self.Gen.ExprGen.translate_value( diff --git a/App/lib/core/Gen/Class/ClassGenBase.vp b/App/lib/core/Gen/Class/ClassGenBase.vp index fd380a8..8c86d8b 100644 --- a/App/lib/core/Gen/Class/ClassGenBase.vp +++ b/App/lib/core/Gen/Class/ClassGenBase.vp @@ -50,7 +50,7 @@ class ClassGenBase: """字段 + 方法元数据/异常/继承检测/装饰器(Meta)""" # --- 方法元数据表(原 _g_method_meta_keys/_g_method_meta_flags/_g_method_meta_count) --- - Gen: Generator.Generator | t.CPtr + Gen: rawptr[Generator.Generator] MethodMetaKeys: bytes MethodMetaFlags: bytes MethodMetaCount: int @@ -828,8 +828,7 @@ class ClassGenBase: i: int for i in range(self.MethodMetaCount): if string.strcmp(self.MethodMetaKeys + i * META_KEY_LEN, key_buf) == 0: - flags_ptr: t.CPtr = (int | t.CPtr)(t.CVoid( - uint64(self.MethodMetaFlags) + i * 4, t.CPtr)) + flags_ptr: t.CPtr = (int | t.CPtr)(uint64(self.MethodMetaFlags) + i * 4) # 按位或合并:同一属性名先 @property(getter=4) 再 @x.setter(8)/ # @x.deleter(16) 会多次注册(如 Config.value / Counter.value)。 # 若整值替换,后注册的位会覆盖 GETTER 位 → _try_property_getter_attr @@ -842,8 +841,7 @@ class ClassGenBase: # 槽位定长 META_KEY_LEN=128 字节,key 超长时 strncpy 钳制防越界写相邻槽 string.strncpy(self.MethodMetaKeys + self.MethodMetaCount * META_KEY_LEN, key_buf, META_KEY_LEN - 1) - flags_ptr2: t.CPtr = (int | t.CPtr)(t.CVoid( - uint64(self.MethodMetaFlags) + self.MethodMetaCount * 4, t.CPtr)) + flags_ptr2: t.CPtr = (int | t.CPtr)(uint64(self.MethodMetaFlags) + self.MethodMetaCount * 4) flags_ptr2[0] = meta self.MethodMetaCount += 1 stdlib.free(key_buf) @@ -863,8 +861,7 @@ class ClassGenBase: i: int for i in range(self.MethodMetaCount): if string.strcmp(self.MethodMetaKeys + i * META_KEY_LEN, key_buf) == 0: - flags_ptr: t.CPtr = (int | t.CPtr)(t.CVoid( - uint64(self.MethodMetaFlags) + i * 4, t.CPtr)) + flags_ptr: t.CPtr = (int | t.CPtr)(uint64(self.MethodMetaFlags) + i * 4) found = flags_ptr[0] break stdlib.free(key_buf) @@ -1040,7 +1037,7 @@ class ClassGenBase: for fi in range(count): addr: sizet = names_buf[fi] if addr != 0: - existing: str = (str | t.CPtr)(t.CVoid(addr, t.CPtr)) + existing: str = (str | t.CPtr)(addr) if existing is not None and string.strcmp(existing, name) == 0: return 1 return 0 diff --git a/App/lib/core/Gen/Class/ClassGenDef.vp b/App/lib/core/Gen/Class/ClassGenDef.vp index 0feab86..886a64a 100644 --- a/App/lib/core/Gen/Class/ClassGenDef.vp +++ b/App/lib/core/Gen/Class/ClassGenDef.vp @@ -225,7 +225,7 @@ class ClassGenDef(ClassGenBase.ClassGenBase): pname_addr: sizet = parents_buf[pi] if pname_addr == 0: continue - pname: str = (str | t.CPtr)(t.CVoid(pname_addr, t.CPtr)) + pname: str = (str | t.CPtr)(pname_addr) if pname is None: continue # 用 SHA1 感知查找父类,规避跨模块同名找错 @@ -451,7 +451,7 @@ 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)(t.CVoid(fty_addr, t.CPtr)) + fty: llvmlite.LLVMType | t.CPtr = (llvmlite.LLVMType | t.CPtr)(fty_addr) # 创建 ParamNode pnode: llvmlite.ParamNode | t.CPtr = pool.alloc(llvmlite.ParamNode.__sizeof__()) @@ -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)(t.CVoid(fty_addr_op, t.CPtr)) + fty_op: llvmlite.LLVMType | t.CPtr = (llvmlite.LLVMType | t.CPtr)(fty_addr_op) llvmlite.module_ensure_opaque_for_type(trans.Module, pool, fty_op) # ============================================================ @@ -574,21 +574,21 @@ class ClassGenDef(ClassGenBase.ClassGenBase): fname_addr: sizet = field_names_buf[fi] if fname_addr == 0: continue - fname: str = (str | t.CPtr)(t.CVoid(fname_addr, t.CPtr)) + fname: str = (str | t.CPtr)(fname_addr) fty_addr2: sizet = field_types_buf[fi] if fty_addr2 == 0: continue - fty2: llvmlite.LLVMType | t.CPtr = (llvmlite.LLVMType | t.CPtr)(t.CVoid(fty_addr2, t.CPtr)) + fty2: llvmlite.LLVMType | t.CPtr = (llvmlite.LLVMType | t.CPtr)(fty_addr2) # 恢复默认值 AST 指针 fdef_addr: sizet = field_defaults_buf[fi] fdef: ast.AST | t.CPtr = None if fdef_addr != 0: - fdef = (ast.AST | t.CPtr)(t.CVoid(fdef_addr, t.CPtr)) + fdef = (ast.AST | t.CPtr)(fdef_addr) # 恢复注解类名指针 fannot_addr: sizet = field_annot_buf[fi] fannot: str = None if fannot_addr != 0: - fannot = (str)(t.CVoid(fannot_addr, t.CPtr)) + fannot = str(fannot_addr) if fname is not None and fty2 is not None: self.Gen.StructGen.add_field(pool, entry, fname, fty2, fdef, fannot) diff --git a/App/lib/core/Gen/Class/ClassGenEnum.vp b/App/lib/core/Gen/Class/ClassGenEnum.vp index ac8f2ea..7048f6b 100644 --- a/App/lib/core/Gen/Class/ClassGenEnum.vp +++ b/App/lib/core/Gen/Class/ClassGenEnum.vp @@ -269,8 +269,7 @@ class ClassGenEnum(ClassGenBase.ClassGenBase): ty_addr: sizet = member_types_buf[mi] if ty_addr == 0: continue - mty: llvmlite.LLVMType | t.CPtr = (llvmlite.LLVMType | t.CPtr)( - t.CVoid(ty_addr, t.CPtr)) + mty: llvmlite.LLVMType | t.CPtr = (llvmlite.LLVMType | t.CPtr)(ty_addr) bits: int = self.Gen.TypeGenErr.get_llvm_type_bits(mty) if bits > max_bits: max_bits = bits @@ -288,12 +287,11 @@ class ClassGenEnum(ClassGenBase.ClassGenBase): fname_addr: sizet = member_names_buf[mi] if fname_addr == 0: continue - mname: str = (str | t.CPtr)(t.CVoid(fname_addr, t.CPtr)) + mname: str = (str | t.CPtr)(fname_addr) fty_addr2: sizet = member_types_buf[mi] if fty_addr2 == 0: continue - mty2: llvmlite.LLVMType | t.CPtr = (llvmlite.LLVMType | t.CPtr)( - t.CVoid(fty_addr2, t.CPtr)) + mty2: llvmlite.LLVMType | t.CPtr = (llvmlite.LLVMType | t.CPtr)(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) @@ -541,12 +539,11 @@ class ClassGenEnum(ClassGenBase.ClassGenBase): fname_addr: sizet = field_names_buf[fi] if fname_addr == 0: continue - fname: str = (str | t.CPtr)(t.CVoid(fname_addr, t.CPtr)) + fname: str = (str | t.CPtr)(fname_addr) fty_addr2: sizet = field_types_buf[fi] if fty_addr2 == 0: continue - fty2: llvmlite.LLVMType | t.CPtr = (llvmlite.LLVMType | t.CPtr)( - t.CVoid(fty_addr2, t.CPtr)) + fty2: llvmlite.LLVMType | t.CPtr = (llvmlite.LLVMType | t.CPtr)(fty_addr2) if fname is not None and fty2 is not None: self.Gen.StructGen.add_field(pool, entry, fname, fty2, None, None) @@ -978,7 +975,7 @@ class ClassGenEnum(ClassGenBase.ClassGenBase): # 检查是否已注册(避免重复注册) for i in range(self.RenumClassCount): - existing: str = (str)(t.CVoid(self.RenumClassNames[i], t.CPtr)) + existing: str = str(self.RenumClassNames[i]) if existing is not None and string.strcmp(existing, class_name) == 0: return @@ -1078,7 +1075,7 @@ class ClassGenEnum(ClassGenBase.ClassGenBase): continue name_offset: sizet = idx * RENUM_VARIANT_PER_CLASS + slot # 变体名同样 strcpy 到 perm_pool(1a 每文件 reset 后 AST 名悬空) - vname_src: str = (str)(t.CVoid(vname_ptr, t.CPtr)) + vname_src: str = str(vname_ptr) vn_len_rv: sizet = string.strlen(vname_src) vn_buf_rv: str = CompilerFactory.factory.PermPool.alloc(vn_len_rv + 1) if vn_buf_rv is None: @@ -1104,9 +1101,9 @@ class ClassGenEnum(ClassGenBase.ClassGenBase): vcount: int = self.RenumClassVariantCounts[i] for j in range(vcount): name_offset: sizet = i * RENUM_VARIANT_PER_CLASS + j - vname: str = (str)(t.CVoid(self.RenumVariantNames[name_offset], t.CPtr)) + vname: str = str(self.RenumVariantNames[name_offset]) if vname is not None and string.strcmp(vname, variant_name) == 0: - cls_nm: str = (str)(t.CVoid(self.RenumClassNames[i], t.CPtr)) + cls_nm: str = str(self.RenumClassNames[i]) return cls_nm return None def RenumTableDump(self) -> str: @@ -1122,12 +1119,12 @@ class ClassGenEnum(ClassGenBase.ClassGenBase): v_first: str = "-" n_first_v: int = 0 if self.RenumClassNames is not None and self.RenumClassCount > 0: - cls_first = (str)(t.CVoid(self.RenumClassNames[0], t.CPtr)) + cls_first = str(self.RenumClassNames[0]) if self.RenumVariantNames is not None \ and self.RenumClassVariantCounts is not None: n_first_v = self.RenumClassVariantCounts[0] if n_first_v > 0: - v_first = (str)(t.CVoid(self.RenumVariantNames[0], t.CPtr)) + v_first = str(self.RenumVariantNames[0]) viperlib.snprintf(buf, 256, "count=%d first=%s vcount=%d vfirst=%s", self.RenumClassCount, cls_first, n_first_v, v_first) return buf @@ -1155,7 +1152,7 @@ class ClassGenEnum(ClassGenBase.ClassGenBase): if class_name is None or self.RenumClassNames is None: return 0 for i in range(self.RenumClassCount): - existing: str = (str)(t.CVoid(self.RenumClassNames[i], t.CPtr)) + existing: str = str(self.RenumClassNames[i]) if existing is not None and string.strcmp(existing, class_name) == 0: return 1 return 0 @@ -1164,13 +1161,13 @@ class ClassGenEnum(ClassGenBase.ClassGenBase): if class_name is None or variant_name is None or self.RenumClassNames is None: return -1 for i in range(self.RenumClassCount): - existing: str = (str)(t.CVoid(self.RenumClassNames[i], t.CPtr)) + existing: str = str(self.RenumClassNames[i]) if existing is None or string.strcmp(existing, class_name) != 0: continue vcount: int = self.RenumClassVariantCounts[i] for j in range(vcount): name_offset: sizet = i * RENUM_VARIANT_PER_CLASS + j - vname: str = (str)(t.CVoid(self.RenumVariantNames[name_offset], t.CPtr)) + vname: str = str(self.RenumVariantNames[name_offset]) if vname is not None and string.strcmp(vname, variant_name) == 0: return self.RenumVariantTags[name_offset] return -1 @@ -1225,11 +1222,9 @@ class ClassGenEnum(ClassGenBase.ClassGenBase): # 去重检查(去指针化):class 槽位存 perm_pool 字符串拷贝,用 strcmp 内容比较—— # 不再依赖指针值统一(注册用 AST 指针、查找用 entry.Name 池拷贝,指针恒不等)。 for i in range(self.RenumAliasCount): - cls_existing_ptr: str = (str | t.CPtr)( - t.CVoid(self.RenumAliasClass[i], t.CPtr)) + cls_existing_ptr: str = (str | t.CPtr)(self.RenumAliasClass[i]) if cls_existing_ptr is not None and string.strcmp(cls_existing_ptr, class_name) == 0: - fld_existing_ptr: str = (str | t.CPtr)( - t.CVoid(self.RenumAliasField[i], t.CPtr)) + fld_existing_ptr: str = (str | t.CPtr)(self.RenumAliasField[i]) if fld_existing_ptr is not None and string.strcmp(fld_existing_ptr, field_name) == 0: # 已存在记录:首遍注册期解析失败(自引用字段,见 # _refill_renum_field_types)类型槽为 0 时,本次解析成功则 @@ -1287,12 +1282,10 @@ class ClassGenEnum(ClassGenBase.ClassGenBase): if class_name is None or field_name is None or self.RenumAliasClass is None: return -1 for i in range(self.RenumAliasCount): - cls_existing_ptr: str = (str | t.CPtr)( - t.CVoid(self.RenumAliasClass[i], t.CPtr)) + cls_existing_ptr: str = (str | t.CPtr)(self.RenumAliasClass[i]) if cls_existing_ptr is not None and string.strcmp(cls_existing_ptr, class_name) == 0: # field_name 用 strcmp 内容比较(指针不同但内容相同) - fld_existing_ptr: str = (str | t.CPtr)( - t.CVoid(self.RenumAliasField[i], t.CPtr)) + fld_existing_ptr: str = (str | t.CPtr)(self.RenumAliasField[i]) if fld_existing_ptr is not None and string.strcmp(fld_existing_ptr, field_name) == 0: return self.RenumAliasIndex[i] return -1 @@ -1306,16 +1299,13 @@ class ClassGenEnum(ClassGenBase.ClassGenBase): if class_name is None or field_name is None or self.RenumAliasTy is None: return None for i in range(self.RenumAliasCount): - cls_existing_ptr: str = (str | t.CPtr)( - t.CVoid(self.RenumAliasClass[i], t.CPtr)) + cls_existing_ptr: str = (str | t.CPtr)(self.RenumAliasClass[i]) if cls_existing_ptr is not None and string.strcmp(cls_existing_ptr, class_name) == 0: - fld_existing_ptr: str = (str | t.CPtr)( - t.CVoid(self.RenumAliasField[i], t.CPtr)) + fld_existing_ptr: str = (str | t.CPtr)(self.RenumAliasField[i]) 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)( - t.CVoid(self.RenumAliasTy[i], t.CPtr)) + return (llvmlite.LLVMType | t.CPtr)(self.RenumAliasTy[i]) return None def _lookup_renum_member_ty(self, class_name: str, variant_name: str, @@ -1331,20 +1321,17 @@ class ClassGenEnum(ClassGenBase.ClassGenBase): if payload_idx < 1: return None for i in range(self.RenumAliasCount): - cls_existing_ptr: str = (str | t.CPtr)( - t.CVoid(self.RenumAliasClass[i], t.CPtr)) + cls_existing_ptr: str = (str | t.CPtr)(self.RenumAliasClass[i]) if cls_existing_ptr is None or string.strcmp(cls_existing_ptr, class_name) != 0: continue if self.RenumAliasVariant[i] == 0: continue - vnt_ptr: str = (str | t.CPtr)( - t.CVoid(self.RenumAliasVariant[i], t.CPtr)) + vnt_ptr: str = (str | t.CPtr)(self.RenumAliasVariant[i]) if vnt_ptr is None or string.strcmp(vnt_ptr, variant_name) != 0: continue if self.RenumAliasIndex[i] != payload_idx: continue if self.RenumAliasTy[i] == 0: return None - return (llvmlite.LLVMType | t.CPtr)( - t.CVoid(self.RenumAliasTy[i], t.CPtr)) + return (llvmlite.LLVMType | t.CPtr)(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 4b3d62b..0c6cd43 100644 --- a/App/lib/core/Gen/Class/ClassGenGeneric.vp +++ b/App/lib/core/Gen/Class/ClassGenGeneric.vp @@ -136,7 +136,7 @@ class ClassGenGeneric(ClassGenBase.ClassGenBase): buf_addr: sizet = self.GenericClassTpParams[i] if buf_addr == 0: return None - buf_tp: str = (str | t.CPtr)(t.CVoid(buf_addr, t.CPtr)) + buf_tp: str = (str | t.CPtr)(buf_addr) # 空格分隔 → list[str] # 注意:list[str](pool, 8) 第二个参数是 elem_size(指针 8 字节), # 不是容量!传 4 会导致 get(i) 偏移算错、append 相互覆盖 @@ -410,11 +410,11 @@ class ClassGenGeneric(ClassGenBase.ClassGenBase): for i in range(self.SpecCount): key_addr: sizet = self.SpecKeys[i] if key_addr != 0: - k: str = (str | t.CPtr)(t.CVoid(key_addr, t.CPtr)) + k: str = (str | t.CPtr)(key_addr) if k is not None and string.strcmp(k, spec_key) == 0: name_addr: sizet = self.SpecNames[i] if name_addr != 0: - return (str | t.CPtr)(t.CVoid(name_addr, t.CPtr)) + return (str | t.CPtr)(name_addr) return None def _cache_spec(self, pool: rawptr[memhub.MemBuddy], spec_key: str, spec_name: str): """缓存特化结果(stdlib 深拷贝存储,跨文件安全)""" diff --git a/App/lib/core/Gen/Class/ClassGenVTable.vp b/App/lib/core/Gen/Class/ClassGenVTable.vp index e227b20..368567a 100644 --- a/App/lib/core/Gen/Class/ClassGenVTable.vp +++ b/App/lib/core/Gen/Class/ClassGenVTable.vp @@ -179,7 +179,7 @@ class ClassGenVTable(ClassGenBase.ClassGenBase): mro_ptr: sizet | t.CPtr = self.Gen.StructGen.get_mro_chain(pool, pname) mro_i: int = 1 while mro_ptr is not None and mro_ptr[mro_i] != 0: - anc: str = (str | t.CPtr)(t.CVoid(mro_ptr[mro_i], t.CPtr)) + anc: str = (str | t.CPtr)(mro_ptr[mro_i]) if anc is not None: probe_buf: str = pool.alloc(128) if probe_buf is not None: @@ -241,7 +241,7 @@ class ClassGenVTable(ClassGenBase.ClassGenBase): for mi in range(method_count): exist_addr: sizet = method_names_buf[mi] if exist_addr != 0: - exist_name: str = (str | t.CPtr)(t.CVoid(exist_addr, t.CPtr)) + exist_name: str = (str | t.CPtr)(exist_addr) if exist_name is not None and string.strcmp(exist_name, mname) == 0: already_in_vt = 1 break @@ -347,13 +347,13 @@ class ClassGenVTable(ClassGenBase.ClassGenBase): self._vtable_strcat(init_buf, 16384, "i8* null") continue - full_name: str = (str | t.CPtr)(t.CVoid(full_name_addr, t.CPtr)) + full_name: str = (str | t.CPtr)(full_name_addr) # 检查是否是继承方法(method_parent_sha1s 非 0 表示用父模块 SHA1 mangling) parent_sha1_addr: sizet = method_parent_sha1s[i] if parent_sha1_addr != 0: # 继承方法: 用父类模块 SHA1 做 mangling - parent_sha1: str = (str | t.CPtr)(t.CVoid(parent_sha1_addr, t.CPtr)) + parent_sha1: str = (str | t.CPtr)(parent_sha1_addr) mangled_name: str = self.Gen.FuncGenBase._mangle_name_with_sha1(parent_sha1, full_name) else: # 当前类方法: 用当前模块 SHA1 @@ -1009,7 +1009,7 @@ class ClassGenVTable(ClassGenBase.ClassGenBase): # 方法/函数同步约定)。void 方法无需显式 return,掉出末尾合法; # 报文里的"(返回类型 void)"来自 TypePrint 的 `case _` 兜底亦可 # 打印 void,不能当作已识别依据,故补注解判据。 - # ① t.CVoid / ② 裸名 CVoid:经既有判据 + # ① t.CVoiX / ② 裸名 CVoid:经既有判据 # TypeGenResolve._is_cvoid_marker(TypeGenResolve.vp:1484) # ③ -> None(CONST_NONE):解析即 Void(TypeGenResolve.vp:1996-1999) if _is_void == 0 and fd.returns is not None: diff --git a/App/lib/core/Gen/Expr/ExprGenBase.vp b/App/lib/core/Gen/Expr/ExprGenBase.vp index efb3807..5ffd6e2 100644 --- a/App/lib/core/Gen/Expr/ExprGenBase.vp +++ b/App/lib/core/Gen/Expr/ExprGenBase.vp @@ -23,7 +23,7 @@ class ExprGenBase: """表达式基础工具(类型判断/指针层级/coerce)""" # --- docstring 登记表字段(__doc__ 魔法属性支持)--- - Gen: Generator.Generator | t.CPtr + Gen: rawptr[Generator.Generator] DocKeys: bytes DocValues: bytes DocCount: int diff --git a/App/lib/core/Gen/Expr/ExprGenCls.vp b/App/lib/core/Gen/Expr/ExprGenCls.vp index a671dc3..7d5987f 100644 --- a/App/lib/core/Gen/Expr/ExprGenCls.vp +++ b/App/lib/core/Gen/Expr/ExprGenCls.vp @@ -436,7 +436,7 @@ class ExprGenCls(ExprGenBase.ExprGenBase): mro_ptr: sizet | t.CPtr = self.Gen.StructGen.get_mro_chain(pool, class_name) mi: int = 1 while mro_ptr is not None and mro_ptr[mi] != 0: - anc: str = (str | t.CPtr)(t.CVoid(mro_ptr[mi], t.CPtr)) + anc: str = (str | t.CPtr)(mro_ptr[mi]) if anc is not None: anc_lookup: str = pool.alloc(128) if anc_lookup is not None: diff --git a/App/lib/core/Gen/Expr/ExprGenOps.vp b/App/lib/core/Gen/Expr/ExprGenOps.vp index 894f3db..5f389fc 100644 --- a/App/lib/core/Gen/Expr/ExprGenOps.vp +++ b/App/lib/core/Gen/Expr/ExprGenOps.vp @@ -1164,7 +1164,7 @@ class ExprGenOps(ExprGenBase.ExprGenBase): mro_ptr: sizet | t.CPtr = self.Gen.StructGen.get_mro_chain(pool, class_name) mi: int = 1 while mro_ptr is not None and mro_ptr[mi] != 0: - anc: str = (str | t.CPtr)(t.CVoid(mro_ptr[mi], t.CPtr)) + anc: str = (str | t.CPtr)(mro_ptr[mi]) if anc is not None: parent_lookup: str = pool.alloc(128) if parent_lookup is not None: @@ -1188,7 +1188,7 @@ class ExprGenOps(ExprGenBase.ExprGenBase): mro_p: sizet | t.CPtr = self.Gen.StructGen.get_mro_chain(pool, search_class) mj: int = 1 while mro_p is not None and mro_p[mj] != 0 and cls_sha1 is None: - anc_p: str = (str | t.CPtr)(t.CVoid(mro_p[mj], t.CPtr)) + anc_p: str = (str | t.CPtr)(mro_p[mj]) if anc_p is not None: cls_sha1 = self.Gen.StructGen.get_struct_sha1(anc_p) mj += 1 @@ -1266,7 +1266,7 @@ class ExprGenOps(ExprGenBase.ExprGenBase): mro_ptr: sizet | t.CPtr = self.Gen.StructGen.get_mro_chain(pool, class_name) mi: int = 1 while mro_ptr is not None and mro_ptr[mi] != 0: - anc: str = (str | t.CPtr)(t.CVoid(mro_ptr[mi], t.CPtr)) + anc: str = (str | t.CPtr)(mro_ptr[mi]) if anc is not None: parent_lookup: str = pool.alloc(128) if parent_lookup is not None: @@ -1289,7 +1289,7 @@ class ExprGenOps(ExprGenBase.ExprGenBase): mro_p: sizet | t.CPtr = self.Gen.StructGen.get_mro_chain(pool, search_class) mj: int = 1 while mro_p is not None and mro_p[mj] != 0 and cls_sha1 is None: - anc_p: str = (str | t.CPtr)(t.CVoid(mro_p[mj], t.CPtr)) + anc_p: str = (str | t.CPtr)(mro_p[mj]) if anc_p is not None: cls_sha1 = self.Gen.StructGen.get_struct_sha1(anc_p) mj += 1 diff --git a/App/lib/core/Gen/Func/FuncGenBase.vp b/App/lib/core/Gen/Func/FuncGenBase.vp index e6e738a..b407061 100644 --- a/App/lib/core/Gen/Func/FuncGenBase.vp +++ b/App/lib/core/Gen/Func/FuncGenBase.vp @@ -433,7 +433,7 @@ class FuncGenBase(CallGenBase.CallGenBase): for ai in range(an): arg: ast.Arg | t.CPtr = (ast.Arg | t.CPtr)(alist.get(ai)) if arg is not None and arg.arg is not None: - # t.CVoid 表示空参:跳过 + # 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) diff --git a/App/lib/core/Gen/Func/FuncGenDef.vp b/App/lib/core/Gen/Func/FuncGenDef.vp index a4faf92..16992d8 100644 --- a/App/lib/core/Gen/Func/FuncGenDef.vp +++ b/App/lib/core/Gen/Func/FuncGenDef.vp @@ -240,7 +240,7 @@ class FuncGenDef(CallGenBase.CallGenBase): arg: ast.Arg | t.CPtr = (ast.Arg | t.CPtr)(alist.get(ai)) if arg is None or arg.arg is None: continue - # t.CVoid 表示空参:跳过 + # CVoid 表示空参:跳过 if arg.annotation is not None: if self.Gen.TypeGenResolve._is_t_attr(arg.annotation, "CVoid", imported_modules) != 0: continue @@ -517,7 +517,7 @@ class FuncGenDef(CallGenBase.CallGenBase): for ai_e in range(an_e): arg_e: ast.Arg | t.CPtr = (ast.Arg | t.CPtr)(alist_e.get(ai_e)) if arg_e is not None and arg_e.arg is not None: - # t.CVoid 表示空参:跳过,不添加到函数签名 + # CVoid 表示空参:跳过,不添加到函数签名 if arg_e.annotation is not None \ and self.Gen.TypeGenResolve._is_t_attr(arg_e.annotation, "CVoid", imported_modules) != 0: continue @@ -634,7 +634,7 @@ class FuncGenDef(CallGenBase.CallGenBase): for ai in range(an): arg: ast.Arg | t.CPtr = (ast.Arg | t.CPtr)(alist.get(ai)) if arg is not None and arg.arg is not None: - # t.CVoid 表示空参:跳过,不添加到函数签名 + # CVoid 表示空参:跳过,不添加到函数签名 if arg.annotation is not None \ and self.Gen.TypeGenResolve._is_t_attr(arg.annotation, "CVoid", imported_modules) != 0: continue @@ -792,7 +792,7 @@ class FuncGenDef(CallGenBase.CallGenBase): for ai2 in range(an2): arg2: ast.Arg | t.CPtr = (ast.Arg | t.CPtr)(alist2.get(ai2)) if arg2 is not None and arg2.arg is not None: - # t.CVoid 表示空参:跳过,不创建 alloca + # CVoid 表示空参:跳过,不创建 alloca if arg2.annotation is not None: if self.Gen.TypeGenResolve._is_t_attr(arg2.annotation, "CVoid", imported_modules) != 0: continue @@ -997,7 +997,7 @@ class FuncGenDef(CallGenBase.CallGenBase): # 会把 c.Asm 收尾的 void 函数(流程真实掉出末尾)误报成"缺显式 return"; # 报文的"(返回类型 void)"不能作为判据(TypePrint 的 `case _` 兜底同样打印 # void,任何未命中类型都显示 void)。故按注解判据补足,与注解→类型解析同口径 - # (注解声明无返回值 ⇔ 解析为 LLVMType.Void):① t.CVoid(Attribute 形式) + # (注解声明无返回值 ⇔ 解析为 LLVMType.Void):① t\.CVoid(Attribute 形式) # ② 裸名 CVoid(from t import CVoid)③ -> None(CONST_NONE); # ①②统一经既有判据 TypeGenResolve._is_cvoid_marker 判定(不新增名字白名单)。 if _is_void == 0 and fd.returns is not None: @@ -1149,8 +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)( - t.CVoid(param_tys[pi], t.CPtr)), pname_w) + llvmlite.add_param(pool, wrapper, (llvmlite.LLVMType | t.CPtr)(param_tys[pi]), pname_w) # ---- 创建块 ---- entry_bb: llvmlite.BasicBlock | t.CPtr = llvmlite.create_block(pool, wrapper, "entry") @@ -1206,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)(t.CVoid(param_tys[ri], t.CPtr)), an_r) + pool, (llvmlite.LLVMType | t.CPtr)(param_tys[ri]), an_r) if av_r is not None: llvmlite.value_set_next(av_r, None) if rec_args is None: @@ -1248,7 +1247,7 @@ class FuncGenDef(CallGenBase.CallGenBase): 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)(t.CVoid(param_tys[fk], t.CPtr))) + pool, (llvmlite.LLVMType | t.CPtr)(param_tys[fk])) if pn_n is not None: pn_n.Next = fields_head fields_head = pn_n @@ -1258,8 +1257,7 @@ class FuncGenDef(CallGenBase.CallGenBase): 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)( - t.CVoid(param_tys[fi2], t.CPtr)) + fld_ty: llvmlite.LLVMType | t.CPtr = (llvmlite.LLVMType | t.CPtr)(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: @@ -1346,8 +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)( - t.CVoid(param_tys[k], t.CPtr)) + fld_ty_k: llvmlite.LLVMType | t.CPtr = (llvmlite.LLVMType | t.CPtr)(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/GenApi.vp b/App/lib/core/Gen/GenApi.vp index e533673..ab9862f 100644 --- a/App/lib/core/Gen/GenApi.vp +++ b/App/lib/core/Gen/GenApi.vp @@ -100,7 +100,7 @@ def fatal_error(node: ast.AST | t.CPtr, msg: str, if _g_gen is not None: _g_gen.TypeGenErr.fatal_error(node, msg, err_type) return - gg: Generator.Generator | t.CPtr = Generator._g_gen + gg: rawptr[Generator.Generator] = Generator._g_gen if gg is not None: gg.TypeGenErr.fatal_error(node, msg, err_type) diff --git a/App/lib/core/Gen/ImportsGenMixin.vp b/App/lib/core/Gen/ImportsGenMixin.vp index b5f3182..b3f6898 100644 --- a/App/lib/core/Gen/ImportsGenMixin.vp +++ b/App/lib/core/Gen/ImportsGenMixin.vp @@ -39,7 +39,7 @@ class ImportsGenMixin: # --- 全局 re-export 映射表(原 _g_reexport_sha1s/_g_reexport_funcs/ # _g_reexport_srcs/_g_reexport_count) --- - Gen: Generator.Generator | t.CPtr + Gen: rawptr[Generator.Generator] ReexportSha1s: bytes ReexportFuncs: bytes ReexportSrcs: bytes diff --git a/App/lib/core/Gen/MatchGenMixin.vp b/App/lib/core/Gen/MatchGenMixin.vp index 8181875..42d767b 100644 --- a/App/lib/core/Gen/MatchGenMixin.vp +++ b/App/lib/core/Gen/MatchGenMixin.vp @@ -36,7 +36,7 @@ class MatchGenMixin: # 与 HandlesIf L309-315 / ClassGenVTable L1084 同语义补 unreachable。 # 返回 1=已补 unreachable(调用方不应 br end_bb);0=正常收尾(应 br end_bb)。 # 不含 Try/With:其处理器不维护 _ctrl_merge_reachable,避免残留值误判。 - Gen: Generator.Generator | t.CPtr + Gen: rawptr[Generator.Generator] def _case_tail_unreachable(self, trans: HT.Translator | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, body_list: list[ast.AST | t.CPtr] | t.CPtr) -> int: @@ -544,8 +544,7 @@ class MatchGenMixin: i = 0 while i < collected: # pass2 用 pass1 缓存的 mc(避免重索引错位) - mc: ast.MatchCase | t.CPtr = (ast.MatchCase | t.CPtr)( - t.CVoid(mc_arr[i], t.CPtr)) + mc: ast.MatchCase | t.CPtr = (ast.MatchCase | t.CPtr)(mc_arr[i]) if mc is None: i = i + 1 continue @@ -554,7 +553,7 @@ class MatchGenMixin: # 取 BB bb_addr: sizet = bb_arr[i] case_bb: llvmlite.BasicBlock | t.CPtr = ( - llvmlite.BasicBlock | t.CPtr)(t.CVoid(bb_addr, t.CPtr)) + llvmlite.BasicBlock | t.CPtr)(bb_addr) is_def: int = def_arr[i] nb: int = nb_arr[i] @@ -938,9 +937,7 @@ class MatchGenMixin: # 4. 入口 → 第一个 check(或 default/end) if first_check >= 0: - head_bb: llvmlite.BasicBlock | t.CPtr = ( - llvmlite.BasicBlock | t.CPtr)( - t.CVoid(check_arr[first_check], t.CPtr)) + head_bb: llvmlite.BasicBlock | t.CPtr = (llvmlite.BasicBlock | t.CPtr)(check_arr[first_check]) llvmlite.build_br(builder, head_bb) elif has_default == 1: llvmlite.build_br(builder, default_bb) @@ -953,12 +950,8 @@ class MatchGenMixin: if def_arr[ci] == 1: ci = ci + 1 continue - cbb2: llvmlite.BasicBlock | t.CPtr = ( - llvmlite.BasicBlock | t.CPtr)( - t.CVoid(check_arr[ci], t.CPtr)) - bbb2: llvmlite.BasicBlock | t.CPtr = ( - llvmlite.BasicBlock | t.CPtr)( - t.CVoid(body_arr[ci], t.CPtr)) + cbb2: llvmlite.BasicBlock | t.CPtr = (llvmlite.BasicBlock | t.CPtr)(check_arr[ci], t.CPtr) + bbb2: llvmlite.BasicBlock | t.CPtr = (llvmlite.BasicBlock | t.CPtr)(body_arr[ci], t.CPtr) llvmlite.position_at_end(builder, cbb2) # 计算匹配条件(元素比较 && guard) @@ -994,21 +987,16 @@ class MatchGenMixin: if pv is None: self.Gen.TypeGenErr.fatal_error( pat1, f"序列模式元素 {pi} 翻译失败", "TypeError") - sv1: llvmlite.Value | t.CPtr = ( - llvmlite.Value | t.CPtr)( - t.CVoid(subj_vals[pi], t.CPtr)) - c1: llvmlite.Value | t.CPtr = self._seq_cmp_eq( - trans, builder, sv1, pv) + sv1: llvmlite.Value | t.CPtr = (llvmlite.Value | t.CPtr)(subj_vals[pi], t.CPtr) + c1: llvmlite.Value | t.CPtr = self._seq_cmp_eq(trans, builder, sv1, pv) if c1 is None: - self.Gen.TypeGenErr.fatal_error( - pat1, "序列模式元素比较失败", "TypeError") + self.Gen.TypeGenErr.fatal_error(pat1, "序列模式元素比较失败", "TypeError") if cond is None: cond = c1 else: cond = llvmlite.build_and(builder, cond, c1) elif pk1 == ast.ASTKind.MatchAs: - ma2: ast.MatchAs | t.CPtr = ( - ast.MatchAs | t.CPtr)(pat1) + ma2: ast.MatchAs | t.CPtr = (ast.MatchAs | t.CPtr)(pat1) if ma2.pattern is None: continue # _ 通配:恒真 if ma2.name is not None: @@ -1023,8 +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)(t.CVoid(g_addr, t.CPtr)) + gnode: ast.AST | t.CPtr = (ast.AST | t.CPtr)(g_addr) gv: llvmlite.Value | t.CPtr = self.Gen.ExprGen.translate_value( builder, pool, trans.Module, gnode, trans._funcs, trans._func_count, trans) @@ -1052,8 +1039,7 @@ class MatchGenMixin: while nj < collected and def_arr[nj] == 1: nj = nj + 1 if nj < collected: - nxt = (llvmlite.BasicBlock | t.CPtr)( - t.CVoid(check_arr[nj], t.CPtr)) + nxt = (llvmlite.BasicBlock | t.CPtr)(check_arr[nj]) elif has_default == 1: nxt = default_bb else: @@ -1067,9 +1053,7 @@ class MatchGenMixin: if def_arr[ci] == 1: ci = ci + 1 continue - bbb3: llvmlite.BasicBlock | t.CPtr = ( - llvmlite.BasicBlock | t.CPtr)( - t.CVoid(body_arr[ci], t.CPtr)) + 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) mc3: ast.MatchCase | t.CPtr = ( @@ -1096,9 +1080,7 @@ class MatchGenMixin: while nj2 < collected and def_arr[nj2] == 1: nj2 = nj2 + 1 if nj2 < collected: - nbb: llvmlite.BasicBlock | t.CPtr = ( - llvmlite.BasicBlock | t.CPtr)( - t.CVoid(body_arr[nj2], t.CPtr)) + nbb: llvmlite.BasicBlock | t.CPtr = (llvmlite.BasicBlock | t.CPtr)(body_arr[nj2]) llvmlite.build_br(builder, nbb) elif has_default == 1: llvmlite.build_br(builder, default_bb) @@ -1321,8 +1303,7 @@ class MatchGenMixin: mc: ast.MatchCase | t.CPtr = (ast.MatchCase | t.CPtr)(case_node) bb_addr: sizet = bb_arr[i] - case_bb: llvmlite.BasicBlock | t.CPtr = ( - llvmlite.BasicBlock | t.CPtr)(t.CVoid(bb_addr, t.CPtr)) + case_bb: llvmlite.BasicBlock | t.CPtr = (llvmlite.BasicBlock | t.CPtr)(bb_addr) is_def: int = def_arr[i] nb: int = nb_arr[i] diff --git a/App/lib/core/Gen/Stmt/StmtGenCifMixin.vp b/App/lib/core/Gen/Stmt/StmtGenCifMixin.vp index 68cd5ab..35d0e52 100644 --- a/App/lib/core/Gen/Stmt/StmtGenCifMixin.vp +++ b/App/lib/core/Gen/Stmt/StmtGenCifMixin.vp @@ -38,7 +38,7 @@ class StmtGenCifMixin: # 用 8 字节类型:Mixin 独立布局与 Generator 组合布局的字段对齐必须一致 # (i32 首字段在组合布局中导致 EnumTable 相对偏移 4 vs 独立布局 8 的错位, # this_adjust 无法同时修正,枚举表错位到相邻字段被覆盖——ASTCtx 丢失根因)。 - Gen: Generator.Generator | t.CPtr + Gen: rawptr[Generator.Generator] CifEvalOk: sizet # --- 枚举注册表(原 HandlesEnum._enum_table/_enum_count) --- @@ -496,8 +496,7 @@ class StmtGenCifMixin: # 构建匿名 struct 类型(字段类型 = 元素值类型) rvi2: sizet for rvi2 in range(rt_n): - rv_i: llvmlite.Value | t.CPtr = (llvmlite.Value | t.CPtr)( - t.CVoid(rt_vals[rvi2], t.CPtr)) + rv_i: llvmlite.Value | t.CPtr = (llvmlite.Value | t.CPtr)((rt_vals[rvi2])) if rv_i is None or rv_i.Ty is None: rt_val_ok = 0 break @@ -519,8 +518,7 @@ class StmtGenCifMixin: if rt_tmp is not None: rvi3: sizet for rvi3 in range(rt_n): - rv3: llvmlite.Value | t.CPtr = (llvmlite.Value | t.CPtr)( - t.CVoid(rt_vals[rvi3], t.CPtr)) + rv3: llvmlite.Value | t.CPtr = (llvmlite.Value | t.CPtr)(rt_vals[rvi3]) rfp: llvmlite.Value | t.CPtr = llvmlite.build_gep_struct( builder, rt_struct_ty, rv3.Ty, rt_tmp, rvi3) if rfp is None: @@ -654,7 +652,7 @@ class StmtGenCifMixin: # (如 SSAValue)误报"整数隐式转指针已禁止"。 val = self.Gen.ExprGenBase.coerce_to_type(builder, val, ret_ty_rt, node, trans) elif val_is_ptr != 0 and ret_is_ptr != 0: - # 指针 → 指针且元素类型不同(如 t.CVoid(x, CPtr) 得到 i8*, + # 指针 → 指针且元素类型不同(如 t\.CVoid(x, CPtr) 得到 i8*, # 函数返回类型是类指针 Circle* 时)需 bitcast 回, # 否则 llc 报 "value doesn't match function result type"。 val_pointee: llvmlite.LLVMType | t.CPtr = None diff --git a/App/lib/core/Gen/Stmt/StmtGenDeclMixin.vp b/App/lib/core/Gen/Stmt/StmtGenDeclMixin.vp index 7510cc2..d696ce3 100644 --- a/App/lib/core/Gen/Stmt/StmtGenDeclMixin.vp +++ b/App/lib/core/Gen/Stmt/StmtGenDeclMixin.vp @@ -436,7 +436,7 @@ class StmtGenDeclMixin(StmtGenCifMixin.StmtGenCifMixin): return None entry_size: sizet = GenTypes.EnumEntry.__sizeof__() addr: uint64 = uint64(self.EnumTable) + i * entry_size - return (GenTypes.EnumEntry | t.CPtr)(t.CVoid(addr, t.CPtr)) + return (GenTypes.EnumEntry | t.CPtr)(addr) def _get_enum_member(self, enum_entry: GenTypes.EnumEntry | t.CPtr, i: int) -> GenTypes.EnumMember | t.CPtr: @@ -445,7 +445,7 @@ class StmtGenDeclMixin(StmtGenCifMixin.StmtGenCifMixin): return None member_size: sizet = GenTypes.EnumMember.__sizeof__() addr: uint64 = uint64(enum_entry.Members) + i * member_size - return (GenTypes.EnumMember | t.CPtr)(t.CVoid(addr, t.CPtr)) + return (GenTypes.EnumMember | t.CPtr)(addr) def register_enum(self, pool: rawptr[memhub.MemBuddy], name: str, diff --git a/App/lib/core/Gen/Stmt/StmtGenMixin.vp b/App/lib/core/Gen/Stmt/StmtGenMixin.vp index a7dad45..f42f0a2 100644 --- a/App/lib/core/Gen/Stmt/StmtGenMixin.vp +++ b/App/lib/core/Gen/Stmt/StmtGenMixin.vp @@ -707,7 +707,7 @@ class StmtGenMixin(StmtGenDeclMixin.StmtGenDeclMixin): # (对齐 TPC HandlesWith.py L167-174;逆序弹栈,经 gen 单例委托) for pi_pop in range(n): if ctx_class_buf[pi_pop] != 0: - cls_pop: str = (str | t.CPtr)(t.CVoid(ctx_class_buf[pi_pop], t.CPtr)) + cls_pop: str = (str | t.CPtr)(ctx_class_buf[pi_pop]) fd_cls_bare_p: str = cls_pop if cls_pop is not None: fd_dot_p: str = string.strrchr(cls_pop, '.') @@ -721,7 +721,7 @@ class StmtGenMixin(StmtGenDeclMixin.StmtGenDeclMixin): for i in range(n): ci: int = n - 1 - i if ctx_class_buf[ci] != 0: - cls_ci: str = (str | t.CPtr)(t.CVoid(ctx_class_buf[ci], t.CPtr)) + cls_ci: str = (str | t.CPtr)(ctx_class_buf[ci]) self.Gen.VarGen.set_var_annot_class_name( trans.SymTab, "__with_ctx", cls_ci) self._with_ctx_call(trans, pool, builder, mod, "__exit__") diff --git a/App/lib/core/Gen/StructGenMixin.vp b/App/lib/core/Gen/StructGenMixin.vp index da54da8..58ca693 100644 --- a/App/lib/core/Gen/StructGenMixin.vp +++ b/App/lib/core/Gen/StructGenMixin.vp @@ -85,7 +85,7 @@ class StructGenMixin: """结构体注册与查找 Mixin(状态从 HandlesStruct 全局变量迁入)""" # --- 全局注册表(原 _struct_table/_struct_count) --- - Gen: Generator.Generator | t.CPtr + Gen: rawptr[Generator.Generator] StructTable: GenTypes.StructEntry | t.CPtr # STRUCT_MAX 槽位数组 StructCount: int @@ -214,7 +214,7 @@ class StructGenMixin: return None entry_size: sizet = GenTypes.StructEntry.__sizeof__() addr: uint64 = uint64(self.StructTable) + i * entry_size - return (GenTypes.StructEntry | t.CPtr)(t.CVoid(addr, t.CPtr)) + return (GenTypes.StructEntry | t.CPtr)(addr) # 名 | 类型 索引(开放寻址 | 线性探测;槽存 index+1,0=空槽) # 目的:把 find_struct/find_struct_by_module(名)与 find_struct_by_type(类型指针) @@ -251,8 +251,7 @@ class StructGenMixin: idx: sizet = sizet(h) & mask i: int = 0 while i < self.StructIdxCap: - slot: sizet | t.CPtr = (sizet | t.CPtr)( - t.CVoid(uint64(base) + uint64(idx * 8), t.CPtr)) + slot: sizet | t.CPtr = (sizet | t.CPtr)(uint64(base) + uint64(idx * 8)) if slot[0] == 0: slot[0] = sizet(ei + 1) return 0 @@ -274,8 +273,7 @@ class StructGenMixin: idx: sizet = sizet(h) & mask i: int = 0 while i < self.StructIdxCap: - slot: sizet | t.CPtr = (sizet | t.CPtr)( - t.CVoid(uint64(base) + uint64(idx * 8), t.CPtr)) + slot: sizet | t.CPtr = (sizet | t.CPtr)(uint64(base) + uint64(idx * 8)) if slot[0] == 0: slot[0] = sizet(ei + 1) return 0 @@ -318,8 +316,7 @@ class StructGenMixin: idx: sizet = sizet(h) & mask i: int = 0 while i < self.StructIdxCap: - slot: sizet | t.CPtr = (sizet | t.CPtr)( - t.CVoid(uint64(base) + uint64(idx * 8), t.CPtr)) + slot: sizet | t.CPtr = (sizet | t.CPtr)(uint64(base) + uint64(idx * 8)) sv: sizet = slot[0] if sv == 0: return -1 @@ -347,8 +344,7 @@ class StructGenMixin: idx: sizet = sizet(h) & mask i: int = 0 while i < self.StructIdxCap: - slot: sizet | t.CPtr = (sizet | t.CPtr)( - t.CVoid(uint64(base) + uint64(idx * 8), t.CPtr)) + slot: sizet | t.CPtr = (sizet | t.CPtr)(uint64(base) + uint64(idx * 8)) sv: sizet = slot[0] if sv == 0: return -1 @@ -365,7 +361,7 @@ class StructGenMixin: return None field_size: sizet = GenTypes.FieldEntry.__sizeof__() addr: uint64 = uint64(struct_entry.Fields) + i * field_size - return (GenTypes.FieldEntry | t.CPtr)(t.CVoid(addr, t.CPtr)) + return (GenTypes.FieldEntry | t.CPtr)(addr) def register_struct(self, pool: rawptr[memhub.MemBuddy], name: str, @@ -645,8 +641,7 @@ class StructGenMixin: return None string.memset(dst_c, 0, ast.Constant.__sizeof__()) # 拷贝 vtable 指针(AST 是 @t.CVTable,kind() 虚调用依赖首字段 vptr) - vt_ptr: t.CPtr = t.CVoid( - c.Deref(uint64(default_val, t.CPtr), t.CPtr), t.CPtr) + vt_ptr: t.CPtr = c.Deref((uint64 | t.CPtr)(default_val)) c.DerefAs(dst_c, vt_ptr) # 拷贝位置字段(报错定位用) dst_c.lineno = src_c.lineno @@ -680,8 +675,7 @@ class StructGenMixin: return None string.memset(dst_l, 0, ast.List.__sizeof__()) # 拷贝 vtable 指针(AST 是 @t.CVTable,kind() 虚调用依赖首字段 vptr) - vt_l: t.CPtr = t.CVoid( - c.Deref(uint64(default_val, t.CPtr), t.CPtr), t.CPtr) + vt_l: t.CPtr = t.CPtr(c.Deref((uint64 | t.CPtr)(default_val))) c.DerefAs(dst_l, vt_l) # 拷贝位置字段与 ctx dst_l.lineno = src_l.lineno @@ -711,8 +705,7 @@ class StructGenMixin: if elem_src_l is not None: elem_dst_l: ast.AST | t.CPtr = 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)( - t.CVoid(uint64(data_l) + li_l * 8, t.CPtr)) + slot_l: ast.AST | t.CPtr = (ast.AST | t.CPtr)(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) @@ -1601,7 +1594,7 @@ class StructGenMixin: addr: sizet = names_ptr[i] arr[i] = 0 if addr != 0: - src: str = (str | t.CPtr)(t.CVoid(addr, t.CPtr)) + src: str = (str | t.CPtr)(addr) if src is not None: slen: sizet = string.strlen(src) dup: str = pn_pool.alloc(slen + 1) @@ -1630,11 +1623,11 @@ class StructGenMixin: return None if idx >= entry.ParentCount: return None - parr: sizet | t.CPtr = (sizet | t.CPtr)(t.CVoid(entry.ParentNames, t.CPtr)) + parr: sizet | t.CPtr = (sizet | t.CPtr)(entry.ParentNames) addr: sizet = parr[idx] if addr == 0: return None - return (str | t.CPtr)(t.CVoid(addr, t.CPtr)) + return (str | t.CPtr)(addr) def get_mro_chain(self, pool: rawptr[memhub.MemBuddy], name: str) -> sizet | t.CPtr: @@ -1659,7 +1652,7 @@ class StructGenMixin: while stack_count > 0: stack_count -= 1 cur_addr: sizet = stack[stack_count] - cur: str = (str | t.CPtr)(t.CVoid(cur_addr, t.CPtr)) + cur: str = (str | t.CPtr)(cur_addr) if cur is None: continue # 已访问检查(线性搜索) @@ -1667,7 +1660,7 @@ class StructGenMixin: for vi in range(visit_count): va: sizet = visited[vi] if va != 0: - vn: str = (str | t.CPtr)(t.CVoid(va, t.CPtr)) + vn: str = (str | t.CPtr)(va) if vn is not None and string.strcmp(vn, cur) == 0: dup = 1 break @@ -1684,7 +1677,7 @@ class StructGenMixin: entry: GenTypes.StructEntry | t.CPtr = self.find_struct(cur) if entry is not None and entry.ParentCount > 0 and entry.ParentNames is not None: pc: int = entry.ParentCount - parr: sizet | t.CPtr = (sizet | t.CPtr)(t.CVoid(entry.ParentNames, t.CPtr)) + parr: sizet | t.CPtr = (sizet | t.CPtr)(entry.ParentNames) for pi2 in range(pc): pi: int = pc - 1 - pi2 if stack_count < MRO_MAX: @@ -1723,12 +1716,12 @@ class StructGenMixin: return -1 # VTableMethods 字段声明为 char*,但实际存储的是 sizet 数组 # 必须转换为 sizet* 才能正确读取 8 字节指针值 - methods_arr: sizet | t.CPtr = (sizet | t.CPtr)(t.CVoid(entry.VTableMethods, t.CPtr)) + methods_arr: sizet | t.CPtr = (sizet | t.CPtr)(entry.VTableMethods) for i in range(entry.VTableMethodCount): mname_addr: sizet = methods_arr[i] if mname_addr == 0: continue - mname: str = (str | t.CPtr)(t.CVoid(mname_addr, t.CPtr)) + mname: str = (str | t.CPtr)(mname_addr) if mname is not None and string.strcmp(mname, method_name) == 0: return i return -1 @@ -1751,11 +1744,11 @@ class StructGenMixin: return None if idx >= entry.VTableMethodCount: return None - methods_arr: sizet | t.CPtr = (sizet | t.CPtr)(t.CVoid(entry.VTableMethods, t.CPtr)) + methods_arr: sizet | t.CPtr = (sizet | t.CPtr)(entry.VTableMethods) mname_addr: sizet = methods_arr[idx] if mname_addr == 0: return None - return (str | t.CPtr)(t.CVoid(mname_addr, t.CPtr)) + return (str | t.CPtr)(mname_addr) def get_field_count(self, name: str) -> int: """获取结构体字段数量,返回 -1=未找到""" diff --git a/App/lib/core/Gen/TranslatorGenMixin.vp b/App/lib/core/Gen/TranslatorGenMixin.vp index f2c0612..a08f7f5 100644 --- a/App/lib/core/Gen/TranslatorGenMixin.vp +++ b/App/lib/core/Gen/TranslatorGenMixin.vp @@ -44,7 +44,7 @@ class TranslatorGenMixin: # CExport 函数无法被先翻译的模块正确识别为裸名调用。 # Phase 1a 预注册所有 CExport/State 函数名到全局表。 # ============================================================ - Gen: Generator.Generator | t.CPtr + Gen: rawptr[Generator.Generator] def _register_cexport_from_funcdef(self, trans: HT.Translator | t.CPtr, node: ast.AST | t.CPtr) -> int: """预注册 CExport/State 函数到全局表(仅注册,不生成 IR)""" diff --git a/App/lib/core/Gen/Type/TypeGenBase.vp b/App/lib/core/Gen/Type/TypeGenBase.vp index 00482cf..1bb21fd 100644 --- a/App/lib/core/Gen/Type/TypeGenBase.vp +++ b/App/lib/core/Gen/Type/TypeGenBase.vp @@ -32,7 +32,7 @@ class TypeGenBase: """字段 + InitTypeGen + trace/临时目录/generic 上下文""" # --- 仿 Python Traceback 调用栈(原 _g_trace_frames/_g_trace_count) --- - Gen: Generator.Generator | t.CPtr + Gen: rawptr[Generator.Generator] TraceFrames: GenTypes.TraceFrame | t.CPtr # malloc 数组(TypeGenMixin.TRACE_MAX 槽) TraceCount: int @@ -184,8 +184,7 @@ class TypeGenBase: if self.Specs is not None: return self.Specs size: sizet = TSpec.TypeSpecArena.__sizeof__() - arena: TSpec.TypeSpecArena | t.CPtr = (TSpec.TypeSpecArena | t.CPtr)( - t.CVoid(CompilerFactory.factory.PermPool.alloc(size), t.CPtr)) + arena: TSpec.TypeSpecArena | t.CPtr = (TSpec.TypeSpecArena | t.CPtr)(CompilerFactory.factory.PermPool.alloc(size)) if arena is None: return None string.memset(arena, 0, size) @@ -214,7 +213,7 @@ class TypeGenBase: return None entry_size: sizet = GenTypes.TraceFrame.__sizeof__() addr: uint64 = uint64(self.TraceFrames) + i * entry_size - return (GenTypes.TraceFrame | t.CPtr)(t.CVoid(addr, t.CPtr)) + return (GenTypes.TraceFrame | t.CPtr)(addr) def push_trace(self, file_name: str, lineno: int, col_start: int = 0, col_end: int = 0) -> None: """压入一个翻译上下文帧(进入新的翻译作用域时调用)""" if self._ensure_trace_init() == 0: @@ -289,10 +288,8 @@ class TypeGenBase: """清除泛型特化上下文(离开泛型类方法体翻译时调用),恢复外层而非置 None""" if self.GenericCtxDepth > 0: self.GenericCtxDepth -= 1 - self.GenericTpNames = (list[str] | t.CPtr)(t.CVoid( - self.GenericCtxStack[self.GenericCtxDepth * 2], t.CPtr)) - self.GenericTypeArgs = (list[str] | t.CPtr)(t.CVoid( - self.GenericCtxStack[self.GenericCtxDepth * 2 + 1], t.CPtr)) + self.GenericTpNames = (list[str] | t.CPtr)(self.GenericCtxStack[self.GenericCtxDepth * 2]) + self.GenericTypeArgs = (list[str] | t.CPtr)(self.GenericCtxStack[self.GenericCtxDepth * 2 + 1]) else: self.GenericTpNames = None self.GenericTypeArgs = None diff --git a/App/lib/core/Gen/Type/TypeGenCDef.vp b/App/lib/core/Gen/Type/TypeGenCDef.vp index 7833449..dbfa9f2 100644 --- a/App/lib/core/Gen/Type/TypeGenCDef.vp +++ b/App/lib/core/Gen/Type/TypeGenCDef.vp @@ -57,7 +57,7 @@ class TypeGenCDef(TypeGenBase.TypeGenBase): def _cdef_idx_slot(self, si: sizet) -> sizet | t.CPtr: """取索引第 si 个槽(8 字节,存槽下标+1;0=空槽)""" - return (sizet | t.CPtr)(t.CVoid(uint64(self.CDefineNameIdx) + uint64(si) * 8, t.CPtr)) + return (sizet | t.CPtr)(uint64(self.CDefineNameIdx) + uint64(si) * 8) def _cdef_idx_init(self, pool: rawptr[memhub.MemBuddy]) -> None: """创建/清零名索引(与 CDefineNames 同池);失败则标记不可信""" diff --git a/App/lib/core/Gen/Type/TypeGenCType.vp b/App/lib/core/Gen/Type/TypeGenCType.vp index a5ac659..d0e353c 100644 --- a/App/lib/core/Gen/Type/TypeGenCType.vp +++ b/App/lib/core/Gen/Type/TypeGenCType.vp @@ -58,7 +58,7 @@ class TypeGenCType(TypeGenBase.TypeGenBase): # ============================================================ def _ctypedef_idx_slot(self, si: sizet) -> sizet | t.CPtr: """取索引第 si 个槽(8 字节,存槽下标+1;0=空槽)""" - return (sizet | t.CPtr)(t.CVoid(uint64(self.CTypedefNameIdx) + uint64(si) * 8, t.CPtr)) + return (sizet | t.CPtr)(uint64(self.CTypedefNameIdx) + uint64(si) * 8) def _ctypedef_idx_init(self, pool: rawptr[memhub.MemBuddy]) -> None: """创建/清零名索引(与 CTypedefNames 同池);失败则标记不可信""" diff --git a/App/lib/core/Gen/Type/TypeGenResolve.vp b/App/lib/core/Gen/Type/TypeGenResolve.vp index df0ddb7..d900da2 100644 --- a/App/lib/core/Gen/Type/TypeGenResolve.vp +++ b/App/lib/core/Gen/Type/TypeGenResolve.vp @@ -1437,7 +1437,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): """检测节点是否是 t.attr_name 形式(含 from t import attr_name 的裸名) 支持两种写法(与 TPC 的 IsTModule 检查对齐): - - t.CPtr / t.CVoid(Attribute 形式) + - t.CPtr / t\.CVoid(Attribute 形式) - 裸名 CPtr / CVoid(from t import CPtr 形式) 裸名识别是必要功能:测试/库代码大量用 `from t import CPtr` 后直接写 `X | CPtr`、`CVoid` 参数注解等,若只认 t.XXX 会漏判。 @@ -1457,7 +1457,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): return 0 if string.strcmp(val_nm.id, "t") == 0: # t 是内建库(SHA1 豁免),可能不在 _imported_modules 中。 - # 显式写 t.CPtr / t.CVoid 即确指 t 模块,无需 imported_modules 确认。 + # 显式写 t.CPtr / t\.CVoid 即确指 t 模块,无需 imported_modules 确认。 return 1 return 0 # 裸名形式: from t import attr_name → Name(id == attr_name) @@ -2347,7 +2347,7 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): # t.CEnum 枚举类非结构体,get_struct_type 查不到) if self.Gen.StmtGenDecl.is_enum_class(at.attr) == 1: return self.Gen.StmtGenDecl.get_enum_base_type(at.attr) - # 模块限定 typedef(posix.DIR = t.CTypedef = t.CVoid|t.CPtr 等): + # 模块限定 typedef(posix.DIR = t.CTypedef = t\.CVoid|t.CPtr 等): # 与 Name 分支同一套 lookup_ctypedef + 递归解析(单层 Module.Typedef # 与嵌套 Attribute 都要支持)。 if self.Gen.TypeGenCType.CTypedefResolveDepth < TypeGenMixin.MAX_CTYPEDEF_DEPTH: @@ -2433,8 +2433,8 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): other_node: ast.AST | t.CPtr = bop.left if left_is_cptr != 0: other_node = bop.right - # 检测另一边是否是 t.CVoid (void* = i8*) - # 严格验证完整形式(Attribute(t.CVoid) 的 value 是 Name("t"), + # 检测另一边是否是 t\.CVoid (void* = i8*) + # 严格验证完整形式(Attribute(t\.CVoid) 的 value 是 Name("t"), # 或裸名 CVoid 且 t 已导入),防止解析异常节点被误判为 CVoid。 other_is_cvoid: int = 0 if other_node is not None: diff --git a/App/lib/core/Gen/Type/TypeSpec.vp b/App/lib/core/Gen/Type/TypeSpec.vp index 3b23633..437b90d 100644 --- a/App/lib/core/Gen/Type/TypeSpec.vp +++ b/App/lib/core/Gen/Type/TypeSpec.vp @@ -285,7 +285,7 @@ def _spec_key_at(keys: bytes, index: int) -> str: if keys is None or index < 0: return None addr: uint64 = uint64(keys) + uint64(index * SPEC_TEXT_MAX) - return (str | t.CPtr)(t.CVoid(addr, t.CPtr)) + return (str | t.CPtr)(addr) # ============================================================ @@ -301,8 +301,7 @@ def _spec_index_find(arena: TypeSpecArena | t.CPtr, key: str, h: uint64) -> int: idx: sizet = sizet(h) & mask i: int = 0 while i < arena.IndexCap: - slot: sizet | t.CPtr = (sizet | t.CPtr)( - t.CVoid(uint64(arena.Index) + uint64(idx * 8), t.CPtr)) + slot: sizet | t.CPtr = (sizet | t.CPtr)(uint64(arena.Index) + uint64(idx * 8)) sv: sizet = slot[0] if sv == 0: return -1 @@ -328,8 +327,7 @@ def _spec_index_insert(arena: TypeSpecArena | t.CPtr, key: str, h: uint64, ei: i idx: sizet = sizet(h) & mask i: int = 0 while i < arena.IndexCap: - slot: sizet | t.CPtr = (sizet | t.CPtr)( - t.CVoid(uint64(arena.Index) + uint64(idx * 8), t.CPtr)) + slot: sizet | t.CPtr = (sizet | t.CPtr)(uint64(arena.Index) + uint64(idx * 8)) if slot[0] == 0: slot[0] = sizet(ei + 1) return 0 @@ -388,7 +386,7 @@ def _spec_alloc() -> TypeSpec | t.CPtr: """分配并清零一个 TypeSpec(PermPool)""" pp: rawptr[memhub.MemBuddy] = CompilerFactory.factory.PermPool size: sizet = TypeSpec.__sizeof__() - sp: TypeSpec | t.CPtr = (TypeSpec | t.CPtr)(t.CVoid(pp.alloc(size), t.CPtr)) + sp: TypeSpec | t.CPtr = (TypeSpec | t.CPtr)(pp.alloc(size)) if sp is None: return None string.memset(sp, 0, size) @@ -693,10 +691,10 @@ def _spec_param_at(sp: TypeSpec | t.CPtr, index: int) -> TypeSpec | t.CPtr: if sp is None or sp.Params is None or index < 0 or index >= sp.ParamCount: return None addr: uint64 = uint64(sp.Params) + uint64(index * 8) - slot: sizet | t.CPtr = (sizet | t.CPtr)(t.CVoid(addr, t.CPtr)) + slot: sizet | t.CPtr = (sizet | t.CPtr)(addr) if slot is None: return None - return (TypeSpec | t.CPtr)(t.CVoid(uint64(slot[0]), t.CPtr)) + return (TypeSpec | t.CPtr)(uint64(slot[0])) # ============================================================ @@ -844,8 +842,7 @@ def _text_to_func(text: str, depth: int) -> TypeSpec | t.CPtr: psp: TypeSpec | t.CPtr = _text_to_spec(seg, depth + 1) if psp is None: return None - slot_p: sizet | t.CPtr = (sizet | t.CPtr)( - t.CVoid(uint64(param_specs) + uint64(pcount * 8), t.CPtr)) + slot_p: sizet | t.CPtr = (sizet | t.CPtr)(uint64(param_specs) + uint64(pcount * 8)) if slot_p is None: return None slot_p[0] = sizet(psp) @@ -891,22 +888,20 @@ def InternSpec(arena: TypeSpecArena | t.CPtr, key_hash: uint64 = _spec_key_hash(key_buf) found: int = _spec_index_find(arena, key_buf, key_hash) if found >= 0: - slot_e: sizet | t.CPtr = (sizet | t.CPtr)( - t.CVoid(uint64(arena.Specs) + uint64(found * 8), t.CPtr)) + slot_e: sizet | t.CPtr = (sizet | t.CPtr)(uint64(arena.Specs) + uint64(found * 8)) if slot_e is None: return None - return (TypeSpec | t.CPtr)(t.CVoid(uint64(slot_e[0]), t.CPtr)) + return (TypeSpec | t.CPtr)(uint64(slot_e[0])) if arena.Index is None: # 索引不可用:回退原线性查找(规模与类型种数同阶) i: int = 0 while i < arena.Count: exist_key: str = _spec_key_at(arena.Keys, i) if exist_key is not None and string.strcmp(exist_key, key_buf) == 0: - slot_e2: sizet | t.CPtr = (sizet | t.CPtr)( - t.CVoid(uint64(arena.Specs) + uint64(i * 8), t.CPtr)) + slot_e2: sizet | t.CPtr = (sizet | t.CPtr)(uint64(arena.Specs) + uint64(i * 8)) if slot_e2 is None: return None - return (TypeSpec | t.CPtr)(t.CVoid(uint64(slot_e2[0]), t.CPtr)) + return (TypeSpec | t.CPtr)(uint64(slot_e2[0])) i += 1 # 未命中:追加。**表满 = fail-fast**:不能返回 None——调用链会把 None 一路传到 # entry.Spec,条目静默失去类型信息(如符号性判定恒返回 0 ⇒ zext/sext 方向取错), @@ -923,8 +918,7 @@ def InternSpec(arena: TypeSpecArena | t.CPtr, if dst_key is None: return None string.strcpy(dst_key, key_buf) - slot_n: sizet | t.CPtr = (sizet | t.CPtr)( - t.CVoid(uint64(arena.Specs) + uint64(arena.Count * 8), t.CPtr)) + slot_n: sizet | t.CPtr = (sizet | t.CPtr)(uint64(arena.Specs) + uint64(arena.Count * 8)) if slot_n is None: return None slot_n[0] = sizet(sp) @@ -1386,8 +1380,7 @@ def _spec_from_func(arena: TypeSpecArena | t.CPtr, ps: TypeSpec | t.CPtr = SpecFromLLVMType(arena, pty) if ps is None: return None - slot: sizet | t.CPtr = (sizet | t.CPtr)( - t.CVoid(uint64(params_arr) + uint64(i * 8), t.CPtr)) + slot: sizet | t.CPtr = (sizet | t.CPtr)(uint64(params_arr) + uint64(i * 8)) if slot is None: return None slot[0] = sizet(ps) @@ -1412,8 +1405,7 @@ def _spec_from_struct(arena: TypeSpecArena | t.CPtr, # ============================================================ def SpecSelfCheck() -> int: """TypeSpec 编解码自检,返回 0=通过 / 失败用例号""" - arena: TypeSpecArena | t.CPtr = (TypeSpecArena | t.CPtr)( - t.CVoid(CompilerFactory.factory.PermPool.alloc(TypeSpecArena.__sizeof__()), t.CPtr)) + arena: TypeSpecArena | t.CPtr = (TypeSpecArena | t.CPtr)(CompilerFactory.factory.PermPool.alloc(TypeSpecArena.__sizeof__())) if arena is None: return 1 string.memset(arena, 0, TypeSpecArena.__sizeof__()) @@ -1452,11 +1444,11 @@ def SpecSelfCheck() -> int: params: sizet | t.CPtr = CompilerFactory.factory.PermPool.alloc(8 * 2) if params is None: return 5 - slot0: sizet | t.CPtr = (sizet | t.CPtr)(t.CVoid(uint64(params), t.CPtr)) + slot0: sizet | t.CPtr = (sizet | t.CPtr)(uint64(params)) if slot0 is None: return 5 slot0[0] = sizet(s_i32) - slot1: sizet | t.CPtr = (sizet | t.CPtr)(t.CVoid(uint64(params) + 8, t.CPtr)) + slot1: sizet | t.CPtr = (sizet | t.CPtr)(uint64(params) + 8) if slot1 is None: return 5 slot1[0] = sizet(s_u64) diff --git a/App/lib/core/Gen/VarGenMixin.vp b/App/lib/core/Gen/VarGenMixin.vp index 7b95a48..42fed5c 100644 --- a/App/lib/core/Gen/VarGenMixin.vp +++ b/App/lib/core/Gen/VarGenMixin.vp @@ -46,7 +46,7 @@ class VarGenMixin: # ============================================================ # init_vars — 分配并清零 VarEntry 数组 # ============================================================ - Gen: Generator.Generator | t.CPtr + Gen: rawptr[Generator.Generator] def init_vars(self, pool: rawptr[memhub.MemBuddy]) -> GenTypes.VarEntry | t.CPtr: """分配并清零变量表数组""" size: sizet = MAX_VARS * GenTypes.VarEntry.__sizeof__() @@ -67,7 +67,7 @@ class VarGenMixin: entry_size: sizet = GenTypes.VarEntry.__sizeof__() for i in range(var_count): entry_addr: uint64 = uint64(vars_ptr) + i * entry_size - entry: GenTypes.VarEntry | t.CPtr = (GenTypes.VarEntry | t.CPtr)(t.CVoid(entry_addr, t.CPtr)) + entry: GenTypes.VarEntry | t.CPtr = (GenTypes.VarEntry | t.CPtr)(entry_addr) if entry.Name is not None and entry.Used != 0: # 快速路径:strcmp 判等蕴含首字符相等,首字符不同者跳过 strcmp if entry.Name[0] == name[0] and string.strcmp(entry.Name, name) == 0: @@ -86,7 +86,7 @@ class VarGenMixin: entry_size: sizet = GenTypes.VarEntry.__sizeof__() for i in range(var_count): entry_addr: uint64 = uint64(vars_ptr) + i * entry_size - entry: GenTypes.VarEntry | t.CPtr = (GenTypes.VarEntry | t.CPtr)(t.CVoid(entry_addr, t.CPtr)) + entry: GenTypes.VarEntry | t.CPtr = (GenTypes.VarEntry | t.CPtr)(entry_addr) if entry.Name is not None and entry.Used != 0: if string.strcmp(entry.Name, name) == 0: return entry @@ -219,7 +219,7 @@ class VarGenMixin: return 1 entry_size: sizet = GenTypes.VarEntry.__sizeof__() entry_addr: uint64 = uint64(vars_ptr) + var_count * entry_size - entry: GenTypes.VarEntry | t.CPtr = (GenTypes.VarEntry | t.CPtr)(t.CVoid(entry_addr, t.CPtr)) + entry: GenTypes.VarEntry | t.CPtr = (GenTypes.VarEntry | t.CPtr)(entry_addr) # 变量名必须深拷贝到 stdlib(跨 pool reset 存活):entry.Name 直接存 AST # 节点 Name.id 指针时,该段内存被后续分配覆盖会使 find_var 的 strcmp 静默 # 失配 → Handle 阶段找不到 PreScan 已建的同名 alloca → 另建类型退化的 diff --git a/App/lib/core/IncludesScanner.vp b/App/lib/core/IncludesScanner.vp index 3f5f7cf..1f0acfd 100644 --- a/App/lib/core/IncludesScanner.vp +++ b/App/lib/core/IncludesScanner.vp @@ -95,7 +95,7 @@ def add_file_entry(result: ScanResult | t.CPtr, # 获取条目地址 entry_size: sizet = FileEntry.__sizeof__() entry_addr: uint64 = uint64(result.Entries) + result.Count * entry_size - entry: FileEntry | t.CPtr = (FileEntry | t.CPtr)(t.CVoid(entry_addr, t.CPtr)) + entry: FileEntry | t.CPtr = (FileEntry | t.CPtr)(entry_addr) if entry is None: return 1 @@ -346,7 +346,7 @@ def find_entry_by_module(result: ScanResult | t.CPtr, entry_size: sizet = FileEntry.__sizeof__() for i in range(result.Count): entry_addr: uint64 = uint64(result.Entries) + i * entry_size - entry: FileEntry | t.CPtr = (FileEntry | t.CPtr)(t.CVoid(entry_addr, t.CPtr)) + entry: FileEntry | t.CPtr = (FileEntry | t.CPtr)(entry_addr) if entry is not None: if entry.ModuleName is not None: if string.strcmp(entry.ModuleName, module_name) == 0: @@ -427,20 +427,20 @@ def _TryResolveModuleFile(inc_dir: str, rel_seg: bytes, rel_len: sizet, # 写输出槽(stdlib 深拷贝,调用方负责 free) # 槽联合必须用 (sizet | t.CPtr):t.CPtr|t.CPtr 会被折叠成 t.CPtr, # [0] 变成 1 字节访问 → 指针被截断(0x2e 崩溃根因)。CSizeT 成员为 - # 8 字节,写入用 sizet(ptr) 直接转换;读取用 t.CVoid(u64, t.CPtr) - # 转回指针(t.CVoid 仅配合 t.CPtr 表示 void* 强转)。 + # 8 字节,写入用 sizet(ptr) 直接转换;读取用 t\.CVoid(u64, t.CPtr) + # 转回指针(t\.CVoid 仅配合 t.CPtr 表示 void* 强转)。 if out_abs_path is not None: - abs_slot: sizet | t.CPtr = (sizet | t.CPtr)(t.CVoid(out_abs_path, t.CPtr)) + abs_slot: sizet | t.CPtr = (sizet | t.CPtr)(out_abs_path) abs_slot[0] = sizet(cand) else: stdlib.free(cand) if out_rel_path is not None: - rel_slot: sizet | t.CPtr = (sizet | t.CPtr)(t.CVoid(out_rel_path, t.CPtr)) + rel_slot: sizet | t.CPtr = (sizet | t.CPtr)(out_rel_path) rel_slot[0] = sizet(rel_path) else: stdlib.free(rel_path) if out_inc_dir is not None and inc_buf is not None: - inc_slot: sizet | t.CPtr = (sizet | t.CPtr)(t.CVoid(out_inc_dir, t.CPtr)) + inc_slot: sizet | t.CPtr = (sizet | t.CPtr)(out_inc_dir) inc_slot[0] = sizet(inc_buf) return 1