Skip to content

Commit 6f63050

Browse files
author
Matthias Güdemann
committed
Simplify stack element replacement loop
1 parent 731c69e commit 6f63050

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

Lines changed: 24 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3212,20 +3212,29 @@ void java_bytecode_convert_methodt::save_stack_entries(
32123212
}
32133213
};
32143214

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

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

3235+
// Function that checks whether the expression is a dereference
3236+
// expression. These accesses are created in `?astore` array write
3237+
// instructions.
32293238
const std::function<tvt(const exprt &expr)> is_dereference_entry =
32303239
[](const exprt &expr) {
32313240
const auto dereference_expr =
@@ -3235,27 +3244,21 @@ void java_bytecode_convert_methodt::save_stack_entries(
32353244

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

0 commit comments

Comments
 (0)