Commit Graph
297 Commits
Author SHA1 Message Date
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 2e80424d67 refactor(handles): 删除 CSpecialCallHandle/TSpecialCallHandle
EmitRawCopyLlvm 改为模块级函数;删除 c./t. 语法糖处理类及 BaseTranslator 实例化,全仓零引用。
2026-10-18 21:51:10 +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 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 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 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 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 a8718aa751 fix(type): t/c 模块前缀报错补全文件、行列与替代写法
SymbolExtractor 在提取符号前记录 CurrentFile;类型注解拒绝 t./c. 时输出 文件:行:列、完整写法与改写建议。
2026-10-18 14:00:55 +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 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 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 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