From a143c2de0c37fedc015db862abe2839e8d9398eb Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Wed, 14 Oct 2026 21:13:03 +0800 Subject: [PATCH] =?UTF-8?q?fix(stubgen):=20=E8=A3=85=E9=A5=B0=E5=99=A8?= =?UTF-8?q?=E5=BE=AA=E7=8E=AF=E5=8F=98=E9=87=8F=E6=94=B9=E5=90=8D=20ddi?= =?UTF-8?q?=EF=BC=8C=E9=81=BF=E5=85=8D=E4=B8=8E=E9=BB=98=E8=AE=A4=E5=80=BC?= =?UTF-8?q?=E5=A4=84=E7=9A=84=E6=B3=A8=E8=A7=A3=E5=A3=B0=E6=98=8E=20di=20?= =?UTF-8?q?=E5=86=B2=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 同一个函数里 di 先被 for 循环绑定为 int(i32),后面又用注解声明为 sizet(i64) 且右值是运行期 i64 值:存储类型 i32 收不下,编译器按 fail-fast 报'带注解重声明冲突'(此前 TPC 是静默丢掉 store,生成的 viperc.exe 在 list[AST*].get 越界读)。装饰器循环改用 ddi,di 保持为首次声明。 --- App/lib/Stub/StubGen/Converter.vp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/App/lib/Stub/StubGen/Converter.vp b/App/lib/Stub/StubGen/Converter.vp index b9f7fc3..bdc7dc5 100644 --- a/App/lib/Stub/StubGen/Converter.vp +++ b/App/lib/Stub/StubGen/Converter.vp @@ -442,8 +442,12 @@ def _PyiFunction(buf: bytes, buf_size: sizet, pos: sizet, fn: ast.FunctionDef*, if fn.decorator_list is not None: fn_decorator_list: list[ast.AST*]* = fn.decorator_list dn: sizet = len(fn_decorator_list) - for di in range(int(dn)): - dec: ast.AST* = fn_decorator_list.get(di) + # 循环变量改名:`di` 在下方默认值处理处被注解声明为 sizet(i64)。若这里先用 + # `di`(range → int/i32)绑定,注解重声明就会与既有 i32 存储冲突 —— 编译器按 + # fail-fast 报“带注解重声明冲突”,此前 TPC 是静默丢掉 store(生成的二进制在 + # list[AST*].get 处越界读)。故装饰器循环变量改用 ddi。 + for ddi in range(int(dn)): + dec: ast.AST* = fn_decorator_list.get(ddi) if dec is not None: pos = _PyiIndent(buf, buf_size, pos, indent_level) pos = _PyiEmit(buf, buf_size, pos, "@")