@@ -17,7 +17,10 @@ public void Run(TestRun t)
1717 {
1818 Quicksort_partition_with_nested_loops ( t ) ;
1919 Comparison_function_with_goto_labels ( t ) ;
20- ArrayInList_ArrayAcceesError ( t ) ;
20+ ArrayInList_NullableInt_ArrayAccessError ( t ) ;
21+ ArrayInList_Int_ArrayAccessError ( t ) ;
22+ ArrayInList_String_ArrayAccessError ( t ) ;
23+ ArrayInList_Struct_ArrayAccess ( t ) ;
2124 }
2225
2326 // Reproduces the sorting use-case from https://github.com/dadhi/FastExpressionCompiler/issues/499
@@ -159,7 +162,7 @@ public void Comparison_function_with_goto_labels(TestContext t)
159162 /// ff raise System.InvalidProgramException: Common Language Runtime detected an invalid program.
160163 /// </summary>
161164 /// <param name="t"></param>
162- public void ArrayInList_ArrayAcceesError ( TestContext t )
165+ public void ArrayInList_NullableInt_ArrayAccessError ( TestContext t )
163166 {
164167 List < Expression > exps = new List < Expression > ( ) ;
165168 var dataArrayList = Parameter ( typeof ( List < int ? [ ] > ) , "dataArrayList" ) ;
@@ -174,24 +177,155 @@ public void ArrayInList_ArrayAcceesError(TestContext t)
174177 exps . Add ( Assign ( left_ListIndex , Constant ( 0 ) ) ) ;
175178 exps . Add ( Assign ( left_ArrayIndex , Constant ( 0 ) ) ) ;
176179 exps . Add ( Assign ( leftVars [ 0 ] , ArrayAccess ( Expression . Property ( dataArrayList , "Item" , left_ListIndex ) , left_ArrayIndex ) ) ) ;
180+ LabelTarget endMain = Expression . Label ( typeof ( int ? ) , "endMain" ) ;
181+ exps . Add ( Expression . Label ( endMain , leftVars [ 0 ] ) ) ;
177182
178183 BlockExpression block = Block (
179184 vars . ToArray ( ) , exps
180185 ) ;
181- var expr = Lambda < Action < List < int ? [ ] > > > ( block , dataArrayList ) ;
186+ var expr = Lambda < Func < List < int ? [ ] > , int ? > > ( block , dataArrayList ) ;
182187 expr . PrintCSharp ( ) ;
183188
184189 List < int ? [ ] > data1 = new List < int ? [ ] > { new int ? [ ] { 1 } } ;
185190 List < int ? [ ] > data2 = new List < int ? [ ] > { new int ? [ ] { 1 } } ;
186191
192+ var fs = expr . CompileSys ( ) ;
193+ fs . PrintIL ( ) ;
194+ t . AreEqual ( 1 , fs ( data1 ) ) ;
195+
196+ var ff = expr . CompileFast ( ifFastFailedReturnNull : true ) ;
197+ t . IsNotNull ( ff ) ;
198+ ff . PrintIL ( ) ;
199+ t . AreEqual ( 1 , ff ( data2 ) ) ;
200+ }
201+
202+ /// <summary>
203+ /// ff raise System.InvalidProgramException: Common Language Runtime detected an invalid program.
204+ /// </summary>
205+ /// <param name="t"></param>
206+ public void ArrayInList_Int_ArrayAccessError ( TestContext t )
207+ {
208+ List < Expression > exps = new List < Expression > ( ) ;
209+ var dataArrayList = Parameter ( typeof ( List < int [ ] > ) , "dataArrayList" ) ;
210+ List < ParameterExpression > vars = new List < ParameterExpression > ( ) ;
211+ var left_ListIndex = Parameter ( typeof ( int ) , "left_ListIndex" ) ;
212+ var left_ArrayIndex = Parameter ( typeof ( int ) , "left_ArrayIndex" ) ;
213+
214+ vars . AddRange ( new ParameterExpression [ ] { left_ListIndex , left_ArrayIndex } ) ;
215+ var leftVars = new ParameterExpression [ 1 ] ;
216+ leftVars [ 0 ] = Parameter ( typeof ( int ) , $ "left_{ 0 } ") ;
217+ vars . Add ( leftVars [ 0 ] ) ;
218+ exps . Add ( Assign ( left_ListIndex , Constant ( 0 ) ) ) ;
219+ exps . Add ( Assign ( left_ArrayIndex , Constant ( 0 ) ) ) ;
220+ exps . Add ( Assign ( leftVars [ 0 ] , ArrayAccess ( Expression . Property ( dataArrayList , "Item" , left_ListIndex ) , left_ArrayIndex ) ) ) ;
221+ LabelTarget endMain = Expression . Label ( typeof ( int ) , "endMain" ) ;
222+ exps . Add ( Expression . Label ( endMain , leftVars [ 0 ] ) ) ;
223+
224+ BlockExpression block = Block (
225+ vars . ToArray ( ) , exps
226+ ) ;
227+ var expr = Lambda < Func < List < int [ ] > , int > > ( block , dataArrayList ) ;
228+ expr . PrintCSharp ( ) ;
229+
230+ List < int [ ] > data1 = new List < int [ ] > { new int [ ] { 1 } } ;
231+ List < int [ ] > data2 = new List < int [ ] > { new int [ ] { 1 } } ;
232+
233+ var fs = expr . CompileSys ( ) ;
234+ fs . PrintIL ( ) ;
235+ t . AreEqual ( 1 , fs ( data1 ) ) ;
236+
237+ var ff = expr . CompileFast ( ifFastFailedReturnNull : true ) ;
238+ t . IsNotNull ( ff ) ;
239+ ff . PrintIL ( ) ;
240+ t . AreEqual ( 1 , ff ( data2 ) ) ;
241+ }
242+
243+
244+ /// <summary>
245+ /// ff raise System.InvalidProgramException: Common Language Runtime detected an invalid program.
246+ /// </summary>
247+ /// <param name="t"></param>
248+ public void ArrayInList_String_ArrayAccessError ( TestContext t )
249+ {
250+ List < Expression > exps = new List < Expression > ( ) ;
251+ var dataArrayList = Parameter ( typeof ( List < string [ ] > ) , "dataArrayList" ) ;
252+ List < ParameterExpression > vars = new List < ParameterExpression > ( ) ;
253+ var left_ListIndex = Parameter ( typeof ( int ) , "left_ListIndex" ) ;
254+ var left_ArrayIndex = Parameter ( typeof ( int ) , "left_ArrayIndex" ) ;
255+
256+ vars . AddRange ( new ParameterExpression [ ] { left_ListIndex , left_ArrayIndex } ) ;
257+ var leftVars = new ParameterExpression [ 1 ] ;
258+ leftVars [ 0 ] = Parameter ( typeof ( string ) , $ "left_{ 0 } ") ;
259+ vars . Add ( leftVars [ 0 ] ) ;
260+ exps . Add ( Assign ( left_ListIndex , Constant ( 0 ) ) ) ;
261+ exps . Add ( Assign ( left_ArrayIndex , Constant ( 0 ) ) ) ;
262+ exps . Add ( Assign ( leftVars [ 0 ] , ArrayAccess ( Expression . Property ( dataArrayList , "Item" , left_ListIndex ) , left_ArrayIndex ) ) ) ;
263+ LabelTarget endMain = Expression . Label ( typeof ( string ) , "endMain" ) ;
264+ exps . Add ( Expression . Label ( endMain , leftVars [ 0 ] ) ) ;
265+
266+ BlockExpression block = Block (
267+ vars . ToArray ( ) , exps
268+ ) ;
269+ var expr = Lambda < Func < List < string [ ] > , string > > ( block , dataArrayList ) ;
270+ expr . PrintCSharp ( ) ;
187271
272+ List < string [ ] > data1 = new List < string [ ] > { new string [ ] { "test1" } } ;
273+ List < string [ ] > data2 = new List < string [ ] > { new string [ ] { "test2" } } ;
188274 var fs = expr . CompileSys ( ) ;
189275 fs . PrintIL ( ) ;
190- fs ( data1 ) ;
276+ t . AreEqual ( "test1" , fs ( data1 ) ) ;
191277
192278 var ff = expr . CompileFast ( ifFastFailedReturnNull : true ) ;
193279 t . IsNotNull ( ff ) ;
194280 ff . PrintIL ( ) ;
195- ff ( data2 ) ;
281+ t . AreEqual ( "test2" , ff ( data2 ) ) ;
282+ }
283+
284+ /// <summary>
285+ /// passed before fix issue 499
286+ /// </summary>
287+ /// <param name="t"></param>
288+ public void ArrayInList_Struct_ArrayAccess ( TestContext t )
289+ {
290+ List < Expression > exps = new List < Expression > ( ) ;
291+ var dataArrayList = Parameter ( typeof ( List < SomeStruct [ ] > ) , "dataArrayList" ) ;
292+ List < ParameterExpression > vars = new List < ParameterExpression > ( ) ;
293+ var left_ListIndex = Parameter ( typeof ( int ) , "left_ListIndex" ) ;
294+ var left_ArrayIndex = Parameter ( typeof ( int ) , "left_ArrayIndex" ) ;
295+
296+ vars . AddRange ( new ParameterExpression [ ] { left_ListIndex , left_ArrayIndex } ) ;
297+ var leftVars = new ParameterExpression [ 1 ] ;
298+ leftVars [ 0 ] = Parameter ( typeof ( int ? ) , $ "left_{ 0 } ") ;
299+ vars . Add ( leftVars [ 0 ] ) ;
300+ exps . Add ( Assign ( left_ListIndex , Constant ( 0 ) ) ) ;
301+ exps . Add ( Assign ( left_ArrayIndex , Constant ( 0 ) ) ) ;
302+ exps . Add ( Assign ( leftVars [ 0 ] , Property ( ArrayAccess ( Property ( dataArrayList , "Item" , left_ListIndex ) , left_ArrayIndex ) , "Foo" ) ) ) ;
303+ LabelTarget endMain = Expression . Label ( typeof ( int ? ) , "endMain" ) ;
304+ exps . Add ( Expression . Label ( endMain , leftVars [ 0 ] ) ) ;
305+
306+ BlockExpression block = Block (
307+ vars . ToArray ( ) , exps
308+ ) ;
309+ var expr = Lambda < Func < List < SomeStruct [ ] > , int ? > > ( block , dataArrayList ) ;
310+ expr . PrintCSharp ( ) ;
311+
312+ List < SomeStruct [ ] > data1 = new List < SomeStruct [ ] > { new SomeStruct [ ] { new SomeStruct { Foo = 1 } } } ;
313+ List < SomeStruct [ ] > data2 = new List < SomeStruct [ ] > { new SomeStruct [ ] { new SomeStruct { Foo = 1 } } } ;
314+
315+ var fs = expr . CompileSys ( ) ;
316+ fs . PrintIL ( ) ;
317+ var resultFs = fs ( data1 ) ;
318+ t . AreEqual ( 1 , resultFs ) ;
319+
320+ var ff = expr . CompileFast ( ifFastFailedReturnNull : true ) ;
321+ t . IsNotNull ( ff ) ;
322+ ff . PrintIL ( ) ;
323+ var resultFf = ff ( data2 ) ;
324+ t . AreEqual ( 1 , resultFf ) ;
325+ }
326+
327+ public struct SomeStruct
328+ {
329+ public int ? Foo { get ; set ; }
196330 }
197331}
0 commit comments