fix(TypeGenCType): 撤销在子类类体重复声明父类字段(TypeGenBase 已声明),修指针隐式转整数误报
上一版(6a287b9)为修 Repl.vp:802 在 TypeGenCType 类体补了 5 个字段,但这 5 个 (CTypedefNames / CTypedefTypeStrs / CTypedefNameIdx / CTypedefNameIdxCap / CTypedefNameIdxBuilt)**本就由父类 TypeGenBase 在类体声明**(TypeGenBase.vp:73-84), 属重复声明(c 源码违规)。 后果(有实证):这 5 个名字进入子类"自有字段"后,HandlesImports._FlattenExt 的 继承前缀前置过滤器(HandlesImports.py:2516-2521,为防重复前置而按名字过滤) 把**同名继承项整条丢弃** ⇒ class_members['TypeGenCType'] 变成 [36 继承项]+[5 自有项]。 被丢掉的 5 项(继承下标 22/23/25/26/27)都排在 LastBuiltinsTypedefResult (继承下标 32)之前,使其表内下标降为 27;NoVTable 类 base=0 ⇒ 命中 body 槽 27 = CTypedefNameIdxBuilt(i32) ⇒ TypeGenResolve.vp 的 `self.Gen.TypeGenCType.LastBuiltinsTypedefResult = "t.CPtr"` 触发 "指针隐式转整数已禁止:不能把指针类型 i8* 赋给整数类型 i32"。 该重复声明还会让父类方法(TypeGenBase.vp InitTypeMixinFields 等)与子类方法 访问同一字段落到不同槽(split-brain)。 撤销后:子类自有字段=0,继承前缀 41 项按原顺序保留,LastBuiltinsTypedefResult 回到表内下标 32 = body 槽 32(i8*,与 TypeGenBase 声明的 str 一致)。 说明:Repl.vp:802 的真实根因(引用模块里继承前缀是否可达)尚未定论,本次只撤销 误修、不掩盖;该类属性链失败现已由 TPC 侧新增记账(a18ca4da)逐条给出失败原因链。
This commit is contained in:
1 parent
6a287b955e
commit
0e5ebd07ba
1 file changed
+7
-16
@@ -53,23 +53,14 @@ class TypeGenCType(TypeGenBase.TypeGenBase):
|
||||
"""CTypedef 表(register/lookup/ScanCTypedefDeclarations/_eval_const_int_expr)"""
|
||||
|
||||
# ============================================================
|
||||
# 字段必须在**类体**声明(跨模块可见性要求,不是风格问题)
|
||||
#
|
||||
# 缘由:`.vpi`(声明存根)只携带**类体 AnnAssign 字段**与 `__init__` 里**带注解**的
|
||||
# `self.x: T = ...`;而方法体里的裸 `self.x = ...` 只被**定义模块自己**的成员收集
|
||||
# (HandlesClassDef 的 self.x 扫描)收录 ⇒ 同一字段"定义模块的成员表里有、引用模块的
|
||||
# 没有",且两侧 struct 布局不同源。
|
||||
# 现场:`GenApi._g_gen.TypeGenCType.CTypedefNames`(Repl.vp:802)在引用模块里属性链
|
||||
# 求值为空 → 带注解赋值被判定"无值可存"而终止编译(该字段原仅由 `self.CTypedefNames =
|
||||
# tn` 赋值,.vpi 与跨模块成员表里都没有它)。
|
||||
# 判据:凡会被**别的模块**读到的字段,一律在类体写注解;只在类内使用的临时状态才允许
|
||||
# 只写 `self.x = ...`。
|
||||
# 本类**不**重复声明 CTypedef* 字段:它们由父类 TypeGenBase 的**类体**声明
|
||||
# (TypeGenBase.vp:73-84),跨模块可见性随父类声明一并提供(继承前缀)。
|
||||
# 判据:字段只在其**归属类**的类体声明一次;子类若再声明同名继承字段,该名字
|
||||
# 会变成子类"自有字段",自有表与继承前缀出现重名条目 ⇒ `base + 表内下标`
|
||||
# 的继承字段偏移整体错位(现场:TypeGenResolve.vp 的
|
||||
# `self.Gen.TypeGenCType.LastBuiltinsTypedefResult = "t.CPtr"` 落到 i32 槽 →
|
||||
# "指针隐式转整数已禁止" fail-fast;正确槽是同名继承字段的 i8* 槽)。
|
||||
# ============================================================
|
||||
CTypedefNames: list[str] | t.CPtr
|
||||
CTypedefTypeStrs: list[str] | t.CPtr
|
||||
CTypedefNameIdx: sizet*
|
||||
CTypedefNameIdxCap: int
|
||||
CTypedefNameIdxBuilt: int
|
||||
|
||||
# ============================================================
|
||||
# CTypedef 名索引(开放寻址;槽存 index+1,0=空槽)
|
||||
|
||||
Reference in new issue
Block a user