TermiNexus
|
25cda80995
|
fix(tpc): 补齐单/多参泛型类下标注解(list[str] → %"{模板sha1}.list[str]"*)
类别:a 编译器缺陷(机制缺失:两个注解解析器都只认双参定长 list[T, N])。
现场(前序报错):CallGenMixin.vp:149 调 ClassGenGeneric._specialize_generic_class
报「%\"650c1c3366d09e39.list[str]\"* 不能隐式转 i32」——实参侧正确、**形参侧
`type_args: list[str]*` 在符号表里成 i32**。同类:字段
`TypeGenBase.CTypedefNames: list[str] | t.CPtr` 在共享符号表里成 i8*(实测
temp/_shared_sym.json)。
真根因:单参泛型类下标在两处注解解析器里都无人处理,直接落到"未知类型"兜底:
· TypeAnnotationResolver._from_node_subscript(IsListAnnotation 只认双参)
→ `return CTypeInfo()`(空 ⇒ i32 / 与 t.CPtr 合并成 i8*);
· LLVMTypeMapper._resolve_subscript → warn + 'i32'。
而声明端 DeclarationGenerator._get_type_str 的泛型分支(L1393-1423)**一直是对的**
(`%"<模板sha1>.<特化名>"*`),三处规则分裂。
修复(一条规则源 + 两处消费 + 一处物化):
1. SymbolUtils 新增 ResolveGenericClassSpecName / IsGenericClassSubscriptBase ——
与 DeclarationGenerator 泛型分支逐字同口径:
spec = 基名 + '[' + ']['.join(ResolveGenericTypeArgStr(实参)) + ']';
判据=该基名**有类定义**(符号表条目 IsStruct 或任一命名空间命中,实测 list
条目 IsStruct=True,故等价覆盖声明端 non_struct_types ∪ _generic_class_names)。
另加 GetStructSha1MapFromSymtab / GetTCAliasMapFromSymtab(从
SymbolTable.translator 取 Phase2 已挂好的 _struct_sha1_map /
_t_c_imported_names),供实参串跨模块类引用解析('<sha1>.AST')。
2. TypeAnnotationResolver._from_node_subscript 末尾(既有 rawptr/CPtr/CArray/
list[T,N]/tuple 分支**之后**)接入:产出
CTypeInfo(BaseType=CStruct(spec), IsStruct=True, Name=spec)(PtrCount 保持 0,
与本文件既有结构体 promotion 同口径:`X | t.CPtr` 取 max→1 层、
`rawptr[X]` +1→1 层,均与 declare 侧一致)。
3. LLVMTypeMapper._resolve_subscript 同样位置接入:产出 `%struct.<spec>*`
(与 _resolve_name / _resolve_attribute 的类引用同一表示)。
4. BaseGen._get_or_create_struct:特化名(含 '[')先按**基名**查
_struct_sha1_map 取模板 sha1 再拼 IR 名 —— 否则会用**使用方模块** sha1 拼出
'<本模块sha1>.list[str]',与 declare/define 端 '<模板sha1>.list[str]' 分裂。
自测(vast AST):list[str]→'list[str]'、dict[str,int]→'dict[str][int]'、
list[rawptr[AST]]→'list[AST*]'、rawptr[int]/tuple[…]→None(仍由既有分支处理)。
|
2026-09-29 13:17:36 +08:00 |
|
TermiNexus
|
7167703ca7
|
fix(tpc): 降级判据改用「注解形态 + 解析结果形状」,放在字段类型唯一漏斗
上一版拦截失效的原因(实测):`class_member_annotations` 全仓**只被声明与读取、从未被
写入**(Step 2 一直是空转),故依赖它的 `_HasDegradedMemberTypes` 恒为 False。改法:
1) SymbolUtils 新增两个**形状判据**(纯判定,不做类型解析):
- IsI8DoublePtrType(T):是否 i8 系两层指针(`i8**`)= `T | t.CPtr` 在 T 类型丢失后
退化成的形状;
- IsClassRefPtrAnnotation(Ann):注解是否「指针包装的类引用」(rawptr[Mod.Class] /
Mod.Class | t.CPtr;内层为非 t/c 模块的 Attribute 或首字母大写裸名)。
2) HandlesBase.CollectAnnAssignMember(字段类型的**唯一漏斗**,覆盖本地类 /
跨模块 .vpi / 嵌套类三条写入链)新增硬判据:注解是类引用指针 **且** 解析结果正是
`i8**` ⇒ 必属类型信息丢失,当场 fail-fast,并打出 CTypeInfo 全字段(BaseType/
PtrCount/IsStruct/IsTypedef/IsEnum/Name)与内层名的符号表条目标志。此前的
`_CheckPtrAnnotationKeepsClass` 只看"void 基座且无类身份",而现场这条链**带 Name/
IsTypedef**(Attribute 分支的 typedef 出口 → BaseType=CVoid 但 Name=类名),正好漏过。
3) StructGen 删除依赖那张空表的 `_HasDegradedMemberTypes` / `_IsI8DoublePtr` /
`_IsClassRefPtrAnnotation` 及 set_body 前的拦截(改由漏斗处兜住,不留死代码)。
现场:Generator.vp:200 `self.ExprGenFstr = SubExprGenFstr`
→ 布局槽 elements[11]=i8** 而声明 %"a7b68c79f39cb4d3.ExprGenFstr"*
|
2026-09-29 12:04:20 +08:00 |
|
TermiNexus
|
e5a6616f8b
|
feat(static): static 修饰符改为语句起始前置 + 新增 static def(旧的注解位置响亮失败)
vast/Parser.py:ParseStatement 与 _ParseDecorated 新增 static def 分派(判据要求第 2 个 token 是 def,故 static = 5 / static x = 5 不会被误吃成函数定义);新增 _ParseStaticDef,镜像 _ParseExportDef 但**不改写返回注解**、而是在既有装饰器之后合成 @t.CStatic
SymbolUtils.py:_TYPE_DESCRIPTOR_MARKERS 删掉 static;新增 _StaticPositionSyntaxError 与 _InStaticOldAnnotationPosition,旧注解位置(名字: static 类型)一律 SyntaxError 并提示前置形式,绝不静默改写;_EXPORT_EXTERN_MODIFIERS 加入 static,_ExpandExportExternVar 新增前置分支——export/extern 追加在类型右侧(或 t.CExport / 或 t.State),static **前置在类型最左**(t.CStatic 加竖线),允许初值;数组前缀展开仍在修饰符展开之前
与 includes/ast/parser.vp 的 pending_static 通道同源:static 名字: 类型 = 值 产出与手写 名字: t.CStatic | 类型、装饰器 @t.CStatic 逐字段同形
|
2026-09-28 13:49:28 +08:00 |
|
TermiNexus
|
6fce79d531
|
feat(symbols): TPC 侧同步 export/extern 变量声明语法糖
新增 _ExpandExportExternVar:export 名字: T [= 初值] → 名字: T | t.CExport [= 初值];extern 名字: T → 名字: T | t.State;extern 带初值响亮失败 SyntaxError
排在 _ExpandArrayPrefixAnnotations 之后(先让注解规范化,再插标记);_AtAnnotationColon 把 export/extern 认作语句边界,使数组前缀仍能脱糖
新增 _NextSignificantTokenIndex;ExpandSoftKeywords 文档改列九种展开
|
2026-09-27 18:00:54 +08:00 |
|
TermiNexus
|
4346552c72
|
feat(symbols): TPC 侧同步 renum 语法糖,renum X: 展开为 class X(t.REnum):
新增 _ExpandRenumBlocks(与 _ExpandUnionBlocks 同构,只改写头行)并接入 _ExpandSoftKeywordsImpl
行首 renum 的非 renum 名字: 形态响亮失败 SyntaxError(renum 不作标识符)
同步 TransPyV/includes 46cd4b4 的解析侧支持;ExpandSoftKeywords 文档改列八种展开
|
2026-09-27 17:53:23 +08:00 |
|
TermiNexus
|
ae02431dd2
|
fix(descriptor): static 作为注解位置存储类描述符(名字: static T)
_TYPE_DESCRIPTOR_MARKERS 增加 static -> CStatic,与 const/volatile 共用同一展开器与注解位置判据;static 仅在注解位置生效(冒号后 / 形参 / 返回箭头后),非注解位置的 static 标识符与 static_libs 之类子串不受影响。缺类型(a: static)现在响亮失败而非静默退化。
修用户报告:a: static int(TransPyV/App/main.vp:56,ViperOS 驱动同款 pack_head: static uint32 = 0 广泛使用)此前注解位置未被消费,static 退化成一个类名并被建成 opaque 结构体,产出 a 的类型为 模块sha1 点 static 的 zeroinitializer 全局,llvm-link 报 invalid type for null constant。现展开为 a: t.CStatic | int。
回归:306 个 .vp 中 105 行被改且全部含 const/volatile/static,0 处意外改动;main.vp / mouse.vp / keyboard.vp / devfs.vp / fat32_types.vp 展开后 vast.parse 全部通过。
|
2026-09-27 14:18:45 +08:00 |
|
TermiNexus
|
64538e08f8
|
feat(descriptor): 注解位置 __attribute__(...) 脱糖为 t.attr.*,并支持 []T 自动推导数组
SymbolUtils 新增 _ExpandAttributeDescriptors:注解位置(冒号后 / 形参 / 返回箭头后,可与 const/volatile 混写)的 __attribute__(a, b(x)) 文本脱糖为 t.attr.a | t.attr.b(x),与 TPV includes/ast/parser.vp 的 _IsMagicAttributeCall/_MakeTAttrMarker 同源;紧跟的 C 风格前置数组前缀 [N]T / []T 在同一次编辑里一并脱糖为 t.CArray[T, N] / t.CArray[T, None](None = TPC 既有长度自动推导数组,见 HandlesAssign.py:1606)。
修 TransPyV/App/main.vp:44 —— V_TPV_VERSION: __attribute__(section('.PRVERSN')) []char = '...' 此前 []char 被 vast 当成 __attribute__ 调用的下标,报 unexpected token OP(']')(与根因脱节);现展开为 t.attr.section('.PRVERSN') | t.CArray[char, None]。
把 _AtAnnotationColon 从 _InArrayAnnotationPosition 抽出,数组前缀与属性描述符共用同一注解位置判据,避免两份副本分叉。回归:306 个 .vp 仅 main.vp:44 一行被改,无意外改动;11 条合成用例与 main.vp 全文件 vast.parse 均通过。
|
2026-09-27 14:06: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
|
2427a6e992
|
fix(typecode): 联合类型中 t.CPtr[...] 下标指针按层级合并,与 TPV 对齐
LLVMTypeMapper 只把裸 t.CPtr 认作指针标记,X | t.CPtr[t.CPtr] 会退化为首段 i8(TPV 定义侧与 TPC 声明侧均为 i8**),跨模块调用点 declare 与定义 ABI 错位:实参传 1 字节、被调用方按 8 字节指针写,ZlibTest 由此触发 ASan heap-buffer-overflow
新增 SymbolUtils.IsCPtrSubscriptNode 判据(对齐 TPV _is_cptr_subscript 的 t.CPtr[...] 判定),_resolve_subscript 与 _resolve_bitor 各增分支,层数复用 TypeAnnotationResolver.from_node(...).PtrCount(先例 HandlesTypeMerge 同手法),使 X | t.CPtr[...] => Ptr^N(X);裸标记分支逐字未改
|
2026-09-16 07:09:09 +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
|
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
|
a99f126cfa
|
feat(parser): 支持 Viper 软关键字 fn/fun/func/function 展开为 def
行首缩进+软关键字+空白+标识符形态的函数定义(fn foo(): / function bar())
展开为 def,行号不变,供 ast.parse 使用;变量名/调用/注解中的 fn 不受影响。
Converter 同步改为 stub 语法错误直接终止(fail-fast),不再生成残缺 vpi
被全局缓存命中后以 undefined symbol 形式爆发。
|
2026-08-13 07:51:21 +08:00 |
|
TermiNexus
|
a277ded8d4
|
修正了 TPC 的一些错误,包括 Test 维护后 TPV 无法重新编译或重编译后越界的部分问题
|
2026-07-20 11:12:30 +08:00 |
|
t
|
796222a300
|
snapshot before regression test
|
2026-07-18 19:25:40 +08:00 |
|