CBMC
create_array_with_type_intrinsic.cpp
Go to the documentation of this file.
1 /*******************************************************************\
2 
3 Module: Implementation of CProver.createArrayWithType intrinsic
4 
5 Author: Diffblue Ltd.
6 
7 \*******************************************************************/
8 
11 
13 
15 
16 #include <util/fresh_symbol.h>
17 #include <util/namespace.h>
18 #include <util/pointer_expr.h>
19 #include <util/std_code.h>
20 #include <util/symbol_table_base.h>
21 
24 {
25  static irep_idt create_array_with_type_name =
26  "java::org.cprover.CProver.createArrayWithType:"
27  "(I[Ljava/lang/Object;)[Ljava/lang/Object;";
28  return create_array_with_type_name;
29 }
30 
42  const irep_idt &function_id,
43  symbol_table_baset &symbol_table,
44  message_handlert &message_handler)
45 {
46  // Replace CProver.createArrayWithType, which uses reflection to copy the
47  // type but not the content of a given array, with a java_new_array statement
48  // followed by overwriting its element type and dimension, similar to our
49  // implementation (in java_bytecode_convert_class.cpp) of the
50  // array[reference].clone() method.
51 
53 
54  namespacet ns{symbol_table};
55 
56  const symbolt &function_symbol =
58  const auto &function_type = to_code_type(function_symbol.type);
59  const auto &length_argument = function_type.parameters().at(0);
60  symbol_exprt length_argument_symbol_expr{length_argument.get_identifier(),
61  length_argument.type()};
62  const auto &existing_array_argument = function_type.parameters().at(1);
63  symbol_exprt existing_array_argument_symbol_expr{
64  existing_array_argument.get_identifier(), existing_array_argument.type()};
65 
66  symbolt &new_array_symbol = get_fresh_aux_symbol(
67  function_type.parameters().at(1).type(),
69  "new_array",
71  ID_java,
72  symbol_table);
73  const auto new_array_symbol_expr = new_array_symbol.symbol_expr();
74 
75  code_blockt code_block;
76 
77  // Declare new_array temporary:
78  code_block.add(code_frontend_declt(new_array_symbol_expr));
79 
80  // new_array = new Object[length];
81  side_effect_exprt new_array_expr{
82  ID_java_new_array, new_array_symbol.type, source_locationt{}};
83  new_array_expr.copy_to_operands(length_argument_symbol_expr);
84  code_block.add(code_frontend_assignt(new_array_symbol_expr, new_array_expr));
85 
86  dereference_exprt existing_array(existing_array_argument_symbol_expr);
87  dereference_exprt new_array(new_array_symbol_expr);
88 
89  // new_array.@array_dimensions = existing_array.@array_dimensions
90  // new_array.@element_class_identifier =
91  // existing_array.@element_class_identifier
92  member_exprt old_array_dimension(
94  member_exprt old_array_element_classid(
96 
97  member_exprt new_array_dimension(
99  member_exprt new_array_element_classid(
101 
102  code_block.add(
103  code_frontend_assignt(new_array_dimension, old_array_dimension));
104  code_block.add(code_frontend_assignt(
105  new_array_element_classid, old_array_element_classid));
106 
107  // return new_array
108  code_block.add(code_frontend_returnt(new_array_symbol_expr));
109 
110  return std::move(code_block);
111 }
create_array_with_type_body
codet create_array_with_type_body(const irep_idt &function_id, symbol_table_baset &symbol_table, message_handlert &message_handler)
Returns the internal implementation for org.cprover.CProver.createArrayWithType.
Definition: create_array_with_type_intrinsic.cpp:41
dstringt
dstringt has one field, an unsigned integer no which is an index into a static table of strings.
Definition: dstring.h:36
JAVA_ARRAY_ELEMENT_CLASSID_FIELD_NAME
#define JAVA_ARRAY_ELEMENT_CLASSID_FIELD_NAME
Definition: java_types.h:671
code_blockt
A codet representing sequential composition of program statements.
Definition: std_code.h:129
symbol_table_baset::lookup_ref
const symbolt & lookup_ref(const irep_idt &name) const
Find a symbol in the symbol table for read-only access.
Definition: symbol_table_base.h:104
JAVA_ARRAY_DIMENSION_FIELD_NAME
#define JAVA_ARRAY_DIMENSION_FIELD_NAME
Definition: java_types.h:669
fresh_symbol.h
symbolt::type
typet type
Type of symbol.
Definition: symbol.h:31
dereference_exprt
Operator to dereference a pointer.
Definition: pointer_expr.h:659
object_factory_parameterst::function_id
irep_idt function_id
Function id, used as a prefix for identifiers of temporaries.
Definition: object_factory_parameters.h:79
code_frontend_declt
A codet representing the declaration of a local variable.
Definition: std_code.h:346
symbol_exprt
Expression to hold a symbol (variable)
Definition: std_expr.h:112
namespace.h
namespacet
A namespacet is essentially one or two symbol tables bound together, to allow for symbol lookups in t...
Definition: namespace.h:90
to_code_type
const code_typet & to_code_type(const typet &type)
Cast a typet to a code_typet.
Definition: std_types.h:744
id2string
const std::string & id2string(const irep_idt &d)
Definition: irep.h:47
PRECONDITION
#define PRECONDITION(CONDITION)
Definition: invariant.h:463
symbol_exprt::get_identifier
const irep_idt & get_identifier() const
Definition: std_expr.h:142
symbol_table_baset
The symbol table base class interface.
Definition: symbol_table_base.h:21
create_array_with_type_intrinsic.h
symbolt::symbol_expr
class symbol_exprt symbol_expr() const
Produces a symbol_exprt for a symbol.
Definition: symbol.cpp:121
pointer_expr.h
code_frontend_assignt
A codet representing an assignment in the program.
Definition: std_code.h:23
message_handlert
Definition: message.h:27
code_blockt::add
void add(const codet &code)
Definition: std_code.h:168
java_int_type
signedbv_typet java_int_type()
Definition: java_types.cpp:31
std_code.h
code_frontend_returnt
codet representation of a "return from a function" statement.
Definition: std_code.h:892
source_locationt
Definition: source_location.h:18
member_exprt
Extract member of struct or union.
Definition: std_expr.h:2793
symbolt
Symbol table entry.
Definition: symbol.h:27
string_typet
String type.
Definition: std_types.h:912
java_types.h
symbol_table_base.h
Author: Diffblue Ltd.
get_fresh_aux_symbol
symbolt & get_fresh_aux_symbol(const typet &type, const std::string &name_prefix, const std::string &basename_prefix, const source_locationt &source_location, const irep_idt &symbol_mode, const namespacet &ns, symbol_table_baset &symbol_table)
Installs a fresh-named symbol with respect to the given namespace ns with the requested name pattern ...
Definition: fresh_symbol.cpp:32
side_effect_exprt
An expression containing a side effect.
Definition: std_code.h:1449
codet
Data structure for representing an arbitrary statement in a program.
Definition: std_code_base.h:28
get_create_array_with_type_name
irep_idt get_create_array_with_type_name()
Returns the symbol name for org.cprover.CProver.createArrayWithType
Definition: create_array_with_type_intrinsic.cpp:23