fix: 修复 EvalStackCalculator::ReduceBaseType计算boxed值类型和class类型的base type失败的bug

main
walon 2025-09-14 09:15:58 +08:00
parent 403764e7af
commit 747ee88fd3
1 changed files with 101 additions and 34 deletions

View File

@ -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)) if (TypeEqualityComparer.Instance.Equals(type1, type2))
{ {
@ -1025,9 +1025,6 @@ namespace Obfuz.Emit
switch (t1) switch (t1)
{ {
case ElementType.Void: case ElementType.Void:
case ElementType.R4:
case ElementType.R8:
case ElementType.R:
case ElementType.TypedByRef: case ElementType.TypedByRef:
case ElementType.ValueArray: case ElementType.ValueArray:
{ {
@ -1037,6 +1034,26 @@ namespace Obfuz.Emit
} }
return type1; 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.Boolean:
case ElementType.Char: case ElementType.Char:
case ElementType.I1: case ElementType.I1:
@ -1066,6 +1083,20 @@ namespace Obfuz.Emit
{ {
return type2; return type2;
} }
default:
{
if (forceRefType)
{
switch (t2)
{
case ElementType.Class:
case ElementType.GenericInst:
return type2;
default: return _corLibTypes.Object;
}
}
break;
}
} }
break; break;
} }
@ -1078,8 +1109,24 @@ namespace Obfuz.Emit
case ElementType.U: case ElementType.U:
case ElementType.I8: case ElementType.I8:
case ElementType.U8: case ElementType.U8:
{
return type1; return type1;
} }
default:
{
if (forceRefType)
{
switch (t2)
{
case ElementType.Class:
case ElementType.GenericInst:
return type2;
default: return _corLibTypes.Object;
}
}
break;
}
}
break; break;
} }
case ElementType.I: case ElementType.I:
@ -1096,6 +1143,20 @@ namespace Obfuz.Emit
{ {
return type2; return type2;
} }
default:
{
if (forceRefType)
{
switch (t2)
{
case ElementType.Class:
case ElementType.GenericInst:
return type2;
default: return _corLibTypes.Object;
}
}
break;
}
} }
break; break;
} }
@ -1111,8 +1172,8 @@ namespace Obfuz.Emit
{ {
switch (t2) switch (t2)
{ {
case ElementType.Ptr: return new PtrSig(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)); case ElementType.ByRef: return new ByRefSig(ReduceBaseType(type1.Next, type2.Next, false));
case ElementType.I: case ElementType.I:
case ElementType.U: return type1; case ElementType.U: return type1;
} }
@ -1122,7 +1183,7 @@ namespace Obfuz.Emit
{ {
switch (t2) 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.I:
case ElementType.U: return type1; case ElementType.U: return type1;
} }
@ -1130,6 +1191,10 @@ namespace Obfuz.Emit
} }
case ElementType.ValueType: case ElementType.ValueType:
{ {
if (forceRefType)
{
return type2;
}
break; break;
} }
case ElementType.Class: case ElementType.Class:
@ -1193,7 +1258,7 @@ namespace Obfuz.Emit
switch (t2) switch (t2)
{ {
case ElementType.Array: case ElementType.Array:
return new ArraySig(ReduceBaseType(type1.Next, type2.Next)); return new ArraySig(ReduceBaseType(type1.Next, type2.Next, false));
case ElementType.SZArray: case ElementType.SZArray:
return _method.Module.ImportAsTypeSig(typeof(Array)); return _method.Module.ImportAsTypeSig(typeof(Array));
case ElementType.GenericInst: case ElementType.GenericInst:
@ -1261,13 +1326,15 @@ namespace Obfuz.Emit
break; break;
} }
case ElementType.Object: case ElementType.Object:
{
return type1; return type1;
}
case ElementType.SZArray: case ElementType.SZArray:
{ {
switch (t2) switch (t2)
{ {
case ElementType.SZArray: case ElementType.SZArray:
return new SZArraySig(ReduceBaseType(type1.Next, type2.Next)); return new SZArraySig(ReduceBaseType(type1.Next, type2.Next, false));
case ElementType.MVar: case ElementType.MVar:
return _corLibTypes.Object; return _corLibTypes.Object;
} }
@ -1324,7 +1391,7 @@ namespace Obfuz.Emit
{ {
return type1; 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: case EvalDataType.ValueType:
{ {