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:
1 parent
b0aa9f6d76
commit
a7d8589af6
1 file changed
+28
-1
@@ -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 = {}
|
||||
|
||||
Reference in new issue
Block a user