@@ -125,7 +125,8 @@ pointer_typet select_pointer_typet::specialize_generics(
125
125
{
126
126
const pointer_typet &new_array_type = specialize_generics (
127
127
to_pointer_type (array_element_type),
128
- generic_parameter_specialization_map, visited_nodes);
128
+ generic_parameter_specialization_map,
129
+ visited_nodes);
129
130
130
131
pointer_typet replacement_array_type = java_array_type (' a' );
131
132
replacement_array_type.subtype ().set (ID_C_element_type, new_array_type);
@@ -149,10 +150,34 @@ optionalt<pointer_typet> select_pointer_typet::get_instantiated_type(
149
150
&generic_parameter_specialization_map) const
150
151
{
151
152
generic_parameter_recursion_trackingt visited;
152
- const auto retval = get_instantiated_type (
153
- parameter_name, generic_parameter_specialization_map, visited, 0 );
154
- INVARIANT (visited.empty (), " recursion set must be empty here" );
155
- return retval;
153
+ size_t depth = 0 ;
154
+ const size_t max =
155
+ generic_parameter_specialization_map.find (parameter_name)->second .size ();
156
+
157
+ irep_idt current_parameter = parameter_name;
158
+ while (depth < max)
159
+ {
160
+ const auto retval = get_instantiated_type (
161
+ current_parameter, generic_parameter_specialization_map, visited, depth);
162
+ if (retval.has_value ())
163
+ {
164
+ if (is_java_generic_parameter (*retval))
165
+ {
166
+ UNREACHABLE;
167
+ }
168
+ return retval;
169
+ }
170
+ INVARIANT (visited.empty (), " recursion set must be empty here" );
171
+
172
+ const auto &entry =
173
+ generic_parameter_specialization_map.find (current_parameter)
174
+ ->second .back ();
175
+ const java_generic_parametert &gen_param = to_java_generic_parameter (entry);
176
+ const auto &type_var = gen_param.type_variable ();
177
+ current_parameter = type_var.get_identifier ();
178
+ depth++;
179
+ }
180
+ return {};
156
181
}
157
182
158
183
// / See above, the additional parameter just tracks the recursion to prevent
@@ -179,16 +204,14 @@ optionalt<pointer_typet> select_pointer_typet::get_instantiated_type(
179
204
const auto &replacements =
180
205
generic_parameter_specialization_map.find (parameter_name)->second ;
181
206
182
- // max depth reached and nothing found
207
+ // max depth reached and nothing found, TODO return bound
183
208
if (replacements.size () <= depth)
184
209
return {};
185
210
186
- // Check if there is a recursion loop, if yes increase search depth
211
+ // Check if there is a recursion loop, if yes return with nothing found
187
212
if (visited.find (parameter_name) != visited.end ())
188
213
{
189
- visited.clear ();
190
- return get_instantiated_type (
191
- parameter_name, generic_parameter_specialization_map, visited, depth+1 );
214
+ return {};
192
215
}
193
216
else
194
217
{
@@ -202,7 +225,8 @@ optionalt<pointer_typet> select_pointer_typet::get_instantiated_type(
202
225
else
203
226
{
204
227
visited.insert (parameter_name);
205
- const auto &gen_type = to_java_generic_parameter (type).type_variable ();
228
+ const auto &gen_type =
229
+ to_java_generic_parameter (type).type_variable ();
206
230
const auto val = get_instantiated_type (
207
231
gen_type.get_identifier (),
208
232
generic_parameter_specialization_map,
0 commit comments