Skip to content

Commit 6ff2993

Browse files
author
Matthias Güdemann
committed
Choose mapped-to type when doing higher depth search
1 parent 31004f5 commit 6ff2993

File tree

2 files changed

+37
-13
lines changed

2 files changed

+37
-13
lines changed

jbmc/src/java_bytecode/select_pointer_type.cpp

+35-11
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,8 @@ pointer_typet select_pointer_typet::specialize_generics(
125125
{
126126
const pointer_typet &new_array_type = specialize_generics(
127127
to_pointer_type(array_element_type),
128-
generic_parameter_specialization_map, visited_nodes);
128+
generic_parameter_specialization_map,
129+
visited_nodes);
129130

130131
pointer_typet replacement_array_type = java_array_type('a');
131132
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(
149150
&generic_parameter_specialization_map) const
150151
{
151152
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 {};
156181
}
157182

158183
/// See above, the additional parameter just tracks the recursion to prevent
@@ -179,16 +204,14 @@ optionalt<pointer_typet> select_pointer_typet::get_instantiated_type(
179204
const auto &replacements =
180205
generic_parameter_specialization_map.find(parameter_name)->second;
181206

182-
// max depth reached and nothing found
207+
// max depth reached and nothing found, TODO return bound
183208
if(replacements.size() <= depth)
184209
return {};
185210

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
187212
if(visited.find(parameter_name) != visited.end())
188213
{
189-
visited.clear();
190-
return get_instantiated_type(
191-
parameter_name, generic_parameter_specialization_map, visited, depth+1);
214+
return {};
192215
}
193216
else
194217
{
@@ -202,7 +225,8 @@ optionalt<pointer_typet> select_pointer_typet::get_instantiated_type(
202225
else
203226
{
204227
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();
206230
const auto val = get_instantiated_type(
207231
gen_type.get_identifier(),
208232
generic_parameter_specialization_map,

jbmc/src/java_bytecode/select_pointer_type.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,11 @@
1111
/// \file
1212
/// Handle selection of correct pointer type (for example changing abstract
1313
/// classes to concrete versions).
14+
#include <vector>
1415

16+
#include "java_types.h"
1517
#include <util/optional.h>
1618
#include <util/std_types.h>
17-
#include <vector>
18-
#include "java_types.h"
1919

2020
typedef std::unordered_map<irep_idt, std::vector<reference_typet>>
2121
generic_parameter_specialization_mapt;

0 commit comments

Comments
 (0)