@@ -41,11 +41,10 @@ void local_value_sett::make_union_adjusting_evs_types(
41
41
}
42
42
43
43
std::pair<value_sett::valuest::iterator, bool >
44
- local_value_sett::init_external_value_set (const external_value_set_exprt &evse)
44
+ local_value_sett::init_per_field_external_value_set (
45
+ const external_value_set_exprt &evse)
45
46
{
46
47
PRECONDITION (!evse.access_path_entries ().empty ());
47
- bool per_field_evs =
48
- evse.get_external_value_set_type () == external_value_set_typet::PER_FIELD;
49
48
const auto &apback=evse.access_path_entries ().back ();
50
49
std::string basename=evse.get_access_path_basename (apback.declared_on_type ());
51
50
std::string access_path_suffix=evse.get_access_path_suffix ();
@@ -56,15 +55,30 @@ local_value_sett::init_external_value_set(const external_value_set_exprt &evse)
56
55
auto insert_result=values.insert (std::make_pair (irep_idt (entryname), entry));
57
56
58
57
if (insert_result.second )
59
- {
60
- const external_value_set_exprt &evs_to_insert =
61
- per_field_evs ? evse.as_initializer () : evse;
62
- insert (insert_result.first ->second .object_map , evs_to_insert);
63
- }
58
+ insert (insert_result.first ->second .object_map , evse.as_initializer ());
64
59
65
60
return insert_result;
66
61
}
67
62
63
+ void local_value_sett::init_precise_external_value_set (
64
+ const external_value_set_exprt &evse,
65
+ object_mapt &dest)
66
+ {
67
+ PRECONDITION (!evse.access_path_entries ().empty ());
68
+ const auto &apback = evse.access_path_entries ().back ();
69
+ std::string basename =
70
+ evse.get_access_path_basename (apback.declared_on_type ());
71
+ std::string access_path_suffix = evse.get_access_path_suffix ();
72
+ std::string entryname = basename + access_path_suffix;
73
+
74
+ const irep_idt key (entryname);
75
+
76
+ if (values.count (key))
77
+ make_union (dest, values.at (key).object_map );
78
+ else
79
+ insert (dest, evse);
80
+ }
81
+
68
82
// / Builds a version of expr suitable for alias-comparison
69
83
// / \param expr: The expression to be converted to the alias-uniform structure
70
84
// / \return expr without information which is irrelevant to alias-comparison
@@ -290,9 +304,8 @@ void local_value_sett::get_value_set_rec(
290
304
291
305
// TODO: figure out how to do this sort of on-demand-insert
292
306
// without such ugly const hacking:
293
- auto insert_result=
294
- (const_cast <local_value_sett *>(this ))->
295
- init_external_value_set (new_ext_set);
307
+ auto insert_result = (const_cast <local_value_sett *>(this ))
308
+ ->init_per_field_external_value_set (new_ext_set);
296
309
297
310
make_union (dest, insert_result.first ->second .object_map );
298
311
}
@@ -317,11 +330,8 @@ void local_value_sett::get_value_set_rec(
317
330
318
331
// TODO: figure out how to do this sort of on-demand-insert
319
332
// without such ugly const hacking:
320
- auto insert_result=
321
- (const_cast <local_value_sett *>(this ))->
322
- init_external_value_set (new_ext_set);
323
-
324
- make_union (dest, insert_result.first ->second .object_map );
333
+ (const_cast <local_value_sett *>(this ))
334
+ ->init_precise_external_value_set (new_ext_set, dest);
325
335
}
326
336
}
327
337
}
0 commit comments