Skip to content

Commit 93e0ab4

Browse files
author
Matthias Güdemann
committed
Simplify stack element replacement loop
1 parent ccc7318 commit 93e0ab4

File tree

1 file changed

+24
-21
lines changed

1 file changed

+24
-21
lines changed

jbmc/src/java_bytecode/java_bytecode_convert_method.cpp

+24-21
Original file line numberDiff line numberDiff line change
@@ -3209,20 +3209,29 @@ void java_bytecode_convert_methodt::save_stack_entries(
32093209
}
32103210
};
32113211

3212+
// Function that checks whether the expression accesses a member with the
3213+
// given identifier name. These accesses are created in the case of `iinc`, or
3214+
// non-array `?store` instructions.
32123215
const std::function<tvt(const exprt &expr)> has_member_entry = [&identifier](
32133216
const exprt &expr) {
32143217
const auto member_expr = expr_try_dynamic_cast<member_exprt>(expr);
32153218
return !member_expr ? tvt::unknown()
32163219
: tvt(member_expr->get_component_name() == identifier);
32173220
};
32183221

3222+
// Function that checks whether the expression is a symbol with the given
3223+
// identifier name. These accesses are created in the case of `putstatic` or
3224+
// `putfield` instructions.
32193225
const std::function<tvt(const exprt &expr)> is_symbol_entry =
32203226
[&identifier](const exprt &expr) {
32213227
const auto symbol_expr = expr_try_dynamic_cast<symbol_exprt>(expr);
32223228
return !symbol_expr ? tvt::unknown()
32233229
: tvt(symbol_expr->get_identifier() == identifier);
32243230
};
32253231

3232+
// Function that checks whether the expression is a dereference
3233+
// expression. These accesses are created in `?astore` array write
3234+
// instructions.
32263235
const std::function<tvt(const exprt &expr)> is_dereference_entry =
32273236
[](const exprt &expr) {
32283237
const auto dereference_expr =
@@ -3232,27 +3241,21 @@ void java_bytecode_convert_methodt::save_stack_entries(
32323241

32333242
for(auto &stack_entry : stack)
32343243
{
3235-
// variables or static fields and symbol -> save symbols with same id
3236-
if(
3237-
(write_type == bytecode_write_typet::VARIABLE ||
3238-
write_type == bytecode_write_typet::STATIC_FIELD) &&
3239-
entry_matches(is_symbol_entry, stack_entry))
3240-
{
3241-
create_stack_tmp_var(tmp_var_prefix, tmp_var_type, block, stack_entry);
3242-
}
3243-
3244-
// array reference and dereference -> save all references on the stack
3245-
else if(
3246-
write_type == bytecode_write_typet::ARRAY_REF &&
3247-
entry_matches(is_dereference_entry, stack_entry))
3248-
{
3249-
create_stack_tmp_var(tmp_var_prefix, tmp_var_type, block, stack_entry);
3250-
}
3251-
3252-
// field and member access -> compare component name
3253-
else if(
3254-
write_type == bytecode_write_typet::FIELD &&
3255-
entry_matches(has_member_entry, stack_entry))
3244+
bool replace = false;
3245+
switch(write_type)
3246+
{
3247+
case bytecode_write_typet::VARIABLE:
3248+
case bytecode_write_typet::STATIC_FIELD:
3249+
replace = entry_matches(is_symbol_entry, stack_entry);
3250+
break;
3251+
case bytecode_write_typet::ARRAY_REF:
3252+
replace = entry_matches(is_dereference_entry, stack_entry);
3253+
break;
3254+
case bytecode_write_typet::FIELD:
3255+
replace = entry_matches(has_member_entry, stack_entry);
3256+
break;
3257+
}
3258+
if(replace)
32563259
{
32573260
create_stack_tmp_var(tmp_var_prefix, tmp_var_type, block, stack_entry);
32583261
}

0 commit comments

Comments
 (0)