修复 EvalDataTypeWithSig计算ldarga等取引用的指令的栈数据类型未包含具体类型的bug

main
walon 2025-08-12 14:19:11 +08:00
parent 0889f730fd
commit c3c53b2797
1 changed files with 11 additions and 9 deletions

View File

@ -348,7 +348,7 @@ namespace Obfuz.Emit
case Code.Ldarga: case Code.Ldarga:
case Code.Ldarga_S: case Code.Ldarga_S:
{ {
PushStack(newPushedDatas, EvalDataType.I); PushStackPointer(newPushedDatas, new ByRefSig(inst.GetParameter(_method.Parameters).Type));
break; break;
} }
case Code.Ldloc_0: case Code.Ldloc_0:
@ -364,7 +364,7 @@ namespace Obfuz.Emit
case Code.Ldloca: case Code.Ldloca:
case Code.Ldloca_S: case Code.Ldloca_S:
{ {
PushStack(newPushedDatas, EvalDataType.I); PushStackPointer(newPushedDatas, new ByRefSig(inst.GetLocal(body.Variables).Type));
break; break;
} }
case Code.Stloc_0: case Code.Stloc_0:
@ -522,7 +522,7 @@ namespace Obfuz.Emit
case Code.Ldind_I: case Code.Ldind_I:
{ {
Assert.IsTrue(stackSize > 0); Assert.IsTrue(stackSize > 0);
PushStack(newPushedDatas, EvalDataType.I); PushStackPointer(newPushedDatas, corLibTypes.IntPtr);
break; break;
} }
case Code.Ldind_Ref: case Code.Ldind_Ref:
@ -648,7 +648,7 @@ namespace Obfuz.Emit
case Code.Conv_I: case Code.Conv_I:
case Code.Conv_U: case Code.Conv_U:
{ {
PushStack(newPushedDatas, EvalDataType.I); PushStackPointer(newPushedDatas, corLibTypes.IntPtr);
break; break;
} }
case Code.Conv_R4: case Code.Conv_R4:
@ -690,7 +690,7 @@ namespace Obfuz.Emit
case Code.Conv_Ovf_U: case Code.Conv_Ovf_U:
case Code.Conv_Ovf_U_Un: case Code.Conv_Ovf_U_Un:
{ {
PushStack(newPushedDatas, EvalDataType.I); PushStackPointer(newPushedDatas, corLibTypes.IntPtr);
break; break;
} }
case Code.Conv_R_Un: case Code.Conv_R_Un:
@ -776,7 +776,9 @@ namespace Obfuz.Emit
case Code.Ldflda: case Code.Ldflda:
case Code.Ldsflda: case Code.Ldsflda:
{ {
PushStack(newPushedDatas, EvalDataType.I); IField field = (IField)inst.Operand;
TypeSig fieldType = MetaUtil.InflateFieldSig(field, gac);
PushStackPointer(newPushedDatas, new ByRefSig(fieldType));
break; break;
} }
case Code.Stfld: case Code.Stfld:
@ -822,7 +824,7 @@ namespace Obfuz.Emit
case Code.Ldelem_I: case Code.Ldelem_I:
{ {
Assert.IsTrue(stackSize >= 2); Assert.IsTrue(stackSize >= 2);
PushStack(newPushedDatas, EvalDataType.I); PushStackPointer(newPushedDatas, corLibTypes.IntPtr);
break; break;
} }
case Code.Ldelem_R4: case Code.Ldelem_R4:
@ -875,7 +877,7 @@ namespace Obfuz.Emit
case Code.Refanyval: case Code.Refanyval:
{ {
Assert.IsTrue(stackSize > 0); Assert.IsTrue(stackSize > 0);
PushStack(newPushedDatas, EvalDataType.I); PushStackPointer(newPushedDatas, corLibTypes.IntPtr);
break; break;
} }
case Code.Ldtoken: case Code.Ldtoken:
@ -905,7 +907,7 @@ namespace Obfuz.Emit
} }
case Code.Localloc: case Code.Localloc:
{ {
PushStack(newPushedDatas, EvalDataType.I); PushStackPointer(newPushedDatas, corLibTypes.IntPtr);
break; break;
} }
case Code.Unaligned: case Code.Unaligned: