Skip to content

Commit aaf0aa4

Browse files
committed
AssertOpCodes
1 parent c0e06b9 commit aaf0aa4

File tree

26 files changed

+140
-144
lines changed

26 files changed

+140
-144
lines changed

src/FastExpressionCompiler/TestTools.cs

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -42,20 +42,25 @@ static TestTools()
4242
#endif
4343
}
4444

45-
public static void AssertOpCodes(this Delegate @delegate, params OpCode[] expectedCodes) =>
46-
AssertOpCodes(@delegate.Method, expectedCodes);
45+
public static void AssertOpCodes(this Delegate dlg, params OpCode[] expectedCodes)
46+
{
47+
if (dlg.TryGetDebugInfo() is var diagInfo)
48+
AssertOpCodes(diagInfo.ILInstructions, expectedCodes);
49+
else
50+
AssertOpCodes(dlg.Method, expectedCodes);
51+
}
52+
53+
public static void AssertOpCodes(this MethodInfo method, params OpCode[] expectedCodes) =>
54+
AssertOpCodes(ILReaderFactory.GetILReaderOrNull(method)?.ToArray() ?? [], expectedCodes);
4755

48-
public static void AssertOpCodes(this MethodInfo method, params OpCode[] expectedCodes)
56+
public static void AssertOpCodes(this IDelegateDebugInfo debugInfo, params OpCode[] expectedCodes) =>
57+
AssertOpCodes(debugInfo.ILInstructions, expectedCodes);
58+
59+
public static void AssertOpCodes(this IEnumerable<ILInstruction> il, params OpCode[] expectedCodes)
4960
{
5061
if (DisableAssertOpCodes) return;
5162

52-
var ilReader = ILReaderFactory.GetILReaderOrNull(method);
53-
if (ilReader is null)
54-
{
55-
Debug.WriteLine($"Reading IL is currently not supported");
56-
return;
57-
}
58-
var actualCodes = ilReader.Select(x => x.OpCode).ToArray();
63+
var actualCodes = il.Select(x => x.OpCode).ToArray();
5964

6065
var sb = new StringBuilder();
6166
var index = 0;

test/FastExpressionCompiler.IssueTests/Issue159_NumericConversions.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ public void UnsignedNullableLongComparison()
118118
var expectedResult = expected(new ValueHolder<ulong?> { Value = ulong.MaxValue });
119119
Asserts.AreEqual(false, expectedResult);
120120

121-
var actual = lambdaExpr.CompileFast(true);
121+
var actual = lambdaExpr.CompileFast(true, CompilerFlags.EnableDelegateDebugInfo);
122122

123123
actual.Method.AssertOpCodes(
124124
OpCodes.Ldarg_1,
@@ -315,7 +315,7 @@ public void ComparisonsWithConversionsShouldWork3()
315315
var expr = Lambda<Func<ValueHolder<float>, bool>>(condition, floatParamExpr);
316316
var source = new ValueHolder<float> { Value = float.MaxValue };
317317

318-
var compiledFast = expr.CompileFast(true);
318+
var compiledFast = expr.CompileFast(true, CompilerFlags.EnableDelegateDebugInfo);
319319

320320
compiledFast.AssertOpCodes(
321321
OpCodes.Ldarg_1,
@@ -346,7 +346,7 @@ public void ComparisonsWithConversionsShouldWork4()
346346
var compiled = expr.CompileSys();
347347
compiled.PrintIL();
348348

349-
var compiledFast = expr.CompileFast(true);
349+
var compiledFast = expr.CompileFast(true, CompilerFlags.EnableDelegateDebugInfo);
350350
compiledFast.PrintIL();
351351

352352
compiledFast.AssertOpCodes(
@@ -632,7 +632,7 @@ public void NullableIntToDoubleCastsShouldWork()
632632
block,
633633
nullableIntHolderParam);
634634

635-
var adapt = adaptExpr.CompileFast(true);
635+
var adapt = adaptExpr.CompileFast(true, CompilerFlags.EnableDelegateDebugInfo);
636636
adapt.Method.AssertOpCodes(
637637
OpCodes.Newobj,
638638
OpCodes.Stloc_0, // todo: can be replaced with dup #
@@ -663,7 +663,7 @@ public void NullableIntToDoubleCastsShouldWork_with_MemberInit()
663663
var adaptExpr = Lambda<Func<ValueHolder<int?>, ValueHolder<double>>>(
664664
memberInit, nullableIntHolderParam);
665665

666-
var adapt = adaptExpr.CompileFast(true);
666+
var adapt = adaptExpr.CompileFast(true, CompilerFlags.EnableDelegateDebugInfo);
667667

668668
adapt.Method.AssertOpCodes(
669669
OpCodes.Newobj,
@@ -702,7 +702,7 @@ public void NullableDecimalToDoubleCastsShouldWork()
702702

703703
var source = new ValueHolder<decimal?> { Value = 938378.637m };
704704

705-
var adapt = expr.CompileFast(true);
705+
var adapt = expr.CompileFast(true, CompilerFlags.EnableDelegateDebugInfo);
706706
adapt.Method.AssertOpCodes(
707707
OpCodes.Newobj,
708708
OpCodes.Stloc_0, // todo: can be simplified with dup #173
@@ -742,7 +742,7 @@ public void DecimalToNullableDoubleCastsShouldWork()
742742

743743
var source = new ValueHolder<decimal> { Value = 5332.00m };
744744

745-
var adapt = expr.CompileFast(true);
745+
var adapt = expr.CompileFast(true, CompilerFlags.EnableDelegateDebugInfo);
746746
adapt.Method.AssertOpCodes(
747747
OpCodes.Newobj,
748748
OpCodes.Stloc_0, // todo: can be simplified with dup #173

test/FastExpressionCompiler.IssueTests/Issue170_Serializer_Person_Ref.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ void LocalAssert(DeserializeDelegate<Person> invoke)
7474
func.PrintIL();
7575
LocalAssert(func);
7676

77-
var funcFast = lambda.CompileFast(true);
77+
var funcFast = lambda.CompileFast(true, CompilerFlags.EnableDelegateDebugInfo);
7878
funcFast.PrintIL();
7979
funcFast.AssertOpCodes(
8080
OpCodes.Ldarg_3,
@@ -180,7 +180,7 @@ void LocalAssert(DeserializeDelegateSimple<SimplePersonStruct> invoke)
180180
s.PrintIL();
181181
// LocalAssert(s); // system thing does not work for the structs, but works for the class
182182

183-
var f = lambda.CompileFast(true);
183+
var f = lambda.CompileFast(true, CompilerFlags.EnableDelegateDebugInfo);
184184
f.PrintIL();
185185
f.AssertOpCodes(
186186
OpCodes.Ldarg_1,
@@ -224,7 +224,7 @@ void LocalAssert(DeserializeDelegateSimple<SimplePersonClass> invoke)
224224
s.PrintIL();
225225
LocalAssert(s); // works for class
226226

227-
var f = lambda.CompileFast(true);
227+
var f = lambda.CompileFast(true, CompilerFlags.EnableDelegateDebugInfo);
228228
f.PrintIL();
229229
f.AssertOpCodes(
230230
OpCodes.Ldarg_1,

test/FastExpressionCompiler.IssueTests/Issue243_Pass_Parameter_By_Ref_is_supported.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ public void Lambda_Ref_Parameter_Passed_Into_Static_Value_Method()
9292
var a = "test";
9393
Asserts.AreEqual(a, systCompiled(ref a));
9494

95-
var fastCompiled = lambda.CompileFast(ifFastFailedReturnNull: true);
95+
var fastCompiled = lambda.CompileFast(ifFastFailedReturnNull: true, CompilerFlags.EnableDelegateDebugInfo);
9696
Asserts.IsNotNull(fastCompiled);
9797

9898
fastCompiled.AssertOpCodes(
@@ -131,7 +131,7 @@ public void Lambda_Ref_Parameter_Passed_Into_Instance_Value_Method()
131131
var a = "test";
132132
Asserts.AreEqual(a, systCompiled(ref cls, ref a));
133133

134-
var fastCompiled = lambda.CompileFast(ifFastFailedReturnNull: true);
134+
var fastCompiled = lambda.CompileFast(ifFastFailedReturnNull: true, CompilerFlags.EnableDelegateDebugInfo);
135135
Asserts.IsNotNull(fastCompiled);
136136

137137
fastCompiled.AssertOpCodes(
@@ -172,7 +172,7 @@ public void Lambda_Ref_Parameter_Passed_Into_Struct_Instance_Value_Method()
172172
var a = 1;
173173
Asserts.AreEqual("1", systCompiled(ref cls, ref a));
174174

175-
var fastCompiled = lambda.CompileFast(ifFastFailedReturnNull: true);
175+
var fastCompiled = lambda.CompileFast(ifFastFailedReturnNull: true, CompilerFlags.EnableDelegateDebugInfo);
176176
Asserts.IsNotNull(fastCompiled);
177177
fastCompiled.PrintIL();
178178

@@ -195,7 +195,7 @@ public void Lambda_Ref_ValueType_Parameter_Passed_Into_Value_Method()
195195

196196
var lambda = Lambda<RefValueTypeDelegate>(call, parameter);
197197

198-
var fastCompiled = lambda.CompileFast(ifFastFailedReturnNull: true);
198+
var fastCompiled = lambda.CompileFast(ifFastFailedReturnNull: true, CompilerFlags.EnableDelegateDebugInfo);
199199
Asserts.IsNotNull(fastCompiled);
200200

201201
fastCompiled.Method.AssertOpCodes(

test/FastExpressionCompiler.IssueTests/Issue248_Calling_method_with_in_out_parameters_in_expression_lead_to_NullReferenceException_on_calling_site.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ public void Test_1()
3333

3434
expr.PrintCSharp();
3535

36-
var serialize = expr.CompileFast(true);
36+
var serialize = expr.CompileFast(true, CompilerFlags.EnableDelegateDebugInfo);
3737
Asserts.IsNotNull(serialize);
3838
serialize.PrintIL();
3939

@@ -74,7 +74,7 @@ public void Test_2()
7474
OpCodes.Callvirt,
7575
OpCodes.Ret);
7676

77-
var serialize = expr.CompileFast(true);
77+
var serialize = expr.CompileFast(true, CompilerFlags.EnableDelegateDebugInfo);
7878
Asserts.IsNotNull(serialize);
7979
serialize.PrintIL();
8080

@@ -113,7 +113,7 @@ public void Test_3()
113113
OpCodes.Callvirt,
114114
OpCodes.Ret);
115115

116-
var serialize = expr.CompileFast(true);
116+
var serialize = expr.CompileFast(true, CompilerFlags.EnableDelegateDebugInfo);
117117
Asserts.IsNotNull(serialize);
118118
serialize.PrintIL();
119119

@@ -157,7 +157,7 @@ public void Test_4()
157157
OpCodes.Callvirt,
158158
OpCodes.Ret);
159159

160-
var serialize = expr.CompileFast(true);
160+
var serialize = expr.CompileFast(true, CompilerFlags.EnableDelegateDebugInfo);
161161
Asserts.IsNotNull(serialize);
162162
serialize.PrintIL();
163163

test/FastExpressionCompiler.IssueTests/Issue251_Bad_code_gen_for_byRef_parameters.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public void Test_1()
2929

3030
expr.PrintCSharp();
3131

32-
var f = expr.CompileFast(true);
32+
var f = expr.CompileFast(true, CompilerFlags.EnableDelegateDebugInfo);
3333
Asserts.IsNotNull(f);
3434
f.PrintIL();
3535

test/FastExpressionCompiler.IssueTests/Issue261_Loop_wih_conditions_fails.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -608,7 +608,7 @@ public void Test_class_items_array_index_via_variable_access_then_the_member_acc
608608
var fs = e.CompileSys();
609609
fs.PrintIL();
610610

611-
var ff = e.CompileFast(true);
611+
var ff = e.CompileFast(true, CompilerFlags.EnableDelegateDebugInfo);
612612
ff.AssertOpCodes(
613613
OpCodes.Ldarg_2,
614614
OpCodes.Stloc_0,
@@ -641,7 +641,7 @@ public void Test_struct_items_array_index_via_variable_access_then_the_member_ac
641641
elArr, index
642642
);
643643

644-
var f = e.CompileFast(true);
644+
var f = e.CompileFast(true, CompilerFlags.EnableDelegateDebugInfo);
645645

646646
f.AssertOpCodes(
647647
OpCodes.Ldarg_2,

test/FastExpressionCompiler.IssueTests/Issue281_Index_Out_of_Range.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ public void Index_Out_of_Range()
4747
var m = new List<string> { "a" };
4848
Asserts.AreEqual("a", fs(m, 0));
4949

50-
var ff = e.CompileFast(true);
50+
var ff = e.CompileFast(true, CompilerFlags.EnableDelegateDebugInfo);
5151
ff.PrintIL();
5252
ff.AssertOpCodes(
5353
OpCodes.Ldarg_1,

test/FastExpressionCompiler.IssueTests/Issue341_Equality_comparison_between_nullable_and_null_inside_Any_produces_incorrect_compiled_expression.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -315,9 +315,7 @@ public void Nullable_decimal_member_not_equal_to_null_inside_predicate()
315315

316316
var dis = f.TryGetDebugInfo();
317317
foreach (var di in dis.EnumerateNestedLambdas())
318-
{
319318
di.PrintIL("predicate");
320-
}
321319

322320
var instance = new Test()
323321
{

test/FastExpressionCompiler.IssueTests/Issue347_InvalidProgramException_on_compiling_an_expression_that_returns_a_record_which_implements_IList.cs

Lines changed: 13 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -87,24 +87,20 @@ public void Test_struct_parameter_in_closure_of_the_nested_lambda()
8787

8888
var di = f.TryGetDebugInfo();
8989
foreach (var ni in di.EnumerateNestedLambdas())
90+
{
9091
ni.PrintIL("nested");
91-
92-
//todo: @wip #475
93-
// if (f.TryGetDebugClosureNestedLambda(0, out var d))
94-
// {
95-
// d.PrintIL("nested");
96-
// d.AssertOpCodes(
97-
// OpCodes.Ldarg_0,
98-
// OpCodes.Ldfld, // ArrayClosureWithNonPassedParams.NonPassedParams
99-
// OpCodes.Ldc_I4_0,
100-
// OpCodes.Ldelem_Ref,
101-
// OpCodes.Unbox_Any, // NotifyModel
102-
// OpCodes.Stloc_0,
103-
// OpCodes.Ldloca_S, // 0
104-
// OpCodes.Call, // NotifyModel.get_Number1
105-
// OpCodes.Ret
106-
// );
107-
// }
92+
ni.AssertOpCodes(
93+
OpCodes.Ldarg_0,
94+
OpCodes.Ldfld, // ArrayClosureWithNonPassedParams.NonPassedParams
95+
OpCodes.Ldc_I4_0,
96+
OpCodes.Ldelem_Ref,
97+
OpCodes.Unbox_Any, // NotifyModel
98+
OpCodes.Stloc_0,
99+
OpCodes.Ldloca_S, // 0
100+
OpCodes.Call, // NotifyModel.get_Number1
101+
OpCodes.Ret
102+
);
103+
}
108104

109105
var y = f(m);
110106
Asserts.AreEqual(43, y);
@@ -247,9 +243,7 @@ public void Test_original()
247243

248244
var dis = f.TryGetDebugInfo();
249245
foreach (var di in dis.EnumerateNestedLambdas())
250-
{
251246
di.PrintIL("nested");
252-
}
253247

254248
var y = f(container);
255249
Asserts.AreEqual(1, y.Count);

0 commit comments

Comments
 (0)