fix(Translator): 类体 CDefine 预扫描扩展 + CDefine 类型修复(i32)

- GenerateLlvmDirect 预扫描扩展到类体 AnnAssign,注册类体 CDefine 常量
  (方法内裸名如 ISINSTANCE_CLASS_MAX 不再解析为 0)
- t.py CDefine Size/IsSigned 覆盖为 32 位有符号,修复 stub 生成 void 类型
- 新增 Test/TpvIsinstanceTest(TPV 侧 isinstance 回归测试)
This commit is contained in:
TermiNexus committed 2026-08-10 21:15:42 +08:00
1 parent 1b89225130
commit 9c2dc45c03
4 files changed
+197 -19

No files matched your search

+125
View File
@@ -0,0 +1,125 @@
from stdint import *
import t, c
from t import CPtr, CInt, CExport
import testcheck
# ============================================================
# TPV 侧 isinstance 内建函数测试(由 TransPyV.exe 编译)
#
# 验证 TPV 编译器生成的 isinstance IR:
# 1. CVTable 自身 / 子类→基类
# 2. 运行时多态(基类指针指向子类对象)
# 3. 元组 (A, B)
# 4. 多继承
# 5. NoVTable 编译时静态判断
# ============================================================
# ========== CVTable 继承 ==========
@t.CVTable
class Animal:
Name: str
def __init__(self, name: str):
self.Name = name
def speak(self) -> str:
return "..."
@t.CVTable
class Dog(Animal):
def speak(self) -> str:
return "Woof"
@t.CVTable
class Cat(Animal):
def speak(self) -> str:
return "Meow"
# ========== 多继承 ==========
@t.CVTable
class A:
a: CInt
def get_a(self) -> CInt:
return self.a
@t.CVTable
class B:
b: CInt
def get_b(self) -> CInt:
return self.b
@t.CVTable
class AB(A, B):
def __init__(self, a: CInt, b: CInt):
self.a = a
self.b = b
# ========== NoVTable(编译时静态判断) ==========
@t.NoVTable
class Plain:
v: CInt
def main() -> CInt | CExport:
testcheck.begin("TpvIsinstanceTest: TPV 侧 isinstance 测试")
# --- 1. 自身类型 + 子类→基类 ---
d: Dog | CPtr = Dog("dog")
testcheck.check(isinstance(d, Dog) == 1, "isinstance(d, Dog) 自身 OK",
"isinstance(d, Dog) FAILED")
testcheck.check(isinstance(d, Animal) == 1, "isinstance(d, Animal) 子类→基类 OK",
"isinstance(d, Animal) FAILED")
testcheck.check(isinstance(d, Cat) == 0, "isinstance(d, Cat) 不匹配 OK",
"isinstance(d, Cat) FAILED")
# --- 2. 运行时多态:基类指针指向子类对象 ---
a: Animal | CPtr = (Animal | CPtr)(d)
testcheck.check(isinstance(a, Dog) == 1,
"isinstance(Animal*, Dog 对象) 运行时多态 OK",
"isinstance(Animal*, Dog) FAILED")
testcheck.check(isinstance(a, Animal) == 1,
"isinstance(Animal*, Animal) 基类自身 OK",
"isinstance(Animal*, Animal) FAILED")
testcheck.check(isinstance(a, Cat) == 0,
"isinstance(Animal*, Cat) 运行时 False OK",
"isinstance(Animal*, Cat) FAILED")
# --- 3. 元组 ---
testcheck.check(isinstance(d, (Cat, Dog)) == 1, "isinstance 元组命中 OK",
"isinstance 元组 FAILED")
testcheck.check(isinstance(d, (Cat, A)) == 0, "isinstance 元组未命中 OK",
"isinstance 元组未命中 FAILED")
# --- 4. 多继承 ---
ab: AB | CPtr = AB(1, 2)
testcheck.check(isinstance(ab, A) == 1, "isinstance(AB, A) 多继承 OK",
"isinstance(AB, A) FAILED")
testcheck.check(isinstance(ab, B) == 1, "isinstance(AB, B) 多继承 OK",
"isinstance(AB, B) FAILED")
testcheck.check(isinstance(ab, Animal) == 0, "isinstance(AB, Animal) False OK",
"isinstance(AB, Animal) FAILED")
testcheck.check(ab.get_a() == 1 and ab.get_b() == 2, "AB 字段/方法正常 OK",
"AB 字段/方法 FAILED")
# --- 5. NoVTable(编译时静态判断) ---
p: Plain | CPtr = Plain()
p.v = 42
testcheck.check(isinstance(p, Plain) == 1, "isinstance NoVTable 编译时 OK",
"isinstance NoVTable FAILED")
testcheck.check(p.v == 42, "NoVTable 字段正常 OK", "NoVTable 字段 FAILED")
testcheck.ok("TPV 侧 isinstance 全部测试完成")
return testcheck.end()
+29
View File
@@ -0,0 +1,29 @@
{
"$schema": "https://raw.githubusercontent.com/TermiNexus/TransPyC/main/schemas/project-schema.json",
"name": "TpvIsinstanceTest",
"version": "1.0.0",
"source_dir": "./App",
"build_dir": "./.tpv_build",
"compiler": {
"cmd": "llc",
"flags": ["-filetype=obj", "-relocation-model=pic"]
},
"linker": {
"cmd": "clang++",
"flags": ["-Wl,--allow-multiple-definition", "-Wl,--unresolved-symbols=ignore-in-object-files", "-lmsvcrt", "-lucrt", "-lpthread", "-lmingwex", "-lkernel32", "-luser32", "-latomic"],
"output": "TpvIsinstanceTest.exe"
},
"includes": [
"../../includes"
],
"target": {
"triple": "x86_64-pc-windows-gnu",
"datalayout": "e-m:w-p270:32:32-p271:32:32-p272:64:64-f80:128-n8:16:32:64-S128"
},
"options": {
"slice_level": 3,
"sha1_slice_level": 1,
"target": "llvm",
"strict_mode": true
}
}