@@ -73,6 +73,15 @@ pointer_typet select_pointer_typet::specialize_generics(
73
73
const java_generic_parametert ¶meter =
74
74
to_java_generic_parameter (pointer_type);
75
75
const irep_idt ¶meter_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
+
76
85
if (generic_parameter_specialization_map.count (parameter_name) == 0 )
77
86
{
78
87
// this means that the generic pointer_type has not been specialized
@@ -84,21 +93,13 @@ pointer_typet select_pointer_typet::specialize_generics(
84
93
const pointer_typet &type =
85
94
generic_parameter_specialization_map.find (parameter_name)->second .back ();
86
95
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
-
95
96
// generic parameters can be adopted from outer classes or superclasses so
96
97
// we may need to search for the concrete type recursively
97
98
if (!is_java_generic_parameter (type))
98
99
return type;
99
100
100
101
visited_nodes.insert (parameter_name);
101
- auto returned_type = specialize_generics (
102
+ const auto returned_type = specialize_generics (
102
103
to_java_generic_parameter (type),
103
104
generic_parameter_specialization_map,
104
105
visited_nodes);
@@ -135,20 +136,19 @@ pointer_typet select_pointer_typet::specialize_generics(
135
136
// / instantiated
136
137
// / \param generic_specialization_map Map of type names to specialization stack
137
138
// / \return The first instantiated type for the generic type or nothing if no
138
- // / such instantiation exists.
139
+ // / such instantiation exists.
139
140
optionalt<pointer_typet>
140
141
select_pointer_typet::get_recursively_instantiated_type (
141
142
const irep_idt ¶meter_name,
142
143
const generic_parameter_specialization_mapt
143
144
&generic_parameter_specialization_map) const
144
145
{
145
146
generic_parameter_recursion_trackingt visited;
146
- size_t depth = 0 ;
147
- const size_t max =
147
+ const size_t max_depth =
148
148
generic_parameter_specialization_map.find (parameter_name)->second .size ();
149
149
150
150
irep_idt current_parameter = parameter_name;
151
- while ( depth < max )
151
+ for ( size_t depth = 0 ; depth < max_depth; depth++ )
152
152
{
153
153
const auto retval = get_recursively_instantiated_type (
154
154
current_parameter, generic_parameter_specialization_map, visited, depth);
@@ -162,19 +162,19 @@ select_pointer_typet::get_recursively_instantiated_type(
162
162
const auto &entry =
163
163
generic_parameter_specialization_map.find (current_parameter)
164
164
->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 ();
169
166
}
170
167
return {};
171
168
}
172
169
173
170
// / 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
175
172
// / stack depth is analyzed.
176
173
// / \param visited Tracks the visited parameter names
177
174
// / \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
178
178
optionalt<pointer_typet>
179
179
select_pointer_typet::get_recursively_instantiated_type (
180
180
const irep_idt ¶meter_name,
@@ -183,12 +183,7 @@ select_pointer_typet::get_recursively_instantiated_type(
183
183
generic_parameter_recursion_trackingt &visited,
184
184
const size_t depth) const
185
185
{
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);
192
187
INVARIANT (
193
188
val != generic_parameter_specialization_map.end (),
194
189
" generic parameter must be a key in map" );
@@ -204,7 +199,7 @@ select_pointer_typet::get_recursively_instantiated_type(
204
199
return {};
205
200
}
206
201
207
- const size_t index = (replacements.size () - depth ) - 1 ;
202
+ const size_t index = (replacements.size () - 1 ) - depth ;
208
203
const auto &type = replacements[index];
209
204
210
205
if (!is_java_generic_parameter (type))
@@ -213,9 +208,8 @@ select_pointer_typet::get_recursively_instantiated_type(
213
208
}
214
209
215
210
visited.insert (parameter_name);
216
- const auto &gen_type = to_java_generic_parameter (type).type_variable ();
217
211
const auto inst_val = get_recursively_instantiated_type (
218
- gen_type. get_identifier (),
212
+ to_java_generic_parameter (type). get_name (),
219
213
generic_parameter_specialization_map,
220
214
visited,
221
215
depth);
0 commit comments