Skip to content

Commit 066ba51

Browse files
Merge pull request diffblue#1778 from peterschrammel/java-array-is-object
Java arrays are instanceof Object
2 parents 3548d99 + 5fa3a1a commit 066ba51

File tree

3 files changed

+35
-30
lines changed

3 files changed

+35
-30
lines changed

regression/cbmc-java/instanceof1/test.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
KNOWNBUG
1+
CORE
22
instanceof1.class
33

44
^EXIT=0$

regression/cbmc-java/instanceof3/test.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
KNOWNBUG
1+
CORE
22
instanceof3.class
33

44
^EXIT=0$

src/java_bytecode/java_bytecode_convert_class.cpp

Lines changed: 33 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -487,39 +487,41 @@ void java_bytecode_convert_classt::add_array_types(symbol_tablet &symbol_table)
487487
if(symbol_table.has_symbol(symbol_type_identifier))
488488
return;
489489

490-
struct_typet struct_type;
490+
class_typet class_type;
491491
// we have the base class, java.lang.Object, length and data
492492
// of appropriate type
493-
struct_type.set_tag(symbol_type_identifier);
494-
495-
struct_type.components().reserve(3);
496-
struct_typet::componentt
497-
comp0("@java.lang.Object", symbol_typet("java::java.lang.Object"));
498-
comp0.set_pretty_name("@java.lang.Object");
499-
comp0.set_base_name("@java.lang.Object");
500-
struct_type.components().push_back(comp0);
501-
502-
struct_typet::componentt comp1("length", java_int_type());
503-
comp1.set_pretty_name("length");
504-
comp1.set_base_name("length");
505-
struct_type.components().push_back(comp1);
506-
507-
struct_typet::componentt
508-
comp2("data", java_reference_type(java_type_from_char(l)));
509-
comp2.set_pretty_name("data");
510-
comp2.set_base_name("data");
511-
struct_type.components().push_back(comp2);
493+
class_type.set_tag(symbol_type_identifier);
494+
495+
class_type.components().reserve(3);
496+
class_typet::componentt base_class_component(
497+
"@java.lang.Object", symbol_typet("java::java.lang.Object"));
498+
base_class_component.set_pretty_name("@java.lang.Object");
499+
base_class_component.set_base_name("@java.lang.Object");
500+
class_type.components().push_back(base_class_component);
501+
502+
class_typet::componentt length_component("length", java_int_type());
503+
length_component.set_pretty_name("length");
504+
length_component.set_base_name("length");
505+
class_type.components().push_back(length_component);
506+
507+
class_typet::componentt data_component(
508+
"data", java_reference_type(java_type_from_char(l)));
509+
data_component.set_pretty_name("data");
510+
data_component.set_base_name("data");
511+
class_type.components().push_back(data_component);
512+
513+
class_type.add_base(symbol_typet("java::java.lang.Object"));
512514

513515
INVARIANT(
514-
is_valid_java_array(struct_type),
516+
is_valid_java_array(class_type),
515517
"Constructed a new type representing a Java Array "
516518
"object that doesn't match expectations");
517519

518520
symbolt symbol;
519521
symbol.name=symbol_type_identifier;
520522
symbol.base_name=symbol_type.get(ID_C_base_name);
521523
symbol.is_type=true;
522-
symbol.type=struct_type;
524+
symbol.type = class_type;
523525
symbol_table.add(symbol);
524526

525527
// Also provide a clone method:
@@ -566,14 +568,16 @@ void java_bytecode_convert_classt::add_array_types(symbol_tablet &symbol_table)
566568
java_reference_type(symbol_type));
567569
dereference_exprt old_array(this_symbol.symbol_expr(), symbol_type);
568570
dereference_exprt new_array(local_symexpr, symbol_type);
569-
member_exprt old_length(old_array, comp1.get_name(), comp1.type());
571+
member_exprt old_length(
572+
old_array, length_component.get_name(), length_component.type());
570573
java_new_array.copy_to_operands(old_length);
571574
code_assignt create_blank(local_symexpr, java_new_array);
572575
clone_body.move_to_operands(create_blank);
573576

574-
575-
member_exprt old_data(old_array, comp2.get_name(), comp2.type());
576-
member_exprt new_data(new_array, comp2.get_name(), comp2.type());
577+
member_exprt old_data(
578+
old_array, data_component.get_name(), data_component.type());
579+
member_exprt new_data(
580+
new_array, data_component.get_name(), data_component.type());
577581

578582
/*
579583
// TODO use this instead of a loop.
@@ -592,7 +596,7 @@ void java_bytecode_convert_classt::add_array_types(symbol_tablet &symbol_table)
592596
index_symbol.name=index_name;
593597
index_symbol.base_name="index";
594598
index_symbol.pretty_name=index_symbol.base_name;
595-
index_symbol.type=comp1.type();
599+
index_symbol.type = length_component.type();
596600
index_symbol.mode=ID_java;
597601
symbol_table.add(index_symbol);
598602
const auto &index_symexpr=index_symbol.symbol_expr();
@@ -623,7 +627,8 @@ void java_bytecode_convert_classt::add_array_types(symbol_tablet &symbol_table)
623627
// End for-loop
624628
clone_body.move_to_operands(copy_loop);
625629

626-
member_exprt new_base_class(new_array, comp0.get_name(), comp0.type());
630+
member_exprt new_base_class(
631+
new_array, base_class_component.get_name(), base_class_component.type());
627632
address_of_exprt retval(new_base_class);
628633
code_returnt return_inst(retval);
629634
clone_body.move_to_operands(return_inst);

0 commit comments

Comments
 (0)