TermiNexus
|
850bad4e8a
|
feat(overload): 跨模块调用 Mod.f(...) 接入重载决议
模块限定调用分支先按接收者路径解析目标模块 SHA1(含 from-import 别名),再以 prefix 模式在同名候选集里决议;vpi 注入的重载符号 {sha1}.f_v{hash} 与函数表项名 f_v{hash} 均能命中。单候选/非重载保持原 find_func_in_module 路径。至此模块级、实例方法、Class.m、静态方法、跨模块五条调用路径全部接入同一套 C++ 部分序决议。
|
2026-10-24 18:00:18 +08:00 |
|
TermiNexus
|
f54c365b20
|
feat(overload): vpi 写入端把签名后缀写进 def 名,签名 hash 与上下文无关
_overload_sig_text 算 hash 时固定传 imported_modules/from_imports/trans = None,只靠全局结构体表解析,使定义端、vpi 写入端(translator 尚未创建)、读取端天然算出同一个 hash,无需跨阶段搬运 import 上下文;解析不到即 fail-fast。Converter 新增 _PyiOverloadSuffix:同一作用域同名 def >=2 时追加 _v{hash}(方法跳过 self,@staticmethod 不跳;extern/state/export/main 不加)。读取端 _inject_function_declare 用 fd.name 拼符号,自动与定义端一致,返回/形参注解缓存也按后缀分组不再互相覆盖。
|
2026-10-24 17:29:51 +08:00 |
|
TermiNexus
|
20e31b8dbd
|
refactor(overload): 抽出不依赖 translator 的签名后缀计算(vpi 两端复用)
_overload_sig_text 拆成 _overload_sig_text_ctx(显式传 imported_modules/from_imports/trans)与薄包装;新增 _overload_sig_suffix_ctx 只返回 _v{16位签名hash}。GenApi.overload_sig_suffix 提供无 translator 的入口,供 vpi 写入端(写 def 名)与读取端(核对注入名)共用同一 hash,避免三处各算一套导致跨模块符号对不上。行为不变(尚无调用方)。注:本提交含此前未提交的既有改动。
|
2026-10-24 17:18:23 +08:00 |
|
TermiNexus
|
246d70f2fb
|
feat(overload): 静态方法与类方法的 Class.m(...) 调用接入重载决议
_translate_property_call 在候选 >=2 时用同一套决议:prefix 模式匹配 Class.m / Class.m_v{hash},静态方法 param_base=0(无 self/cls),类方法 param_base=1;新增 arg_start 参数让 cargs 跳过前 start_idx 个预置接收者(obj/cls)。call_name 仍由决议出的 Function 名生成,保证调用目标符号与定义一致。
|
2026-10-24 17:14:15 +08:00 |
|
TermiNexus
|
faea680116
|
feat(overload): 类方法与虚函数重载(符号/函数表键/vtable 槽名一致)
类内同名方法 >=2 时,方法短名追加 _v{参数签名hash}(跳过 self,static 不跳):LLVM 符号 {sha1}.Class.m_v{hash}、函数表键 Class.m_v{hash}、vtable 槽名 m_v{hash} 三者一致。vtable 收集改为先用 _method_slot_name 建槽名表:继承槽的覆盖判定按槽名比较(只有签名相同的同名方法才算覆盖),本类槽按槽名去重(重载各占一槽);__init__/__before_init__/__new__ 仍按原始名排除。实例方法调用与 Class.m(obj,...) 两条路径在候选 >=2 时用同一套决议(prefix 模式 + param_base=1),并把 method_name 换成带后缀的短名,使虚调用取到正确槽位。注:本提交含此前未提交的既有改动。
|
2026-10-24 17:02:33 +08:00 |
|
TermiNexus
|
c89a0d747c
|
feat(overload): 实参类型推导支持字段访问、函数调用结果与二元运算
字段访问按接收者类名找 FieldEntry.Spec(字段 Spec 已带注解符号性);裸名调用取被调者 Spec.Ret(被调者本身同名重载时视为未知,避免递归决议);二元运算按常规算术转换取结果类型(浮点优先、位宽取宽、同宽无符号优先,字符串拼接按左值),比较运算恒 bool。至此 ORFunc(s.f) / ORFunc(f()) / ORFunc(x + 1) 均可参与决议。
|
2026-10-24 16:42:26 +08:00 |
|
TermiNexus
|
42be750029
|
feat(overload): 实参类型推导支持 &x / *p / x[i]
此前只认常量与具名变量,ORFunc(&a) 被判成实参未定型而拒绝。补充 UnaryOp(AddrOf/Deref) 与 Subscript 的静态类型推导:&x 取 PtrLevel+1(数组取地址退化为元素指针),*p 与 x[i] 取元素/pointee 类型。
|
2026-10-24 16:40:16 +08:00 |
|
TermiNexus
|
c1d31cfafb
|
fix(overload): 决议时按需构建模块表项签名,并把调用节点传给报错
模块函数表项的 Spec 一直为 None(只有全局表由 update_global_func_spec 填写),导致所有候选被判成无签名、报 no overload matches。改为在决议时用 _build_func_spec 按需构建并缓存。同时把调用节点 cl.func 传进 resolve_overload_call,no-match/歧义/实参未定型三种报错都带上源码位置,不再缺栈帧。
|
2026-10-24 16:28:41 +08:00 |
|
TermiNexus
|
00c385dc94
|
fix(overload): 签名文本改用类内 _overload_append,避免跨 mixin 调用 FuncGenBase._append_str
FuncGenDef 与 FuncGenBase 是兄弟 mixin,MRO 中不含对方;在 FuncGenDef 里调用 self._append_str 会让调用点解析失败(method return type cannot be obtained precisely: _append_str)。改为 FuncGenDef 自己的有界追加,并把超长判定并进去重处理。
|
2026-10-24 16:19:23 +08:00 |
|
TermiNexus
|
195af1101e
|
feat(overload): 模块级函数重载决议与签名符号名
同名顶层 def 组成重载组时符号名为 {模块sha1}.{name}_v{规范参数签名hash}(仅重载组加后缀,其余保持 {sha1}.{name});签名由注解经 SpecFromLLVMType+SpecWithSign 生成,别名展开为 i32/u32,指针为 p:i32、结构体为 st:{模块sha1}.类名。调用点按 C++ 部分序决议:精确 > 提升/拓宽 > 转换(同宽符号性/指针到 void*) > 省略号,返回值不参与;唯一最优才通过,否则歧义、无匹配、实参类型无法定型均 fail-fast;默认参数参与可行性判定。重复签名、extern/state/export/main 同名、泛型同名均报错。注:本提交含此前未提交的既有改动。
|
2026-10-24 16:02:53 +08:00 |
|
TermiNexus
|
0158df6813
|
perf(TypeSpec): 驻留键与规范文本 scratch 改为 arena 常驻,类型解析零分配
SpecArenaInit 一次性分配 KeyBuf 与 (深度+2) 槽 scratch,InternSpec/_spec_to_text 不再逐次申请缓冲,只需在去重命中时归还临时 TypeSpec;main.vp 在 --detection/--detection-deep 下打开 memhub._memdbg_enable 以保留诊断。
|
2026-10-24 13:10:03 +08:00 |
|
TermiNexus
|
72eea1568c
|
fix(TypeSpec): 修复类型驻留临时对象泄漏导致 PermPool 耗尽
_spec_to_text 的逐层临时缓冲由 PermPool 改为 stdlib.malloc/free 并配对释放;InternSpec 的键缓冲在所有退出路径归还,去重命中时归还临时 TypeSpec 及独占的 BaseName(与驻留条目共享指针时不释放)。PermPool 永不 reset,此前每次类型解析泄漏一个键缓冲与临时实例,翻译大模块时耗尽 1 GiB(现场 includes/ast/parser.vp)。
|
2026-10-24 01:10:59 +08:00 |
|
TermiNexus
|
30e0a71cc6
|
fix(call): 类名与模块同名时不再误报“模块未导入”
- _fail_on_unimported_module_call 先按文件级类名表(is_file_class)与 (name, sha1) 判定类静态调用,再走模块判定
- 修复 TypeSpec.vp 中 TypeSpec.__sizeof__() 被当模块调用而报 NameError
- 注:本文件同时包含此前未提交的既有改动,按整文件提交
|
2026-10-24 00:48:17 +08:00 |
|
TermiNexus
|
e2192db72d
|
feat(viperbuild): 新增 proj.clean.all 总开关
- ViperBuild:clean.all 布尔字段 + CleanAll() 读取口
- main.vp:all 并入 build_dir / includes(个体字段写 False 无法关闭),等价整根清理 + includes 缓存
|
2026-10-24 00:43:08 +08:00 |
|
TermiNexus
|
024e61ce45
|
feat(viperbuild): build(run=, args=) 支持编译后直接运行
- ViperBuild:解析 run(bool) / args(list[str]);非空 args 隐含 run,含空格元素自动加引号,内嵌双引号 fatal
- Phase2:链接成功后按配置运行产物(命令行形式 "exe" args...),CLI --run 仍生效,phase2command 模式跳过
|
2026-10-24 00:25:47 +08:00 |
|
TermiNexus
|
22e4fc5d50
|
feat(viperbuild): 新增 proj.clean.{output,temp,build_dir,includes}
- ViperBuild:clean 嵌套布尔字段校验与 CleanOutput/CleanTemp/CleanBuildDir/CleanIncludes 读取口
- main.vp:编译前按开关清理 output / temp / 整个 buildroot(__vpcbuild__)/ includes 缓存;--clean 覆盖时跳过
|
2026-10-24 00:22:47 +08:00 |
|
TermiNexus
|
51b959de57
|
feat(viperbuild): 宏 list 解包与 proj.advanced.asan/traceback
- ViperBuild:_EvalList 同时识别 Starred 与 UnaryOp(Deref);新增 advanced 嵌套布尔字段、校验与 AdvancedAsan/AdvancedTraceback 读取口
- Translator:擦除 proj.advanced.* 宏赋值,避免生成无效 IR
- main.vp:Pass 0 后并入 BuildPipeline 模式,切换 includes 缓存后缀并清理,--repl 与 advanced 互斥
|
2026-10-24 00:14:49 +08:00 |
|
TermiNexus
|
52f3ff7f56
|
feat(define): 支持字符串 list 宏常量与 *list 解包
- AssignGenMixin:_register_cdefine_list 校验元素为字符串常量或 *other_list,\n 连接,不建全局
- TypeGenBase/TypeGenCDef:新增宏 list 常量表(register/lookup/clear),与 DefineT 同池
|
2026-10-24 00:14:08 +08:00 |
|
TermiNexus
|
8461a3da47
|
fix(viperc): typedef 强转补充 stdint/win32base 解析兜底
|
2026-10-19 19:16:46 +08:00 |
|
TermiNexus
|
08fe5a7b6b
|
fix(viperc): 支持多级模块路径的 typedef 强转(win32.win32base.LPCWSTR)
|
2026-10-19 19:16:00 +08:00 |
|
TermiNexus
|
850f61dc22
|
refactor(viperc): 清理标记下标推导中的内联类型转换
|
2026-10-18 13:40:22 +08:00 |
|
TermiNexus
|
82a735c367
|
refactor(viperc): 完全删除 T1 | T2 类型组合,语法糖改用标记下标
|
2026-10-18 13:39:38 +08:00 |
|
TermiNexus
|
42b094a575
|
refactor(viperc): 退役 t/c 模块标记,内建类型改由编译器直接识别
|
2026-10-18 12:56:57 +08:00 |
|
TermiNexus
|
3242560d02
|
支持 tls 关键字,全面准备清退 t, c
|
2026-10-17 23:40:06 +08:00 |
|
TermiNexus
|
6e17716a69
|
revert(vtable): 恢复按类实际规模动态分配
bf0bbcc 已经把固定上限去掉:收集前按「各父类 VTableMethodCount 之和 + 本类 FunctionDef 数 + 1」一次性分配三张表,越界检查保留为 InternalCompilerError。eff88dd 在并行开发中误把这段覆盖回固定 1024,这里恢复 bf0bbcc 的实现——无任意上限,且符合「能动态就动态」的既定规则。
|
2026-10-17 19:22:50 +08:00 |
|
TermiNexus
|
eff88dd591
|
fix(vtable): VTBL_METHOD_MAX 32 -> 1024
memhub.MemBuddy 这类工具类的虚方法数远超 32,上一轮加的 fail-fast 直接把它拦下了。三张槽位表由 PermPool 分配(各 8*VTBL_METHOD_MAX),1024 时每类 24 KiB,可接受。
|
2026-10-17 19:21:44 +08:00 |
|
TermiNexus
|
bf0bbcc89b
|
fix(vtable): 虚方法表按类实际规模动态分配,去掉 32 上限
MemBuddy 继承 MemManager 后虚方法约 60+ 个,VTBL_METHOD_MAX=32 会触发 fail-fast(此前静默只收前 32 个,之后的调用点找不到槽位、退化成静态直调)。现在收集前先算容量上界:各父类已收集的 VTableMethodCount 之和 + 本类 FunctionDef 数量 + 1,三个 PermPool 数组按此一次性分配;两处越界检查保留为 InternalCompilerError(理论不可达)。删除 VTBL_METHOD_MAX。注:本次提交同时带上了该文件既有的 t.CPtr → rawptr 迁移与 _generate_default_init 删除等未提交改动。
|
2026-10-17 19:20:03 +08:00 |
|
TermiNexus
|
d46fdf152a
|
refactor(struct): AST vtable 拷贝改为按 uint64 槽显式读写
原写法 *dst_c = vt_ptr_c 把 i8* 赋给结构体类型的左值,TPC 会以「非基本类型禁止指针隐式转值类型」报错。新增 _copy_ast_vtable(src, dst):把两侧 AST 节点都视作一个 uint64 槽(src_vt[0] -> dst_vt[0]),语义不变(只复制首字段 vptr),Constant 与 List 两条深拷贝路径统一调用它。
|
2026-10-17 19:13:08 +08:00 |
|
TermiNexus
|
3e1e1fc1b3
|
fix(gen): 消除 ViperC 侧 P0 级静默截断
match:case 数超过 MAX_MATCH_CASES 时 fail-fast(原先 break 会静默少分支,need_case 检查也发现不了)。vtable:初始化串按真实方法表动态分配,_vtable_strcat 溢出改 fatal;VTBL_METHOD_MAX 超限不再 break(原先子类 override 静默失效)。符号名:coro_pool_/__tls_init_done_/__decor_rec_/闭包 fn_ptr 的定义与引用改为按实际长度分配,消除 96 vs 128、64 vs 128 的不对称。Stub:_PyiEmit 溢出改 VLogger.error(半截 .vpi 会被当完整文件解析);VpiReader 参数段/返回注解缓存槽放不下时 fail-fast,不再丢段导致形参注解错位。Includes:文件超过 1MiB 拒绝哈希(SHA1 冲突会让两个模块共用缓存);add_file_entry 失败不再被忽略。f-string:格式串按字面量/转换符实际长度分配,字面量与 format_spec 溢出 fail-fast。
|
2026-10-17 18:46:18 +08:00 |
|
TermiNexus
|
15952d3852
|
fix(asm): 内联汇编/LLVMIR 文本缓冲扩容并将所有超限改为 fail-fast
ASM_TEXT_BUF_SIZE 2048→8192(内核 _do_switch 模板已 2245 字节),c.LLVMIR 模板 512→4096。_asm_append_cstr 不再静默截断:装不下时报 TypeError 并给出已用/待写/容量字节数(此前截断会把模板切成半条 mov,最终以 llc invalid operand 的面目出现)。操作数超过 16、clobber 超过 32、符号改写缓冲溢出同样 fail-fast;约束串/参数串/extractvalue 行缓冲改为按实际操作数与类型文本长度动态分配。
|
2026-10-17 17:41:11 +08:00 |
|
TermiNexus
|
201c881b43
|
fix(assign): 拦截注解为类值类型但右值取地址的 typo
dirp: devfs_directory = &directories[d](注解漏写 *)此前会静默通过,把栈/表元素地址塞进值语义槽位,导致 vptr/父指针悬垂、对象被就地覆写。在 translate_annassign 中新增 fail-fast:注解解析为 struct(类值类型)而右值是取地址表达式(&x 或 c.Addr(x))时报 TypeError 并提示补 *。新增 _is_addr_of_expr 助手,只认取地址,不含 *p 解引用,避免误伤值拷贝。
|
2026-10-16 20:19:51 +08:00 |
|
TermiNexus
|
19feb40e8c
|
fix(call): 实参个数与被调方不符时前端 fail-fast - 不再漏到 LLVM verifier(含 EH 参数扣除与可变参数放行)
|
2026-10-16 19:26:22 +08:00 |
|
TermiNexus
|
2f4031b3d6
|
chore(typegen): read_all 长度参数去掉多余 ULONG 转换
|
2026-10-16 16:40:41 +08:00 |
|
TermiNexus
|
d8648176e9
|
feat(asm): op=/clobber= 支持裸枚举名(CLOBBER_MEMORY) - 等价 ASM_DESCR.XXX
|
2026-10-16 15:26:17 +08:00 |
|
TermiNexus
|
e796314a24
|
fix(gi): 模块级空数组字面量 = [] 改走 zeroinitializer - 修大数组被逐元素展开(元素过多+池耗尽)
|
2026-10-16 13:02:38 +08:00 |
|
TermiNexus
|
7e9ed22dff
|
revert(main): POOL_SIZE 回退 1GiB - 2GiB 触发 MemBuddy 内部索引溢出(_fl_push 在 __init__ 崩)
|
2026-10-16 12:13:02 +08:00 |
|
TermiNexus
|
c57c931099
|
fix(cdefine): 支持浮点常量表达式(define X = 160.0 * 4) - 含浮点字面量时按浮点求值登记 double
|
2026-10-16 11:23:41 +08:00 |
|
TermiNexus
|
832b0a5706
|
chore(diag): [VAR-DIAG] 增加 alloca 地址打印 - 定位 pos/npos 共享存储(值语义被破坏)
|
2026-10-16 00:12:06 +08:00 |
|
TermiNexus
|
6196bdfe56
|
fix(gi): 模块级负浮点字面量按浮点初始化(不再送整型提取器) - 修 double = -100.0 报错
|
2026-10-16 00:03:21 +08:00 |
|
TermiNexus
|
d06e665ebd
|
fix(cdefine): stub 读取对负浮点字面量/浮点强转包裹剥壳后再注册 - 修 X: double = -100.0 走整型提取 fatal
|
2026-10-15 23:46:25 +08:00 |
|
TermiNexus
|
5460d78ff1
|
fix(gi): 模块级类全局按值本位存储(仅 __new__ 类用指针) - 修 CAM: V3 被包成 Ptr 致悬垂误报
|
2026-10-15 23:11:24 +08:00 |
|
TermiNexus
|
9d0a43d5e6
|
chore(diag): [GVAR-DIAG] 模块级全局类型决策(hasnew/hasvtable/isoop) - 定位 CAM 被包成 Ptr
|
2026-10-15 23:06:20 +08:00 |
|
TermiNexus
|
15a210bede
|
chore(diag): 变量声明槽类型 [VAR-DIAG] - 定位 class 标注是否被解析成 ptr
|
2026-10-15 23:00:04 +08:00 |
|
TermiNexus
|
59c032f135
|
chore(diag): CTOR-DIAG 打印构造类型与目标类型的真实 LLVM 文本 - 定位 CAM 全局值本位
|
2026-10-15 22:53:23 +08:00 |
|
TermiNexus
|
23236c88ea
|
fix(lifetime): 裸构造判值拷贝不再依赖类型打印比较 - 修 CAM = V3(...) 全局赋值误报
|
2026-10-15 22:26:17 +08:00 |
|
TermiNexus
|
d1dd6de070
|
fix(lifetime): 目标为值类型即判 LIFE_VALUE(不再要求源非指针) - class 局部变量内部为指针槽,修 stars 误报
|
2026-10-15 21:59:39 +08:00 |
|
TermiNexus
|
cbadc356f9
|
chore(diag): life 判定加全量诊断 [LIFE-DIAG]/[RT-DIAG] - 定位 return col 误判
|
2026-10-15 21:54:08 +08:00 |
|
TermiNexus
|
5dc483e256
|
fix(lifetime): 值类型变量按值拷贝判据改为双非指针(不再依赖类型打印比较),堆/静态登记优先
|
2026-10-15 21:47:30 +08:00 |
|
TermiNexus
|
6b86f846ca
|
fix(lifetime): 值类型局部变量在同型聚合目标位置按值拷贝(LIFE_VALUE) - 修 return col 被误判 stack address escapes
|
2026-10-15 21:40:30 +08:00 |
|
TermiNexus
|
217f5f021d
|
fix(viperc): 解引用赋值补位拷贝(*a = *b 按位重解释,不做数值转换)
现场(math.vp sin/cos):
u: uint64 = 0; xv: double = x
*&u = *&xv # 位拷贝,应为 movq %xmm0, %rax
ef: uint64 = (u >> 52) & 0x7FF
生成:404084 cvttsd2si %xmm0, %rax ← 把 double 数值截断成 int64
代价:u 成了数值截断结果 ⇒ ef/neg 全错;x 为负时(-1.5 → u = -1)ef 命中 0x7FF
⇒ 直接 return x - x = NaN ⇒ sin/cos 负参全废。
VPC 的 `*p = v` 目标路径无条件 coerce_to_type(rhs, pointee);TPC 侧早有该判据
(HandlesAssign.py:592 调 HandlesSpecialCall.EmitRawCopyLlvm,注释明确"位拷贝,绝不转换"),
VPC 漏了 ⇒ 本次按同口径补齐。
- RHS 为 UnaryOp(Deref)(`*p`)且两侧是**等宽标量**时:按**源自身类型** load(类型与槽的
存储类型一致),再 bitcast 成目的类型存回 —— 不做任何数值转换;
- 不用"按目的类型重解释的 load"(`load i64, ptr %xv`):文本层 T2「store→load 转发」按**名字**
替换,会把 `store double %x, ptr %xv` 的 %x 顶进这条 i64 行,报
`use of value '%x' expects different type than prior uses: 'i64' vs 'f64'`;
- 源操作数限定非调用形状,避免与前面 rhs_val 的求值重复;源不是指针 ⇒ fail-fast;
- 两侧位宽不等或含聚合 ⇒ 不做位拷贝,交回 coerce 路径(等价改动前行为,聚合位拷贝未支持)。
|
2026-10-15 20:16:50 +08:00 |
|