@@ -1022,8 +1022,8 @@ Function: java_string_library_preprocesst::
1022
1022
Output: return the following code:
1023
1023
> lhs = { {Object}, length=rhs_length, data=rhs_array }
1024
1024
1025
- Purpose: Produce code for an assignemnrt of a string expr to a
1026
- Java string, component-wise .
1025
+ Purpose: Produce code for an assignment of a string expr to a
1026
+ Java string.
1027
1027
1028
1028
\*******************************************************************/
1029
1029
@@ -1862,8 +1862,7 @@ codet java_string_library_preprocesst::make_copy_string_code(
1862
1862
1863
1863
/* ******************************************************************\
1864
1864
1865
- Function:
1866
- java_string_library_preprocesst::make_copy_constructor_code
1865
+ Function: java_string_library_preprocesst::make_copy_constructor_code
1867
1866
1868
1867
Inputs:
1869
1868
type - type of the function
@@ -1911,6 +1910,52 @@ codet java_string_library_preprocesst::make_copy_constructor_code(
1911
1910
1912
1911
/* ******************************************************************\
1913
1912
1913
+ Function: java_string_library_preprocesst::make_string_length_code
1914
+
1915
+ Inputs:
1916
+ type - type of the function
1917
+ loc - location in the source
1918
+ symbol_table - symbol table
1919
+
1920
+ Outputs: Code corresponding to:
1921
+ > str_expr = java_string_to_string_expr(this)
1922
+ > str_expr_sym = str_expr
1923
+ > return this->length
1924
+
1925
+ Purpose: Generates code for the String.length method
1926
+
1927
+ \*******************************************************************/
1928
+
1929
+ codet java_string_library_preprocesst::make_string_length_code (
1930
+ const code_typet &type,
1931
+ const source_locationt &loc,
1932
+ symbol_tablet &symbol_table)
1933
+ {
1934
+ // Code for the output
1935
+ code_blockt code;
1936
+
1937
+ code_typet::parameterst params=type.parameters ();
1938
+ symbol_exprt arg_this (params[0 ].get_identifier (), params[0 ].type ());
1939
+ dereference_exprt deref (arg_this, arg_this.type ().subtype ());
1940
+
1941
+ // Create a new string_exprt to be picked up by the solver
1942
+ string_exprt str_expr=fresh_string_expr (loc, symbol_table, code);
1943
+
1944
+ // Assign this to str_expr
1945
+ code.add (
1946
+ code_assign_java_string_to_string_expr (str_expr, arg_this, symbol_table));
1947
+
1948
+ // Assign str_expr to str_expr_sym for that expression to be present in the
1949
+ // symbol table in order to be processed by the string solver
1950
+ exprt str_expr_sym=fresh_string_expr_symbol (loc, symbol_table, code);
1951
+ code.add (code_assignt (str_expr_sym, str_expr));
1952
+ code.add (code_returnt (get_length (deref, symbol_table)));
1953
+
1954
+ return code;
1955
+ }
1956
+
1957
+ /* ******************************************************************\
1958
+
1914
1959
Function: java_string_library_preprocesst::code_for_function
1915
1960
1916
1961
Inputs:
@@ -2110,9 +2155,14 @@ void java_string_library_preprocesst::initialize_conversion_table()
2110
2155
cprover_equivalent_to_java_function
2111
2156
[" java::java.lang.String.lastIndexOf:(Ljava/lang/String;I)I" ]=
2112
2157
ID_cprover_string_last_index_of_func;
2113
- cprover_equivalent_to_java_function
2158
+ conversion_table
2114
2159
[" java::java.lang.String.length:()I" ]=
2115
- ID_cprover_string_length_func;
2160
+ std::bind (
2161
+ &java_string_library_preprocesst::make_string_length_code,
2162
+ this ,
2163
+ std::placeholders::_1,
2164
+ std::placeholders::_2,
2165
+ std::placeholders::_3);
2116
2166
// Not supported "java.lang.String.matches"
2117
2167
cprover_equivalent_to_java_function
2118
2168
[" java::java.lang.String.offsetByCodePoints:(II)I" ]=
@@ -2305,9 +2355,9 @@ void java_string_library_preprocesst::initialize_conversion_table()
2305
2355
" Ljava/lang/StringBuilder;" ]=
2306
2356
ID_cprover_string_insert_func;
2307
2357
// Not supported "java.lang.StringBuilder.lastIndexOf"
2308
- cprover_equivalent_to_java_function
2358
+ conversion_table
2309
2359
[" java::java.lang.StringBuilder.length:()I" ]=
2310
- ID_cprover_string_length_func ;
2360
+ conversion_table[ " java::java.lang.String.length:()I " ] ;
2311
2361
// Not supported "java.lang.StringBuilder.offsetByCodePoints"
2312
2362
// Not supported "java.lang.StringBuilder.replace"
2313
2363
// Not supported "java.lang.StringBuilder.reverse"
@@ -2432,9 +2482,9 @@ void java_string_library_preprocesst::initialize_conversion_table()
2432
2482
" Ljava/lang/StringBuffer;" ]=
2433
2483
ID_cprover_string_insert_func;
2434
2484
// Not supported "java.lang.StringBuffer.lastIndexOf"
2435
- cprover_equivalent_to_java_function
2485
+ conversion_table
2436
2486
[" java::java.lang.StringBuffer.length:()I" ]=
2437
- ID_cprover_string_length_func ;
2487
+ conversion_table[ " java::java.lang.String.length:()I " ] ;
2438
2488
// Not supported "java.lang.StringBuffer.offsetByCodePoints"
2439
2489
// Not supported "java.lang.StringBuffer.replace"
2440
2490
// Not supported "java.lang.StringBuffer.reverse"
@@ -2461,7 +2511,7 @@ void java_string_library_preprocesst::initialize_conversion_table()
2461
2511
std::placeholders::_3);
2462
2512
// Not supported "java.lang.StringBuffer.trimToSize"
2463
2513
2464
- // Other libraries
2514
+ // CharSequence library
2465
2515
cprover_equivalent_to_java_function
2466
2516
[" java::java.lang.CharSequence.charAt:(I)C" ]=
2467
2517
ID_cprover_string_char_at_func;
@@ -2473,6 +2523,11 @@ void java_string_library_preprocesst::initialize_conversion_table()
2473
2523
std::placeholders::_1,
2474
2524
std::placeholders::_2,
2475
2525
std::placeholders::_3);
2526
+ conversion_table
2527
+ [" java::java.lang.CharSequence.length:()I" ]=
2528
+ conversion_table[" java::java.lang.String.length:()I" ];
2529
+
2530
+ // Other libraries
2476
2531
conversion_table
2477
2532
[" java::java.lang.Float.toString:(F)Ljava/lang/String;" ]=
2478
2533
std::bind (
0 commit comments