fix(transpyv): 修正 _PyiClass 的 type_params 局部变量注解(list[ast.AST*]* → list[str]*)
c 源码违规(注解写错,被严格指针规则抓出):ClassDef.type_params 的真身是 rawptr[list[str]](**名字串**列表,见 includes/ast/stmts.vp:475-483 与 parser.vp:3619-3663 的 `list[str](ps.pool, 8)`);`list[rawptr[AST]]` 是 decorator_list 的类型。Converter._PyiClass 把局部变量注解从 decorator_list 抄错成 list[ast.AST*]* ⇒ `.get()` 被解析到 list[ast.AST*].get,而实参是 list[str]* ⇒ fail-fast: 调用 650c1c3366d09e39.list[10f3f43ddd447eec.AST*].get 第 0 个实参 %"650c1c3366d09e39.list[str]"* 不能隐式转为形参 %"650c1c3366d09e39.list[10f3f43ddd447eec.AST*]"* 已核对全仓其余 8 处 type_params 用点(VpiReader.vp:2253/2274/4345、 Phase2/__init__.vp:317、Phase1Scan.vp:153/318、ClassGenDef.vp:69、 CallGenMixin.vp:415)均写作 list[str]*,本次与之对齐。
This commit is contained in:
1 parent
aa52cf157d
commit
fddadf9d56
1 file changed
+10
-1
@@ -667,7 +667,16 @@ def _PyiClass(buf: bytes, buf_size: sizet, pos: sizet,
|
||||
|
||||
# PEP 695 类型参数 (class Foo[T]:)
|
||||
if cls.type_params is not None:
|
||||
cls_type_params: list[ast.AST*]* = cls.type_params
|
||||
# ClassDef.type_params 的真身是 rawptr[list[str]](**名字串**列表,
|
||||
# 见 includes/ast/stmts.vp:475-483 与 parser.vp:3619-3663 的
|
||||
# `list[str](ps.pool, 8)`),不是 `list[rawptr[AST]]`(那是 decorator_list
|
||||
# 的类型)。原注解从 decorator_list 抄错成 list[ast.AST*]* ⇒ .get() 被解析到
|
||||
# list[ast.AST*].get,而实参是 list[str]* ⇒ 严格规则下 fail-fast:
|
||||
# "调用 ...list[AST*].get 第 0 个实参 %"...list[str]"* 不能隐式转为形参
|
||||
# %"...list[AST*]"*"
|
||||
# 全仓其余 8 处 type_params 均为 list[str]*(VpiReader/Phase1Scan/Phase2/
|
||||
# ClassGenDef/ClassGenGeneric 等),此处对齐。
|
||||
cls_type_params: list[str]* = cls.type_params
|
||||
tpn: sizet = len(cls_type_params)
|
||||
if tpn > 0:
|
||||
pos = _PyiEmit(buf, buf_size, pos, "[")
|
||||
|
||||
Reference in new issue
Block a user