Skip to content

Commit f7602f8

Browse files
author
Matthias Güdemann
committed
Leave typecasts on variables on stack
Instead of removing all typecasts from variables on the stack, we extract the necessary information of the bare expression from a temporary variable via a `reference_wrapper`.
1 parent dec622c commit f7602f8

File tree

1 file changed

+22
-12
lines changed

1 file changed

+22
-12
lines changed

jbmc/src/java_bytecode/java_bytecode_convert_method.cpp

+22-12
Original file line numberDiff line numberDiff line change
@@ -3184,28 +3184,38 @@ void java_bytecode_convert_methodt::save_stack_entries(
31843184
{
31853185
for(auto &stack_entry : stack)
31863186
{
3187+
// remove typecasts if existing
3188+
auto entry = std::ref(stack_entry);
3189+
while(entry.get().id() == ID_typecast)
3190+
{
3191+
entry = std::ref(to_typecast_expr(stack_entry).op());
3192+
}
3193+
31873194
// variables or static fields and symbol -> save symbols with same id
3188-
if((write_type==bytecode_write_typet::VARIABLE ||
3189-
write_type==bytecode_write_typet::STATIC_FIELD) &&
3190-
stack_entry.id()==ID_symbol)
3195+
if(
3196+
(write_type == bytecode_write_typet::VARIABLE ||
3197+
write_type == bytecode_write_typet::STATIC_FIELD) &&
3198+
entry.get().id() == ID_symbol)
31913199
{
3192-
const symbol_exprt &var=to_symbol_expr(stack_entry);
3193-
if(var.get_identifier()==identifier)
3200+
if(to_symbol_expr(entry.get()).get_identifier() == identifier)
31943201
create_stack_tmp_var(tmp_var_prefix, tmp_var_type, block, stack_entry);
31953202
}
31963203

31973204
// array reference and dereference -> save all references on the stack
3198-
else if(write_type==bytecode_write_typet::ARRAY_REF &&
3199-
stack_entry.id()==ID_dereference)
3205+
else if(
3206+
write_type == bytecode_write_typet::ARRAY_REF &&
3207+
entry.get().id() == ID_dereference)
3208+
{
32003209
create_stack_tmp_var(tmp_var_prefix, tmp_var_type, block, stack_entry);
3210+
}
32013211

32023212
// field and member access -> compare component name
3203-
else if(write_type==bytecode_write_typet::FIELD &&
3204-
stack_entry.id()==ID_member)
3213+
else if(
3214+
write_type == bytecode_write_typet::FIELD &&
3215+
entry.get().id() == ID_member)
32053216
{
3206-
const irep_idt &entry_id=
3207-
to_member_expr(stack_entry).get_component_name();
3208-
if(entry_id==identifier)
3217+
const irep_idt &entry_id = to_member_expr(entry).get_component_name();
3218+
if(entry_id == identifier)
32093219
create_stack_tmp_var(tmp_var_prefix, tmp_var_type, block, stack_entry);
32103220
}
32113221
}

0 commit comments

Comments
 (0)