@@ -1024,8 +1024,8 @@ Function: java_string_library_preprocesst::
1024
1024
Output: return the following code:
1025
1025
> lhs = { {Object}, length=rhs_length, data=rhs_array }
1026
1026
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.
1029
1029
1030
1030
\*******************************************************************/
1031
1031
@@ -1864,8 +1864,7 @@ codet java_string_library_preprocesst::make_copy_string_code(
1864
1864
1865
1865
/* ******************************************************************\
1866
1866
1867
- Function:
1868
- java_string_library_preprocesst::make_copy_constructor_code
1867
+ Function: java_string_library_preprocesst::make_copy_constructor_code
1869
1868
1870
1869
Inputs:
1871
1870
type - type of the function
@@ -1913,6 +1912,52 @@ codet java_string_library_preprocesst::make_copy_constructor_code(
1913
1912
1914
1913
/* ******************************************************************\
1915
1914
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
+
1916
1961
Function: java_string_library_preprocesst::code_for_function
1917
1962
1918
1963
Inputs:
@@ -2112,9 +2157,14 @@ void java_string_library_preprocesst::initialize_conversion_table()
2112
2157
cprover_equivalent_to_java_function
2113
2158
[" java::java.lang.String.lastIndexOf:(Ljava/lang/String;I)I" ]=
2114
2159
ID_cprover_string_last_index_of_func;
2115
- cprover_equivalent_to_java_function
2160
+ conversion_table
2116
2161
[" 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);
2118
2168
// Not supported "java.lang.String.matches"
2119
2169
cprover_equivalent_to_java_function
2120
2170
[" java::java.lang.String.offsetByCodePoints:(II)I" ]=
@@ -2307,9 +2357,9 @@ void java_string_library_preprocesst::initialize_conversion_table()
2307
2357
" Ljava/lang/StringBuilder;" ]=
2308
2358
ID_cprover_string_insert_func;
2309
2359
// Not supported "java.lang.StringBuilder.lastIndexOf"
2310
- cprover_equivalent_to_java_function
2360
+ conversion_table
2311
2361
[" java::java.lang.StringBuilder.length:()I" ]=
2312
- ID_cprover_string_length_func ;
2362
+ conversion_table[ " java::java.lang.String.length:()I " ] ;
2313
2363
// Not supported "java.lang.StringBuilder.offsetByCodePoints"
2314
2364
// Not supported "java.lang.StringBuilder.replace"
2315
2365
// Not supported "java.lang.StringBuilder.reverse"
@@ -2434,9 +2484,9 @@ void java_string_library_preprocesst::initialize_conversion_table()
2434
2484
" Ljava/lang/StringBuffer;" ]=
2435
2485
ID_cprover_string_insert_func;
2436
2486
// Not supported "java.lang.StringBuffer.lastIndexOf"
2437
- cprover_equivalent_to_java_function
2487
+ conversion_table
2438
2488
[" java::java.lang.StringBuffer.length:()I" ]=
2439
- ID_cprover_string_length_func ;
2489
+ conversion_table[ " java::java.lang.String.length:()I " ] ;
2440
2490
// Not supported "java.lang.StringBuffer.offsetByCodePoints"
2441
2491
// Not supported "java.lang.StringBuffer.replace"
2442
2492
// Not supported "java.lang.StringBuffer.reverse"
@@ -2463,7 +2513,7 @@ void java_string_library_preprocesst::initialize_conversion_table()
2463
2513
std::placeholders::_3);
2464
2514
// Not supported "java.lang.StringBuffer.trimToSize"
2465
2515
2466
- // Other libraries
2516
+ // CharSequence library
2467
2517
cprover_equivalent_to_java_function
2468
2518
[" java::java.lang.CharSequence.charAt:(I)C" ]=
2469
2519
ID_cprover_string_char_at_func;
@@ -2475,6 +2525,11 @@ void java_string_library_preprocesst::initialize_conversion_table()
2475
2525
std::placeholders::_1,
2476
2526
std::placeholders::_2,
2477
2527
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
2478
2533
conversion_table
2479
2534
[" java::java.lang.Float.toString:(F)Ljava/lang/String;" ]=
2480
2535
std::bind (
0 commit comments