13
13
14
14
#include < iomanip>
15
15
16
- #include < util/std_expr.h>
17
- #include < util/prefix.h>
18
16
#include < util/arith_tools.h>
19
17
#include < util/unicode.h>
20
18
@@ -110,10 +108,11 @@ void java_bytecode_typecheckt::typecheck_expr_java_string_literal(exprt &expr)
110
108
const irep_idt value=expr.get (ID_value);
111
109
const symbol_typet string_type (" java::java.lang.String" );
112
110
113
- std::string escaped_symbol_name=JAVA_STRING_LITERAL_PREFIX " ." ;
114
- escaped_symbol_name+=escape_non_alnum (id2string (value));
111
+ const std::string escaped_symbol_name = escape_non_alnum (id2string (value));
112
+ const std::string escaped_symbol_name_with_prefix =
113
+ JAVA_STRING_LITERAL_PREFIX " ." + escaped_symbol_name;
115
114
116
- auto findit= symbol_table.symbols .find (escaped_symbol_name );
115
+ auto findit = symbol_table.symbols .find (escaped_symbol_name_with_prefix );
117
116
if (findit!=symbol_table.symbols .end ())
118
117
{
119
118
expr=address_of_exprt (findit->second .symbol_expr ());
@@ -122,9 +121,9 @@ void java_bytecode_typecheckt::typecheck_expr_java_string_literal(exprt &expr)
122
121
123
122
// Create a new symbol:
124
123
symbolt new_symbol;
125
- new_symbol.name =escaped_symbol_name ;
124
+ new_symbol.name = escaped_symbol_name_with_prefix ;
126
125
new_symbol.type =string_type;
127
- new_symbol.base_name = " Literal " ;
126
+ new_symbol.base_name = escaped_symbol_name ;
128
127
new_symbol.pretty_name =value;
129
128
new_symbol.mode =ID_java;
130
129
new_symbol.is_type =false ;
@@ -144,15 +143,19 @@ void java_bytecode_typecheckt::typecheck_expr_java_string_literal(exprt &expr)
144
143
if (string_refinement_enabled)
145
144
{
146
145
struct_exprt literal_init (new_symbol.type );
147
- literal_init.move_to_operands (jlo_init);
148
- literal_init.copy_to_operands (
149
- from_integer (id2string (value).size (), jls_struct.components ()[1 ].type ()));
146
+ literal_init.operands ().resize (jls_struct.components ().size ());
147
+ const std::size_t jlo_nb = jls_struct.component_number (" @java.lang.Object" );
148
+ literal_init.operands ()[jlo_nb] = jlo_init;
149
+
150
+ const std::size_t length_nb = jls_struct.component_number (" length" );
151
+ const typet &length_type = jls_struct.components ()[length_nb].type ();
152
+ const exprt length = from_integer (id2string (value).size (), length_type);
153
+ literal_init.operands ()[length_nb] = length;
150
154
151
155
// Initialize the string with a constant utf-16 array:
152
156
symbolt array_symbol;
153
- array_symbol.name =escaped_symbol_name+" _constarray" ;
154
- array_symbol.base_name =" Literal_constarray" ;
155
- // TODO: this should be obtained from java_string_library_preprocess
157
+ array_symbol.name = escaped_symbol_name_with_prefix + " _constarray" ;
158
+ array_symbol.base_name = escaped_symbol_name + " _constarray" ;
156
159
array_symbol.pretty_name =value;
157
160
array_symbol.mode =ID_java;
158
161
array_symbol.is_type =false ;
@@ -168,23 +171,28 @@ void java_bytecode_typecheckt::typecheck_expr_java_string_literal(exprt &expr)
168
171
throw " failed to add constarray symbol to symbol table" ;
169
172
170
173
const symbol_exprt array_expr = array_symbol.symbol_expr ();
171
- const address_of_exprt first_index (
174
+ const address_of_exprt array_pointer (
172
175
index_exprt (array_expr, from_integer (0 , java_int_type ())));
173
- literal_init.copy_to_operands (first_index);
176
+
177
+ const std::size_t data_nb = jls_struct.component_number (" data" );
178
+ literal_init.operands ()[data_nb] = array_pointer;
174
179
175
180
// Associate array with pointer
176
181
symbolt return_symbol;
177
- return_symbol.name = " return_value_" + escaped_symbol_name;
178
- return_symbol.base_name = escaped_symbol_name;
179
- return_symbol.pretty_name = " return_value" ;
182
+ return_symbol.name = escaped_symbol_name_with_prefix + " _return_value" ;
183
+ return_symbol.base_name = escaped_symbol_name + " _return_value" ;
184
+ return_symbol.pretty_name =
185
+ escaped_symbol_name.length () > 10
186
+ ? escaped_symbol_name.substr (0 , 10 ) + " ..._return_value"
187
+ : escaped_symbol_name + " _return_value" ;
180
188
return_symbol.mode = ID_java;
181
189
return_symbol.is_type = false ;
182
190
return_symbol.is_lvalue = true ;
183
191
return_symbol.is_static_lifetime = true ;
184
192
return_symbol.is_state_var = true ;
185
193
return_symbol.value = make_function_application (
186
194
ID_cprover_associate_array_to_pointer_func,
187
- {array_symbol.value , first_index },
195
+ {array_symbol.value , array_pointer },
188
196
java_int_type (),
189
197
symbol_table);
190
198
return_symbol.type = return_symbol.value .type ();
0 commit comments