可用的回归测试通过的标准版本
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user