fix: 修复 EvalStackCalculator::ReduceBaseType计算boxed值类型和class类型的base type失败的bug
parent
403764e7af
commit
747ee88fd3
|
@ -1006,7 +1006,7 @@ namespace Obfuz.Emit
|
|||
}
|
||||
}
|
||||
|
||||
private TypeSig ReduceBaseType(TypeSig type1, TypeSig type2)
|
||||
private TypeSig ReduceBaseType(TypeSig type1, TypeSig type2, bool forceRefType)
|
||||
{
|
||||
if (TypeEqualityComparer.Instance.Equals(type1, type2))
|
||||
{
|
||||
|
@ -1025,9 +1025,6 @@ namespace Obfuz.Emit
|
|||
switch (t1)
|
||||
{
|
||||
case ElementType.Void:
|
||||
case ElementType.R4:
|
||||
case ElementType.R8:
|
||||
case ElementType.R:
|
||||
case ElementType.TypedByRef:
|
||||
case ElementType.ValueArray:
|
||||
{
|
||||
|
@ -1037,6 +1034,26 @@ namespace Obfuz.Emit
|
|||
}
|
||||
return type1;
|
||||
}
|
||||
case ElementType.R4:
|
||||
case ElementType.R8:
|
||||
case ElementType.R:
|
||||
{
|
||||
if (t1 == t2)
|
||||
{
|
||||
return type1;
|
||||
}
|
||||
if (forceRefType)
|
||||
{
|
||||
switch (t2)
|
||||
{
|
||||
case ElementType.Class:
|
||||
case ElementType.GenericInst:
|
||||
return type2;
|
||||
default: return _corLibTypes.Object;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case ElementType.Boolean:
|
||||
case ElementType.Char:
|
||||
case ElementType.I1:
|
||||
|
@ -1066,6 +1083,20 @@ namespace Obfuz.Emit
|
|||
{
|
||||
return type2;
|
||||
}
|
||||
default:
|
||||
{
|
||||
if (forceRefType)
|
||||
{
|
||||
switch (t2)
|
||||
{
|
||||
case ElementType.Class:
|
||||
case ElementType.GenericInst:
|
||||
return type2;
|
||||
default: return _corLibTypes.Object;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
@ -1078,8 +1109,24 @@ namespace Obfuz.Emit
|
|||
case ElementType.U:
|
||||
case ElementType.I8:
|
||||
case ElementType.U8:
|
||||
{
|
||||
return type1;
|
||||
}
|
||||
default:
|
||||
{
|
||||
if (forceRefType)
|
||||
{
|
||||
switch (t2)
|
||||
{
|
||||
case ElementType.Class:
|
||||
case ElementType.GenericInst:
|
||||
return type2;
|
||||
default: return _corLibTypes.Object;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case ElementType.I:
|
||||
|
@ -1096,6 +1143,20 @@ namespace Obfuz.Emit
|
|||
{
|
||||
return type2;
|
||||
}
|
||||
default:
|
||||
{
|
||||
if (forceRefType)
|
||||
{
|
||||
switch (t2)
|
||||
{
|
||||
case ElementType.Class:
|
||||
case ElementType.GenericInst:
|
||||
return type2;
|
||||
default: return _corLibTypes.Object;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
@ -1111,8 +1172,8 @@ namespace Obfuz.Emit
|
|||
{
|
||||
switch (t2)
|
||||
{
|
||||
case ElementType.Ptr: return new PtrSig(ReduceBaseType(type1.Next, type2.Next));
|
||||
case ElementType.ByRef: return new ByRefSig(ReduceBaseType(type1.Next, type2.Next));
|
||||
case ElementType.Ptr: return new PtrSig(ReduceBaseType(type1.Next, type2.Next, false));
|
||||
case ElementType.ByRef: return new ByRefSig(ReduceBaseType(type1.Next, type2.Next, false));
|
||||
case ElementType.I:
|
||||
case ElementType.U: return type1;
|
||||
}
|
||||
|
@ -1122,7 +1183,7 @@ namespace Obfuz.Emit
|
|||
{
|
||||
switch (t2)
|
||||
{
|
||||
case ElementType.ByRef: return new ByRefSig(ReduceBaseType(type1.Next, type2.Next));
|
||||
case ElementType.ByRef: return new ByRefSig(ReduceBaseType(type1.Next, type2.Next, false));
|
||||
case ElementType.I:
|
||||
case ElementType.U: return type1;
|
||||
}
|
||||
|
@ -1130,6 +1191,10 @@ namespace Obfuz.Emit
|
|||
}
|
||||
case ElementType.ValueType:
|
||||
{
|
||||
if (forceRefType)
|
||||
{
|
||||
return type2;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case ElementType.Class:
|
||||
|
@ -1193,7 +1258,7 @@ namespace Obfuz.Emit
|
|||
switch (t2)
|
||||
{
|
||||
case ElementType.Array:
|
||||
return new ArraySig(ReduceBaseType(type1.Next, type2.Next));
|
||||
return new ArraySig(ReduceBaseType(type1.Next, type2.Next, false));
|
||||
case ElementType.SZArray:
|
||||
return _method.Module.ImportAsTypeSig(typeof(Array));
|
||||
case ElementType.GenericInst:
|
||||
|
@ -1261,13 +1326,15 @@ namespace Obfuz.Emit
|
|||
break;
|
||||
}
|
||||
case ElementType.Object:
|
||||
{
|
||||
return type1;
|
||||
}
|
||||
case ElementType.SZArray:
|
||||
{
|
||||
switch (t2)
|
||||
{
|
||||
case ElementType.SZArray:
|
||||
return new SZArraySig(ReduceBaseType(type1.Next, type2.Next));
|
||||
return new SZArraySig(ReduceBaseType(type1.Next, type2.Next, false));
|
||||
case ElementType.MVar:
|
||||
return _corLibTypes.Object;
|
||||
}
|
||||
|
@ -1324,7 +1391,7 @@ namespace Obfuz.Emit
|
|||
{
|
||||
return type1;
|
||||
}
|
||||
return new EvalDataTypeWithSig(type1.type, ReduceBaseType(type1.typeSig, type2.typeSig));
|
||||
return new EvalDataTypeWithSig(type1.type, ReduceBaseType(type1.typeSig, type2.typeSig, type1.type == EvalDataType.Ref));
|
||||
}
|
||||
case EvalDataType.ValueType:
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue