17
17
18
18
struct lambda_assignment_test_datat
19
19
{
20
- std::regex lambda_variable_id;
21
20
irep_idt lambda_interface;
22
21
std::string lambda_interface_method_descriptor;
23
22
irep_idt lambda_function_id;
@@ -46,15 +45,10 @@ struct lambda_assignment_test_datat
46
45
void validate_lamdba_assignement (
47
46
const symbol_tablet &symbol_table,
48
47
const std::vector<codet> &instructions,
49
- const lambda_assignment_test_datat &test_data)
48
+ const lambda_assignment_test_datat &test_data,
49
+ const require_goto_statements::pointer_assignment_locationt
50
+ &lambda_assignment)
50
51
{
51
- const auto lambda_assignment =
52
- require_goto_statements::find_pointer_assignments (
53
- test_data.lambda_variable_id , instructions);
54
-
55
- REQUIRE (lambda_assignment.non_null_assignments .size () == 1 );
56
- REQUIRE_FALSE (lambda_assignment.null_assignment .has_value ());
57
-
58
52
const typecast_exprt &rhs_value = require_expr::require_typecast (
59
53
lambda_assignment.non_null_assignments [0 ].rhs ());
60
54
@@ -140,6 +134,25 @@ void validate_lamdba_assignement(
140
134
}
141
135
}
142
136
137
+ // / Find the assignment to the lambda and then call validate_lamdba_assignement
138
+ // / for full validation.
139
+ void validate_local_variable_lambda_assignment (
140
+ const symbol_tablet &symbol_table,
141
+ const std::vector<codet> &instructions,
142
+ const lambda_assignment_test_datat &test_data,
143
+ const std::regex lambda_variable_id)
144
+ {
145
+ const auto lambda_assignment =
146
+ require_goto_statements::find_pointer_assignments (
147
+ lambda_variable_id, instructions);
148
+
149
+ REQUIRE (lambda_assignment.non_null_assignments .size () == 1 );
150
+ REQUIRE_FALSE (lambda_assignment.null_assignment .has_value ());
151
+
152
+ validate_lamdba_assignement (
153
+ symbol_table, instructions, test_data, lambda_assignment);
154
+ }
155
+
143
156
SCENARIO (
144
157
" Converting invokedynamic with a local lambda" ,
145
158
" [core]"
@@ -170,24 +183,22 @@ SCENARIO(
170
183
" SimpleLambda" )
171
184
{
172
185
lambda_assignment_test_datat test_data;
173
- test_data.lambda_variable_id =
174
- std::regex (function_prefix_regex_str + " ::\\ d+::simpleLambda$" );
175
-
176
186
test_data.lambda_interface = " java::SimpleLambda" ;
177
187
test_data.lambda_interface_method_descriptor = " .Execute:()V" ;
178
188
test_data.lambda_function_id = " java::LocalLambdas.pretendLambda:()V" ;
179
189
test_data.expected_params = {};
180
190
test_data.should_return_value = false ;
181
- validate_lamdba_assignement (symbol_table, instructions, test_data);
191
+ validate_local_variable_lambda_assignment (
192
+ symbol_table,
193
+ instructions,
194
+ test_data,
195
+ std::regex (function_prefix_regex_str + " ::\\ d+::simpleLambda$" ));
182
196
}
183
197
THEN (
184
198
" The local variable should be assigned a non-null pointer to a "
185
199
" parameter interface implementor" )
186
200
{
187
201
lambda_assignment_test_datat test_data;
188
- test_data.lambda_variable_id =
189
- std::regex (function_prefix_regex_str + " ::\\ d+::paramLambda$" );
190
-
191
202
test_data.lambda_interface = " java::ParameterLambda" ;
192
203
test_data.lambda_interface_method_descriptor =
193
204
" .Execute:(ILjava/lang/Object;LDummyGeneric;)V" ;
@@ -204,23 +215,23 @@ SCENARIO(
204
215
test_data.expected_params = {integer_param, ref_param, generic_param};
205
216
test_data.should_return_value = false ;
206
217
207
- validate_lamdba_assignement (symbol_table, instructions, test_data);
218
+ validate_local_variable_lambda_assignment (
219
+ symbol_table,
220
+ instructions,
221
+ test_data,
222
+ std::regex (function_prefix_regex_str + " ::\\ d+::paramLambda$" ));
208
223
}
209
224
THEN (
210
225
" The local variable should be assigned a non-null pointer to a "
211
226
" array parameter interface implementor" )
212
227
{
213
228
lambda_assignment_test_datat test_data;
214
-
215
- test_data.lambda_variable_id =
216
- std::regex (function_prefix_regex_str + " ::\\ d+::arrayParamLambda$" );
217
-
218
229
test_data.lambda_interface = " java::ArrayParameterLambda" ;
219
230
test_data.lambda_interface_method_descriptor =
220
231
" .Execute:([I[Ljava/lang/Object;[LDummyGeneric;)V" ;
221
232
test_data.lambda_function_id =
222
233
" java::LocalLambdas.lambda$test$2:"
223
- " ( [I[Ljava/lang/Object;[LDummyGeneric;)V" ;
234
+ " [I[Ljava/lang/Object;[LDummyGeneric;)V" ;
224
235
225
236
symbol_exprt integer_param{" primitive" , java_type_from_string (" [I" )};
226
237
symbol_exprt ref_param{" reference" ,
@@ -231,33 +242,35 @@ SCENARIO(
231
242
test_data.expected_params = {integer_param, ref_param, generic_param};
232
243
test_data.should_return_value = false ;
233
244
234
- validate_lamdba_assignement (symbol_table, instructions, test_data);
245
+ validate_local_variable_lambda_assignment (
246
+ symbol_table,
247
+ instructions,
248
+ test_data,
249
+ std::regex (
250
+ function_prefix_regex_str + " ::\\ d+::arrayParamLambda$" ));
235
251
}
236
252
THEN (
237
253
" The local variable should be assigned a temp object implementing "
238
254
" ReturningLambdaPrimitive" )
239
255
{
240
256
lambda_assignment_test_datat test_data;
241
-
242
- test_data.lambda_variable_id = std::regex (
243
- function_prefix_regex_str + " ::\\ d+::returnPrimitiveLambda" );
244
-
245
257
test_data.lambda_interface = " java::ReturningLambdaPrimitive" ;
246
258
test_data.lambda_interface_method_descriptor = " .Execute:()I" ;
247
259
test_data.lambda_function_id = " java::LocalLambdas.lambda$test$3:()I" ;
248
260
test_data.expected_params = {};
249
261
test_data.should_return_value = true ;
250
- validate_lamdba_assignement (symbol_table, instructions, test_data);
262
+ validate_local_variable_lambda_assignment (
263
+ symbol_table,
264
+ instructions,
265
+ test_data,
266
+ std::regex (
267
+ function_prefix_regex_str + " ::\\ d+::returnPrimitiveLambda" ));
251
268
}
252
269
THEN (
253
270
" The local variable should be assigned a temp object implementing "
254
271
" ReturningLambdaReference" )
255
272
{
256
273
lambda_assignment_test_datat test_data;
257
-
258
- test_data.lambda_variable_id = std::regex (
259
- function_prefix_regex_str + " ::\\ d+::returnReferenceLambda" );
260
-
261
274
test_data.lambda_interface = " java::ReturningLambdaReference" ;
262
275
263
276
test_data.lambda_interface_method_descriptor =
@@ -268,18 +281,18 @@ SCENARIO(
268
281
" java::LocalLambdas.lambda$test$4:()Ljava/lang/Object;" ;
269
282
test_data.expected_params = {};
270
283
test_data.should_return_value = true ;
271
- validate_lamdba_assignement (symbol_table, instructions, test_data);
284
+ validate_local_variable_lambda_assignment (
285
+ symbol_table,
286
+ instructions,
287
+ test_data,
288
+ std::regex (
289
+ function_prefix_regex_str + " ::\\ d+::returnReferenceLambda" ));
272
290
}
273
291
THEN (
274
292
" The local variable should be assigned a temp object implementing "
275
293
" ReturningLambdaSpecalisedGeneric" )
276
294
{
277
295
lambda_assignment_test_datat test_data;
278
-
279
- test_data.lambda_variable_id = std::regex (
280
- function_prefix_regex_str +
281
- " ::\\ d+::returningSpecalisedGenericLambda" );
282
-
283
296
test_data.lambda_interface = " java::ReturningLambdaSpecalisedGeneric" ;
284
297
285
298
test_data.lambda_interface_method_descriptor =
@@ -288,7 +301,13 @@ SCENARIO(
288
301
" java::LocalLambdas.lambda$test$5:()LDummyGeneric;" ;
289
302
test_data.expected_params = {};
290
303
test_data.should_return_value = true ;
291
- validate_lamdba_assignement (symbol_table, instructions, test_data);
304
+ validate_local_variable_lambda_assignment (
305
+ symbol_table,
306
+ instructions,
307
+ test_data,
308
+ std::regex (
309
+ function_prefix_regex_str +
310
+ " ::\\ d+::returningSpecalisedGenericLambda" ));
292
311
}
293
312
// TODO[TG-2482]: Tests for local lambdas that capture variables
294
313
}
0 commit comments