尝试进行 Qt 测试,增加了 AI 人机调试工具 _console,以及 TransPyV 进行修正

This commit is contained in:
2026-07-21 14:41:22 +08:00
parent a277ded8d4
commit 135aa05485
311 changed files with 7084 additions and 2131 deletions

View File

@@ -572,10 +572,9 @@ class ExprCallHandle(BaseHandle):
result = self._HandleClassNewLlvm(Node, FuncAttr, module_sha1=_ctor_module_sha1)
if result is not None:
return result
if FuncAttr in Gen.structs:
result = self._HandleClassNewLlvm(Node, FuncAttr, module_sha1=_ctor_module_sha1)
if result is not None:
return result
# c 模块的特殊语法设施Addr/Deref/DerefAs/Set/Load/Asm 等)必须优先处理,
# 即使它们在 Gen.structs 中c.py 的类会被声明为结构体但不应被实例化)。
# c.py 是语法部分,不应被编译,其中的类是编译器语法设施。
if ModulePath == 'c':
if FuncAttr == 'Asm':
return self.Trans.ExprAsmHandle._HandleAsmLlvm(Node)
@@ -607,6 +606,10 @@ class ExprCallHandle(BaseHandle):
return self._HandleLLVMIRLlvm(Node)
elif FuncAttr in ('LInp', 'LOut'):
return ir.Constant(ir.IntType(32), 0)
if FuncAttr in Gen.structs:
result = self._HandleClassNewLlvm(Node, FuncAttr, module_sha1=_ctor_module_sha1)
if result is not None:
return result
if ModulePath == 't':
MethodResult_t = self._HandleMethodCallLlvm(Node)
if MethodResult_t is not None:
@@ -1272,13 +1275,7 @@ class ExprCallHandle(BaseHandle):
if expected_type.width < val.type.width:
return Gen.builder.trunc(val, expected_type)
else:
if val.type.width == 1:
# i1 是布尔值,无符号语义,必须 zext
return Gen.builder.zext(val, expected_type, name="zext")
is_unsigned: bool = id(val) in Gen._unsigned_results
if is_unsigned:
return Gen.builder.zext(val, expected_type, name="zext")
return Gen.builder.sext(val, expected_type, name="sext")
return Gen.builder.zext(val, expected_type)
if isinstance(val.type, ir.PointerType) and isinstance(expected_type, ir.IntType):
if expected_type.width == 64:
return Gen.builder.ptrtoint(val, expected_type)
@@ -1631,14 +1628,7 @@ class ExprCallHandle(BaseHandle):
return ArgVal
if isinstance(TargetType, ir.IntType) and isinstance(ArgVal.type, ir.IntType):
if ArgVal.type.width < TargetType.width:
if ArgVal.type.width == 1:
# i1 是布尔值,无符号语义,必须 zext
return Gen.builder.zext(ArgVal, TargetType, name=f"zext_{TypedefName}_cast")
# C cast 语义:源有符号 → sext源无符号 → zext目标符号性仅影响解释
is_unsigned: bool = (Node.args and Gen._check_node_unsigned(Node.args[0])) or id(ArgVal) in Gen._unsigned_results
if is_unsigned:
return Gen.builder.zext(ArgVal, TargetType, name=f"zext_{TypedefName}_cast")
return Gen.builder.sext(ArgVal, TargetType, name=f"sext_{TypedefName}_cast")
return Gen.builder.zext(ArgVal, TargetType, name=f"zext_{TypedefName}_cast")
elif ArgVal.type.width > TargetType.width:
return Gen.builder.trunc(ArgVal, TargetType, name=f"trunc_{TypedefName}_cast")
return ArgVal
@@ -1767,15 +1757,7 @@ class ExprCallHandle(BaseHandle):
if default_val.type != param_type:
if isinstance(param_type, ir.IntType) and isinstance(default_val.type, ir.IntType):
if default_val.type.width < param_type.width:
if default_val.type.width == 1:
# i1 是布尔值,无符号语义,必须 zext
default_val = Gen.builder.zext(default_val, param_type, name=f"zext_default_{i}")
else:
is_unsigned: bool = Gen._check_node_unsigned(default_node) or id(default_val) in Gen._unsigned_results
if is_unsigned:
default_val = Gen.builder.zext(default_val, param_type, name=f"zext_default_{i}")
else:
default_val = Gen.builder.sext(default_val, param_type, name=f"sext_default_{i}")
default_val = Gen.builder.zext(default_val, param_type, name=f"zext_default_{i}")
elif default_val.type.width > param_type.width:
default_val = Gen.builder.trunc(default_val, param_type, name=f"trunc_default_{i}")
elif isinstance(param_type, ir.PointerType) and isinstance(default_val.type, ir.IntType):
@@ -1844,16 +1826,7 @@ class ExprCallHandle(BaseHandle):
elif isinstance(arg.type, ir.PointerType) and isinstance(param_type, ir.IntType):
adjusted.append(Gen.builder.ptrtoint(arg, param_type))
elif isinstance(arg.type, ir.IntType) and arg.type.width < param_type.width:
if arg.type.width == 1:
# i1 是布尔值,无符号语义,必须 zext
adjusted.append(Gen.builder.zext(arg, param_type, name=f"zext_vararg_fixed_{i}"))
else:
arg_node = Node.args[i] if i < len(Node.args) else None
is_unsigned: bool = (arg_node is not None and Gen._check_node_unsigned(arg_node)) or id(arg) in Gen._unsigned_results
if is_unsigned:
adjusted.append(Gen.builder.zext(arg, param_type, name=f"zext_vararg_fixed_{i}"))
else:
adjusted.append(Gen.builder.sext(arg, param_type, name=f"sext_vararg_fixed_{i}"))
adjusted.append(Gen.builder.zext(arg, param_type))
elif isinstance(arg.type, ir.PointerType) and isinstance(param_type, ir.PointerType):
adjusted.append(Gen.builder.bitcast(arg, param_type, name=f"cast_arg_{i}"))
else:
@@ -2024,23 +1997,6 @@ class ExprCallHandle(BaseHandle):
else:
# 跨模块基类 — 查找基类的 sha1
base_sha1 = struct_sha1_map.get(base_name)
# 回退:若 _struct_sha1_map 未命中(普通类导入时不填充),
# 扫描 temp/ 下所有 .pyi 查找包含该基类定义的文件
if base_sha1 is None:
temp_dir = os.path.join(project_root, 'temp')
try:
pyi_files = os.listdir(temp_dir)
except OSError:
pyi_files = []
for pyi_file in pyi_files:
if not pyi_file.endswith('.pyi'):
continue
candidate_sha1 = pyi_file[:-4]
candidate_map = load_pyi(candidate_sha1)
if candidate_map and base_name in candidate_map:
base_sha1 = candidate_sha1
struct_sha1_map[base_name] = base_sha1
break
if base_sha1:
base_methods, base_cvtable, base_novtable, _ = collect_class_methods(base_name, base_sha1, visited)
if base_novtable: