From fddadf9d56a68e2208095edca9378287ba74b229 Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Mon, 28 Sep 2026 22:54:50 +0800 Subject: [PATCH] =?UTF-8?q?fix(transpyv):=20=E4=BF=AE=E6=AD=A3=20=5FPyiCla?= =?UTF-8?q?ss=20=E7=9A=84=20type=5Fparams=20=E5=B1=80=E9=83=A8=E5=8F=98?= =?UTF-8?q?=E9=87=8F=E6=B3=A8=E8=A7=A3=EF=BC=88list[ast.AST*]*=20=E2=86=92?= =?UTF-8?q?=20list[str]*=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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]*,本次与之对齐。 --- App/lib/Stub/StubGen/Converter.vp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/App/lib/Stub/StubGen/Converter.vp b/App/lib/Stub/StubGen/Converter.vp index 7d076bf..a1a6cd3 100644 --- a/App/lib/Stub/StubGen/Converter.vp +++ b/App/lib/Stub/StubGen/Converter.vp @@ -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, "[")