Skip to content

Commit 5f5994b

Browse files
author
thk123
committed
Pull out the logic for getting the inital assignment
This will allow sharing code for testing members as well as local variables
1 parent 7f843a7 commit 5f5994b

File tree

1 file changed

+58
-39
lines changed

1 file changed

+58
-39
lines changed

unit/java_bytecode/java_bytecode_convert_method/convert_invoke_dynamic.cpp

Lines changed: 58 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717

1818
struct lambda_assignment_test_datat
1919
{
20-
std::regex lambda_variable_id;
2120
irep_idt lambda_interface;
2221
std::string lambda_interface_method_descriptor;
2322
irep_idt lambda_function_id;
@@ -46,15 +45,10 @@ struct lambda_assignment_test_datat
4645
void validate_lamdba_assignement(
4746
const symbol_tablet &symbol_table,
4847
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)
5051
{
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-
5852
const typecast_exprt &rhs_value = require_expr::require_typecast(
5953
lambda_assignment.non_null_assignments[0].rhs());
6054

@@ -140,6 +134,25 @@ void validate_lamdba_assignement(
140134
}
141135
}
142136

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+
143156
SCENARIO(
144157
"Converting invokedynamic with a local lambda",
145158
"[core]"
@@ -170,24 +183,22 @@ SCENARIO(
170183
"SimpleLambda")
171184
{
172185
lambda_assignment_test_datat test_data;
173-
test_data.lambda_variable_id =
174-
std::regex(function_prefix_regex_str + "::\\d+::simpleLambda$");
175-
176186
test_data.lambda_interface = "java::SimpleLambda";
177187
test_data.lambda_interface_method_descriptor = ".Execute:()V";
178188
test_data.lambda_function_id = "java::LocalLambdas.pretendLambda:()V";
179189
test_data.expected_params = {};
180190
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$"));
182196
}
183197
THEN(
184198
"The local variable should be assigned a non-null pointer to a "
185199
"parameter interface implementor")
186200
{
187201
lambda_assignment_test_datat test_data;
188-
test_data.lambda_variable_id =
189-
std::regex(function_prefix_regex_str + "::\\d+::paramLambda$");
190-
191202
test_data.lambda_interface = "java::ParameterLambda";
192203
test_data.lambda_interface_method_descriptor =
193204
".Execute:(ILjava/lang/Object;LDummyGeneric;)V";
@@ -204,23 +215,23 @@ SCENARIO(
204215
test_data.expected_params = {integer_param, ref_param, generic_param};
205216
test_data.should_return_value = false;
206217

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$"));
208223
}
209224
THEN(
210225
"The local variable should be assigned a non-null pointer to a "
211226
"array parameter interface implementor")
212227
{
213228
lambda_assignment_test_datat test_data;
214-
215-
test_data.lambda_variable_id =
216-
std::regex(function_prefix_regex_str + "::\\d+::arrayParamLambda$");
217-
218229
test_data.lambda_interface = "java::ArrayParameterLambda";
219230
test_data.lambda_interface_method_descriptor =
220231
".Execute:([I[Ljava/lang/Object;[LDummyGeneric;)V";
221232
test_data.lambda_function_id =
222233
"java::LocalLambdas.lambda$test$2:"
223-
"([I[Ljava/lang/Object;[LDummyGeneric;)V";
234+
"[I[Ljava/lang/Object;[LDummyGeneric;)V";
224235

225236
symbol_exprt integer_param{"primitive", java_type_from_string("[I")};
226237
symbol_exprt ref_param{"reference",
@@ -231,33 +242,35 @@ SCENARIO(
231242
test_data.expected_params = {integer_param, ref_param, generic_param};
232243
test_data.should_return_value = false;
233244

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$"));
235251
}
236252
THEN(
237253
"The local variable should be assigned a temp object implementing "
238254
"ReturningLambdaPrimitive")
239255
{
240256
lambda_assignment_test_datat test_data;
241-
242-
test_data.lambda_variable_id = std::regex(
243-
function_prefix_regex_str + "::\\d+::returnPrimitiveLambda");
244-
245257
test_data.lambda_interface = "java::ReturningLambdaPrimitive";
246258
test_data.lambda_interface_method_descriptor = ".Execute:()I";
247259
test_data.lambda_function_id = "java::LocalLambdas.lambda$test$3:()I";
248260
test_data.expected_params = {};
249261
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"));
251268
}
252269
THEN(
253270
"The local variable should be assigned a temp object implementing "
254271
"ReturningLambdaReference")
255272
{
256273
lambda_assignment_test_datat test_data;
257-
258-
test_data.lambda_variable_id = std::regex(
259-
function_prefix_regex_str + "::\\d+::returnReferenceLambda");
260-
261274
test_data.lambda_interface = "java::ReturningLambdaReference";
262275

263276
test_data.lambda_interface_method_descriptor =
@@ -268,18 +281,18 @@ SCENARIO(
268281
"java::LocalLambdas.lambda$test$4:()Ljava/lang/Object;";
269282
test_data.expected_params = {};
270283
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"));
272290
}
273291
THEN(
274292
"The local variable should be assigned a temp object implementing "
275293
"ReturningLambdaSpecalisedGeneric")
276294
{
277295
lambda_assignment_test_datat test_data;
278-
279-
test_data.lambda_variable_id = std::regex(
280-
function_prefix_regex_str +
281-
"::\\d+::returningSpecalisedGenericLambda");
282-
283296
test_data.lambda_interface = "java::ReturningLambdaSpecalisedGeneric";
284297

285298
test_data.lambda_interface_method_descriptor =
@@ -288,7 +301,13 @@ SCENARIO(
288301
"java::LocalLambdas.lambda$test$5:()LDummyGeneric;";
289302
test_data.expected_params = {};
290303
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"));
292311
}
293312
// TODO[TG-2482]: Tests for local lambdas that capture variables
294313
}

0 commit comments

Comments
 (0)