Skip to content

Commit 44b5bae

Browse files
author
Thomas Kiley
authored
Merge pull request diffblue#1698 from thomasspriggs/tg1633
[TG-1633] Fix for inner generic types have incorrect type identifier
2 parents 85193a0 + 1053e5f commit 44b5bae

File tree

5 files changed

+112
-1
lines changed

5 files changed

+112
-1
lines changed

src/java_bytecode/java_types.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,7 @@ std::string erase_type_arguments(const std::string &src)
252252
class_name.erase(f_pos, e_pos - f_pos + 1);
253253

254254
// Search the remainder of the string for generic signature
255-
f_pos = class_name.find('<', e_pos + 1);
255+
f_pos = class_name.find('<', f_pos + 1);
256256
}
257257
return class_name;
258258
}

unit/java_bytecode/java_bytecode_parse_generics/GenericClassWithGenericInnerClasses.java

+2
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ class TwoParamInnerClass<K, L>
4545
TwoParamInnerClass<Interface_Implementation,T> field9;
4646
TwoParamInnerClass<T,T> field10;
4747

48+
GenericInnerClass<GenericClassWithGenericInnerClasses<Integer>>.DoublyNestedInnerGenericClass<T> field11;
49+
4850
void method(InnerClass input)
4951
{
5052

unit/java_bytecode/java_bytecode_parse_generics/parse_generic_class_with_generic_inner_classes.cpp

+41
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,47 @@ SCENARIO(
248248
{require_type::type_argument_kindt::Var, class_prefix + "::T"}});
249249
}
250250
}
251+
252+
THEN(
253+
"The field11 component should be a pointer to "
254+
"GenericClassWithGenericInnerClasses$"
255+
"GenericInnerClass$DoublyNestedInnerGenericClass")
256+
{
257+
const struct_union_typet::componentt &field_component =
258+
require_type::require_component(java_generic_class, "field11");
259+
260+
// Declaration of field11 to be tested -
261+
// GenericInnerClass<GenericClassWithGenericInnerClasses<Integer>>.
262+
// DoublyNestedInnerGenericClass<T> field11;
263+
264+
require_type::require_pointer(
265+
field_component.type(),
266+
symbol_typet(
267+
class_prefix + "$GenericInnerClass$DoublyNestedInnerGenericClass"));
268+
269+
THEN("The pointer should be GenericClassWithGenericInnerClasses")
270+
{
271+
const java_generic_typet &generic_field =
272+
require_type::require_java_generic_type(
273+
field_component.type(),
274+
{{require_type::type_argument_kindt::Var,
275+
"java::GenericClassWithGenericInnerClasses::T"},
276+
{require_type::type_argument_kindt::Inst,
277+
"java::GenericClassWithGenericInnerClasses"},
278+
{require_type::type_argument_kindt::Var,
279+
"java::GenericClassWithGenericInnerClasses::T"}});
280+
281+
THEN("Test nested Integer parameter.")
282+
{
283+
const typet &nested_generic_field =
284+
generic_field.generic_type_arguments().at(1);
285+
require_type::require_java_generic_type(
286+
nested_generic_field,
287+
{{require_type::type_argument_kindt::Inst,
288+
"java::java.lang.Integer"}});
289+
}
290+
}
291+
}
251292
}
252293
}
253294

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
/*******************************************************************\
2+
3+
Module: Unit tests for java_types
4+
5+
Author: DiffBlue Limited. All rights reserved.
6+
7+
\*******************************************************************/
8+
9+
#include <testing-utils/catch.hpp>
10+
#include <java_types.h>
11+
12+
SCENARIO("erase_type_arguments", "[core][java_types]")
13+
{
14+
THEN(
15+
"erase_type_arguments should leave strings with no type arguments "
16+
"unaltered.")
17+
{
18+
const std::string testInput1 = "testString1";
19+
REQUIRE(erase_type_arguments(testInput1) == testInput1);
20+
}
21+
22+
THEN("erase_type_arguments should remove a simple type argument")
23+
{
24+
REQUIRE(
25+
erase_type_arguments("testClassName<testTypeArgument>") ==
26+
"testClassName");
27+
}
28+
29+
THEN(
30+
"erase_type_arguments should remove multiple type arguments in cases "
31+
"of nested classes")
32+
{
33+
REQUIRE(
34+
erase_type_arguments(
35+
"outerClass<testTypeArgument1>$"
36+
"innerClass<testTypeArgument2>") == "outerClass$innerClass");
37+
}
38+
39+
THEN(
40+
"erase_type_arguments should remove type arguments which contain nested "
41+
"type arguments")
42+
{
43+
REQUIRE(
44+
erase_type_arguments(
45+
"outerClass<testTypeArgument1<testTypeArgument2>>") == "outerClass");
46+
}
47+
48+
THEN(
49+
"erase_type_arguments should remove multiple type arguments which contain "
50+
"nested type arguments in cases of nested classes")
51+
{
52+
REQUIRE(
53+
erase_type_arguments(
54+
"outerClass<testTypeArgument1<testTypeArgument2>>$"
55+
"innerClass<testTypeArgument3<testTypeArgument4>>") ==
56+
"outerClass$innerClass");
57+
}
58+
59+
THEN(
60+
"erase_type_arguments should throw an error if a type argument is "
61+
"unterminated")
62+
{
63+
REQUIRE_THROWS_AS(
64+
erase_type_arguments(
65+
"testClassName<testTypeArgument1<testTypeArgument2>"),
66+
unsupported_java_class_signature_exceptiont &);
67+
}
68+
}

0 commit comments

Comments
 (0)