Skip to content

Commit db6756e

Browse files
author
thk123
committed
Adding checks for parameters of the called function
1 parent d2ed92b commit db6756e

File tree

1 file changed

+45
-2
lines changed

1 file changed

+45
-2
lines changed

unit/java_bytecode/java_bytecode_convert_method/convert_invoke_dynamic.cpp

+45-2
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,16 @@
1313
#include <testing-utils/require_type.h>
1414
#include <testing-utils/run_test_with_compilers.h>
1515
#include <testing-utils/require_symbol.h>
16+
#include <util/expr_iterator.h>
1617

1718
struct lambda_assignment_test_datat
1819
{
1920
std::regex lambda_variable_id;
2021
irep_idt lambda_interface;
2122
std::string lambda_interface_method_descriptor;
2223
irep_idt lambda_function_id;
24+
25+
std::vector<exprt> expected_params;
2326
};
2427

2528
void validate_lamdba_assignement(
@@ -84,8 +87,29 @@ void validate_lamdba_assignement(
8487
const std::vector<codet> &assignments =
8588
require_goto_statements::get_all_statements(method_symbol.value);
8689

87-
require_goto_statements::require_function_call(
88-
assignments, test_data.lambda_function_id);
90+
code_function_callt function_call =
91+
require_goto_statements::require_function_call(
92+
assignments, test_data.lambda_function_id);
93+
94+
std::string variable_prefix = id2string(method_identifier) + "::";
95+
// replace all symbol exprs with a prefixed symbol expr
96+
std::vector<exprt> expected_args = test_data.expected_params;
97+
for(exprt &arg : expected_args)
98+
{
99+
for(auto it = arg.depth_begin(); it != arg.depth_end(); ++it)
100+
{
101+
if(it->id() == ID_symbol)
102+
{
103+
symbol_exprt &symbol_expr = to_symbol_expr(it.mutate());
104+
const irep_idt simple_id = symbol_expr.get_identifier();
105+
symbol_expr.set_identifier(variable_prefix + id2string(simple_id));
106+
}
107+
}
108+
}
109+
110+
REQUIRE_THAT(
111+
function_call.arguments(),
112+
Catch::Matchers::Vector::EqualsMatcher<exprt>{expected_args});
89113
}
90114
}
91115

@@ -125,6 +149,7 @@ SCENARIO(
125149
test_data.lambda_interface = "java::SimpleLambda";
126150
test_data.lambda_interface_method_descriptor = ".Execute:()V";
127151
test_data.lambda_function_id = "java::LocalLambdas.pretendLambda:()V";
152+
test_data.expected_params = {};
128153
validate_lamdba_assignement(symbol_table, instructions, test_data);
129154
}
130155
THEN(
@@ -141,6 +166,15 @@ SCENARIO(
141166
test_data.lambda_function_id =
142167
"java::LocalLambdas.lambda$test$1:(ILjava/lang/"
143168
"Object;LDummyGeneric;)V";
169+
170+
symbol_exprt integer_param{"primitive", java_int_type()};
171+
symbol_exprt ref_param{"reference",
172+
java_type_from_string("Ljava/lang/Object;")};
173+
symbol_exprt generic_param{
174+
"specalisedGeneric",
175+
java_type_from_string("LDummyGeneric<Ljava/lang/Interger;>;")};
176+
test_data.expected_params = {integer_param, ref_param, generic_param};
177+
144178
validate_lamdba_assignement(symbol_table, instructions, test_data);
145179
}
146180
THEN(
@@ -158,6 +192,15 @@ SCENARIO(
158192
test_data.lambda_function_id =
159193
"java::LocalLambdas.lambda$test$2:"
160194
"([I[Ljava/lang/Object;[LDummyGeneric;)V";
195+
196+
symbol_exprt integer_param{"primitive", java_type_from_string("[I")};
197+
symbol_exprt ref_param{"reference",
198+
java_type_from_string("[Ljava/lang/Object;")};
199+
symbol_exprt generic_param{
200+
"specalisedGeneric",
201+
java_type_from_string("[LDummyGeneric<Ljava/lang/Interger;>;")};
202+
test_data.expected_params = {integer_param, ref_param, generic_param};
203+
161204
validate_lamdba_assignement(symbol_table, instructions, test_data);
162205
}
163206
}

0 commit comments

Comments
 (0)