@@ -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