尝试进行 Qt 测试,增加了 AI 人机调试工具 _console,以及 TransPyV 进行修正
This commit is contained in:
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user