@@ -3209,20 +3209,29 @@ void java_bytecode_convert_methodt::save_stack_entries(
3209
3209
}
3210
3210
};
3211
3211
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.
3212
3215
const std::function<tvt (const exprt &expr)> has_member_entry = [&identifier](
3213
3216
const exprt &expr) {
3214
3217
const auto member_expr = expr_try_dynamic_cast<member_exprt>(expr);
3215
3218
return !member_expr ? tvt::unknown ()
3216
3219
: tvt (member_expr->get_component_name () == identifier);
3217
3220
};
3218
3221
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.
3219
3225
const std::function<tvt (const exprt &expr)> is_symbol_entry =
3220
3226
[&identifier](const exprt &expr) {
3221
3227
const auto symbol_expr = expr_try_dynamic_cast<symbol_exprt>(expr);
3222
3228
return !symbol_expr ? tvt::unknown ()
3223
3229
: tvt (symbol_expr->get_identifier () == identifier);
3224
3230
};
3225
3231
3232
+ // Function that checks whether the expression is a dereference
3233
+ // expression. These accesses are created in `?astore` array write
3234
+ // instructions.
3226
3235
const std::function<tvt (const exprt &expr)> is_dereference_entry =
3227
3236
[](const exprt &expr) {
3228
3237
const auto dereference_expr =
@@ -3232,27 +3241,21 @@ void java_bytecode_convert_methodt::save_stack_entries(
3232
3241
3233
3242
for (auto &stack_entry : stack)
3234
3243
{
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)
3256
3259
{
3257
3260
create_stack_tmp_var (tmp_var_prefix, tmp_var_type, block, stack_entry);
3258
3261
}
0 commit comments