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