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