可用的回归测试通过的标准版本

This commit is contained in:
2026-06-18 00:39:43 +08:00
parent bffb0cb6b7
commit e02c867edf
365 changed files with 22562 additions and 24532 deletions

View File

@@ -2,7 +2,7 @@ from __future__ import annotations
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from lib.core.translator import Translator
from lib.core.Handles.HandlesBase import BaseHandle, CTypeInfo, FuncMeta
from lib.core.Handles.HandlesBase import BaseHandle, CTypeInfo, FuncMeta
from lib.includes import t
import ast
import llvmlite.ir as ir
@@ -89,12 +89,12 @@ class AssignHandle:
fmt_ptr = Gen.builder.bitcast(fmt_gvar, ir.PointerType(ir.IntType(8)), name=f"{VarName}_fmt")
fmt_var_name = f"__{VarName}_fmt"
if fmt_var_name not in Gen.variables:
fmt_alloca = Gen._alloca_entry(ir.PointerType(ir.IntType(8)), name=fmt_var_name)
fmt_alloca = Gen._allocaEntry(ir.PointerType(ir.IntType(8)), name=fmt_var_name)
Gen.variables[fmt_var_name] = fmt_alloca
Gen.builder.store(fmt_ptr, Gen.variables[fmt_var_name])
kind_var_name = f"__{VarName}_kind"
if kind_var_name not in Gen.variables:
kind_alloca = Gen._alloca_entry(ir.IntType(32), name=kind_var_name)
kind_alloca = Gen._allocaEntry(ir.IntType(32), name=kind_var_name)
Gen.variables[kind_var_name] = kind_alloca
Gen.builder.store(ir.Constant(ir.IntType(32), 0), Gen.variables[kind_var_name])
if VarName not in Gen.variables:
@@ -116,12 +116,12 @@ class AssignHandle:
fmt_ptr = Gen.builder.bitcast(fmt_gvar, ir.PointerType(ir.IntType(8)), name=f"{VarName}_fmt")
fmt_var_name = f"__{VarName}_fmt"
if fmt_var_name not in Gen.variables:
fmt_alloca = Gen._alloca_entry(ir.PointerType(ir.IntType(8)), name=fmt_var_name)
fmt_alloca = Gen._allocaEntry(ir.PointerType(ir.IntType(8)), name=fmt_var_name)
Gen.variables[fmt_var_name] = fmt_alloca
Gen.builder.store(fmt_ptr, Gen.variables[fmt_var_name])
kind_var_name = f"__{VarName}_kind"
if kind_var_name not in Gen.variables:
kind_alloca = Gen._alloca_entry(ir.IntType(32), name=kind_var_name)
kind_alloca = Gen._allocaEntry(ir.IntType(32), name=kind_var_name)
Gen.variables[kind_var_name] = kind_alloca
Gen.builder.store(ir.Constant(ir.IntType(32), 1), Gen.variables[kind_var_name])
if VarName not in Gen.variables:
@@ -129,7 +129,7 @@ class AssignHandle:
Gen.variables[VarName] = dummy_var
return
if isinstance(Node.value, ast.Call) and isinstance(Node.value.func, ast.Name) and Node.value.func.id == 'va_list':
va_list_ptr = Gen._alloca_entry(ir.IntType(8).as_pointer(), name="va_list")
va_list_ptr = Gen._allocaEntry(ir.IntType(8).as_pointer(), name="va_list")
Gen.variables[VarName] = va_list_ptr
return
IsStructCtor = (isinstance(Node.value, ast.Call) and isinstance(Node.value.func, ast.Name)
@@ -147,7 +147,7 @@ class AssignHandle:
if IsUnion:
Value = self.HandleExprLlvm(Node.value)
if Value:
var = Gen._alloca_entry(Value.type, name=VarName)
var = Gen._allocaEntry(Value.type, name=VarName)
Gen._store(Value, var)
Gen.variables[VarName] = var
return
@@ -160,7 +160,7 @@ class AssignHandle:
elif VarName in Gen._reg_values:
OldVal = Gen._reg_values[VarName]
if isinstance(OldVal.type, ir.PointerType):
var = Gen._alloca_entry(OldVal.type, name=VarName)
var = Gen._allocaEntry(OldVal.type, name=VarName)
Gen._store(OldVal, var)
Gen.variables[VarName] = var
del Gen._reg_values[VarName]
@@ -168,7 +168,7 @@ class AssignHandle:
elif VarName in Gen._direct_values:
OldVal = Gen._direct_values.pop(VarName)
if isinstance(OldVal.type, ir.PointerType):
var = Gen._alloca_entry(OldVal.type, name=VarName)
var = Gen._allocaEntry(OldVal.type, name=VarName)
Gen._store(OldVal, var)
Gen.variables[VarName] = var
ExistingPtr = var
@@ -195,7 +195,7 @@ class AssignHandle:
return
if isinstance(Value.type, ir.VoidType):
return
Gen._unregister_temp_ptr(Value)
Gen._UnregisterTempPtr(Value)
if isinstance(Value.type, ir.PointerType) and isinstance(Value.type.pointee, (ir.LiteralStructType, ir.IdentifiedStructType)):
found_class = None
found = Gen.find_struct_by_pointee(Value.type.pointee)
@@ -219,7 +219,7 @@ class AssignHandle:
if VarName in Gen.variables and Gen.variables[VarName] is not None:
Gen._store(Value, Gen.variables[VarName])
else:
var = Gen._alloca_entry(Value.type, name=VarName)
var = Gen._allocaEntry(Value.type, name=VarName)
Gen._store(Value, var)
Gen.variables[VarName] = var
if isinstance(Node.value, ast.Call) and isinstance(Node.value.func, ast.Name):
@@ -231,17 +231,17 @@ class AssignHandle:
dst_fmt_var = f"__{VarName}_fmt"
if src_fmt_var in Gen.variables:
if dst_fmt_var not in Gen.variables:
dst_alloca = Gen._alloca_entry(ir.PointerType(ir.IntType(8)), name=dst_fmt_var)
dst_alloca = Gen._allocaEntry(ir.PointerType(ir.IntType(8)), name=dst_fmt_var)
Gen.variables[dst_fmt_var] = dst_alloca
src_fmt_ptr = Gen._load(Gen.variables[src_fmt_var], name=f"load_{call_func_name}_fmt_for_{VarName}")
src_fmt_ptr = Gen._load(Gen.variables[src_fmt_var], name=f"Load_{call_func_name}_fmt_for_{VarName}")
Gen.builder.store(src_fmt_ptr, Gen.variables[dst_fmt_var])
src_kind_var = f"__{call_func_name}_kind"
dst_kind_var = f"__{VarName}_kind"
if src_kind_var in Gen.variables:
if dst_kind_var not in Gen.variables:
dst_kind_alloca = Gen._alloca_entry(ir.IntType(32), name=dst_kind_var)
dst_kind_alloca = Gen._allocaEntry(ir.IntType(32), name=dst_kind_var)
Gen.variables[dst_kind_var] = dst_kind_alloca
src_kind_val = Gen._load(Gen.variables[src_kind_var], name=f"load_{call_func_name}_kind_for_{VarName}")
src_kind_val = Gen._load(Gen.variables[src_kind_var], name=f"Load_{call_func_name}_kind_for_{VarName}")
Gen.builder.store(src_kind_val, Gen.variables[dst_kind_var])
Gen.var_type_info[VarName] = {'type': 't_type_runtime', 'source': call_func_name}
return
@@ -260,13 +260,13 @@ class AssignHandle:
return
if VarName in Gen._reg_values:
OldVal = Gen._reg_values[VarName]
var = Gen._alloca_entry(OldVal.type, name=VarName)
var = Gen._allocaEntry(OldVal.type, name=VarName)
Gen._store(OldVal, var)
Gen.variables[VarName] = var
del Gen._reg_values[VarName]
if VarName in Gen._direct_values:
OldVal = Gen._direct_values.pop(VarName)
var = Gen._alloca_entry(OldVal.type, name=VarName)
var = Gen._allocaEntry(OldVal.type, name=VarName)
Gen._store(OldVal, var)
Gen.variables[VarName] = var
if VarName in Gen.variables and Gen.variables[VarName] is not None:
@@ -277,12 +277,12 @@ class AssignHandle:
except AssertionError:
types_differ = False
if isinstance(Value.type, ir.PointerType) and isinstance(Value.type.pointee, ir.PointerType):
LoadedValue = Gen._load(Value, name=f"load_{VarName}")
LoadedValue = Gen._load(Value, name=f"Load_{VarName}")
try:
loaded_differ = TargetType and LoadedValue.type != TargetType
Loaded_differ = TargetType and LoadedValue.type != TargetType
except AssertionError:
loaded_differ = False
if loaded_differ:
Loaded_differ = False
if Loaded_differ:
try:
Coerced = Gen._coerce_value(LoadedValue, TargetType)
if Coerced is not None:
@@ -308,12 +308,12 @@ class AssignHandle:
Gen._store(Value, GVar)
Gen.variables[VarName] = GVar
elif isinstance(Value.type, ir.PointerType) and isinstance(Value.type.pointee, ir.PointerType):
LoadedValue = Gen._load(Value, name=f"load_{VarName}")
var = Gen._alloca_entry(LoadedValue.type, name=VarName)
LoadedValue = Gen._load(Value, name=f"Load_{VarName}")
var = Gen._allocaEntry(LoadedValue.type, name=VarName)
Gen._store(LoadedValue, var)
Gen.variables[VarName] = var
else:
var = Gen._alloca_entry(Value.type, name=VarName)
var = Gen._allocaEntry(Value.type, name=VarName)
Gen._store(Value, var)
Gen.variables[VarName] = var
is_u = Gen._check_node_unsigned(Node.value)
@@ -327,17 +327,17 @@ class AssignHandle:
dst_fmt_var = f"__{VarName}_fmt"
if src_fmt_var in Gen.variables:
if dst_fmt_var not in Gen.variables:
dst_alloca = Gen._alloca_entry(ir.PointerType(ir.IntType(8)), name=dst_fmt_var)
dst_alloca = Gen._allocaEntry(ir.PointerType(ir.IntType(8)), name=dst_fmt_var)
Gen.variables[dst_fmt_var] = dst_alloca
src_fmt_ptr = Gen._load(Gen.variables[src_fmt_var], name=f"load_{call_func_name}_fmt_for_{VarName}")
src_fmt_ptr = Gen._load(Gen.variables[src_fmt_var], name=f"Load_{call_func_name}_fmt_for_{VarName}")
Gen.builder.store(src_fmt_ptr, Gen.variables[dst_fmt_var])
src_kind_var = f"__{call_func_name}_kind"
dst_kind_var = f"__{VarName}_kind"
if src_kind_var in Gen.variables:
if dst_kind_var not in Gen.variables:
dst_kind_alloca = Gen._alloca_entry(ir.IntType(32), name=dst_kind_var)
dst_kind_alloca = Gen._allocaEntry(ir.IntType(32), name=dst_kind_var)
Gen.variables[dst_kind_var] = dst_kind_alloca
src_kind_val = Gen._load(Gen.variables[src_kind_var], name=f"load_{call_func_name}_kind_for_{VarName}")
src_kind_val = Gen._load(Gen.variables[src_kind_var], name=f"Load_{call_func_name}_kind_for_{VarName}")
Gen.builder.store(src_kind_val, Gen.variables[dst_kind_var])
Gen.var_type_info[VarName] = {'type': 't_type_runtime', 'source': call_func_name}
else:
@@ -403,12 +403,12 @@ class AssignHandle:
elif isinstance(Target, ast.Tuple):
if isinstance(Node.value, ast.Call):
FuncName = None
module_path = None
ModulePath = None
if isinstance(Node.value.func, ast.Name):
FuncName = Node.value.func.id
elif isinstance(Node.value.func, ast.Attribute):
FuncName = Node.value.func.attr
module_path = self.Trans.ExprCallHandle._get_module_path(Node.value.func.value)
ModulePath = self.Trans.ExprCallHandle._get_ModulePath(Node.value.func.value)
CReturnTypes = []
FuncDef = self.Trans.FunctionDefCache.get(FuncName) if FuncName else None
if FuncDef:
@@ -436,8 +436,8 @@ class AssignHandle:
if not CReturnTypes:
sym_key = FuncName
if sym_key not in self.Trans.SymbolTable:
if module_path:
sym_key = f"{module_path}.{FuncName}"
if ModulePath:
sym_key = f"{ModulePath}.{FuncName}"
sym_info = self.Trans.SymbolTable.get(sym_key)
if sym_info and sym_info.IsFunction:
ret_type_info = getattr(sym_info, 'FuncPtrReturn', None)
@@ -604,7 +604,7 @@ class AssignHandle:
CastedVal = Gen.builder.bitcast(Value, VarPtr.type.pointee, name=f"cast_{VarName}")
Gen._store(CastedVal, VarPtr)
except Exception: # 回退bitcast 失败时 alloca 新变量
NewVar = Gen._alloca_entry(Value.type, name=VarName)
NewVar = Gen._allocaEntry(Value.type, name=VarName)
Gen._store(Value, NewVar)
Gen.variables[VarName] = NewVar
@@ -620,7 +620,7 @@ class AssignHandle:
SelfVar = Gen._get_var_ptr('self')
if SelfVar:
SelfPtr = Gen._load(SelfVar, name="self")
SetterFunc = Gen._get_function(PropKey)
SetterFunc = Gen._get_function(PropKey + '$set')
if SetterFunc and SelfPtr:
Gen.builder.call(SetterFunc, [SelfPtr, Value], name=f"prop_set_{PropKey}")
return
@@ -683,7 +683,7 @@ class AssignHandle:
if offset >= max_offset:
VarName = f"self.{AttrName}"
if VarName not in Gen.variables:
NewVar = Gen._alloca_entry(Value.type, name=AttrName)
NewVar = Gen._allocaEntry(Value.type, name=AttrName)
Gen.variables[VarName] = NewVar
Gen._store(Value, Gen.variables[VarName])
return
@@ -736,10 +736,10 @@ class AssignHandle:
PropInfo = self.Trans.SymbolTable.get(PropKey)
if PropInfo and hasattr(PropInfo, 'MetaList') and FuncMeta.PROPERTY_SETTER in PropInfo.MetaList:
ObjVal = self.Trans.ExprHandler.HandleExprLlvm(Target.value)
SetterFunc = Gen._get_function(PropKey)
SetterFunc = Gen._get_function(PropKey + '$set')
if SetterFunc and ObjVal:
if isinstance(ObjVal.type, ir.PointerType) and isinstance(ObjVal.type.pointee, ir.PointerType):
ObjVal = Gen._load(ObjVal, name=f"load_{ClassName}")
ObjVal = Gen._load(ObjVal, name=f"Load_{ClassName}")
Gen.builder.call(SetterFunc, [ObjVal, Value], name=f"prop_set_{PropKey}")
return
ObjVal = self.Trans.ExprHandler.HandleExprLlvm(Target.value)
@@ -747,7 +747,7 @@ class AssignHandle:
if BaseHandle._is_char_pointer(ObjVal):
ObjVal = Gen.builder.bitcast(ObjVal, ir.PointerType(Gen.structs[ClassName]), name=f"cast_{ClassName}")
if isinstance(ObjVal.type, ir.PointerType) and isinstance(ObjVal.type.pointee, ir.PointerType):
ObjVal = Gen._load(ObjVal, name=f"load_{ClassName}")
ObjVal = Gen._load(ObjVal, name=f"Load_{ClassName}")
if isinstance(ObjVal.type, ir.PointerType) and ObjVal.type.pointee == Gen.structs[ClassName]:
if IsUnion:
NestedStructName = f"{ClassName}_{AttrName}"
@@ -855,8 +855,8 @@ class AssignHandle:
self._StoreWithCoerce(Value, MemberPtr)
if not ClassName:
imported_modules = getattr(self.Trans, '_imported_modules', None)
import_aliases = getattr(self.Trans, '_import_aliases', {})
imported_modules = getattr(self.Trans, '_ImportedModules', None)
import_aliases = getattr(self.Trans, '_ImportAliases', {})
resolved_mod = import_aliases.get(VarName, VarName)
if imported_modules and (VarName in imported_modules or resolved_mod in imported_modules):
PossibleKeys = [f"{VarName}.{AttrName}", AttrName]
@@ -874,14 +874,14 @@ class AssignHandle:
return
self._StoreWithCoerce(Value, GVar)
return
module_sha1_map = getattr(Gen, 'module_sha1_map', {})
ModuleSha1Map = getattr(Gen, 'ModuleSha1Map', {})
sha1_candidates = [VarName, resolved_mod]
for mod_name in imported_modules:
if mod_name.endswith(f".{VarName}") or mod_name == VarName:
if mod_name not in sha1_candidates:
sha1_candidates.append(mod_name)
for cand in sha1_candidates:
sha1 = module_sha1_map.get(cand)
sha1 = ModuleSha1Map.get(cand)
if sha1:
prefixed = f"{sha1}.{AttrName}"
if prefixed in Gen.module.globals:
@@ -945,7 +945,7 @@ class AssignHandle:
self._StoreWithCoerce(Value, MemberPtr)
return
elif isinstance(Target.value, ast.Call):
# Check if this is c.Deref(...) — we need the pointer, not the loaded value
# Check if this is c.Deref(...) — we need the pointer, not the Loaded value
ObjVal = None
is_cderef = (isinstance(Target.value.func, ast.Attribute) and
isinstance(Target.value.func.value, ast.Name) and
@@ -953,7 +953,7 @@ class AssignHandle:
Target.value.func.attr == 'Deref' and
Target.value.args)
if is_cderef:
# Get the pointer from c.Deref argument, don't load the value
# Get the pointer from c.Deref argument, don't Load the value
deref_arg = Target.value.args[0]
inner_val = self.HandleExprLlvm(deref_arg)
if inner_val and isinstance(inner_val.type, ir.PointerType):
@@ -1019,7 +1019,7 @@ class AssignHandle:
MemberPtr = Gen.builder.gep(SubPtr, [ir.Constant(ir.IntType(32), 0), ir.Constant(ir.IntType(32), offset)], name=AttrName)
self._StoreWithCoerce(Value, MemberPtr)
elif isinstance(pointee, ir.PointerType):
LoadedPtr = Gen._load(SubPtr, name=f"load_{AttrName}_ptr")
LoadedPtr = Gen._load(SubPtr, name=f"Load_{AttrName}_ptr")
if isinstance(LoadedPtr.type, ir.PointerType) and isinstance(LoadedPtr.type.pointee, (ir.IdentifiedStructType, ir.LiteralStructType)):
found = Gen.find_struct_by_pointee(LoadedPtr.type.pointee)
if found:
@@ -1049,8 +1049,8 @@ class AssignHandle:
if not ValueVal or not IndexVal:
return
if BaseHandle._is_char_pointer(IndexVal):
loaded_byte = Gen._load(IndexVal, name="load_char_idx_store")
IndexVal = Gen.builder.zext(loaded_byte, ir.IntType(32), name="char_to_int_idx_store")
Loaded_byte = Gen._load(IndexVal, name="Load_char_idx_store")
IndexVal = Gen.builder.zext(Loaded_byte, ir.IntType(32), name="char_to_int_idx_store")
if isinstance(ValueVal.type, ir.IntType):
var_ptr = self._get_int_ptr(Target.value)
if var_ptr:
@@ -1116,7 +1116,7 @@ class AssignHandle:
ElemPtr = Gen.builder.gep(AttrPtr, [zero, IndexVal], name="subscript")
self._StoreWithCoerce(Value, ElemPtr)
return
arr_alloc = Gen._alloca_entry(ValueVal.type, name="arr_subscript_tmp")
arr_alloc = Gen._allocaEntry(ValueVal.type, name="arr_subscript_tmp")
Gen._store(ValueVal, arr_alloc)
ElemPtr = Gen.builder.gep(arr_alloc, [zero, IndexVal], name="subscript")
self._StoreWithCoerce(Value, ElemPtr)