Skip to content

Commit 849f0ff

Browse files
author
Matthias Güdemann
committed
Choose mapped-to type when doing higher depth search
1 parent bd2c5ae commit 849f0ff

File tree

1 file changed

+31
-9
lines changed

1 file changed

+31
-9
lines changed

jbmc/src/java_bytecode/select_pointer_type.cpp

Lines changed: 31 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -149,10 +149,34 @@ optionalt<pointer_typet> select_pointer_typet::get_instantiated_type(
149149
&generic_parameter_specialization_map) const
150150
{
151151
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;
152+
size_t depth = 0;
153+
const size_t max =
154+
generic_parameter_specialization_map.find(parameter_name)->second.size();
155+
156+
irep_idt current_parameter = parameter_name;
157+
while(depth < max)
158+
{
159+
const auto retval = get_instantiated_type(
160+
current_parameter, generic_parameter_specialization_map, visited, depth);
161+
if(retval.has_value())
162+
{
163+
if(is_java_generic_parameter(*retval))
164+
{
165+
UNREACHABLE;
166+
}
167+
return retval;
168+
}
169+
INVARIANT(visited.empty(), "recursion set must be empty here");
170+
171+
const auto &entry =
172+
generic_parameter_specialization_map.find(current_parameter)
173+
->second.back();
174+
const java_generic_parametert &gen_param = to_java_generic_parameter(entry);
175+
const auto &type_var = gen_param.type_variable();
176+
current_parameter = type_var.get_identifier();
177+
depth++;
178+
}
179+
return {};
156180
}
157181

158182
/// See above, the additional parameter just tracks the recursion to prevent
@@ -179,16 +203,14 @@ optionalt<pointer_typet> select_pointer_typet::get_instantiated_type(
179203
const auto &replacements =
180204
generic_parameter_specialization_map.find(parameter_name)->second;
181205

182-
// max depth reached and nothing found
206+
// max depth reached and nothing found, TODO return bound
183207
if(replacements.size() <= depth)
184208
return {};
185209

186-
// Check if there is a recursion loop, if yes increase search depth
210+
// Check if there is a recursion loop, if yes return with nothing found
187211
if(visited.find(parameter_name) != visited.end())
188212
{
189-
visited.clear();
190-
return get_instantiated_type(
191-
parameter_name, generic_parameter_specialization_map, visited, depth+1);
213+
return {};
192214
}
193215
else
194216
{

0 commit comments

Comments
 (0)