fix(HandlesAnnAssign): 补上指针占位类名判据的定义,修 _PTR_MARKER_CLASS_NAMES 未定义

「注解声明类台账」只引用未定义 _PTR_MARKER_CLASS_NAMES,_DeclCls 为真时即 NameError(翻译 lib/Projectrans/Utils.vp 触发)。定义为 frozenset 常量并改用 _IsPtrMarkerClassName,覆盖裸名 / sha1.rawptr 前缀 / rawptr[X] 下标三种占位形态。
This commit is contained in:
TermiNexus committed 2026-09-30 19:10:59 +08:00
1 parent b0aa9f6d76
commit a7d8589af6
1 file changed
+28 -1
+28 -1
View File
@@ -29,6 +29,33 @@ def _IsGenericTpName(name: str) -> bool:
return len(name) == 1 and name.isalpha() and name.isupper()
# 指针/未知**占位**类名(非真实类):联合注解 rawptr[T] / X | t.CPtr 折叠后,
# var_struct_class 里可能落进这些占位名(它们可能恰好也在 Gen.structs 里,如
# 'rawptr')。占位名不表态具体类 ⇒ 不得登记为「注解声明类」的权威值,否则会挡住
# "无注解赋值从右值推断类名"的正常路径(如 `p: t.CPtr = Point()` 之后 `p.x` 需要
# Point)。形态三种(见本文件 L753 的同类判据):裸 'rawptr'、带模块前缀
# 'sha1.rawptr'、下标式 'rawptr[X]';CPtr 一族的裸名/限定名同样计入。
_PTR_MARKER_CLASS_NAMES: frozenset[str] = frozenset({
'rawptr', 't.rawptr', 'c.rawptr',
'CPtr', 't.CPtr', 'c.CPtr',
'CNeedPtr', 't.CNeedPtr', 'CAutoPtr', 't.CAutoPtr',
})
def _IsPtrMarkerClassName(Name: str | None) -> bool:
"""类名是否为指针/未知占位名(判据见 _PTR_MARKER_CLASS_NAMES)"""
if not Name:
return False
if Name in _PTR_MARKER_CLASS_NAMES:
return True
# 带模块前缀('sha1.rawptr')与下标式('rawptr[X]')两种形态
if '.rawptr' in Name or Name.startswith('rawptr['):
return True
if '.CPtr' in Name or Name.startswith('CPtr['):
return True
return False
class AnnAssignHandle(BaseHandle):
def _StoreOrStrCopy(self, VarName: str, VarPtr: ir.Value, Value: ir.Value) -> None:
Gen: LlvmCodeGenerator = self.Trans.LlvmGen
@@ -465,7 +492,7 @@ class AnnAssignHandle(BaseHandle):
# 注解 `rawptr[T]`/`X | t.CPtr` 折叠后的占位名,可能恰好在 Gen.structs 里)
# 不表态具体类,若一并记为权威会挡住"无注解赋值从右值推断类名"的正常路径
# (如 `p: t.CPtr = Point()` 之后 `p.x` 需要 Point)。
if _DeclCls and _DeclCls not in _PTR_MARKER_CLASS_NAMES:
if _DeclCls and not _IsPtrMarkerClassName(_DeclCls):
_M: dict = getattr(Gen, 'var_annotated_class', None)
if _M is None:
_M = {}