fix(type): 支持内建裸名函数指针构造子 callable[[...], R]

TransPyV 侧 TypeGenResolve._IsCallableSubscriptValue 已把 t.Callable[...] 与内建裸名
callable[...] / Callable[...] 视为逐点等价,TPC 侧只有模块限定形态能识别:

- TypeAnnotationResolver._from_node_subscript 的 Callable 分支要求 IsTModule(parts[0]),
  裸名落进泛型特化兜底未命中 → 空 CTypeInfo;改为裸名同判并共用同一构造体。
- DeclarationGenerator._get_type_str 的 Subscript 分支缺 callable 判定,落到末尾
  兜底 'i32';补判返回 'i8*'(与 Attribute 分支的 t.Callable 一致)。

现场:Repl.vp:307 ReplFragFn: callable[[rawptr], int] 被声明成 i32 全局,
Repl.vp:2727 ReplFragFn = fp_addr(i8*)触发「指针隐式转整数已禁止」。
This commit is contained in:
TermiNexus committed 2026-10-01 21:53:43 +08:00
1 parent f0e630457f
commit 85d68e5913
2 files changed
+21 -3

No files matched your search

+6
View File
@@ -1377,6 +1377,12 @@ class DeclarationGenerator:
if (IsPtrSubscriptNode(annotation, TCAliasMap=self._t_c_imported_names)
or (ValueIsCPtr and isinstance(annotation.slice, (ast.Attribute, ast.Name, ast.Subscript)))):
return self._ptr_subscript_type_str(annotation)
# 内建裸名函数指针构造子 callable[...] / Callable[...]:与 Attribute 分支的
# t.Callable[...] 逐点等价(同为 i8*)。缺此分支时落到下方 Name 泛型特化 /
# 兜底返回 'i32'(现场 Repl.vp:307 `ReplFragFn: callable[[rawptr], int]`
# 声明成 i32 全局 ⇒ 赋 i8* 触发「指针隐式转整数」)。
if isinstance(annotation.value, ast.Name) and (annotation.value.id == 'callable' or annotation.value.id == 'Callable'):
return 'i8*'
base: str = self._get_type_str(annotation.value)
if base == 'i8*' and isinstance(annotation.slice, ast.Constant):
return f'[{self._get_const_int(annotation.slice)} x i8]'