Skip to content

Commit 7710b5b

Browse files
author
Matthias Güdemann
committed
Clarify and correct
1 parent bbc2bac commit 7710b5b

File tree

4 files changed

+26
-34
lines changed

4 files changed

+26
-34
lines changed

jbmc/src/java_bytecode/generic_parameter_specialization_map_keys.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,7 @@ class generic_parameter_specialization_map_keyst
3636
auto &val = generic_parameter_specialization_map.find(key)->second;
3737
val.pop_back();
3838
if(val.empty())
39-
{
4039
generic_parameter_specialization_map.erase(key);
41-
}
4240
}
4341
}
4442

jbmc/src/java_bytecode/select_pointer_type.cpp

Lines changed: 21 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,15 @@ pointer_typet select_pointer_typet::specialize_generics(
7373
const java_generic_parametert &parameter =
7474
to_java_generic_parameter(pointer_type);
7575
const irep_idt &parameter_name = parameter.get_name();
76+
77+
// avoid infinite recursion
78+
if(visited_nodes.find(parameter_name) != visited_nodes.end())
79+
{
80+
const optionalt<pointer_typet> result = get_recursively_instantiated_type(
81+
parameter_name, generic_parameter_specialization_map);
82+
return result.has_value() ? result.value() : pointer_type;
83+
}
84+
7685
if(generic_parameter_specialization_map.count(parameter_name) == 0)
7786
{
7887
// this means that the generic pointer_type has not been specialized
@@ -84,21 +93,13 @@ pointer_typet select_pointer_typet::specialize_generics(
8493
const pointer_typet &type =
8594
generic_parameter_specialization_map.find(parameter_name)->second.back();
8695

87-
// avoid infinite recursion
88-
if(visited_nodes.find(parameter_name) != visited_nodes.end())
89-
{
90-
optionalt<pointer_typet> result = get_recursively_instantiated_type(
91-
parameter_name, generic_parameter_specialization_map);
92-
return result.has_value() ? result.value() : pointer_type;
93-
}
94-
9596
// generic parameters can be adopted from outer classes or superclasses so
9697
// we may need to search for the concrete type recursively
9798
if(!is_java_generic_parameter(type))
9899
return type;
99100

100101
visited_nodes.insert(parameter_name);
101-
auto returned_type = specialize_generics(
102+
const auto returned_type = specialize_generics(
102103
to_java_generic_parameter(type),
103104
generic_parameter_specialization_map,
104105
visited_nodes);
@@ -135,20 +136,19 @@ pointer_typet select_pointer_typet::specialize_generics(
135136
/// instantiated
136137
/// \param generic_specialization_map Map of type names to specialization stack
137138
/// \return The first instantiated type for the generic type or nothing if no
138-
/// such instantiation exists.
139+
/// such instantiation exists.
139140
optionalt<pointer_typet>
140141
select_pointer_typet::get_recursively_instantiated_type(
141142
const irep_idt &parameter_name,
142143
const generic_parameter_specialization_mapt
143144
&generic_parameter_specialization_map) const
144145
{
145146
generic_parameter_recursion_trackingt visited;
146-
size_t depth = 0;
147-
const size_t max =
147+
const size_t max_depth =
148148
generic_parameter_specialization_map.find(parameter_name)->second.size();
149149

150150
irep_idt current_parameter = parameter_name;
151-
while(depth < max)
151+
for(size_t depth = 0; depth < max_depth; depth++)
152152
{
153153
const auto retval = get_recursively_instantiated_type(
154154
current_parameter, generic_parameter_specialization_map, visited, depth);
@@ -162,19 +162,19 @@ select_pointer_typet::get_recursively_instantiated_type(
162162
const auto &entry =
163163
generic_parameter_specialization_map.find(current_parameter)
164164
->second.back();
165-
const java_generic_parametert &gen_param = to_java_generic_parameter(entry);
166-
const auto &type_var = gen_param.type_variable();
167-
current_parameter = type_var.get_identifier();
168-
depth++;
165+
current_parameter = to_java_generic_parameter(entry).get_name();
169166
}
170167
return {};
171168
}
172169

173170
/// See get_recursively instantiated_type, the additional parameters just track
174-
/// the recursion to prevent, visiting the same depth again and specify which
171+
/// the recursion to prevent visiting the same depth again and specify which
175172
/// stack depth is analyzed.
176173
/// \param visited Tracks the visited parameter names
177174
/// \param depth Stack depth to analyze
175+
/// \return if this type is not a generic type, it is returned as a valid
176+
/// instantiation, if nothing can be found at the given depth, en empty optional
177+
/// is returned
178178
optionalt<pointer_typet>
179179
select_pointer_typet::get_recursively_instantiated_type(
180180
const irep_idt &parameter_name,
@@ -183,12 +183,7 @@ select_pointer_typet::get_recursively_instantiated_type(
183183
generic_parameter_recursion_trackingt &visited,
184184
const size_t depth) const
185185
{
186-
// Get the pointed to instantiation type at the desired stack depth.
187-
// - if this type is not a generic type, it is returned as a valid
188-
// instantiation
189-
// - if nothing can be found at the given depth, an empty optional is returned
190-
191-
auto val = generic_parameter_specialization_map.find(parameter_name);
186+
const auto &val = generic_parameter_specialization_map.find(parameter_name);
192187
INVARIANT(
193188
val != generic_parameter_specialization_map.end(),
194189
"generic parameter must be a key in map");
@@ -204,7 +199,7 @@ select_pointer_typet::get_recursively_instantiated_type(
204199
return {};
205200
}
206201

207-
const size_t index = (replacements.size() - depth) - 1;
202+
const size_t index = (replacements.size() - 1) - depth;
208203
const auto &type = replacements[index];
209204

210205
if(!is_java_generic_parameter(type))
@@ -213,9 +208,8 @@ select_pointer_typet::get_recursively_instantiated_type(
213208
}
214209

215210
visited.insert(parameter_name);
216-
const auto &gen_type = to_java_generic_parameter(type).type_variable();
217211
const auto inst_val = get_recursively_instantiated_type(
218-
gen_type.get_identifier(),
212+
to_java_generic_parameter(type).get_name(),
219213
generic_parameter_specialization_map,
220214
visited,
221215
depth);

jbmc/src/java_bytecode/select_pointer_type.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ class select_pointer_typet
3232
const size_t) const;
3333
optionalt<pointer_typet> get_recursively_instantiated_type(
3434
const irep_idt &parameter_name,
35-
const generic_parameter_specialization_mapt &) const;
35+
const generic_parameter_specialization_mapt &visited) const;
3636

3737
public:
3838
virtual ~select_pointer_typet() = default;
@@ -46,7 +46,7 @@ class select_pointer_typet
4646
const pointer_typet &pointer_type,
4747
const generic_parameter_specialization_mapt
4848
&generic_parameter_specialization_map,
49-
generic_parameter_recursion_trackingt &) const;
49+
generic_parameter_recursion_trackingt &visited) const;
5050
};
5151

5252
#endif // CPROVER_JAVA_BYTECODE_SELECT_POINTER_TYPE_H

jbmc/unit/java_bytecode/goto_program_generics/mutually_recursive_generics.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ SCENARIO(
2020
"./java_bytecode/goto_program_generics",
2121
"MutuallyRecursiveGenerics.f");
2222

23-
std::string class_prefix = "java::MutuallyRecursiveGenerics";
23+
const std::string class_prefix = "java::MutuallyRecursiveGenerics";
2424

2525
REQUIRE(symbol_table.has_symbol(class_prefix));
2626

@@ -86,7 +86,7 @@ SCENARIO(
8686
const std::vector<codet> &entry_point_code =
8787
require_goto_statements::require_entry_point_statements(symbol_table);
8888

89-
auto has_key_and_value_field = [&](
89+
const auto has_key_and_value_field = [&](
9090
const irep_idt &field,
9191
const irep_idt &key_type,
9292
const irep_idt &val_type) {
@@ -150,7 +150,7 @@ SCENARIO(
150150
require_goto_statements::require_struct_component_assignment(
151151
tmp_object_name, {}, "example2", "java::Three", {}, entry_point_code);
152152

153-
auto has_x_u_e_fields = [&](
153+
const auto has_x_u_e_fields = [&](
154154
const irep_idt &field,
155155
const irep_idt &x_type,
156156
const irep_idt &e_type,

0 commit comments

Comments
 (0)