void AssertResult(ILStackFrameWithDiagnostics <ILEngineCompiled> frame, object expected, OperandType operandType) { var instructions = frame.Stream; Assert.IsTrue(instructions.Any(x => x.OpCode.OperandType == operandType), $"Instructions do not contain Opcode of type {operandType}" ); AssertEmptyStackWithResult(frame, expected); }
public void TestExceptionHandling() { var builder = new ILInstructionBuilder(); builder.Write(ILOpCodeValues.Ldobj, "test"); builder.Write(ILOpCodeValues.Conv_I4); var frame = new ILStackFrameWithDiagnostics(); frame.Stream = builder.Instructions; frame.Execute(100); Assert.IsInstanceOfType(frame.Exception, typeof(FormatException)); }
public void ExecuteTest() { var frame = new ILStackFrameWithDiagnostics(); Action empty = () => { }; var instructions = ILInstructionReader.FromMethod(empty.Method); frame.Stream = instructions; frame.SetResolver(empty.Method); frame.Execute(); Assert.IsNull(frame.ReturnResult); Assert.IsNull(frame.Exception); Assert.IsTrue(frame.Module.MetadataToken == empty.Method.Module.MetadataToken); var thisType = this.GetType(); var testMethod = thisType.GetMethod(nameof(ExecuteTest)); Assert.IsNotNull(testMethod); var methodSigToken = testMethod.GetMethodBody().LocalSignatureMetadataToken; Assert.IsTrue(methodSigToken >0); var resolvedSig = frame.ResolveSignatureToken(methodSigToken); Assert.IsNotNull(resolvedSig); Assert.IsTrue(resolvedSig.Length > 0); frame.Execute(1); Assert.IsNull(frame.ReturnResult); Assert.IsNull(frame.Exception); Action sleepToLong = () => System.Threading.Thread.Sleep(4000); instructions = ILInstructionReader.FromMethod(sleepToLong.Method); frame.Stream = instructions; frame.Execute(1); Assert.IsNull(frame.ReturnResult); Assert.IsNotNull(frame.Exception); Assert.IsInstanceOfType(frame.Exception, typeof(ActionTimeoutException)); Action throwException = () => throw new ArgumentException(nameof(throwException)); instructions = ILInstructionReader.FromMethod(throwException.Method); frame.Stream = instructions; frame.Execute(1); Assert.IsNull(frame.ReturnResult); Assert.IsNotNull(frame.Exception); Assert.IsInstanceOfType(frame.Exception, typeof(ArgumentException)); }
public void ResetTest() { var builder = new ILInstructionBuilder(); builder.Write(ILOpCodeValues.Ldc_I4_0); builder.Write(ILOpCodeValues.Ldc_I4_1); builder.Write(ILOpCodeValues.Ret); var frame = new ILStackFrameWithDiagnostics(); frame.Stream = builder.Instructions; frame.Execute(); Assert.IsTrue(frame.ReturnResult == 1); Assert.IsTrue(frame.Stack.Count == 1); frame.Reset(); Assert.IsNull(frame.ReturnResult); Assert.IsTrue(frame.Stack.Count == 0); }
public void TestConvNoOverflowCheck() { var frame = new ILStackFrameWithDiagnostics(); var stream = new ILInstructionBuilder(); frame.Stream = stream.Instructions; stream.Clear(); frame.Args = new object[] { uint.MaxValue }; stream.Write(OpCodes.Ldarg_0); stream.Write(OpCodes.Conv_I); stream.Write(OpCodes.Ret); frame.Execute(); int expected = unchecked((int)Convert.ToInt64(uint.MaxValue)); Assert.IsNull(frame.Exception, $"Frame returned exception: {frame.Exception?.Message}"); Assert.IsTrue(frame.ReturnResult == expected, $"Conv_I uint.MaxValue failed\r\nExpected: {expected}\r\nActual:{frame.ReturnResult ?? "null"}"); }
public List <ILInstruction> GetValidInstructions(ILStackFrameWithDiagnostics stackFrame) { var result = new List <ILInstruction>(); return(result); }
public void TestLoadConstants() { var frame = new ILStackFrameWithDiagnostics(); var stream = new ILInstructionBuilder(); frame.Stream = stream.Instructions; stream.Clear(); stream.Write(OpCodes.Ldc_I4_0); stream.Write(OpCodes.Ret); frame.Execute(); Assert.IsTrue(frame.ReturnResult == 0, $"Ldc_I4_0 failed, return result = {frame.ReturnResult ?? "null"}"); stream.Clear(); stream.Write(OpCodes.Ldc_I4_1); stream.Write(OpCodes.Ret); frame.Execute(); Assert.IsTrue(frame.ReturnResult == 1, $"Ldc_I4_1 failed, return result = {frame.ReturnResult ?? "null"}"); stream.Clear(); stream.Write(OpCodes.Ldc_I4_2); stream.Write(OpCodes.Ret); frame.Execute(); Assert.IsTrue(frame.ReturnResult == 2, $"Ldc_I4_2 failed, return result = {frame.ReturnResult ?? "null"}"); stream.Clear(); stream.Write(OpCodes.Ldc_I4_3); stream.Write(OpCodes.Ret); frame.Execute(); Assert.IsTrue(frame.ReturnResult == 3, $"Ldc_I4_3 failed, return result = {frame.ReturnResult ?? "null"}"); stream.Clear(); stream.Write(OpCodes.Ldc_I4_4); stream.Write(OpCodes.Ret); frame.Execute(); Assert.IsTrue(frame.ReturnResult == 4, $"Ldc_I4_4 failed, return result = {frame.ReturnResult ?? "null"}"); stream.Clear(); stream.Write(OpCodes.Ldc_I4_5); stream.Write(OpCodes.Ret); frame.Execute(); Assert.IsTrue(frame.ReturnResult == 5, $"Ldc_I4_5 failed, return result = {frame.ReturnResult ?? "null"}"); stream.Clear(); stream.Write(OpCodes.Ldc_I4_6); stream.Write(OpCodes.Ret); frame.Execute(); Assert.IsTrue(frame.ReturnResult == 6, $"Ldc_I4_6 failed, return result = {frame.ReturnResult ?? "null"}"); stream.Clear(); stream.Write(OpCodes.Ldc_I4_7); stream.Write(OpCodes.Ret); frame.Execute(); Assert.IsTrue(frame.ReturnResult == 7, $"Ldc_I4_7 failed, return result = {frame.ReturnResult ?? "null"}"); stream.Clear(); stream.Write(OpCodes.Ldc_I4_8); stream.Write(OpCodes.Ret); frame.Execute(); Assert.IsTrue(frame.ReturnResult == 8, $"Ldc_I4_8 failed, return result = {frame.ReturnResult ?? "null"}"); stream.Clear(); stream.Write(OpCodes.Ldc_I4_M1); stream.Write(OpCodes.Ret); frame.Execute(); Assert.IsTrue(frame.ReturnResult == -1, $"Ldc_I4_M1 failed, return result = {frame.ReturnResult ?? "null"}"); stream.Clear(); stream.Write(OpCodes.Ldc_I4, 1); stream.Write(OpCodes.Ret); frame.Execute(); Assert.IsTrue(frame.ReturnResult == 1, $"Ldc_I4(1) failed, return result = {frame.ReturnResult ?? "null"}"); stream.Clear(); stream.Write(OpCodes.Ldc_I4_S, byte.MaxValue); stream.Write(OpCodes.Ret); frame.Execute(); Assert.IsTrue(frame.ReturnResult == byte.MaxValue, $"Ldc_I4_s(255) failed, return result = {frame.ReturnResult ?? "null"}"); stream.Clear(); stream.Write(OpCodes.Ldc_I8, long.MaxValue); stream.Write(OpCodes.Ret); frame.Execute(); Assert.IsTrue(frame.ReturnResult == long.MaxValue, $"Ldc_I8(long.MaxValue) failed, return result = {frame.ReturnResult ?? "null"}"); stream.Clear(); stream.Write(OpCodes.Ldc_R4, 0); stream.Write(OpCodes.Ret); frame.Execute(); Assert.IsTrue(frame.ReturnResult == 0, $"Ldc_R4(float.MaxValue) failed, return result = {frame.ReturnResult ?? "null"}"); stream.Clear(); stream.Write(OpCodes.Ldc_R4, float.MaxValue); stream.Write(OpCodes.Ret); frame.Execute(); Assert.IsTrue(frame.ReturnResult == float.MaxValue, $"Ldc_R4(float.MaxValue) failed, return result = {frame.ReturnResult ?? "null"}"); stream.Clear(); stream.Write(OpCodes.Ldc_R4, float.MinValue); stream.Write(OpCodes.Ret); frame.Execute(); Assert.IsTrue(frame.ReturnResult == float.MinValue, $"Ldc_R4(float.MinValue) failed, return result = {frame.ReturnResult ?? "null"}"); stream.Clear(); stream.Write(OpCodes.Ldc_R8, 0); stream.Write(OpCodes.Ret); frame.Execute(); Assert.IsTrue(frame.ReturnResult == 0, $"Ldc_R8(float.MaxValue) failed, return result = {frame.ReturnResult ?? "null"}"); stream.Clear(); stream.Write(OpCodes.Ldc_R8, double.MaxValue); stream.Write(OpCodes.Ret); frame.Execute(); Assert.IsTrue(frame.ReturnResult == double.MaxValue, $"Ldc_R8(double.MaxValue) failed, return result = {frame.ReturnResult ?? "null"}"); stream.Clear(); stream.Write(OpCodes.Ldc_R8, double.MinValue); stream.Write(OpCodes.Ret); frame.Execute(); Assert.IsTrue(frame.ReturnResult == double.MinValue, $"Ldc_R8(double.MinValue) failed, return result = {frame.ReturnResult ?? "null"}"); }
public void TestLoadAndStoreLocals() { var frame = new ILStackFrameWithDiagnostics(); var intType = typeof(int); var rng = Enumerable.Range(0, 8); frame.Locals = rng .Select(idx => new ILVariable { Index = idx, Type = intType, Value = idx }).ToArray(); var stream = new ILInstructionBuilder(); frame.Stream = stream.Instructions; stream.Write(OpCodes.Ldloc_0); stream.Write(OpCodes.Stloc_0); stream.Write(OpCodes.Ldloc_0); stream.Write(OpCodes.Ret); frame.Execute(); Assert.IsTrue(frame.ReturnResult == (int)frame.Locals[0].Value, $"Locals 0 failed, return result = {frame.ReturnResult ?? "null"}"); stream.Clear(); stream.Write(OpCodes.Ldloc_1); stream.Write(OpCodes.Stloc_1); stream.Write(OpCodes.Ldloc_1); stream.Write(OpCodes.Ret); frame.Execute(); Assert.IsTrue(frame.ReturnResult == (int)frame.Locals[1].Value, $"Locals 1 failed, return result = {frame.ReturnResult ?? "null"}"); stream.Clear(); stream.Write(OpCodes.Ldloc_2); stream.Write(OpCodes.Stloc_2); stream.Write(OpCodes.Ldloc_2); stream.Write(OpCodes.Ret); frame.Execute(); Assert.IsTrue(frame.ReturnResult == (int)frame.Locals[2].Value, $"Locals 2 failed, return result = {frame.ReturnResult ?? "null"}"); ; stream.Clear(); stream.Write(OpCodes.Ldloc_3); stream.Write(OpCodes.Stloc_3); stream.Write(OpCodes.Ldloc_3); stream.Write(OpCodes.Ret); frame.Execute(); Assert.IsTrue(frame.ReturnResult == (int)frame.Locals[3].Value, $"Locals 3 failed, return result = {frame.ReturnResult ?? "null"}"); stream.Clear(); stream.Write(OpCodes.Ldloc, 4); stream.Write(OpCodes.Stloc, 4); stream.Write(OpCodes.Ldloc, 4); stream.Write(OpCodes.Ret); frame.Execute(); Assert.IsTrue(frame.ReturnResult == (int)frame.Locals[4].Value, $"Ldloc(arg=4) failed, return result = {frame.ReturnResult ?? "null"}"); stream.Clear(); stream.Write(OpCodes.Ldloc_S, 5); stream.Write(OpCodes.Stloc_S, 5); stream.Write(OpCodes.Ldloc_S, 5); stream.Write(OpCodes.Ret); frame.Execute(); Assert.IsTrue(frame.ReturnResult == (int)frame.Locals[5].Value, $"Ldloc_S(arg=5) failed, return result = {frame.ReturnResult ?? "null"}"); stream.Clear(); stream.Write(OpCodes.Ldloca, 6); stream.Write(OpCodes.Stloc_S, 6); stream.Write(OpCodes.Ldloca, 6); stream.Write(OpCodes.Ret); frame.Execute(); Assert.IsTrue(frame.ReturnResult == (int)frame.Locals[6].Value, $"Ldloca(arg=6) failed, return result = {frame.ReturnResult ?? "null"}"); stream.Clear(); stream.Write(OpCodes.Ldloca_S, 7); stream.Write(OpCodes.Stloc_S, 7); stream.Write(OpCodes.Ldloca_S, 7); stream.Write(OpCodes.Ret); frame.Execute(); Assert.IsTrue(frame.ReturnResult == (int)frame.Locals[7].Value, $"Ldloca_S(arg=6) failed, return result = {frame.ReturnResult ?? "null"}"); }
public void TestLoadAndStoreArgs() { var frame = new ILStackFrameWithDiagnostics(); var intType = typeof(int); var rng = Enumerable.Range(0, 8); frame.Args = rng .Select(idx => (object)idx).ToArray(); var stream = new ILInstructionBuilder(); frame.Stream = stream.Instructions; stream.Write(OpCodes.Ldarg_0); stream.Write(OpCodes.Starg, 0); stream.Write(OpCodes.Ldarg_0); stream.Write(OpCodes.Ret); frame.Execute(); Assert.IsTrue(frame.ReturnResult == (int)frame.Args[0], $"Args 0 failed, return result = {frame.ReturnResult ?? "null"}"); stream.Clear(); stream.Write(OpCodes.Ldarg_1); stream.Write(OpCodes.Starg_S, 1); stream.Write(OpCodes.Ldarg_1); stream.Write(OpCodes.Ret); frame.Execute(); Assert.IsTrue(frame.ReturnResult == (int)frame.Args[1], $"Args 1 failed, return result = {frame.ReturnResult ?? "null"}"); stream.Clear(); stream.Write(OpCodes.Ldarg_2); stream.Write(OpCodes.Starg, 2); stream.Write(OpCodes.Ldarg_2); stream.Write(OpCodes.Ret); frame.Execute(); Assert.IsTrue(frame.ReturnResult == (int)frame.Args[2], $"Args 2 failed, return result = {frame.ReturnResult ?? "null"}"); ; stream.Clear(); stream.Write(OpCodes.Ldarg_3); stream.Write(OpCodes.Starg, 3); stream.Write(OpCodes.Ldarg_3); stream.Write(OpCodes.Ret); frame.Execute(); Assert.IsTrue(frame.ReturnResult == (int)frame.Args[3], $"Args 3 failed, return result = {frame.ReturnResult ?? "null"}"); stream.Clear(); stream.Write(OpCodes.Ldarg, 4); stream.Write(OpCodes.Starg, 4); stream.Write(OpCodes.Ldarg, 4); stream.Write(OpCodes.Ret); frame.Execute(); Assert.IsTrue(frame.ReturnResult == (int)frame.Args[4], $"Args(arg=4) failed, return result = {frame.ReturnResult ?? "null"}"); stream.Clear(); stream.Write(OpCodes.Ldarg_S, 5); stream.Write(OpCodes.Starg_S, 5); stream.Write(OpCodes.Ldarg_S, 5); stream.Write(OpCodes.Ret); frame.Execute(); Assert.IsTrue(frame.ReturnResult == (int)frame.Args[5], $"Args(arg=5) failed, return result = {frame.ReturnResult ?? "null"}"); stream.Clear(); stream.Write(OpCodes.Ldarga, 6); stream.Write(OpCodes.Starg_S, 6); stream.Write(OpCodes.Ldarga, 6); stream.Write(OpCodes.Ret); frame.Execute(); Assert.IsTrue(frame.ReturnResult == (int)frame.Args[6], $"Ldarga(arg=6) failed, return result = {frame.ReturnResult ?? "null"}"); stream.Clear(); stream.Write(OpCodes.Ldarga_S, 7); stream.Write(OpCodes.Starg_S, 7); stream.Write(OpCodes.Ldarga_S, 7); stream.Write(OpCodes.Ret); frame.Execute(); Assert.IsTrue(frame.ReturnResult == (int)frame.Args[7], $"Ldarga_S(arg=6) failed, return result = {frame.ReturnResult ?? "null"}"); }
public void TestConvUnsigned() { var frame = new ILStackFrameWithDiagnostics(); var stream = new ILInstructionBuilder(); frame.Stream = stream.Instructions; stream.Clear(); frame.Args = new object[] { byte.MinValue }; stream.Write(OpCodes.Ldarg_0); stream.Write(OpCodes.Conv_U); stream.Write(OpCodes.Ret); frame.Execute(); Assert.IsNull(frame.Exception, $"Frame returned exception: {frame.Exception?.Message}"); Assert.IsTrue(frame.ReturnResult == (uint)byte.MinValue, $"Conv_U byte.MinValue return result = {frame.ReturnResult ?? "null"}"); stream.Clear(); frame.Args = new object[] { byte.MaxValue }; stream.Write(OpCodes.Ldarg_0); stream.Write(OpCodes.Conv_U); stream.Write(OpCodes.Ret); frame.Execute(); Assert.IsNull(frame.Exception, $"Frame returned exception: {frame.Exception?.Message}"); Assert.IsTrue(frame.ReturnResult == (uint)byte.MaxValue, $"Conv_U byte.MaxValue return result = {frame.ReturnResult ?? "null"}"); stream.Clear(); frame.Args = new object[] { byte.MinValue }; stream.Write(OpCodes.Ldarg_0); stream.Write(OpCodes.Conv_U1); stream.Write(OpCodes.Ret); frame.Execute(); Assert.IsNull(frame.Exception, $"Frame returned exception: {frame.Exception?.Message}"); Assert.IsTrue(frame.ReturnResult == (uint)byte.MinValue, $"Conv_U1 byte.MinValue return result = {frame.ReturnResult ?? "null"}"); stream.Clear(); frame.Args = new object[] { byte.MaxValue }; stream.Write(OpCodes.Ldarg_0); stream.Write(OpCodes.Conv_U1); stream.Write(OpCodes.Ret); frame.Execute(); Assert.IsNull(frame.Exception, $"Frame returned exception: {frame.Exception?.Message}"); Assert.IsTrue(frame.ReturnResult == (uint)byte.MaxValue, $"Conv_U1 byte.MaxValue return result = {frame.ReturnResult ?? "null"}"); stream.Clear(); frame.Args = new object[] { ushort.MinValue }; stream.Write(OpCodes.Ldarg_0); stream.Write(OpCodes.Conv_U2); stream.Write(OpCodes.Ret); frame.Execute(); Assert.IsNull(frame.Exception, $"Frame returned exception: {frame.Exception?.Message}"); Assert.IsTrue(frame.ReturnResult == (uint)ushort.MinValue, $"Conv_U2 ushort.MinValue return result = {frame.ReturnResult ?? "null"}"); stream.Clear(); frame.Args = new object[] { ushort.MaxValue }; stream.Write(OpCodes.Ldarg_0); stream.Write(OpCodes.Conv_U2); stream.Write(OpCodes.Ret); frame.Execute(); Assert.IsNull(frame.Exception, $"Frame returned exception: {frame.Exception?.Message}"); Assert.IsTrue(frame.ReturnResult == (uint)ushort.MaxValue, $"Conv_U2 ushort.MaxValue return result = {frame.ReturnResult ?? "null"}"); stream.Clear(); frame.Args = new object[] { uint.MinValue }; stream.Write(OpCodes.Ldarg_0); stream.Write(OpCodes.Conv_U4); stream.Write(OpCodes.Ret); frame.Execute(); Assert.IsNull(frame.Exception, $"Frame returned exception: {frame.Exception?.Message}"); Assert.IsTrue(frame.ReturnResult == (uint)uint.MinValue, $"Conv_U4 uint.MinValue return result = {frame.ReturnResult ?? "null"}"); stream.Clear(); frame.Args = new object[] { uint.MaxValue }; stream.Write(OpCodes.Ldarg_0); stream.Write(OpCodes.Conv_U4); stream.Write(OpCodes.Ret); frame.Execute(); Assert.IsNull(frame.Exception, $"Frame returned exception: {frame.Exception?.Message}"); Assert.IsTrue(frame.ReturnResult == (uint)uint.MaxValue, $"Conv_U4 uint.MaxValue return result = {frame.ReturnResult ?? "null"}"); stream.Clear(); frame.Args = new object[] { ulong.MinValue }; stream.Write(OpCodes.Ldarg_0); stream.Write(OpCodes.Conv_U8); stream.Write(OpCodes.Ret); frame.Execute(); Assert.IsNull(frame.Exception, $"Frame returned exception: {frame.Exception?.Message}"); Assert.IsTrue(frame.ReturnResult == ulong.MinValue, $"ConvU_U8 ulong.MinValue return result = {frame.ReturnResult ?? "null"}"); stream.Clear(); frame.Args = new object[] { ulong.MaxValue }; stream.Write(OpCodes.Ldarg_0); stream.Write(OpCodes.Conv_U8); stream.Write(OpCodes.Ret); frame.Execute(); Assert.IsNull(frame.Exception, $"Frame returned exception: {frame.Exception?.Message}"); Assert.IsTrue(frame.ReturnResult == ulong.MaxValue, $"Conv_U8 ulong.MaxValue return result = {frame.ReturnResult ?? "null"}"); }
public void TestConvSigned() { var frame = new ILStackFrameWithDiagnostics(); var stream = new ILInstructionBuilder(); frame.Stream = stream.Instructions; stream.Clear(); frame.Args = new object[] { sbyte.MinValue }; stream.Write(OpCodes.Ldarg_0); stream.Write(OpCodes.Conv_I); stream.Write(OpCodes.Ret); frame.Execute(); Assert.IsNull(frame.Exception, $"Frame returned exception: {frame.Exception?.Message}"); Assert.IsTrue(frame.ReturnResult == (int)sbyte.MinValue, $"Conv_I sbyte.MinValue return result = {frame.ReturnResult ?? "null"}"); stream.Clear(); frame.Args = new object[] { byte.MinValue }; stream.Write(OpCodes.Ldarg_0); stream.Write(OpCodes.Conv_I); stream.Write(OpCodes.Ret); frame.Execute(); Assert.IsNull(frame.Exception, $"Frame returned exception: {frame.Exception?.Message}"); Assert.IsTrue(frame.ReturnResult == (int)byte.MinValue, $"Conv_I byte.MinValue return result = {frame.ReturnResult ?? "null"}"); stream.Clear(); frame.Args = new object[] { byte.MaxValue }; stream.Write(OpCodes.Ldarg_0); stream.Write(OpCodes.Conv_I); stream.Write(OpCodes.Ret); frame.Execute(); Assert.IsNull(frame.Exception, $"Frame returned exception: {frame.Exception?.Message}"); Assert.IsTrue(frame.ReturnResult == (int)byte.MaxValue, $"Conv_I byte.MaxValue return result = {frame.ReturnResult ?? "null"}"); stream.Clear(); frame.Args = new object[] { sbyte.MinValue }; stream.Write(OpCodes.Ldarg_0); stream.Write(OpCodes.Conv_I1); stream.Write(OpCodes.Ret); frame.Execute(); Assert.IsNull(frame.Exception, $"Frame returned exception: {frame.Exception?.Message}"); Assert.IsTrue(frame.ReturnResult == (int)sbyte.MinValue, $"Conv_I1 sbyte.MinValue return result = {frame.ReturnResult ?? "null"}"); stream.Clear(); frame.Args = new object[] { sbyte.MaxValue }; stream.Write(OpCodes.Ldarg_0); stream.Write(OpCodes.Conv_I1); stream.Write(OpCodes.Ret); frame.Execute(); Assert.IsNull(frame.Exception, $"Frame returned exception: {frame.Exception?.Message}"); Assert.IsTrue(frame.ReturnResult == (int)sbyte.MaxValue, $"Conv_I1 sbyte.MaxValue return result = {frame.ReturnResult ?? "null"}"); stream.Clear(); frame.Args = new object[] { short.MinValue }; stream.Write(OpCodes.Ldarg_0); stream.Write(OpCodes.Conv_I2); stream.Write(OpCodes.Ret); frame.Execute(); Assert.IsNull(frame.Exception, $"Frame returned exception: {frame.Exception?.Message}"); Assert.IsTrue(frame.ReturnResult == (int)short.MinValue, $"Conv_I1 short.MinValue return result = {frame.ReturnResult ?? "null"}"); stream.Clear(); frame.Args = new object[] { short.MaxValue }; stream.Write(OpCodes.Ldarg_0); stream.Write(OpCodes.Conv_I2); stream.Write(OpCodes.Ret); frame.Execute(); Assert.IsNull(frame.Exception, $"Frame returned exception: {frame.Exception?.Message}"); Assert.IsTrue(frame.ReturnResult == (int)short.MaxValue, $"Conv_I2 short.MaxValue return result = {frame.ReturnResult ?? "null"}"); stream.Clear(); frame.Args = new object[] { int.MinValue }; stream.Write(OpCodes.Ldarg_0); stream.Write(OpCodes.Conv_I4); stream.Write(OpCodes.Ret); frame.Execute(); Assert.IsNull(frame.Exception, $"Frame returned exception: {frame.Exception?.Message}"); Assert.IsTrue(frame.ReturnResult == (int)int.MinValue, $"Conv_I4 int.MinValue return result = {frame.ReturnResult ?? "null"}"); stream.Clear(); frame.Args = new object[] { int.MaxValue }; stream.Write(OpCodes.Ldarg_0); stream.Write(OpCodes.Conv_I4); stream.Write(OpCodes.Ret); frame.Execute(); Assert.IsNull(frame.Exception, $"Frame returned exception: {frame.Exception?.Message}"); Assert.IsTrue(frame.ReturnResult == (int)int.MaxValue, $"Conv_I4 int.MaxValue return result = {frame.ReturnResult ?? "null"}"); stream.Clear(); frame.Args = new object[] { long.MinValue }; stream.Write(OpCodes.Ldarg_0); stream.Write(OpCodes.Conv_I8); stream.Write(OpCodes.Ret); frame.Execute(); Assert.IsNull(frame.Exception, $"Frame returned exception: {frame.Exception?.Message}"); Assert.IsTrue(frame.ReturnResult == long.MinValue, $"Conv_I8 long.MinValue return result = {frame.ReturnResult ?? "null"}"); stream.Clear(); frame.Args = new object[] { long.MaxValue }; stream.Write(OpCodes.Ldarg_0); stream.Write(OpCodes.Conv_I8); stream.Write(OpCodes.Ret); frame.Execute(); Assert.IsNull(frame.Exception, $"Frame returned exception: {frame.Exception?.Message}"); Assert.IsTrue(frame.ReturnResult == long.MaxValue, $"Conv_I8 long.MaxValue return result = {frame.ReturnResult ?? "null"}"); }
public void TesCheckInfinity() { var frame = new ILStackFrameWithDiagnostics(); var stream = new ILInstructionBuilder(); frame.Stream = stream.Instructions; stream.Clear(); stream.Write(ILOpCodeValues.Ldc_R4, float.NegativeInfinity); stream.Write(OpCodes.Ckfinite); stream.Write(OpCodes.Ret); frame.Execute(); Assert.IsTrue(frame.ReturnResult == true, $"Ckfinite float.NegativeInfinity, return result = {frame.ReturnResult ?? "null"}"); stream.Clear(); stream.Write(OpCodes.Ldc_R4, float.PositiveInfinity); stream.Write(OpCodes.Ckfinite); stream.Write(OpCodes.Ret); frame.Execute(); Assert.IsTrue(frame.ReturnResult == true, $"Ckfinite float.PositiveInfinity, return result = {frame.ReturnResult ?? "null"}"); stream.Clear(); stream.Write(OpCodes.Ldc_R4, 1.0f); stream.Write(OpCodes.Ckfinite); stream.Write(OpCodes.Ret); frame.Execute(); Assert.IsTrue(frame.ReturnResult == false, $"Ckfinite float.PositiveInfinity, return result = {frame.ReturnResult ?? "null"}"); stream.Clear(); stream.Write(OpCodes.Ldc_R4, 1); stream.Write(OpCodes.Ckfinite); stream.Write(OpCodes.Ret); frame.Execute(); Assert.IsTrue(frame.ReturnResult == false, $"Ckfinite float.PositiveInfinity, return result = {frame.ReturnResult ?? "null"}"); stream.Clear(); stream.Write(OpCodes.Ldc_R8, double.NegativeInfinity); stream.Write(OpCodes.Ckfinite); stream.Write(OpCodes.Ret); frame.Execute(); Assert.IsTrue(frame.ReturnResult == true, $"Ckfinite double.NegativeInfinityd, return result = {frame.ReturnResult ?? "null"}"); stream.Clear(); stream.Write(OpCodes.Ldc_R8, double.PositiveInfinity); stream.Write(OpCodes.Ckfinite); stream.Write(OpCodes.Ret); frame.Execute(); Assert.IsTrue(frame.ReturnResult == true, $"Ckfinite double.PositiveInfinity, return result = {frame.ReturnResult ?? "null"}"); stream.Clear(); stream.Write(OpCodes.Ldc_R8, 1.0); stream.Write(OpCodes.Ckfinite); stream.Write(OpCodes.Ret); frame.Execute(); Assert.IsTrue(frame.ReturnResult == false, $"Ckfinite 1.0, return result = {frame.ReturnResult ?? "null"}"); stream.Clear(); stream.Write(OpCodes.Ldc_R8, 1); stream.Write(OpCodes.Ckfinite); stream.Write(OpCodes.Ret); frame.Execute(); Assert.IsTrue(frame.ReturnResult == false, $"Ckfinite 1, return result = {frame.ReturnResult ?? "null"}"); }
void ExecuteAndAssertResult(ILStackFrameWithDiagnostics <ILEngineCompiled> frame, object expected, OperandType operandType) { Execute(frame); AssertResult(frame, expected, operandType); //AssertEmptyStackWithResult(frame, expected); }