可用的回归测试通过的标准版本
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
|
||||
from lib.core.Handles.HandlesBase import BaseHandle, CTypeInfo
|
||||
from lib.includes import t
|
||||
import ast
|
||||
import llvmlite.ir as ir
|
||||
@@ -33,7 +33,7 @@ class AnnAssignHandle(BaseHandle):
|
||||
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
|
||||
|
||||
@@ -90,7 +90,7 @@ class AnnAssignHandle(BaseHandle):
|
||||
if isinstance(ObjVal.type, ir.PointerType) and isinstance(ObjVal.type.pointee, ir.IntType) and ObjVal.type.pointee.width == 8:
|
||||
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}"
|
||||
@@ -195,7 +195,7 @@ class AnnAssignHandle(BaseHandle):
|
||||
if Node.value and isinstance(Node.value, ast.Constant) and isinstance(Node.value.value, str):
|
||||
ArrayCount = len(Node.value.value) + 1
|
||||
VarType = ir.ArrayType(ElemType, ArrayCount)
|
||||
var = Gen._alloca_entry(VarType, name=VarName)
|
||||
var = Gen._allocaEntry(VarType, name=VarName)
|
||||
Gen.variables[VarName] = var
|
||||
Gen._record_var_signedness(VarName, False)
|
||||
if Node.value and isinstance(Node.value, ast.List):
|
||||
@@ -267,7 +267,7 @@ class AnnAssignHandle(BaseHandle):
|
||||
if 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]
|
||||
@@ -294,7 +294,7 @@ class AnnAssignHandle(BaseHandle):
|
||||
is_vtable_class = True
|
||||
break
|
||||
if is_vtable_class:
|
||||
var = Gen._alloca_entry(InitValue.type, name=VarName)
|
||||
var = Gen._allocaEntry(InitValue.type, name=VarName)
|
||||
Gen._store(InitValue, var)
|
||||
Gen.variables[VarName] = var
|
||||
if isinstance(Node.annotation, ast.Name) and Node.annotation.id in Gen.structs:
|
||||
@@ -329,7 +329,7 @@ class AnnAssignHandle(BaseHandle):
|
||||
Gen.variables[VarName] = GVar
|
||||
Gen._record_var_signedness(VarName, IsUnsigned)
|
||||
return
|
||||
var = Gen._alloca_entry(VarType, name=VarName)
|
||||
var = Gen._allocaEntry(VarType, name=VarName)
|
||||
if InitValue and isinstance(InitValue.type, ir.PointerType):
|
||||
pointee = InitValue.type.pointee
|
||||
if isinstance(pointee, ir.IdentifiedStructType):
|
||||
@@ -340,7 +340,7 @@ class AnnAssignHandle(BaseHandle):
|
||||
is_vtable_class = True
|
||||
break
|
||||
if is_vtable_class and not isinstance(VarType, ir.PointerType):
|
||||
var = Gen._alloca_entry(InitValue.type, name=VarName)
|
||||
var = Gen._allocaEntry(InitValue.type, name=VarName)
|
||||
VarType = InitValue.type
|
||||
IsPtr = True
|
||||
Gen._store(InitValue, var)
|
||||
@@ -356,7 +356,7 @@ class AnnAssignHandle(BaseHandle):
|
||||
Gen.var_struct_class[VarName] = CN
|
||||
Gen.global_struct_class[VarName] = CN
|
||||
if isinstance(VarType, ir.PointerType) and VarType.pointee is not ST and VarType.pointee != ST:
|
||||
var = Gen._alloca_entry(ir.PointerType(pointee), name=VarName)
|
||||
var = Gen._allocaEntry(ir.PointerType(pointee), name=VarName)
|
||||
VarType = ir.PointerType(pointee)
|
||||
break
|
||||
if InitValue:
|
||||
@@ -435,8 +435,12 @@ class AnnAssignHandle(BaseHandle):
|
||||
AttrTypeInfo = CTypeInfo.FromNode(Node.annotation, self.Trans.SymbolTable)
|
||||
if AttrTypeInfo:
|
||||
AttrVarType = Gen._ctype_to_llvm(AttrTypeInfo)
|
||||
except Exception as e:
|
||||
pass
|
||||
except Exception as _e:
|
||||
from lib.core.VLogger import get_logger as _vlog
|
||||
from lib.constants.config import mode as _config_mode
|
||||
if _config_mode == "strict":
|
||||
raise
|
||||
_vlog().warning(f"解析类型失败: {_e}", "Exception")
|
||||
Value = self.HandleExprLlvm(Node.value, VarType=AttrVarType)
|
||||
if Value:
|
||||
self._HandleAttributeStoreLlvm(Node.target, Value)
|
||||
|
||||
Reference in New Issue
Block a user