TermiNexus
|
077d705609
|
fix(assign): 类型变量赋值限定链根为模块
f19d2578 退役 t/c 模块时移除了 IsTModule 检查,任意 x = y.attr 都被当作类型变量赋值:只发射 __x_fmt/__x_kind 两个 store 就 return,真实赋值丢失。includes/json 链表遍历 cur = cur.next 因此不前进,viperc.exe 运行卡在 Load_project_config。恢复判据:链根必须是 import 模块,且属性名是已知类型名。
|
2026-10-19 19:05:13 +08:00 |
|
TermiNexus
|
103cd4ff26
|
chore(traceback): 移除 [traceback] 测试插桩日志
|
2026-10-19 18:45:56 +08:00 |
|
TermiNexus
|
4c0dfb222a
|
fix(traceback): 修复 Install 注入位置与 Phase1 声明缺失
traceback 不被用户代码 import,--clean/--clear-cache 后 Phase1 不生成其声明,main 入口解析不到 Install 的 sha1 前缀;改为 --traceback 时把 traceback 及其传递依赖强制纳入 Phase1。Install 调用改用函数体当前 builder 发射,避免另建 builder 插到块尾导致 call 落在 ret 之后、ASan opt 报非法 IR。同时统一 global_ctors 元素类型为 {i32, i8*, i8*} 以匹配 ASan 的 appending 全局。
|
2026-10-19 18:43:31 +08:00 |
|
TermiNexus
|
d02e6f21e3
|
fix(traceback): 从 temp_dir 扫描 .vpi 定位 traceback 模块
sig_files 可能不含 include 的 .vpi;改为直接扫描 temp_dir/*.vpi 匹配 'Module: traceback',确保 main 模块拿到 Install 符号。
|
2026-10-19 18:34:34 +08:00 |
|
TermiNexus
|
2beb5d724f
|
debug(traceback): worker stderr 输出并按 fail-fast 注入 main
并行 worker 的 _vlog 不汇总;改为 stderr 直接输出 enabled/InstallSymbol;main 找不到 Install 时明确报错。
|
2026-10-19 18:31:45 +08:00 |
|
TermiNexus
|
2051c2237e
|
debug(traceback): 输出 InstallSymbol 赋值日志
每个文件打印 TracebackInstallSymbol,确认 main 模块是否拿到 3fe9e5dc351f3d26.Install。
|
2026-10-19 18:30:38 +08:00 |
|
TermiNexus
|
39aebc03d7
|
fix(traceback): main 注入支持从 ModuleSha1Map 解析 Install
TracebackInstallSymbol 未设置时,用 Gen.ModuleSha1Map['traceback'] 拼出 {sha1}.Install,确保 main 入口注入生效。
|
2026-10-19 18:25:17 +08:00 |
|
TermiNexus
|
1f03fc1977
|
fix(traceback): 通过 .vpi 内容定位 traceback 模块 SHA1
sig_files/source_module_sig_files 的值是 .vpi 路径,basename 不含 traceback;改为读取前 512 字节匹配 'Module: traceback'。
|
2026-10-19 18:19:31 +08:00 |
|
TermiNexus
|
3da522a549
|
feat(traceback): 在 main 入口直接调用 Install()
MinGW 下 .ctors.65534 不被 CRT 执行,导致 Ctrl+C 无栈;改为编译期把 traceback_sha1.Install() 注入 main 入口,不依赖 .ctors/.init_array。
|
2026-10-19 17:31:12 +08:00 |
|
TermiNexus
|
0903491df3
|
fix(extern): 从 temp_dir 全量 .vpi 收集 extern
sig_files 键集合不含 include 模块(win32process 等);直接扫描 temp_dir/*.vpi 补全 export_extern_funcs,确保 ReadProcessMemory/StackWalk64 裸名。
|
2026-10-19 16:12:30 +08:00 |
|
TermiNexus
|
5a56198937
|
fix(extern): sig_files 不再按 App sha1_map 过滤
sha1_map 只含 App 源文件,按它过滤会丢弃 include 模块的 .vpi,导致 ReadProcessMemory/StackWalk64 等跨模块 extern 无法识别为裸名。
|
2026-10-19 15:45:58 +08:00 |
|
TermiNexus
|
d312d97bca
|
fix(extern): 初始化并同步 LlvmGen._export_extern_funcs
translator 可能尚无该属性;getattr 初始化后 clear+update,并把同一 dict 引用同步到 LlvmGen,确保 _mangle_func_name 看到跨模块 extern。
|
2026-10-19 15:29:38 +08:00 |
|
TermiNexus
|
f91fb7dcca
|
fix(extern): 原地更新 export_extern_funcs
translator 与 LlvmGen 共享同一 dict 引用;替换属性导致 Gen 仍指向旧空 dict。改为 clear+update,确保跨模块 extern 裸名生效。
|
2026-10-19 15:07:54 +08:00 |
|
TermiNexus
|
ed76f77218
|
fix(extern): worker 合并 sig_files 补全 extern 集合
共享 export_extern_funcs 可能因 sig_files 过滤缺少 include 模块(win32process.ReadProcessMemory 等);worker 内从 sig_files 合并补全。
|
2026-10-19 14:55:48 +08:00 |
|
TermiNexus
|
8b5bbbc417
|
fix(mangle): 模块限定的 extern 调用保持裸名
stdlib.system / win32process.ReadProcessMemory 等显式模块限定调用即使本模块有同名 def 也返回裸名。
|
2026-10-19 14:44:10 +08:00 |
|
TermiNexus
|
d1eb1608d0
|
fix(mangle): 本模块普通 def 优先于同名 extern
只有跨模块 extern 才返回裸名;os/_win32 与 os/__init__ 自己定义的 getcwd/system 等普通 def 恢复 SHA1 前缀,消除重复符号。
|
2026-10-19 14:31:32 +08:00 |
|
TermiNexus
|
8037d0e108
|
fix(mangle): _mangle_name 仅 extern 保留裸名
_export_funcs 残留不再导致 getcwd/system 等普通 def 生成裸名,两个 os 模块恢复 SHA1 区分。
|
2026-10-19 14:13:27 +08:00 |
|
TermiNexus
|
21c76541e5
|
fix(mangle): 仅 extern 函数保持裸名
删除 _export_funcs 裸名分支,普通 def/export def 恢复模块 SHA1 前缀,消除 os getcwd/system 等重复符号。
|
2026-10-19 12:54:16 +08:00 |
|
TermiNexus
|
80b7ce5bb1
|
fix(mangle): 普通函数清除裸名导出集合
getcwd/chdir/system 等 os 包装函数不再进入 _export_funcs 裸名集合,按模块 SHA1 区分,消除重复符号。
|
2026-10-19 12:45:06 +08:00 |
|
TermiNexus
|
a9f5d026c4
|
fix(mangle): extern 函数名一律裸名
_export_extern_funcs 命中直接返回裸名,避免 ReadProcessMemory/StackWalk64 等跨模块调用被加 SHA1 前缀。
|
2026-10-19 12:35:38 +08:00 |
|
TermiNexus
|
a2cde67bc5
|
fix(func): 修复 extern 裸名未定义;打印方法体失败内部栈
避免 RawFuncName 未绑定;方法体异常在抛出前 traceback.print_exc() 输出完整调用栈。
|
2026-10-18 23:03:32 +08:00 |
|
TermiNexus
|
d64fe2ee99
|
fix(func): extern 声明与登记统一使用裸名
RawFuncName 用于 _export_funcs/_export_extern_funcs/MangledName,避免 StackWalk64/ReadProcessMemory 等声明被加 SHA1 前缀。
|
2026-10-18 22:57:02 +08:00 |
|
TermiNexus
|
c2dc9927ef
|
fix(func): extern def 使用裸名并登记跨模块
extern def longjmp/_setjmp/GetEnvironmentVariableA 等不再加 SHA1 前缀;声明加入 _export_funcs 与 _export_extern_funcs,链接可解析到 C/系统符号。
|
2026-10-18 22:44:57 +08:00 |
|
TermiNexus
|
0beb8f5e55
|
fix(func): extern def 不再生成空函数体
stdio.printf 等 extern 声明此前被发射为 ret 0 的空 define,覆盖 C runtime 实现导致所有输出为空;现在只保留 declare。
|
2026-10-18 22:37:21 +08:00 |
|
TermiNexus
|
d4fc66fe3c
|
fix(link): _merged.obj 存在时仍链接 include 的 .obj
_merged.obj 只合并非 include 模块;此前命中该分支后跳过 include 的 .obj,导致 argparse.print_help 等符号未链接进 exe。
|
2026-10-18 22:13:50 +08:00 |
|
TermiNexus
|
2e80424d67
|
refactor(handles): 删除 CSpecialCallHandle/TSpecialCallHandle
EmitRawCopyLlvm 改为模块级函数;删除 c./t. 语法糖处理类及 BaseTranslator 实例化,全仓零引用。
|
2026-10-18 21:51:10 +08:00 |
|
TermiNexus
|
d15ae02f3e
|
refactor(stub): 移除 t./c. 前缀剥离兼容
c.* 退役后 stub 生成不再特殊处理 t./c. 前缀,按普通属性名输出。
|
2026-10-18 21:48:59 +08:00 |
|
TermiNexus
|
c94cdd7174
|
refactor(c): 删除 c.* 及对应的裸名语法糖处理分支
移除 c.CIf 判断、Addr/Load/Deref/DerefAs/PtrToInt 裸名分支及 _HandleC* 处理函数;c. 前缀退役后不再保留任何处理路径。
|
2026-10-18 21:48:37 +08:00 |
|
TermiNexus
|
f32235274b
|
refactor(expr): 删除裸名 Set 语法糖及 _HandleCSetLlvm
Set 原本对应已退役的 c.Set;裸名 Set 与用户类 ast.Set 冲突,直接删除,Set(...) 走正常类构造。
|
2026-10-18 21:45:56 +08:00 |
|
TermiNexus
|
5f5d24f5dc
|
fix(expr): 导入的 Set 类优先于内建语法糖 Set
ast.Set 等用户符号存在时不再走 _HandleCSetLlvm,避免 Set(...) 被误判为内建写入语法。
|
2026-10-18 21:44:23 +08:00 |
|
TermiNexus
|
6df2af8746
|
fix(type): 补齐 float8/16/32/64/128 内建短名
float16(val) 等表达式转换与注解可解析为 CFloat16T/half。
|
2026-10-18 21:30:51 +08:00 |
|
TermiNexus
|
fe10e4dcd2
|
fix(renum): 返回类型按结构体指针解析
REnum 预登记为 IsRenum/IsStruct;类型解析先判 REnum;_EmitREnumLlvm 复用已有结构体实例,修复 LLVMType* 退化为 i32*。
|
2026-10-18 21:17:03 +08:00 |
|
TermiNexus
|
b6d6d5ac6b
|
fix(struct): 修复 _Undefined 检查中的未定义变量 constant
列表初始化器中应检查元素 c.constant,原代码引用裸名 constant 导致 NameError。
|
2026-10-18 20:56:21 +08:00 |
|
TermiNexus
|
de89b26bb7
|
fix(generic): 特化实参统一 mangling,失败立即终止
泛型实参在特化名/spec_key/type_map 中统一为 i32/指针形态,list[int].get 返回 i32;特化与翻译失败不再吞异常,include 缺失 .ll 直接终止。
|
2026-10-18 20:40:23 +08:00 |
|
TermiNexus
|
88645fe7da
|
fix(func): extern/export 声明跳过掉出末尾检查
FunctionDef.Extern/Export 为真时视为声明型函数,不再要求显式 return。
|
2026-10-18 20:18:36 +08:00 |
|
TermiNexus
|
da638a018b
|
fix(match,sizeof): 修复 MatchClass 属性名与 LLVM 基本类型 sizeof
Match 分支改用 c.pattern;__sizeof__ 对 i1/i8/i16/i32/i64/f32/f64/ptr 直接返回字节数。
|
2026-10-18 20:13:37 +08:00 |
|
TermiNexus
|
369afb5011
|
fix(generic): 恢复泛型特化发射主路径
补回 _specialize_generic_class 的 deepcopy/改名/字段与方法 T 替换/_EmitClassLlvm 发射逻辑,list[...].__len__ 与 get 正常生成;源码不再支持 CPtr[...],统一写 T*;编译错误只由主进程输出一次。
|
2026-10-18 19:50:32 +08:00 |
|
TermiNexus
|
09553401e7
|
build(vast_c): 使用 mingw64 gcc 重建 _parser.pyd
修复 32/64 位 DLL 不匹配导致的 ImportError。
|
2026-10-18 19:29:49 +08:00 |
|
TermiNexus
|
c8e49a60ed
|
feat(vast): C 解析器补齐 T | None 与语句级声明
支持 T | None、typedef/define/static/export/extern/inline 变量形态;C 解析失败不再回退纯 Python,直接 fail-fast;同步重建 _parser.pyd。
|
2026-10-18 19:26:52 +08:00 |
|
TermiNexus
|
109e71a477
|
refactor: 删除保留性兼容兜底,仅保留新语法主路径
移除 len(list) 直读 __count__、list 方法裸模板回退、旧 C* 文本标记兼容、旧联合兼容;vast 扩展过期直接报错,已重建 _parser.pyd。
|
2026-10-18 19:22:32 +08:00 |
|
TermiNexus
|
f8d84a1941
|
fix(generic): 特化缓存声称完整但方法缺失时强制补发
将缓存临时标记为 declare_only 后重新调用 _specialize_generic_class,触发方法体生成。
|
2026-10-18 19:13:29 +08:00 |
|
TermiNexus
|
92e467ae4c
|
fix(cli): 翻译失败只输出单行错误
worker 与 batch 异常不再打印 traceback.format_exc,避免与主进程汇总重复输出。
|
2026-10-18 19:09:51 +08:00 |
|
TermiNexus
|
8cdef178a5
|
fix(generic): 缺少特化类型信息时从特化名派生
_generic_class_spec_type_info 无写入点,改为从 ClassName 解析 type_args/type_names 后继续补发方法体。
|
2026-10-18 19:09:07 +08:00 |
|
TermiNexus
|
62e38c4367
|
fix(generic): 特化跳过时记录具体原因
模板未注册/缓存已完整/缺类型信息/方法名不一致等分支均写入 _generic_spec_error,供 Undefined method 报文展示。
|
2026-10-18 18:40:20 +08:00 |
|
TermiNexus
|
7a063d916b
|
fix(generic): 特化补全 type_names 并暴露失败原因
缺少特化缓存时传原始实参名生成完整特化;方法查找失败报文附加特化异常,便于定位模板/实参问题。
|
2026-10-18 18:36:25 +08:00 |
|
TermiNexus
|
10b3f90a24
|
fix(generic): 方法调用时缺少特化缓存则从头生成
list[AST*].get 等特化方法未生成时,调用 _specialize_generic_class 补全整个特化,而不只处理 declare_only 缓存。
|
2026-10-18 18:32:44 +08:00 |
|
TermiNexus
|
ceb557314a
|
feat(type): 支持 T | None,等价于 T
仅允许一侧为 None 的联合;解析时剥离 None 后按剩余类型处理,其他联合仍 fail-fast。
|
2026-10-18 18:10:01 +08:00 |
|
TermiNexus
|
7911b4de54
|
feat(cli): 编译期错误按 Viper 模拟堆栈输出
TypeError/SyntaxError 输出 Traceback (compile-time) + File/line + 源码行 + Err,不再打印 Python 内部调用链。
|
2026-10-18 18:07:19 +08:00 |
|
TermiNexus
|
2d0ab9c11f
|
fix(cli): 类型/语法错误只输出单行消息
Projectrans 顶层捕获 TypeError/SyntaxError,直接输出 [TPC] 报文并退出,不再打印 Python 调用栈。
|
2026-10-18 18:05:14 +08:00 |
|
TermiNexus
|
0bded58999
|
refactor(type): 全面清理旧联合与 t/c 标记判断
审计并修复 23 个文件:类型注解中的 T1 | T2 一律 fail-fast;typedef/define/export/extern/static/const/volatile/attribute 优先读取 Markers/Attributes/ByteOrder/BitWidth;指针统一 CPtr/rawptr/CRef/CTempRef/CArrayPtr/CAutoPtr Subscript;stub 输出统一新语法。
|
2026-10-18 18:01:20 +08:00 |
|
TermiNexus
|
a410de2cf7
|
fix(method): list 特化缺方法时回退裸模板
list[AST*].get 等特化方法未生成时,回退调用 list.get,避免 Undefined method。
|
2026-10-18 17:32:44 +08:00 |
|
TermiNexus
|
0f1a2e9fbb
|
fix(len): opaque list 特化按字节偏移读取 __count__
特化结构体尚未展开布局时,先 bitcast 到 i8* 再按偏移 8 读取 __count__,避免 opaque struct 的 getelementptr 失败。
|
2026-10-18 17:29:44 +08:00 |
|
TermiNexus
|
4346e3fb27
|
fix(len): list 特化直接读取 __count__ 字段作为长度
泛型特化方法未生成时,len(list[...]) 按结构体偏移直接读取 __count__,不再误报没有 __len__。
|
2026-10-18 17:24:07 +08:00 |
|
TermiNexus
|
944f5cafbb
|
fix(len): 特化方法按结构体真实名查找
泛型特化结构体的 LLVM 名可能带模块 SHA1 前缀;__len__ 分派先按该真实名查找,再回退裸模板类。
|
2026-10-18 17:16:34 +08:00 |
|
TermiNexus
|
43cedbd3b7
|
fix(len): 泛型特化缺方法时回退裸模板类
len(list[AST*]) 在特化方法尚未生成时回退查找 list.__len__,避免误报没有 __len__ 方法。
|
2026-10-18 16:53:35 +08:00 |
|
TermiNexus
|
da13e7b405
|
fix(imports): typedef/define 声明跳过全局变量类型解析
typedef/define 在类型解析前先按 Markers 分流,避免 void/宏类型触发全局变量 void 断言。
|
2026-10-18 16:41:04 +08:00 |
|
TermiNexus
|
77a97303b7
|
fix(imports): 全局声明识别 Markers 中的 typedef/define
typedef VOID = void 等新语法不再被当作全局变量发射,避免 void 全局变量断言失败。
|
2026-10-18 15:54:54 +08:00 |
|
TermiNexus
|
a91bd8f35b
|
fix(imports): extern 全局变量类型为 void 时 fail-fast
GlobalVariable 不接受 void 指针;解析为 void 时输出变量名、注解与行号,并让 TypeError 穿透外层忽略异常的兜底。
|
2026-10-18 15:49:35 +08:00 |
|
TermiNexus
|
4653abd653
|
fix(phase1): typedef 收集读取 Markers 字段
typedef LONG = int32 等新语法不再依赖 CTypedef 文本标记,LONG 能正确进入 typedef_map 并解析为 int32。
|
2026-10-18 15:48:14 +08:00 |
|
TermiNexus
|
3081d71570
|
fix(symbol): 补齐泛型实参原始名与浮点串集合
定义 _GENERIC_ARG_RAW_NAMES 与 _LLVM_FLOAT_STRINGS,修复 GenericArgRawName / MangleTypeArgByRegistry 的 NameError。
|
2026-10-18 15:08:26 +08:00 |
|
TermiNexus
|
e47b5e4a11
|
fix(expr): 内建短名类型转换并入 builtins typedef 表
sizet/int8/uint64 等短名在表达式调用中直接命中 BUILTIN_TYPE_ALIASES,不再报 Undefined function。
|
2026-10-18 14:42:52 +08:00 |
|
TermiNexus
|
1f44d4291c
|
fix(type): 内建短名可直接参与表达式类型转换
builtins 别名表优先于 builtins.vp 扫描,sizet(TB_VPCALL_MAX) 等调用恢复;stub 类型映射仅保留 CPtr 系列到 rawptr。
|
2026-10-18 14:35:43 +08:00 |
|
TermiNexus
|
94557ad2c0
|
feat(stub): .vpi 输出新语法(rawptr/novirtual/virtual/tls)
类型名不再输出 CPtr/CInt 等 C* 标记,改为 rawptr/int/sizet 等内建短名;@NoVTable/@CVTable 输出 novirtual/virtual class,TLS/CStatic/CExport/CExtern 输出关键字前缀。
|
2026-10-18 14:25:22 +08:00 |
|
TermiNexus
|
700a0ba602
|
fix(stub): .vpi 将 t./c. 前缀类型还原为裸名
生成 stub 时 t.CPtr 等输出为 CPtr,避免 .vpi 中残留 t./c. 模块前缀。
|
2026-10-18 14:23:35 +08:00 |
|
TermiNexus
|
a8718aa751
|
fix(type): t/c 模块前缀报错补全文件、行列与替代写法
SymbolExtractor 在提取符号前记录 CurrentFile;类型注解拒绝 t./c. 时输出 文件:行:列、完整写法与改写建议。
|
2026-10-18 14:00:55 +08:00 |
|
TermiNexus
|
c91edd5629
|
fix(stub): .vpi 保留 typedef 声明
typedef 变量输出为 typedef NAME = 类型,避免生成 NAME: 类型 = 类型 导致加载端不再把 NAME 当类型别名。
|
2026-10-18 13:57:24 +08:00 |
|
TermiNexus
|
3c20d49c4a
|
fix(symbol): 泛型实参归一仅识别内建短名
CInt/CInt32T/CFloat/CFloat64T 等 C 类型类名不再归一,按原名返回;仅内建短名归一为 int。
|
2026-10-18 13:49:39 +08:00 |
|
TermiNexus
|
5157ce2996
|
fix(symbol): 补齐泛型实参归一使用的整数/浮点族名集合
NormalizeGenericArgName 引用的 _GENERIC_ARG_INT_NAMES / _GENERIC_ARG_FLOAT_NAMES 此前未定义,导致 NameError;补充 C 类型类名与内建短名。
|
2026-10-18 13:45:10 +08:00 |
|
TermiNexus
|
e770e1964f
|
fix(stub): .vpi 保留 extern 关键字与 T* 指针写法
符号表字段改为从 AST Markers 渲染:extern/static/export 变量输出关键字前缀;CPtr[T]/rawptr[T] 输出 T*,不再输出 CPtr[...] 或 CExtern | T。
|
2026-10-18 13:43:59 +08:00 |
|
TermiNexus
|
660a15bef8
|
refactor(tpc): 删除类型联合语法并将修饰迁移为 AST 字段
类型注解不再接受任何 T1 | T2;const/volatile/static/export/extern/inline/define/typedef/__attribute__/BigEndian/LittleEndian/Bit 改为注解节点字段 Markers/Attributes/ByteOrder/BitWidth;指针与引用改为 CPtr[T]/CRef[T]/CTempRef[T]/CArrayPtr[T]/CAutoPtr[T];Python 与 vast_c 两套解析器、类型解析与声明端同步;C 扩展早于 vast_c.c 时自动回退纯 Python 解析器。
|
2026-10-18 13:35:34 +08:00 |
|
TermiNexus
|
3269775945
|
feat(tpc): 禁止类型联合 T1 | T2 并优化错误提示
四类类型注解入口统一调用 RejectTypeUnion:任意 T1 | T2 直接报错,报文含行号与 CPtr[T]/rawptr[T]、const/volatile/static/export/extern 替代写法;仅保留内建修饰标记与类型的组合。
|
2026-10-18 13:08:24 +08:00 |
|
TermiNexus
|
f19d25782f
|
refactor(tpc): 退役 t/c 模块并将定宽类型升级为内建
删除 lib/includes/t.py、c.py,类型模型迁入 lib/core/TypeSystem.py;移除 IsTModule/_T_MODULE_NAMES 等名称判据,语法糖与内部标记统一为裸名;builtins 的 sizet/intN/uintN/fast/least/uchar/short/long 等改为编译器内建短名。
|
2026-10-18 13:00:58 +08:00 |
|
TermiNexus
|
8d27747c7c
|
支持 tls 关键字,全面准备清退 t, c
|
2026-10-17 23:39:41 +08:00 |
|
TermiNexus
|
2b4679073e
|
维护基线
|
2026-10-17 23:27:00 +08:00 |
|
TermiNexus
|
b51faef1cb
|
fix(tpc): 带注解重声明冲突不再静默丢 store,改为 fail-fast 报错
原有变量分支整段包在 try/except Exception 里,隐式窄化抛出的 FailFastError 被吞成一条 strict 警告 ⇒ alloca 已建、store 整条丢失 ⇒ 之后 load 读到未初始化栈槽(运行期随机崩溃,且无任何编译期提示)。现场:ViperC 由 TPC 引导时 Converter.vp 'di: sizet = ai - (an - dn)'(di 已由 for 循环绑定为 int/i32)→ 生成的 viperc.exe 在 list[AST*].get 处 ASan 越界读(READ 0x1296f00c1808)。现改为捕获后重抛带变量名/两侧类型的清晰错误。
|
2026-10-14 21:12:56 +08:00 |
|
TermiNexus
|
5f1d2c3300
|
fix(tpc): 显式强转加宽用 sext、窄化用 trunc,不再被隐式窄化禁令拦下
上一轮把显式强转也统一走 _coerce_value 后,显式窄化(如 ViperC 里 LONG(BUF_B),Windows LLP64 下 sizeof(long)==4,即 sizet/u64 -> int32)被当成隐式窄化而触发 FailFastError,导致 TPC 重编 ViperC 中断。'隐式窄化禁止' 只约束隐式路径,显式转换必须允许 trunc;同时加宽保持 sext 以免 int64(int32(-1)) 变成 4294967295。Test/IntWidthTest 新增 Test 7 覆盖该形态(12/12 PASS)。
|
2026-10-14 20:57:47 +08:00 |
|
TermiNexus
|
6b87a78239
|
fix(tpc): 全局注解赋值的一元负号常量按位宽还原带符号真值
_eval_global_const 对负常量直接用无符号读回值取负,负数被物化成 2 的位宽次方减绝对值,例如 -196608 变成 4294770688。改为先按常量自身位宽还原带符号真值再取负,最后按目标类型发射。
与 aaf9330b 同族,覆盖全局路径。
|
2026-10-14 20:49:52 +08:00 |
|
TermiNexus
|
aaf9330b3b
|
fix(tpc): 负数常量与负值整型加宽改为保符号,sext 与常量折叠,不再零扩展
根因:多处手写 zext 做整型加宽,把有符号为负的常量当无符号处理。涉及 HandlesAnnAssign 局部标量初始化两处、HandlesExprCall 的 typedef 与 builtins 强转两处。
一元负号对常量无条件发运行期 neg,常量 -1 变成 neg i32 指令后再被零扩展成 4294967295。
_eval_global_const 用无符号读回值取负,-196608 被物化成 4294770688 即 0x00000000FFFD0000。
现场:b 为 int64 等于 -196608 后,b 右移 1 呈逻辑右移假象,负数右移循环不收敛,见 IntWidthTest Test 5 与 Test 6。
改法:统一收敛到 _coerce_value,加宽用 sext,窄化按其规则 fail-fast;一元负号对常量直接折叠为有符号常量;_eval_global_const 先按位宽还原带符号真值。
另修右移符号性:去掉 emit_binary_op 里按 self._last_var_name 的残留变量名重判,调用方改按 _check_node_unsigned 判定。
验收:Test/IntWidthTest 10 项全 PASS,此前 TPC 侧 5 项通过 2 项失败。
|
2026-10-14 20:49:35 +08:00 |
|
TermiNexus
|
55a6856c4e
|
fix(tpc): >> 符号性只按左操作数判定,去掉“残留变量名”误判(负数右移发成 lshr)
- 现场:`b: int64 = -196608; b >> 1` 发成 lshr ⇒ 负数变大正数;而同样注解的 `c: int64 = 0 - 196608; c >> 1` 却正确 ⇒ 与 RHS/位置相关(IntWidthTest Test 5/6)
- 根因:emit_binary_op 在 i32/i64 分支又用 self._last_var_name 重判符号性,而它只是“最近见过的变量名”,可能是上一条表达式残留的别的(无符号)变量 ⇒ 误判无符号
- 改动:① ExprGen.emit_binary_op 删除 i32/i64 的 _last_var_name 分支(符号性只信调用方;i8/i16 仍按宽度定无符号);② HandlesExprOps 的 `>>` 改用 _check_node_unsigned(Node.left),覆盖 Name 之外的形态
- 验收:Test/IntWidthTest(Test 5/6),目标 TPC 侧 9/9 PASS
|
2026-10-14 20:18:26 +08:00 |
|
TermiNexus
|
23b47053d9
|
chore: 同步 TransPyV→ViperC 改名、new 表达式支持与定宽字面量/窄化适配
|
2026-10-12 20:59:39 +08:00 |
|
TermiNexus
|
15f77da9d3
|
chore: 改名同步 TransPyV -> ViperC(源码/配置内的纯替换)
|
2026-10-12 15:06:48 +08:00 |
|
TermiNexus
|
f6447ad594
|
chore: 改名同步 TransPyV -> ViperC(.gitignore/文档/脚本)
|
2026-10-12 15:02:19 +08:00 |
|
TermiNexus
|
ddf40e02c5
|
feat(deref): 解引用写入 *p = v 采用 DerefAs 安全语义(方案1)
当 v 是指针且 pointee(p) != typeof(v)(原会因'指针<->非基本类型不匹配'fail-fast)时,把指针 p bitcast 成 typeof(v)* 再按值存 v,即 *(T*(p)) = v(DerefAs 期望写法;旧 DerefAs 的 *(intptr_t*(p))=(intptr_t)v 是错实现)。标量宽度等其余情形维持 pointee(p) 语义不变
|
2026-10-11 12:22:23 +08:00 |
|
TermiNexus
|
3122793139
|
fix(define): _try_resolve_nested_cdefine 复用 _make_define_constant,消除模块属性 CDefine 的位宽误判
模块属性访问(win32.win32file.GENERIC_READ)走的是 _try_resolve_nested_cdefine,其内部三处常量物化仍用 val > 0x7FFFFFFF 判 i64,绕过 _make_define_constant 的按值推断;导致 0x80000000 等无符号 32 位 define 变 i64、与 32 位使用点组合时报「64→32 隐式窄化」。改为委托 _make_define_constant(带声明类型按声明位宽,否则按值推断)
|
2026-10-11 11:51:31 +08:00 |
|
TermiNexus
|
7a061d4d49
|
fix(define): CDefine 常量位宽按值推断(含无符号 32 位高半区)
_make_define_constant 原用 abs(val) > 2^31-1 判定,把 [2^31, 2^32-1] 的无符号位模式(如 GENERIC_READ=0x80000000、SHARED 掩码)误判为 i64,导致 X | DEFINE 结果为 i64、赋回 32 位使用点时触发「64→32 隐式窄化」。改为按值推断:落进 [-2^31, 2^32-1] 即 i32,与 TPV 的 define_min_width/ExprGenCdef 同口径
|
2026-10-11 11:46:33 +08:00 |
|
TermiNexus
|
815a6245a5
|
fix(narrow): HandlesAnnAssign._StoreWithCoerce 补注解式整数窄化 fail-fast
此前该路径对整数窄化静默 trunc,导致 x: <32位> = <64位> 注解声明绕过规则;现与 MemoryOps._coerce_value 同口径:豁免 i1 归一化与落进目标位宽的编译期常量,其余抛 FailFastError
|
2026-10-11 09:51:03 +08:00 |
|
TermiNexus
|
3b16334f5d
|
feat(types): 禁止隐式窄化(整数 高→低)——_coerce_value 与 pointee 判据同步
与 TransPyV 同口径:_coerce_value 的 int→int 窄化分支改为 fail-fast(隐式窄化禁止),仅豁免 ① 目标 i1 真值归一化 ② 编译期常量且值落进目标位宽;_ScalarConvertLossless 的 int↔int 改为 Dst.width>=Src.width。
|
2026-10-10 21:57:25 +08:00 |
|
TermiNexus
|
4f9c234ea8
|
fix(cdef): external 声明不再遮蔽同名 CDefine 常量;补 t 类名别名解析
两处:① 现场证据(_shared_sym_includes.pickle)显示 all_dc 已含 STD_*-10/-11/-12,但模块 IR 仍 load @STD_ERROR_HANDLE —— 因为 stub 注入的 @X = external global(无初值)让 _lookup_cdefine 的遮蔽判据 AttrName in Gen.module.globals 成立,直接跳过了 CDefine 回退。新增 SymbolUtils.GlobalDeclShadowsDefine:只有**带初值**(本模块真正定义)的全局才遮蔽;仅 external 声明不算。裸名路径同判据改用同一 helper。② all_decl_types 为空的根因:DWORD 的 BaseType 为 None,底层类型存在 OriginalType 字符串 'CUInt32T'(t 类名),原解析只认内层 CTypeInfo。补:按 getattr(t, 类名) 解析该串。离线校验 DWORD|t.CDefine → (32, False)。
|
2026-10-10 21:25:33 +08:00 |
|
TermiNexus
|
d5b4e9a8b9
|
feat(cdef): define 常量带类型注册——按声明类型物化(DWORD(-11) → i32 位型)
方案 C:CDefine 不再只存无类型 int,而是把**声明整数类型**(位宽 + 符号性)一并登记,使用点按该类型物化,而不是按数值大小猜 i32/i64。链路:① SymbolUtils 新增 DefineIntSignednessOf / DefineDeclIntTypeFromAnnotation(由 T | t.CDefine 注解经符号表 typedef 链解析宽度与符号性)/ DefineDeclTypeValue(按声明类型把值归一成 (位宽, 位型值));② 同模块注册(LlvmGenerator._register_cdefine_constant)与跨模块提取(Phase2Translator._ExtractCDefineConstantsFromPyi,含 _shared_all_decl_types 的 pickle 传递)分别写 Gen._define_decl_types / translator._define_decl_types;③ 物化处(HandlesExpr 裸名两处、HandlesExprAttr._make_define_constant,及 from-import 注册)优先按声明类型出常量。这样 win32file 的 STD_*_HANDLE(DWORD(-10/-11/-12))解析为 i32 位型 0xFFFFFFF5 等,与 GetStdHandle(ULONG) 使用点一致。
|
2026-10-10 21:20:30 +08:00 |
|
TermiNexus
|
e1a0fbf9c0
|
fix(cdef): 裸类型别名构造的 CDefine(如 DWORD(-11))也能提取进 _all_define_constants
根因:ConstEvaluator 只认 t.X(...) / from t import X 的类型构造,裸 typedef 别名(DWORD(-11))既不在 _t_module 也不在 mock ctx 的 _t_type_symbols → eval_full 返回 None → _ExtractCDefineConstantsFromPyi 整条丢弃该常量。win32file.vp 的 STD_INPUT/OUTPUT/ERROR_HANDLE 是全仓唯一用别名构造写的 define,正对应链接期三个 undefined symbol(模块属性访问 wf.STD_*_HANDLE 解析落空后退化成未定义全局)。补:eval_full 失败且值为单参 Call 时,回退求值其实参(CDefine 只要常量值,位型一致)。
|
2026-10-10 20:57:26 +08:00 |
|
TermiNexus
|
936a43f543
|
fix(attr): 模块属性访问的 CDefine 查询补 _all_define_constants 回退
上一提交只补了 3 级路径 _try_resolve_nested_cdefine,而 win32file.STD_OUTPUT_HANDLE 是 2 级访问 → 走 _handle_attr_name → _lookup_cdefine,该函数只查 SymbolTable/_define_constants,没有裸名路径已有的 _all_define_constants 回退。includes 的 vpi 模块不会在 SymbolTable 里登记 IsDefine,于是解析落空 → _lookup_module_global 现造一个无定义的 @STD_OUTPUT_HANDLE → 链接期 undefined symbol。补回退(仅在无同名变量/全局时),覆盖 STD_INPUT/OUTPUT/ERROR_HANDLE。
|
2026-10-10 20:46:52 +08:00 |
|
TermiNexus
|
1050e5a23a
|
fix(decl): stub 跳过联合形态 CDefine + 模块属性访问回退 _all_define_constants
链接报 undefined symbol: STD_INPUT/OUTPUT/ERROR_HANDLE。根因两处:① DeclarationGenerator._generate_global_decl 的 CDefine 跳过判据只认裸 t.CDefine,而 define X: T = V 展开为注解 T | t.CDefine,于是 stub 里写出 @STD_OUTPUT_HANDLE = external global i32(该符号无人定义);② 模块属性访问 win32file.STD_OUTPUT_HANDLE 的 _try_resolve_nested_cdefine 只查 SymbolTable/_define_constants,缺裸名路径已有的 _all_define_constants 回退,解析落空后转去加载那条错误的 stub 全局 → 链接期未定义符号。改为 AnnotationContainsName 判据 + 补 _all_define_constants 回退(仅在本模块无同名全局时,避免遮蔽真实模块全局)。
|
2026-10-10 20:29:59 +08:00 |
|
TermiNexus
|
18d753999d
|
feat(preprocess): ExpandSoftKeywords 增加 new 生命周期软关键字展开
TPV 的 new [描述符...] T(args) 出现在共享 includes(w32/fileio.vp 的 return new File(...))后会打断 TPC 引导编译(TPC 把它当普通名字 → NameError)。新增第 10 种展开 _ExpandNewExprs:把 new + [stack|heap|hlife|slife|memgr(...)] + 类型名 + ( 删成等价裸构造 T(args),TPC 无需理解生命周期语义;new = 1 / new.x / new(1) / for new in 仍作标识符,跨行不处理。
|
2026-10-10 15:24:09 +08:00 |
|
TermiNexus
|
04acaa3dd5
|
fix(funcdef): @life/@willFree 从自定义行为装饰器检测中排除
P2 的编译期生命期标注没有运行时装饰器函数;不排除会生成 wrapper 去调用不存在的 @life/@willFree,并把被装饰的 extern def(stdlib.free)变成本模块 internal 声明。与 TPV 侧 FuncGenDef 同口径。
|
2026-10-08 21:44:02 +08:00 |
|
TermiNexus
|
5a0eecc22f
|
feat(core): 栈地址逃逸检查(LifetimeError)与标量→聚合 fail-fast
- MemoryOps._IsFrameStackAddr 判据 + HandlesReturn/HandlesAssign 汇点挂钩:禁止栈地址逃逸(&local 与数组退让);新增 LifetimeError(FailFastError) 承载该错误类。 - MemoryOps._coerce_value:标量(整数/浮点)不得初始化/赋值给聚合类型,改为 FailFastError(旧行为让 _store 抛 TypeError,非 strict 下被静默吞掉,聚合未初始化)。
|
2026-10-08 12:10:24 +08:00 |
|
TermiNexus
|
75aae26881
|
fix(codegen): arg 糖支持 vprintf 式转发的 va_list,补 stdarg 模块限定分派
_HandleArgLlvm 的回退分支原先把 Gen.variables 里的形参 alloca 直接当 va_list 用,转发形态(vsnprintf(buf,size,fmt,args))因此多一层间接、读错内存;现改为先 load 出槽里的 va_list 指针(自身变参形态仍走 _direct_values 缓冲地址、不 load)。另新增 ModulePath == 'stdarg' 分派,使 stdarg.arg/va_arg/va_start/va_end 命中与裸名相同的内建(点号形式此前会落到外部调用产生未定义符号 @arg)。同时删除 ExprCallHandle 里重复且无调用者的 _HandleArgLlvm 死代码。
|
2026-10-07 20:15:32 +08:00 |
|
TermiNexus
|
9656bb161a
|
feat(codegen): 值引用自动取址收口到 _adjust_args,补齐 vtable/方法/构造等路径
查表键统一为真实发射出的函数名:FuncGen._adjust_args 开头以 func.name 调用 _apply_auto_addr,于是 direct/vtable 虚分派/构造/静态/__call__/下标赋值/c.Addr 构造/闭包/泛型/方法兜底全部自动取址,不再依赖每个调用点手写;同时删除 16 处冗余显式取址(t.CAutoPtr 的 always 模式不幂等,重复应用会多包一层指针)。登记侧:HandlesImports 把模式登记提前到 FuncName-in-Gen.functions 早退之前并按 func.name 主键写表,_TryLoadStructFromStub 改为无条件调用;HandlesFunctions 在函数对象就绪后按真实名登记,并在 _EmitFunctionForwardDeclLlvm 把逻辑名下的模式播种到 MangledName,覆盖同模块先调用后定义的场景。
|
2026-10-07 19:59:36 +08:00 |
|
TermiNexus
|
b49b5c3ba6
|
chore(parse): 已删除的 CIf 家族名字表补齐 CElif/CElse/CEndif
ExprParser 的 _REMOVED_CIF_NAMES 与 vast_c.c 的 Interesting/Removed 名字表原本只认 CIf/CIfdef/CIfndef,现补齐三件套六个拼写(含 c. 前缀形式),使 parser 阶段即可给出指向 cif/celif/celse 的 FailFast;_parser.pyd 同步重编。
|
2026-10-07 19:59:28 +08:00 |
|
TermiNexus
|
6a7b27e14f
|
chore(c): 清理已删除的 c.CIf 家族残留
c.py 删除 CElif/CElse/CEndif 三个类及其 Library_C 登记;HandlesSpecialCall 删除无人调用的 _HandleCIfLlvm;_REMOVED_CIF_CALL_MSG 的报文补齐 CElif/CElse/CEndif 六个拼写。Converter.py 去掉已无意义的注释掉守卫与 c.CIfndef/c.CEndif 时代注释,示例改为仍在用的 c.CUndef/c.CPragma;ExprParser/ConstEvaluator/HandlesIf 的注释把内部标记统一写成 c.@CIfdef 与 cif 标记。
|
2026-10-07 19:09:59 +08:00 |
|
TermiNexus
|
2514cee4c9
|
feat(lang): 同步 cif/celif/celse、值引用注解与 assert 改译 testcheck.check
vast 双路径(Python Parser/ExprParser 与 C 扩展 vast_c.c)新增 cif-celif-celse 语句族与 &T / &temp T 参数注解解析,_parser.pyd 已同步重编。HandlesIf 改认 @CIf 标记并做编译期常量求值,含运行时变量一律 fail-fast,同时删除 c.CIf 家族(c.py)。HandlesAssert 合成 testcheck.check(cond, None, msg) 调用,非字符串字面量消息报 TypeError。FuncGen 调用点按形参模式自动取址(ref 仅接受左值,右值 fail-fast;temp 物化临时栈),SymbolUtils/TypeAnnotationResolver 提供模式识别;t.py 删除 CNeedPtr。
|
2026-10-07 19:03:29 +08:00 |
|