diff --git a/App/lib/core/Gen/Expr/ExprGenBase.vp b/App/lib/core/Gen/Expr/ExprGenBase.vp index b9852b8..4fb880f 100644 --- a/App/lib/core/Gen/Expr/ExprGenBase.vp +++ b/App/lib/core/Gen/Expr/ExprGenBase.vp @@ -100,16 +100,15 @@ class ExprGenBase: return buf # ============================================================ # 获取 LLVM 整数类型的位宽 + # + # [S4 切读·位宽块] 实现已收拢到 `TSpec.SpecTypeBits`(该块在 TypeSpec 模块中的 + # **唯一实现**),此处只做委托,不再保留同码副本(TypeGenErr.get_llvm_type_bits + # 同样委托到它)。两份副本一旦分叉,会出现「同一类型在两处算出不同位宽」的 + # 隐蔽不一致。私有调用点(self.get_llvm_type_bits)保持原样不受影响。 # ============================================================ def get_llvm_type_bits(self, ty: llvmlite.LLVMType | t.CPtr) -> int: - """获取 LLVM 整数类型的位宽,非整数类型返回 0""" - if ty is None: - return 0 - match ty: - case llvmlite.LLVMType.Int(bits): - return bits - case _: - return 0 + """获取 LLVM 整数类型的位宽,非整数类型返回 0(委托 SpecTypeBits)""" + return TSpec.SpecTypeBits(ty) # ============================================================ # 获取 LLVM 浮点类型的位宽 # ============================================================ diff --git a/App/lib/core/Gen/Type/TypeGenErr.vp b/App/lib/core/Gen/Type/TypeGenErr.vp index 03e32bc..7ebd98f 100644 --- a/App/lib/core/Gen/Type/TypeGenErr.vp +++ b/App/lib/core/Gen/Type/TypeGenErr.vp @@ -16,7 +16,8 @@ import lib.Stub.StubMerger as StubMerger import lib.core.CompilerFactory as CompilerFactory import lib.core.Gen.Translator as HT -import lib.core.Gen.Type.TypeGenBase as TypeGenBase +import lib.core.Gen.Type.TypeGenBase as TypeGenBase +import lib.core.Gen.Type.TypeSpec as TSpec # ============================================================ @@ -250,15 +251,16 @@ class TypeGenErr(TypeGenBase.TypeGenBase): if stmt is not None and stmt.kind() == ast.ASTKind.Pass: return 1 return 0 + # ============================================================ + # 获取 LLVM 整数类型的位宽 + # + # [S4 切读·位宽块] 实现已收拢到 `TSpec.SpecTypeBits`(该块在 TypeSpec 模块中的 + # **唯一实现**),此处只做委托,不再保留同码副本(ExprGenBase.get_llvm_type_bits + # 同样委托到它)。私有调用点(self.get_llvm_type_bits)保持原样不受影响。 + # ============================================================ def get_llvm_type_bits(self, ty: llvmlite.LLVMType | t.CPtr) -> int: - """获取 LLVM 整数类型的位宽,非整数类型返回 0""" - if ty is None: - return 0 - match ty: - case llvmlite.LLVMType.Int(bits): - return bits - case _: - return 0 + """获取 LLVM 整数类型的位宽,非整数类型返回 0(委托 SpecTypeBits)""" + return TSpec.SpecTypeBits(ty) def infer_expr_type(self, pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr, param_types: str) -> llvmlite.LLVMType | t.CPtr: diff --git a/App/lib/core/Gen/Type/TypeSpec.vp b/App/lib/core/Gen/Type/TypeSpec.vp index b2ea733..0dec71c 100644 --- a/App/lib/core/Gen/Type/TypeSpec.vp +++ b/App/lib/core/Gen/Type/TypeSpec.vp @@ -1033,6 +1033,26 @@ def SpecTypePtrLevel(ty: llvmlite.LLVMType | t.CPtr) -> int: return level +# ============================================================ +# SpecTypeBits - LLVM 类型 → 整数位宽(**位宽块的唯一实现**) +# +# S4 起由 ExprGenBase.get_llvm_type_bits 与 TypeGenErr.get_llvm_type_bits 委托调用 +# (原为两份同码副本:ExprGenBase.vp:104 + TypeGenErr.vp:253)。收拢理由与 +# SpecTypePtrLevel 相同:同为「LLVMType → 标量」的纯函数,属本模块职责域; +# 副本一旦分叉会出现「同一类型在两处算出不同位宽」的隐蔽不一致。 +# 非整数类型(指针/浮点/结构体等)返回 0 —— 0 是"非整数"的表态,不是兜底位宽。 +# ============================================================ +def SpecTypeBits(ty: llvmlite.LLVMType | t.CPtr) -> int: + """获取 LLVM 整数类型的位宽,非整数类型返回 0""" + if ty is None: + return 0 + match ty: + case llvmlite.LLVMType.Int(bits): + return bits + case _: + return 0 + + # ============================================================ # SpecToLLVMText - TypeSpec → LLVM IR 类型文本(**逐字节对齐 llvmlite.TypePrint**) #