Skip to content

Commit f3db3f0

Browse files
authored
Merge pull request #3915 from thk123/use-fieldref-exprt
Use fieldref exprt
2 parents 9d31c1a + 60553c1 commit f3db3f0

4 files changed

+34
-20
lines changed

jbmc/src/java_bytecode/java_bytecode_convert_method.cpp

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -657,15 +657,15 @@ static irep_idt get_if_cmp_operator(const irep_idt &stmt)
657657
/// components if necessary.
658658
static member_exprt to_member(
659659
const exprt &pointer,
660-
const exprt &field_reference,
660+
const fieldref_exprt &field_reference,
661661
const namespacet &ns)
662662
{
663-
struct_tag_typet class_type(field_reference.get(ID_class));
663+
struct_tag_typet class_type(field_reference.class_name());
664664

665665
const exprt typed_pointer =
666666
typecast_exprt::conditional_cast(pointer, java_reference_type(class_type));
667667

668-
const irep_idt &component_name = field_reference.get(ID_component_name);
668+
const irep_idt &component_name = field_reference.component_name();
669669

670670
exprt accessed_object = checked_dereference(typed_pointer, class_type);
671671
const auto type_of = [&ns](const exprt &object) {
@@ -1559,7 +1559,8 @@ code_blockt java_bytecode_convert_methodt::convert_instructions(
15591559
else if(statement=="getfield")
15601560
{
15611561
PRECONDITION(op.size() == 1 && results.size() == 1);
1562-
results[0] = java_bytecode_promotion(to_member(op[0], arg0, ns));
1562+
results[0] = java_bytecode_promotion(
1563+
to_member(op[0], expr_dynamic_cast<fieldref_exprt>(arg0), ns));
15631564
}
15641565
else if(statement=="getstatic")
15651566
{
@@ -1582,7 +1583,7 @@ code_blockt java_bytecode_convert_methodt::convert_instructions(
15821583
else if(statement=="putfield")
15831584
{
15841585
PRECONDITION(op.size() == 2 && results.empty());
1585-
c = convert_putfield(arg0, op);
1586+
c = convert_putfield(expr_dynamic_cast<fieldref_exprt>(arg0), op);
15861587
}
15871588
else if(statement=="putstatic")
15881589
{
@@ -2588,15 +2589,12 @@ code_blockt java_bytecode_convert_methodt::convert_putstatic(
25882589
}
25892590

25902591
code_blockt java_bytecode_convert_methodt::convert_putfield(
2591-
const exprt &arg0,
2592+
const fieldref_exprt &arg0,
25922593
const exprt::operandst &op)
25932594
{
25942595
code_blockt block;
25952596
save_stack_entries(
2596-
"stack_field",
2597-
block,
2598-
bytecode_write_typet::FIELD,
2599-
arg0.get(ID_component_name));
2597+
"stack_field", block, bytecode_write_typet::FIELD, arg0.component_name());
26002598
block.add(code_assignt(to_member(op[0], arg0, ns), op[1]));
26012599
return block;
26022600
}

jbmc/src/java_bytecode/java_bytecode_convert_method_class.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -395,7 +395,8 @@ class java_bytecode_convert_methodt:public messaget
395395
codet &c,
396396
exprt::operandst &results);
397397

398-
code_blockt convert_putfield(const exprt &arg0, const exprt::operandst &op);
398+
code_blockt
399+
convert_putfield(const fieldref_exprt &arg0, const exprt::operandst &op);
399400

400401
code_blockt convert_putstatic(
401402
const source_locationt &location,

jbmc/src/java_bytecode/java_bytecode_language.cpp

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -311,16 +311,17 @@ static void infer_opaque_type_fields(
311311
if(instruction.statement == "getfield" ||
312312
instruction.statement == "putfield")
313313
{
314-
const exprt &fieldref = instruction.args[0];
315-
irep_idt class_symbol_id = fieldref.get(ID_class);
314+
const fieldref_exprt &fieldref =
315+
expr_dynamic_cast<fieldref_exprt>(instruction.args[0]);
316+
irep_idt class_symbol_id = fieldref.class_name();
316317
const symbolt *class_symbol = symbol_table.lookup(class_symbol_id);
317318
INVARIANT(
318319
class_symbol != nullptr,
319320
"all types containing fields should have been loaded");
320321

321322
const java_class_typet *class_type =
322323
&to_java_class_type(class_symbol->type);
323-
const irep_idt &component_name = fieldref.get(ID_component_name);
324+
const irep_idt &component_name = fieldref.component_name();
324325
while(!class_type->has_component(component_name))
325326
{
326327
if(class_type->get_is_stub())
@@ -582,12 +583,10 @@ static void create_stub_global_symbols(
582583
INVARIANT(
583584
instruction.args.size() > 0,
584585
"get/putstatic should have at least one argument");
585-
irep_idt component = instruction.args[0].get_string(ID_component_name);
586-
INVARIANT(
587-
!component.empty(), "get/putstatic should specify a component");
588-
irep_idt class_id = instruction.args[0].get_string(ID_class);
589-
INVARIANT(
590-
!class_id.empty(), "get/putstatic should specify a class");
586+
const fieldref_exprt &field_ref =
587+
expr_dynamic_cast<fieldref_exprt>(instruction.args[0]);
588+
irep_idt component = field_ref.component_name();
589+
irep_idt class_id = field_ref.class_name();
591590

592591
// The final 'true' parameter here includes interfaces, as they can
593592
// define static fields.

jbmc/src/java_bytecode/java_bytecode_parse_tree.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -337,6 +337,22 @@ class fieldref_exprt : public exprt
337337
set(ID_class, class_name);
338338
set(ID_component_name, component_name);
339339
}
340+
341+
irep_idt class_name() const
342+
{
343+
return get(ID_class);
344+
}
345+
346+
irep_idt component_name() const
347+
{
348+
return get(ID_component_name);
349+
}
340350
};
341351

352+
template <>
353+
inline bool can_cast_expr<fieldref_exprt>(const exprt &base)
354+
{
355+
return base.get(ID_class) != ID_nil && base.get(ID_component_name) != ID_nil;
356+
}
357+
342358
#endif // CPROVER_JAVA_BYTECODE_JAVA_BYTECODE_PARSE_TREE_H

0 commit comments

Comments
 (0)