|
28 | 28 |
|
29 | 29 | #include "value_set.h" |
30 | 30 | #include "add_failed_symbols.h" |
| 31 | +#include "dynamic_object_name.h" |
31 | 32 |
|
32 | 33 | const value_sett::object_map_dt value_sett::object_map_dt::blank; |
33 | 34 | object_numberingt value_sett::object_numbering; |
@@ -808,11 +809,12 @@ void value_sett::get_value_set_rec( |
808 | 809 | const typet &dynamic_type= |
809 | 810 | static_cast<const typet &>(expr.find("#type")); |
810 | 811 |
|
811 | | - dynamic_object_exprt dynamic_object(dynamic_type); |
812 | | - dynamic_object.set_instance(location_number); |
813 | | - dynamic_object.valid()=true_exprt(); |
| 812 | + // Create the most-recent-allocation dynamic-object |
| 813 | + dynamic_object_exprt dynamic_object_recent(dynamic_type, true); |
| 814 | + dynamic_object_recent.set_instance(location_number); |
| 815 | + dynamic_object_recent.valid()=true_exprt(); |
814 | 816 |
|
815 | | - insert(dest, dynamic_object, 0); |
| 817 | + insert(dest, dynamic_object_recent, 0); |
816 | 818 | } |
817 | 819 | else if(statement==ID_cpp_new || |
818 | 820 | statement==ID_cpp_new_array) |
@@ -902,10 +904,7 @@ void value_sett::get_value_set_rec( |
902 | 904 | { |
903 | 905 | const dynamic_object_exprt &dynamic_object= |
904 | 906 | to_dynamic_object_expr(expr); |
905 | | - |
906 | | - const std::string prefix= |
907 | | - "value_set::dynamic_object"+ |
908 | | - std::to_string(dynamic_object.get_instance()); |
| 907 | + std::string prefix=get_dynamic_object_name(dynamic_object); |
909 | 908 |
|
910 | 909 | // first try with suffix |
911 | 910 | const std::string full_name=prefix+suffix; |
@@ -1466,9 +1465,12 @@ void value_sett::do_free( |
1466 | 1465 | { |
1467 | 1466 | const dynamic_object_exprt &dynamic_object= |
1468 | 1467 | to_dynamic_object_expr(object); |
| 1468 | + dynamic_object_idt key_dynamic_object=std::make_pair( |
| 1469 | + dynamic_object.get_instance(), |
| 1470 | + dynamic_object.get_recency()); |
1469 | 1471 |
|
1470 | 1472 | if(dynamic_object.valid().is_true()) |
1471 | | - to_mark.insert(dynamic_object.get_instance()); |
| 1473 | + to_mark.insert(key_dynamic_object); |
1472 | 1474 | } |
1473 | 1475 | } |
1474 | 1476 |
|
@@ -1497,7 +1499,11 @@ void value_sett::do_free( |
1497 | 1499 | const dynamic_object_exprt &dynamic_object= |
1498 | 1500 | to_dynamic_object_expr(object); |
1499 | 1501 |
|
1500 | | - if(to_mark.count(dynamic_object.get_instance())==0) |
| 1502 | + dynamic_object_idt key_dynamic_object=std::make_pair( |
| 1503 | + dynamic_object.get_instance(), |
| 1504 | + dynamic_object.get_recency()); |
| 1505 | + |
| 1506 | + if(to_mark.count(key_dynamic_object)==0) |
1501 | 1507 | set(new_object_map, o_it); |
1502 | 1508 | else |
1503 | 1509 | { |
@@ -1564,10 +1570,7 @@ void value_sett::assign_rec( |
1564 | 1570 | { |
1565 | 1571 | const dynamic_object_exprt &dynamic_object= |
1566 | 1572 | to_dynamic_object_expr(lhs); |
1567 | | - |
1568 | | - const std::string name= |
1569 | | - "value_set::dynamic_object"+ |
1570 | | - std::to_string(dynamic_object.get_instance()); |
| 1573 | + std::string name=get_dynamic_object_name(dynamic_object); |
1571 | 1574 |
|
1572 | 1575 | entryt &e=get_entry(entryt(name, suffix), lhs.type(), ns); |
1573 | 1576 |
|
|
0 commit comments