TermiNexus
|
de89fda73d
|
fix(HandlesClassDef/DeclarationGenerator): 未声明字段不再静默兜底 i32,推不出类型即 fail-fast
类别:a 编译器缺陷(静默兜底推断)+ 隐患预防。
判据(为什么必须去掉 i32 兜底):成员类型是 struct 布局的唯一来源,静默把"没声明/
推不出"的字段当成 i32 会把错误推到下游——值域不匹配时表现为与真因无关的报文
(同族既有现场:`free_lists: uint64*` 被当成 i32 后,`self.free_lists = base`(i8*) 报
"指针隐式转整数已禁止")。项目约定:类型信息缺失立即终止(与同函数 `self.X: T` 分支
HandlesClassDef.py:1356-1386 已有 fail-fast 同口径)。
改动 1(定义端布局,权威侧)HandlesClassDef._scan_node_for_self_assign 的 Assign 分支:
删除 `MemberType = ir.IntType(32)` 默认值,改为显式 `MemberType = None` + 白名单定型;
推不出即 compile_error(含 文件:行:列、源码行、取值原文、建议写法,行号按 _line_offset
还原)+ sys.exit(1)。
采纳形态(逐条写进注释,必须与 stub 侧一致):
整型/布尔字面量→i32;浮点字面量→double;字符串字面量→i8*;
值为本方法带注解形参→该形参类型;白名单调用 float()/double()→double、char()→i8、
int()/long()/short()→i32、`x.len()`→i32;其余(None 字面量/BinOp/任意调用…)→终止。
改动 2(stub 声明侧)DeclarationGenerator._CollectOwnMemberTypes 的 Assign 分支:
删除 `InferredType = 'i32'` 默认值,改白名单 + 推不出即 raise `[FATAL] …拒绝静默写成
i32`;同时纠正两处与定义端不一致的映射:浮点字面量 'float'(f32) → 'double'(f64),
布尔字面量 'i8' → 'i32'(定义端 bool 走 int 分支),否则 stub 与定义端槽宽/类型分叉。
预检(确认不打断既有构建):用 TPC 自家解析器扫全工作区 .vp(678 类;口径 =
类体 AnnAssign + 任意位置 `self.X: T` + 祖先传递声明),"未声明字段 + 首次裸赋值"
实例数 = 0(曾疑似的 4 例 `self.Next = None` 均为继承字段:G4Node/Value 继承
GSListNode 已声明 Next)。
冒烟(合成样例,跑完删除):
A `self.flag = None`(未声明、None 无类型信息)⇒ SystemExit(1) + 明确报文;
B `self.n = 5`(可定型)⇒ 正常翻译;C `flag: int` 已声明后赋 None ⇒ 正常翻译。
已知残留(本次未动,已在代码注释里写明,避免下次盲修):stub 侧方法体内裸
`self.X = ...` 仍被 seen_member_names 过滤(该集合只含本类自有声明、不含继承字段);
若放行,继承字段(如 G4Node.Next)会被当成自有字段重复加槽 → 反而制造布局分叉。
要放行必须先在该处补"祖先字段名"判定。
|
2026-09-30 10:58:23 +08:00 |
|
TermiNexus
|
5d1620505e
|
fix(decl): 声明端看穿「装饰器标记 + 裸类引用」联合,修 t.CExtern|X|t.CPtr 多外包一层指针
根因:vpi 记录的模块级全局是 `_mbuddy: t.CExtern | memhub.MemBuddy | t.CPtr` 形态,_get_type_str 把该联合展开为 %"sha1.MemBuddy"*(标记 t.CExtern 展开为空串,已被 BinOp 分支丢弃),但外层 | t.CPtr 走 _is_bare_class_ref_annotation 时对 ast.BinOp 一律 return False ⇒ 未吸收"裸类引用自身即指针"那一层 ⇒ 声明端 %X** 与定义端 %X* 差一层。
后果:Phase1 生成的 .stub.ll 声明 @_mbuddy = external global %X**,消费模块按下声明取值得到 %X**,赋给 %X* 字段(VLogger.vp:105 self.__mbuddy__ = _mbuddy)即报"指针隐式转换已禁止(层数不同)"。
修法:BinOp 分支内若恰一侧展开为空/void(纯装饰器标记 CExtern/CExport/State/CStatic...)则按另一侧递归判定,对齐 TPV TypeGenResolve.vp:2596 第 3 条语义「ActualType | DecoratorMarker → ActualType」(TPV 无此问题,故只改 TPC)。
探针验证:t.CExtern|X|t.CPtr / X|None|t.CPtr / t.State|X|t.CPtr → %X*(修正);X|t.CPtr、rawptr[X]|t.CPtr → %X**、bytes|t.CPtr → i8**、int|t.CPtr → i32*(均不变)。注意 .stub.ll 有全局缓存,需 --clear-cache 重编生效。
|
2026-09-28 16:35:53 +08:00 |
|
TermiNexus
|
35de6321f6
|
refactor(return): 移除 @c.CReturn 多返回值处理器,只保留 -> tuple[ty1, ty2, ...],遇到 CReturn 一律报错
DeclarationGenerator:tuple[...] 分支逐字保留(仅 CReturnTypes 机械改名 MultiRetTypes),装饰器分支改为 SyntaxError,报文含函数名与“请改用 -> tuple[ty1, ty2, ...]”提示
HandlesAssign(a, b = f() 解包路径):删除装饰器收集分支并改为报错;tuple[...] 恢复与逐个解包逻辑逐字不变
HandlesFunctions:新增 _CRETURN_REMOVED_HINT 与 _RejectCReturnDecorator,在函数定义入口(_GetFunctionSignatureLlvm / _EmitFunctionLlvm)fail-fast——即使只有装饰器、没有 -> 注解,也不会让返回类型静默退化成 i32
HandlesImports:外部函数声明处同样报错,并删除下游已失效的 CReturnTypes 参数拼接死代码
HandlesReturn / HandlesFor / BaseTranslator:CurrentCReturnTypes 等机械改名(读写端一致,无行为变化)
includes/c.py:保留 CReturn 名字作墓碑(删掉会让 @c.CReturn 变成未知属性、可能被静默忽略),docstring 写明已移除并指路 -> tuple[...];README 措辞同步
|
2026-09-28 13:57:04 +08:00 |
|
TermiNexus
|
c83fc752c6
|
fix(sizeof,parse): 尺寸链去静默兜底,解析报错可定位,补 C 解析器缺口
StructGen: _get_struct_size/_get_align 去 opaque→8/ptr_size、未知→4 兜底并补 VectorType;LiteralStructType.fields→.elements(llvmlite 无 fields,必然 AttributeError)
HandlesClassDef: union 载荷尺寸经不存在的 ir.DataLayout 静默退化成 8 字节;HandlesExprCall/ExprBuiltin: sizeof 各静默 0 分支改 fail-fast,数组元素 sizeof 统一走 _get_struct_size
HandlesFor: nonlocal struct/array 堆分配不再退化成 malloc(8)
vast/vast_c: 补一元 * / & 解析,装饰器后 extern/export 分派修复,C 侧报错带 token 与行号;StubGen.Converter: 宏展开丢尾随空行修 .pyi 缩进非法
其余为 rawptr 迁移 / fail-fast 口径等历史改动一并入库
|
2026-09-26 19:27:22 +08:00 |
|
TermiNexus
|
2cc816ac13
|
修复了一些错误
|
2026-09-18 20:00:59 +08:00 |
|
TermiNexus
|
8d950f5d43
|
fix(declgen): 联合中 t.CPtr[T] 下标段按 Ptr^N 叠加,与 LLVMTypeMapper 口径对齐
_get_type_str 的 BinOp 段原先在右段非 i8* 时落到 星号在左值则直接返回左值 的启发式,左值已是指针(BYTEPTR=>i8*)时会吞掉右段层数(BYTEPTR | t.CPtr[t.CPtr] 得 i8*,Mapper 得 i8***,同份 stub 自相矛盾)
新增 t.CPtr[T] 分支(两侧对称,置于该启发式之前),复用文件内既有 _ptr_level_of 取层数并按定义侧 TypeGenResolve 口径改为纯外包 N 层(去掉原 struct 吸收半截语义);LLVM 聚合左值显式排除。A/B 实测 135 个 .pyi 输出逐字节相同,现有语料零影响
|
2026-09-16 07:11:23 +08:00 |
|
TermiNexus
|
45e78ad107
|
基线重置,修复了一些 bug
|
2026-09-07 14:46:02 +08:00 |
|
TermiNexus
|
2f0d52e736
|
fix(gentype): list[t.CPtr] 特化与 list[对象] elem_size 根本修复
两处根因:
1. list[t.CPtr] 报 Undefined method 'append':
- _resolve_generic_slice_type 对 t.CPtr 返回裸名 'CPtr',type_map['T']='CPtr'
替换进模板(item: CPtr)后 CPtr 不在顶层作用域 → append 声明注册失败
- 改保留带前缀 't.CPtr'(可解析)
- 查找端(SymbolUtils.FindStructNameInAnnotation)与声明端
(DeclarationGenerator)的 CPtr 统一规范化为 'ptr',与特化端
_mangle_generic_class_name 一致(list[CPtr]/list[i8*] vs list[ptr])
- _specialize_generic_class 的 cptr_params/class_type_names 判定改 tn_bare
2. list[对象] elem_size=0(get(0)==get(1) 同槽根因):
- T.__sizeof__() 特化后为 'X | t.CPtr'(BinOp 联合),_HandleSizeofLlvm
对 BinOp 落到 else 返回 0 → list.__elem_size__=0 → 元素全写同槽
- 改含 t.CPtr 的联合类型返回 8(指针大小)
|
2026-08-19 22:44:15 +08:00 |
|
TermiNexus
|
7c6a497111
|
fix(DeclarationGenerator): 按自有字段展平时补齐祖先 vtable 指针
_FlattenInheritedDecl 递归只取类自有字段,而原 _get_inherited_members 返回完整 struct 天然含 vtable。改造后 Module(AST CVTable) 等子类 struct 缺 vtable 指针 → 字段错位 → 编译报 'cannot store i8* to %AST**'(写 vtable 到 parent 槽位)。新增 _ShouldEmitOwnVtablePtr 判定,递归各祖先类时在自有字段前补齐 vtable。
|
2026-08-18 13:19:51 +08:00 |
|
TermiNexus
|
81ad712475
|
fix(Handles): 多继承字段展平按继承源去重,消除菱形重复
Generator 同时继承 ClassGenMixin/ClassGenEnum/ClassGenGeneric/ClassGenVTable/ClassGenDef/ClassGenBase,而前 5 个都继承 ClassGenBase → ClassGenBase 41 字段被重复展平 6 次(struct 707 元素),class_members 索引与 struct 布局错位 → 跨 Mixin 方法 this_adjust 失效 → is_exception_name 读错位内存 strcmp 越界(ASAN heap-buffer-overflow)。
修复:HandlesClassDef 与 DeclarationGenerator 的多继承展平改为递归按继承源去重(每类只展平一次,只取自有字段;同名字段如 TempDir 跨非继承 Mixin 仍各自保留,避免 2026-08-10 历史去重缺陷回归)。
|
2026-08-18 13:13:25 +08:00 |
|
TermiNexus
|
6fc9e19e24
|
feat(vast): 新增自研 Viper/Python 语法解析器取代标准库 ast
TPC 侧取缔对 Python 标准库 ast 模块的依赖,改用 lib/vast 包:
- Nodes: 与 CPython 3.12 ast 完全同构的 131 个节点类(含抽象基类继承)
- Tokenizer: 词法分析(缩进/字符串/f-string/数字/运算符/软关键字)
- ExprParser: 表达式递归下降解析(优先级/lambda/推导式/f-string/切片)
- Parser: 语句解析(def/class/if/for/try/with/match/import/注解)
- Utils/Unparser: walk/dump/unparse/copy_location/literal_eval 等辅助
- 软关键字 fn/fun/func/function 并入解析器, 废除 ExpandSoftKeywords 预处理
- lib/_bootstrap 将 lib 目录加入 sys.path, import vast as ast 零修改替换
- 52 个文件 import ast 替换为 import vast as ast; 94 文件差分测试 0 失败
|
2026-08-17 09:36:38 +08:00 |
|
TermiNexus
|
ca7c2120b8
|
修正了种子编译器的错误
|
2026-07-22 21:55:36 +08:00 |
|
TermiNexus
|
135aa05485
|
尝试进行 Qt 测试,增加了 AI 人机调试工具 _console,以及 TransPyV 进行修正
|
2026-07-21 14:41:22 +08:00 |
|
TermiNexus
|
4e66207ba1
|
重置上传,新增了多个标准库,开始 TransPyV 自举实验
|
2026-07-19 11:38:15 +08:00 |
|
t
|
796222a300
|
snapshot before regression test
|
2026-07-18 19:25:40 +08:00 |
|