Skip to content

Commit e6700ff

Browse files
Minor improvements in bytecode typecheck
Remove commented code. Remove comment that is no longer relevant as the type is now char array of fixed size for string litterals data field. Remove unused includes. More informative names for symbols introduced. Improving (pretty_/base_)name of string litterals. Avoid direct access to struct with hardcoded field numbers.
1 parent 61f0e1b commit e6700ff

File tree

1 file changed

+27
-19
lines changed

1 file changed

+27
-19
lines changed

src/java_bytecode/java_bytecode_typecheck_expr.cpp

Lines changed: 27 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,6 @@ Author: Daniel Kroening, [email protected]
1313

1414
#include <iomanip>
1515

16-
#include <util/std_expr.h>
17-
#include <util/prefix.h>
1816
#include <util/arith_tools.h>
1917
#include <util/unicode.h>
2018

@@ -110,10 +108,11 @@ void java_bytecode_typecheckt::typecheck_expr_java_string_literal(exprt &expr)
110108
const irep_idt value=expr.get(ID_value);
111109
const symbol_typet string_type("java::java.lang.String");
112110

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;
115114

116-
auto findit=symbol_table.symbols.find(escaped_symbol_name);
115+
auto findit = symbol_table.symbols.find(escaped_symbol_name_with_prefix);
117116
if(findit!=symbol_table.symbols.end())
118117
{
119118
expr=address_of_exprt(findit->second.symbol_expr());
@@ -122,9 +121,9 @@ void java_bytecode_typecheckt::typecheck_expr_java_string_literal(exprt &expr)
122121

123122
// Create a new symbol:
124123
symbolt new_symbol;
125-
new_symbol.name=escaped_symbol_name;
124+
new_symbol.name = escaped_symbol_name_with_prefix;
126125
new_symbol.type=string_type;
127-
new_symbol.base_name="Literal";
126+
new_symbol.base_name = escaped_symbol_name;
128127
new_symbol.pretty_name=value;
129128
new_symbol.mode=ID_java;
130129
new_symbol.is_type=false;
@@ -144,15 +143,19 @@ void java_bytecode_typecheckt::typecheck_expr_java_string_literal(exprt &expr)
144143
if(string_refinement_enabled)
145144
{
146145
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;
150154

151155
// Initialize the string with a constant utf-16 array:
152156
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";
156159
array_symbol.pretty_name=value;
157160
array_symbol.mode=ID_java;
158161
array_symbol.is_type=false;
@@ -168,23 +171,28 @@ void java_bytecode_typecheckt::typecheck_expr_java_string_literal(exprt &expr)
168171
throw "failed to add constarray symbol to symbol table";
169172

170173
const symbol_exprt array_expr = array_symbol.symbol_expr();
171-
const address_of_exprt first_index(
174+
const address_of_exprt array_pointer(
172175
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;
174179

175180
// Associate array with pointer
176181
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";
180188
return_symbol.mode = ID_java;
181189
return_symbol.is_type = false;
182190
return_symbol.is_lvalue = true;
183191
return_symbol.is_static_lifetime = true;
184192
return_symbol.is_state_var = true;
185193
return_symbol.value = make_function_application(
186194
ID_cprover_associate_array_to_pointer_func,
187-
{array_symbol.value, first_index},
195+
{array_symbol.value, array_pointer},
188196
java_int_type(),
189197
symbol_table);
190198
return_symbol.type = return_symbol.value.type();

0 commit comments

Comments
 (0)