TermiNexus
|
1508563f1c
|
chore(ffilib): 临时探针(CDLL 抽取 + extern 分支的 ffi_lib/runtime)
现象与"exe 已含最新提交"矛盾:add_c2 仍生成全局、@add 无 thunk、无 _ffilib 引用。加两处 printf 定位断点:_HandleCDLL 入口打印句柄名;translate_function_def 的 extern 分支打印 fd.ffi_lib 与 FfiHandleRuntime 结果。定位后立即移除。
|
2026-10-24 22:51:31 +08:00 |
|
TermiNexus
|
c765cfa9d4
|
fix(ffilib): 模块级 ffilib.CDLL(...) 赋值不再生成全局变量
现场 main.vp 的 text.ll 里出现 @"<sha1>.add_c2"() : i32 全局,说明纯编译期配置的 CDLL 声明被当成普通模块级变量翻译了。ViperBuild 增加 IsCdlLDeclCall(复用 _IsCDLLCall,认别名与全名);TranslatorGenMixin 的模块级 Assign 分支先判它,命中则整条跳过 Pass 0 已抽取的声明。
|
2026-10-24 22:34:54 +08:00 |
|
TermiNexus
|
522075097e
|
fix(ffilib): translate_function_def 的 extern 分支也生成 runtime thunk
现场 temp/02/029af3a930989beb.text.ll 里 @add 是普通直接调用、没有 _ffilib 引用,说明 App 文件的 extern 走的是 translate_function_def 而不是 forward_declare_functions,thunk 校验挂错了地方。两处都挂:各自先查 find_func_in_module 去重;runtime=True 生成 thunk,runtime=False 保持原 declare 路径。
|
2026-10-24 22:33:14 +08:00 |
|
TermiNexus
|
36bfa4e061
|
fix(ffilib): runtime=True 不再把库路径写进 dynamic_libs
runtime=True 的库由 thunk 在运行期按绝对路径 LoadLibraryA,若同时进 dynamic_libs 会成为链接输入、生成 PE 导入表依赖,既与 thunk 重复又会重新带回 exe 同目录/PATH 的限制。改为只登记句柄与路径。
|
2026-10-24 22:31:10 +08:00 |
|
TermiNexus
|
0acbefafd8
|
feat(ffilib): runtime CDLL 生成 thunk(绝对路径 LoadLibraryA + 间接调用)
_emit_runtime_ffi_thunk 生成 define <name>(%p0..): Load(path) -> Sym(h,name) -> bitcast 成 <ret>(<params>)* -> call_indirect -> ret;符号名与普通 extern 一致(裸名),调用点零改动。路径与符号名用 ExprGenConst.create_global_string 落成常量操作数(GEP 由该助手处理)。约束:仅标量参数/返回值,结构体按值与变参 fail-fast;declare-only 阶段仍走普通 declare,避免同模块 define/declare 同名并存。
|
2026-10-24 22:20:55 +08:00 |
|
TermiNexus
|
5e038eae5e
|
feat(ffilib): 句柄表补记库路径,供 runtime thunk 使用
CDLL 句柄登记从 (名字, runtime) 扩为 (名字, runtime, 路径):_ffi_handles_path 与另外两张表平行,_RegisterFfiHandle 增加 path 参数(四条登记路径全部更新),新增 FfiHandlePath(name) 查询。runtime=True 的 thunk 将用该绝对路径调用 _ffilib.Load,从而绕开 PE 导入表的文件名查找规则。
|
2026-10-24 22:01:07 +08:00 |
|
TermiNexus
|
74a9d96d3c
|
feat(ffilib): extern <lib> name(...) 校验库句柄并按 runtime 决定行为
Pass 0 新增 CDLL 句柄表(变量名 -> runtime):_HandleCDLL 接收赋值目标名,_RegisterFfiHandle 登记,FfiHandleRuntime 提供查询(1=运行时/0=链接期/-1=未登记)。FuncGenDef 在前置声明阶段校验 ffi_lib:未绑定 ffilib.CDLL 报 NameError;runtime=True 报 NotImplementedError(需要 _ffilib 运行时符号绑定,绝不静默退化为静态链接);runtime=False 照常生成裸名 declare。
|
2026-10-24 21:12:55 +08:00 |
|
TermiNexus
|
1885370920
|
feat(ffilib): import 白名单登记 ffilib 宏模块
_check_import_sha1 对宏库有一份硬编码白名单(ctraits / viperbuild),宏库不产生代码也就没有模块 SHA1。ffilib 走同一条路,加入白名单后 import ffilib 不再报 has no registered SHA1;配置仍由 Pass 0 抽取。
|
2026-10-24 20:00:31 +08:00 |
|
TermiNexus
|
d2833f6e0c
|
fix(overload): _PyiClass 补传内存池,修复 undefined name mb
类内方法的重载后缀要调用 GenApi.overload_sig_suffix(pool, ...),但 _PyiClass 之前没有内存池参数。追加可选参数 mb 并从 _GeneratePyiFromAst 的两个调用点(模块级类、嵌套类)传下去;未传时 _PyiOverloadSuffix 返回 None,非重载路径行为不变。
|
2026-10-24 19:46:54 +08:00 |
|
TermiNexus
|
af445058b4
|
fix(overload): _translate_method 补传 ClassDef,修复 undefined name cd
方法重载需要在类体内统计同名 def 才能决定是否追加 _v{hash},但 _translate_method 之前没有 ClassDef 参数。改为从 _translate_oop_methods 把 cd 传下去(两处调用点:sig_only 预扫描与正式翻译),未传时 _method_slot_name 退回原方法名,保持非重载路径行为不变。
|
2026-10-24 19:34:22 +08:00 |
|
TermiNexus
|
51b30d3413
|
feat(ffilib): Pass 0 抽取 CDLL 构建配置
import ffilib 只记别名、不进 BFS;_ScanFile 的 Assign/Expr 分发先判 _IsCDLLCall,是则交给 _HandleCDLL。四分支:Project.StaticLib -> static_libs、Project.DynamicLib -> dynamic_libs、字符串 + runtime(True=dynamic/False=static,位置参数或关键字)、list 回退形式编译期 fail-fast。路径追加沿用 static_libs/dynamic_libs 的空格拼接格式,_ResetAll 同步清零 _ffi_alias。
|
2026-10-24 19:15:59 +08:00 |
|
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
|
37c15c9aa0
|
修改 README.md 为纯英文
|
2026-10-19 18:25:15 +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 |
|