Skip to content

Commit 72b611a

Browse files
romainbrenguierJoel Allred
authored andcommitted
Improvements on lengths
Add CharSequence.length method More direct conversion of length methods
1 parent c61d095 commit 72b611a

File tree

2 files changed

+71
-11
lines changed

2 files changed

+71
-11
lines changed

src/java_bytecode/java_string_library_preprocess.cpp

Lines changed: 66 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1024,8 +1024,8 @@ Function: java_string_library_preprocesst::
10241024
Output: return the following code:
10251025
> lhs = { {Object}, length=rhs_length, data=rhs_array }
10261026
1027-
Purpose: Produce code for an assignemnrt of a string expr to a
1028-
Java string, component-wise.
1027+
Purpose: Produce code for an assignment of a string expr to a
1028+
Java string.
10291029
10301030
\*******************************************************************/
10311031

@@ -1864,8 +1864,7 @@ codet java_string_library_preprocesst::make_copy_string_code(
18641864

18651865
/*******************************************************************\
18661866
1867-
Function:
1868-
java_string_library_preprocesst::make_copy_constructor_code
1867+
Function: java_string_library_preprocesst::make_copy_constructor_code
18691868
18701869
Inputs:
18711870
type - type of the function
@@ -1913,6 +1912,52 @@ codet java_string_library_preprocesst::make_copy_constructor_code(
19131912

19141913
/*******************************************************************\
19151914
1915+
Function: java_string_library_preprocesst::make_string_length_code
1916+
1917+
Inputs:
1918+
type - type of the function
1919+
loc - location in the source
1920+
symbol_table - symbol table
1921+
1922+
Outputs: Code corresponding to:
1923+
> str_expr = java_string_to_string_expr(this)
1924+
> str_expr_sym = str_expr
1925+
> return this->length
1926+
1927+
Purpose: Generates code for the String.length method
1928+
1929+
\*******************************************************************/
1930+
1931+
codet java_string_library_preprocesst::make_string_length_code(
1932+
const code_typet &type,
1933+
const source_locationt &loc,
1934+
symbol_tablet &symbol_table)
1935+
{
1936+
// Code for the output
1937+
code_blockt code;
1938+
1939+
code_typet::parameterst params=type.parameters();
1940+
symbol_exprt arg_this(params[0].get_identifier(), params[0].type());
1941+
dereference_exprt deref(arg_this, arg_this.type().subtype());
1942+
1943+
// Create a new string_exprt to be picked up by the solver
1944+
string_exprt str_expr=fresh_string_expr(loc, symbol_table, code);
1945+
1946+
// Assign this to str_expr
1947+
code.add(
1948+
code_assign_java_string_to_string_expr(str_expr, arg_this, symbol_table));
1949+
1950+
// Assign str_expr to str_expr_sym for that expression to be present in the
1951+
// symbol table in order to be processed by the string solver
1952+
exprt str_expr_sym=fresh_string_expr_symbol(loc, symbol_table, code);
1953+
code.add(code_assignt(str_expr_sym, str_expr));
1954+
code.add(code_returnt(get_length(deref, symbol_table)));
1955+
1956+
return code;
1957+
}
1958+
1959+
/*******************************************************************\
1960+
19161961
Function: java_string_library_preprocesst::code_for_function
19171962
19181963
Inputs:
@@ -2112,9 +2157,14 @@ void java_string_library_preprocesst::initialize_conversion_table()
21122157
cprover_equivalent_to_java_function
21132158
["java::java.lang.String.lastIndexOf:(Ljava/lang/String;I)I"]=
21142159
ID_cprover_string_last_index_of_func;
2115-
cprover_equivalent_to_java_function
2160+
conversion_table
21162161
["java::java.lang.String.length:()I"]=
2117-
ID_cprover_string_length_func;
2162+
std::bind(
2163+
&java_string_library_preprocesst::make_string_length_code,
2164+
this,
2165+
std::placeholders::_1,
2166+
std::placeholders::_2,
2167+
std::placeholders::_3);
21182168
// Not supported "java.lang.String.matches"
21192169
cprover_equivalent_to_java_function
21202170
["java::java.lang.String.offsetByCodePoints:(II)I"]=
@@ -2307,9 +2357,9 @@ void java_string_library_preprocesst::initialize_conversion_table()
23072357
"Ljava/lang/StringBuilder;"]=
23082358
ID_cprover_string_insert_func;
23092359
// Not supported "java.lang.StringBuilder.lastIndexOf"
2310-
cprover_equivalent_to_java_function
2360+
conversion_table
23112361
["java::java.lang.StringBuilder.length:()I"]=
2312-
ID_cprover_string_length_func;
2362+
conversion_table["java::java.lang.String.length:()I"];
23132363
// Not supported "java.lang.StringBuilder.offsetByCodePoints"
23142364
// Not supported "java.lang.StringBuilder.replace"
23152365
// Not supported "java.lang.StringBuilder.reverse"
@@ -2434,9 +2484,9 @@ void java_string_library_preprocesst::initialize_conversion_table()
24342484
"Ljava/lang/StringBuffer;"]=
24352485
ID_cprover_string_insert_func;
24362486
// Not supported "java.lang.StringBuffer.lastIndexOf"
2437-
cprover_equivalent_to_java_function
2487+
conversion_table
24382488
["java::java.lang.StringBuffer.length:()I"]=
2439-
ID_cprover_string_length_func;
2489+
conversion_table["java::java.lang.String.length:()I"];
24402490
// Not supported "java.lang.StringBuffer.offsetByCodePoints"
24412491
// Not supported "java.lang.StringBuffer.replace"
24422492
// Not supported "java.lang.StringBuffer.reverse"
@@ -2463,7 +2513,7 @@ void java_string_library_preprocesst::initialize_conversion_table()
24632513
std::placeholders::_3);
24642514
// Not supported "java.lang.StringBuffer.trimToSize"
24652515

2466-
// Other libraries
2516+
// CharSequence library
24672517
cprover_equivalent_to_java_function
24682518
["java::java.lang.CharSequence.charAt:(I)C"]=
24692519
ID_cprover_string_char_at_func;
@@ -2475,6 +2525,11 @@ void java_string_library_preprocesst::initialize_conversion_table()
24752525
std::placeholders::_1,
24762526
std::placeholders::_2,
24772527
std::placeholders::_3);
2528+
conversion_table
2529+
["java::java.lang.CharSequence.length:()I"]=
2530+
conversion_table["java::java.lang.String.length:()I"];
2531+
2532+
// Other libraries
24782533
conversion_table
24792534
["java::java.lang.Float.toString:(F)Ljava/lang/String;"]=
24802535
std::bind(

src/java_bytecode/java_string_library_preprocess.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,11 @@ class java_string_library_preprocesst:public messaget
146146
const source_locationt &loc,
147147
symbol_tablet &symbol_table);
148148

149+
codet make_string_length_code(
150+
const code_typet &type,
151+
const source_locationt &loc,
152+
symbol_tablet &symbol_table);
153+
149154
// Auxiliary functions
150155
codet code_for_scientific_notation(
151156
const exprt &arg,

0 commit comments

Comments
 (0)