Skip to content

Commit 94ffce3

Browse files
author
Matthias Güdemann
authored
Merge pull request diffblue#1567 from mgudemann/mgudemann/feature/support_arrays_in_generic_parameters
TG-1318 Mgudemann/feature/support arrays in generic parameters
2 parents 4db6fc6 + 5be97db commit 94ffce3

File tree

5 files changed

+63
-9
lines changed

5 files changed

+63
-9
lines changed

src/java_bytecode/generate_java_generic_type.cpp

+18-1
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,24 @@ irep_idt generate_java_generic_typet::build_generic_tag(
119119
INVARIANT(
120120
is_java_generic_inst_parameter(param),
121121
"Only create full concretized generic types");
122-
new_tag_buffer << param.subtype().get(ID_identifier);
122+
const irep_idt &id(id2string(param.subtype().get(ID_identifier)));
123+
new_tag_buffer << id2string(id);
124+
if(is_java_array_tag(id))
125+
{
126+
const typet &element_type =
127+
java_array_element_type(to_symbol_type(param.subtype()));
128+
129+
// If this is an array of references then we will specialize its
130+
// identifier using the type of the objects in the array. Else, there can
131+
// be a problem with the same symbols for different instantiations using
132+
// arrays with different types.
133+
if(element_type.id() == ID_pointer)
134+
{
135+
const symbol_typet element_symbol =
136+
to_symbol_type(element_type.subtype());
137+
new_tag_buffer << "of_" << id2string(element_symbol.get_identifier());
138+
}
139+
}
123140
}
124141

125142
new_tag_buffer << ">";

src/java_bytecode/java_utils.cpp

+2-4
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,9 @@ Author: Daniel Kroening, [email protected]
2121

2222
bool java_is_array_type(const typet &type)
2323
{
24-
if(type.id()!=ID_struct)
24+
if(type.id() != ID_struct)
2525
return false;
26-
return has_prefix(id2string(
27-
to_struct_type(type).get_tag()),
28-
"java::array[");
26+
return is_java_array_tag(to_struct_type(type).get_tag());
2927
}
3028

3129
unsigned java_local_variable_slots(const typet &t)

unit/java_bytecode/generate_concrete_generic_type/generate_java_generic_type.cpp

+40-2
Original file line numberDiff line numberDiff line change
@@ -184,8 +184,9 @@ SCENARIO(
184184

185185
// We want to test that the specialized/instantiated class has it's field
186186
// type updated, so find the specialized class, not the generic class.
187-
const irep_idt test_class=
188-
"java::generic_field_array_instantiation$generic<java::array[reference]>";
187+
const irep_idt test_class =
188+
"java::generic_field_array_instantiation$generic<java::array[reference]"
189+
"of_java::java.lang.Float>";
189190

190191
GIVEN("A generic type instantiated with an array type")
191192
{
@@ -230,5 +231,42 @@ SCENARIO(
230231
require_type::require_pointer(
231232
java_array_element_type(test_field_array),
232233
symbol_typet("java::java.lang.Float"));
234+
235+
// check for other specialized classes, in particular different symbol ids
236+
// for arrays with different element types
237+
GIVEN("A generic type instantiated with different array types")
238+
{
239+
const irep_idt test_class_integer =
240+
"java::generic_field_array_instantiation$generic<java::array[reference]"
241+
"of_"
242+
"java::java.lang.Integer>";
243+
244+
const irep_idt test_class_int =
245+
"java::generic_field_array_instantiation$generic<java::array[int]>";
246+
247+
const irep_idt test_class_float =
248+
"java::generic_field_array_instantiation$generic<java::array[float]>";
249+
250+
const struct_typet::componentt &component_g =
251+
require_type::require_component(
252+
to_struct_type(harness_symbol.type), "g");
253+
instantiate_generic_type(
254+
to_java_generic_type(component_g.type()), new_symbol_table);
255+
REQUIRE(new_symbol_table.has_symbol(test_class_integer));
256+
257+
const struct_typet::componentt &component_h =
258+
require_type::require_component(
259+
to_struct_type(harness_symbol.type), "h");
260+
instantiate_generic_type(
261+
to_java_generic_type(component_h.type()), new_symbol_table);
262+
REQUIRE(new_symbol_table.has_symbol(test_class_int));
263+
264+
const struct_typet::componentt &component_i =
265+
require_type::require_component(
266+
to_struct_type(harness_symbol.type), "i");
267+
instantiate_generic_type(
268+
to_java_generic_type(component_i.type()), new_symbol_table);
269+
REQUIRE(new_symbol_table.has_symbol(test_class_float));
270+
}
233271
}
234272
}

unit/java_bytecode/generate_concrete_generic_type/generic_field_array_instantiation.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ class generic<T> {
55
}
66

77
generic<Float []> f;
8+
generic<Integer []> g;
9+
generic<int []> h;
10+
generic<float []> i;
811
Float [] af;
912
}
10-
11-

0 commit comments

Comments
 (0)