Skip to content

Commit cc7eff6

Browse files
committed
Java bytecode conversion: inline or move temporaries
This avoids constructing short-lived temporary objects where their names don't add value either.
1 parent cec0869 commit cc7eff6

File tree

2 files changed

+30
-40
lines changed

2 files changed

+30
-40
lines changed

jbmc/src/java_bytecode/java_bytecode_convert_method.cpp

+17-28
Original file line numberDiff line numberDiff line change
@@ -1621,15 +1621,12 @@ code_blockt java_bytecode_convert_methodt::convert_instructions(
16211621
{
16221622
PRECONDITION(op.size() == 1 && results.size() == 1);
16231623

1624-
const typecast_exprt pointer(op[0], java_array_type(statement[0]));
1625-
1626-
dereference_exprt array{pointer};
1627-
PRECONDITION(pointer.type().subtype().id() == ID_struct_tag);
1624+
dereference_exprt array{
1625+
typecast_exprt{op[0], java_array_type(statement[0])}};
1626+
PRECONDITION(array.type().id() == ID_struct_tag);
16281627
array.set(ID_java_member_access, true);
16291628

1630-
const member_exprt length(array, "length", java_int_type());
1631-
1632-
results[0]=length;
1629+
results[0] = member_exprt{std::move(array), "length", java_int_type()};
16331630
}
16341631
else if(statement=="tableswitch" ||
16351632
statement=="lookupswitch")
@@ -1823,8 +1820,8 @@ code_blockt java_bytecode_convert_methodt::convert_instructions(
18231820

18241821
if(start_new_block)
18251822
{
1826-
code_labelt newlabel(label(std::to_string(address)), code_blockt());
1827-
root_block.add(newlabel);
1823+
root_block.add(
1824+
code_labelt{label(std::to_string(address)), code_blockt{}});
18281825
root.branch.push_back(block_tree_nodet::get_leaf());
18291826
assert((root.branch_addresses.empty() ||
18301827
root.branch_addresses.back()<address) &&
@@ -2490,7 +2487,7 @@ code_blockt java_bytecode_convert_methodt::convert_newarray(
24902487
constant_exprt size_limit = from_integer(max_array_length, java_int_type());
24912488
binary_relation_exprt le_max_size(op[0], ID_le, size_limit);
24922489
code_assumet assume_le_max_size(le_max_size);
2493-
block.add(assume_le_max_size);
2490+
block.add(std::move(assume_le_max_size));
24942491
}
24952492
const exprt tmp = tmp_variable("newarray", ref_type);
24962493
block.add(code_assignt(tmp, java_new_array));
@@ -2693,10 +2690,10 @@ code_blockt java_bytecode_convert_methodt::convert_iinc(
26932690

26942691
const exprt arg1_int_type =
26952692
typecast_exprt::conditional_cast(arg1, java_int_type());
2696-
const code_assignt code_assign(
2693+
code_assignt code_assign(
26972694
variable(arg0, 'i', address, NO_CAST),
26982695
plus_exprt(variable(arg0, 'i', address, CAST_AS_NEEDED), arg1_int_type));
2699-
block.add(code_assign);
2696+
block.add(std::move(code_assign));
27002697

27012698
return block;
27022699
}
@@ -2829,20 +2826,16 @@ exprt java_bytecode_convert_methodt::convert_aload(
28292826
const irep_idt &statement,
28302827
const exprt::operandst &op) const
28312828
{
2832-
const char &type_char = statement[0];
2833-
const typecast_exprt pointer(op[0], java_array_type(type_char));
2834-
2835-
dereference_exprt deref{pointer};
2829+
const char type_char = statement[0];
2830+
dereference_exprt deref{typecast_exprt{op[0], java_array_type(type_char)}};
28362831
deref.set(ID_java_member_access, true);
28372832

2838-
const member_exprt data_ptr(
2833+
member_exprt data_ptr(
28392834
deref, "data", pointer_type(java_type_from_char(type_char)));
2840-
2841-
plus_exprt data_plus_offset{data_ptr, op[1]};
2835+
plus_exprt data_plus_offset{std::move(data_ptr), op[1]};
28422836
// tag it so it's easy to identify during instrumentation
28432837
data_plus_offset.set(ID_java_array_access, true);
2844-
const dereference_exprt element{data_plus_offset};
2845-
return java_bytecode_promotion(element);
2838+
return java_bytecode_promotion(dereference_exprt{data_plus_offset});
28462839
}
28472840

28482841
code_blockt java_bytecode_convert_methodt::convert_store(
@@ -2878,18 +2871,14 @@ code_blockt java_bytecode_convert_methodt::convert_astore(
28782871
const source_locationt &location)
28792872
{
28802873
const char type_char = statement[0];
2881-
const typecast_exprt pointer(op[0], java_array_type(type_char));
2882-
2883-
dereference_exprt deref{pointer};
2874+
dereference_exprt deref{typecast_exprt{op[0], java_array_type(type_char)}};
28842875
deref.set(ID_java_member_access, true);
28852876

2886-
const member_exprt data_ptr(
2877+
member_exprt data_ptr(
28872878
deref, "data", pointer_type(java_type_from_char(type_char)));
2888-
2889-
plus_exprt data_plus_offset{data_ptr, op[1]};
2879+
plus_exprt data_plus_offset{std::move(data_ptr), op[1]};
28902880
// tag it so it's easy to identify during instrumentation
28912881
data_plus_offset.set(ID_java_array_access, true);
2892-
const dereference_exprt element{data_plus_offset};
28932882

28942883
code_blockt block;
28952884
block.add_source_location() = location;

jbmc/src/java_bytecode/java_string_library_preprocess.cpp

+13-12
Original file line numberDiff line numberDiff line change
@@ -468,10 +468,8 @@ refined_string_exprt java_string_library_preprocesst::decl_string_expr(
468468
array_type, "cprover_string_content", loc, function_id, symbol_table);
469469
const symbol_exprt content_field = sym_content.symbol_expr();
470470
code.add(code_declt(content_field), loc);
471-
const refined_string_exprt str{
472-
length_field, content_field, refined_string_type};
473-
code.add(code_declt(length_field), loc);
474-
return str;
471+
code.add(code_declt{length_field}, loc);
472+
return refined_string_exprt{length_field, content_field, refined_string_type};
475473
}
476474

477475
/// add symbols with prefix cprover_string_length and cprover_string_data and
@@ -601,10 +599,10 @@ exprt make_nondet_infinite_char_array(
601599
const symbol_exprt data_pointer = data_sym.symbol_expr();
602600
code.add(code_declt(data_pointer));
603601
code.add(make_allocate_code(data_pointer, array_type.size()));
604-
const exprt nondet_data = side_effect_expr_nondett(array_type, loc);
605-
const exprt data = dereference_exprt{data_pointer};
606-
code.add(code_assignt(data, nondet_data), loc);
607-
return data;
602+
side_effect_expr_nondett nondet_data{array_type, loc};
603+
dereference_exprt data{data_pointer};
604+
code.add(code_assignt{data, std::move(nondet_data)}, loc);
605+
return std::move(data);
608606
}
609607

610608
/// Add a call to a primitive of the string solver, letting it know that
@@ -847,8 +845,8 @@ void java_string_library_preprocesst::code_assign_java_string_to_string_expr(
847845

848846
// Assignments
849847
code.add(code_assignt(lhs.length(), rhs_length), loc);
850-
const exprt data_as_array = get_data(deref, symbol_table);
851-
code.add(code_assignt(lhs.content(), data_as_array), loc);
848+
exprt data_as_array = get_data(deref, symbol_table);
849+
code.add(code_assignt{lhs.content(), std::move(data_as_array)}, loc);
852850
}
853851

854852
/// Create a string expression whose value is given by a literal
@@ -868,9 +866,12 @@ java_string_library_preprocesst::string_literal_to_string_expr(
868866
symbol_table_baset &symbol_table,
869867
code_blockt &code)
870868
{
871-
const constant_exprt expr(s, string_typet());
872869
return string_expr_of_function(
873-
ID_cprover_string_literal_func, {expr}, loc, symbol_table, code);
870+
ID_cprover_string_literal_func,
871+
{constant_exprt{s, string_typet{}}},
872+
loc,
873+
symbol_table,
874+
code);
874875
}
875876

876877
/// Provide code for the String.valueOf(F) function.

0 commit comments

Comments
 (0)