@@ -27,16 +27,16 @@ public int Run()
27
27
Block_local_variable_assignment_with_member_init ( ) ;
28
28
Block_local_variable_assignment_with_member_init_array_closure ( ) ;
29
29
Block_local_variable_assignment_with_lambda_invoke ( ) ;
30
-
31
- // todo: @fix #255 Nested Lambda Invoke does not work in Block
32
- // Block_local_variable_assignment_returning_the_nested_lambda_which_reassigns_the_variable ();
33
-
34
- // Block_local_variable_assignment_with_lambda_invoke_plus_external_assignment();
35
- // Block_local_variable_assignment_with_lambda_invoke_array_closure();
36
- // Block_local_variable_assignment_with_lambda_invoke_with_param_override();
37
- // Block_local_variable_assignment_with_lambda_invoke_with_param_override_array_closure();
38
-
39
- return 13 ;
30
+ Block_returning_the_nested_lambda_assigning_the_outer_parameter ( ) ;
31
+ Block_calling_non_void_method_returning_the_nested_lambda_assigning_the_outer_parameter ( ) ;
32
+ Block_assigning_local_variable_then_returning_the_nested_lambda_which_reassigns_the_variable ( ) ;
33
+ Block_assigning_local_ValueType_variable_then_returning_the_nested_lambda_which_reassigns_the_variable ( ) ;
34
+ Block_local_variable_assignment_with_lambda_invoke_plus_external_assignment ( ) ;
35
+ Block_local_variable_assignment_with_lambda_invoke_array_closure ( ) ;
36
+ Block_local_variable_assignment_with_lambda_invoke_with_param_override ( ) ;
37
+ Block_local_variable_assignment_with_lambda_invoke_with_param_override_array_closure ( ) ;
38
+
39
+ return 17 ;
40
40
}
41
41
42
42
[ Test ]
@@ -98,43 +98,72 @@ public void Block_local_variable_assignment_with_lambda_invoke()
98
98
Assert . AreEqual ( 6 , f ( ) ) ;
99
99
}
100
100
101
- // todo: @fix Invoke CLR crash
101
+ public static int Inc ( int i ) => i + 1 ;
102
+
102
103
[ Test ]
103
- public void Block_local_variable_assignment_returning_the_nested_lambda_which_reassigns_the_variable ( )
104
+ public void Block_calling_non_void_method_returning_the_nested_lambda_assigning_the_outer_parameter ( )
104
105
{
105
- var variable = Variable ( typeof ( int ) ) ;
106
-
107
- var block = Block ( new [ ] { variable } ,
108
- Assign ( variable , Constant ( 35 ) ) ,
109
- Lambda ( Assign ( variable , Constant ( 42 ) ) ) ) ;
106
+ var p = Parameter ( typeof ( int ) , "p" ) ;
110
107
111
- var lambda = Lambda < Func < Func < int > > > ( block ) ;
108
+ var lambda = Lambda < Func < int , Func < int > > > (
109
+ Block (
110
+ Call ( null , GetType ( ) . GetTypeInfo ( ) . GetDeclaredMethod ( nameof ( Inc ) ) , p ) ,
111
+ Lambda ( Assign ( p , Constant ( 42 ) ) )
112
+ ) ,
113
+ p ) ;
112
114
113
115
#if LIGHT_EXPRESSION
114
116
lambda . PrintCSharpString ( ) ;
115
117
#endif
116
-
117
118
var s = lambda . CompileSys ( ) ;
118
119
s . PrintIL ( "system il" ) ;
119
120
120
- var f = lambda . CompileFast < Func < Func < int > > > ( true ) ;
121
+ var f = lambda . CompileFast < Func < int , Func < int > > > ( true ) ;
121
122
f . PrintIL ( "fec il" ) ;
122
123
123
124
Assert . NotNull ( f ) ;
124
- Assert . AreEqual ( 6 , f ( ) ( ) ) ;
125
+ var ff = f ( 17 ) ;
126
+ Assert . IsInstanceOf < Func < int > > ( ff ) ;
127
+
128
+ Assert . AreEqual ( 42 , ff ( ) ) ;
125
129
}
126
130
127
- // todo: @fix Invoke CLR crash
128
131
[ Test ]
129
- public void Block_local_variable_assignment_with_lambda_invoke_plus_external_assignment ( )
132
+ public void Block_returning_the_nested_lambda_assigning_the_outer_parameter ( )
130
133
{
131
- var variable = Variable ( typeof ( int ) ) ;
134
+ var p = Parameter ( typeof ( int ) , "p" ) ;
132
135
133
- var block = Block ( new [ ] { variable } ,
134
- Assign ( variable , Constant ( 5 ) ) ,
135
- Invoke ( Lambda ( Assign ( variable , Constant ( 6 ) ) ) ) ) ;
136
+ var lambda = Lambda < Func < int , Func < int > > > (
137
+ Lambda ( Assign ( p , Constant ( 42 ) ) ) ,
138
+ p ) ;
136
139
137
- var lambda = Lambda < Func < int > > ( block ) ;
140
+ #if LIGHT_EXPRESSION
141
+ lambda . PrintCSharpString ( ) ;
142
+ #endif
143
+ var s = lambda . CompileSys ( ) ;
144
+ s . PrintIL ( "system il" ) ;
145
+
146
+ var f = lambda . CompileFast < Func < int , Func < int > > > ( true ) ;
147
+ f . PrintIL ( "fec il" ) ;
148
+
149
+ Assert . NotNull ( f ) ;
150
+ var ff = f ( 17 ) ;
151
+ Assert . IsInstanceOf < Func < int > > ( ff ) ;
152
+
153
+ Assert . AreEqual ( 42 , ff ( ) ) ;
154
+ }
155
+
156
+ [ Test ]
157
+ public void Block_assigning_local_variable_then_returning_the_nested_lambda_which_reassigns_the_variable ( )
158
+ {
159
+ var variable = Variable ( typeof ( string ) ) ;
160
+
161
+ var lambda = Lambda < Func < Func < string > > > (
162
+ Block ( new [ ] { variable } ,
163
+ Assign ( variable , Constant ( "35" ) ) ,
164
+ Lambda ( Assign ( variable , Constant ( "42" ) ) )
165
+ )
166
+ ) ;
138
167
139
168
#if LIGHT_EXPRESSION
140
169
lambda . PrintCSharpString ( ) ;
@@ -143,11 +172,48 @@ public void Block_local_variable_assignment_with_lambda_invoke_plus_external_ass
143
172
var s = lambda . CompileSys ( ) ;
144
173
s . PrintIL ( "system il" ) ;
145
174
146
- var f = lambda . CompileFast < Func < int > > ( true ) ;
175
+ var f = lambda . CompileFast ( true ) ;
147
176
f . PrintIL ( "fec il" ) ;
148
177
149
- // Assert.NotNull(fastCompiled);
150
- // Assert.AreEqual(6, fastCompiled());
178
+ Assert . NotNull ( f ) ;
179
+ var ff = f ( ) ;
180
+ Assert . IsInstanceOf < Func < string > > ( ff ) ;
181
+ Assert . AreEqual ( "42" , ff ( ) ) ;
182
+ }
183
+
184
+ [ Test ]
185
+ public void Block_assigning_local_ValueType_variable_then_returning_the_nested_lambda_which_reassigns_the_variable ( )
186
+ {
187
+ var variable = Variable ( typeof ( int ) ) ;
188
+
189
+ var lambda = Lambda < Func < Func < int > > > (
190
+ Block ( new [ ] { variable } ,
191
+ Assign ( variable , Constant ( 35 ) ) ,
192
+ Lambda ( Assign ( variable , Constant ( 42 ) ) )
193
+ )
194
+ ) ;
195
+
196
+ var f = lambda . CompileFast ( true ) ;
197
+ Assert . NotNull ( f ) ;
198
+
199
+ var ff = f ( ) ;
200
+ Assert . IsInstanceOf < Func < int > > ( ff ) ;
201
+ Assert . AreEqual ( 42 , ff ( ) ) ;
202
+ }
203
+
204
+ [ Test ]
205
+ public void Block_local_variable_assignment_with_lambda_invoke_plus_external_assignment ( )
206
+ {
207
+ var variable = Variable ( typeof ( int ) ) ;
208
+
209
+ var block = Block ( new [ ] { variable } ,
210
+ Assign ( variable , Constant ( 5 ) ) ,
211
+ Invoke ( Lambda ( Assign ( variable , Constant ( 6 ) ) ) ) ) ;
212
+
213
+ var lambda = Lambda < Func < int > > ( block ) ;
214
+
215
+ var f = lambda . CompileFast < Func < int > > ( true ) ;
216
+ Assert . AreEqual ( 6 , f ( ) ) ;
151
217
}
152
218
153
219
[ Test ]
0 commit comments