Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[mc] OOPify/C++ify Type (cont)
authorGabriel Corona <gabriel.corona@loria.fr>
Mon, 20 Jul 2015 09:32:24 +0000 (11:32 +0200)
committerGabriel Corona <gabriel.corona@loria.fr>
Tue, 21 Jul 2015 12:18:30 +0000 (14:18 +0200)
Make members a std::vector.

src/mc/mc_compare.cpp
src/mc/mc_diff.cpp
src/mc/mc_dwarf.cpp
src/mc/mc_object_info.cpp
src/mc/mc_object_info.h
teshsuite/mc/dwarf/dwarf.cpp

index 284cc51..ed81cf6 100644 (file)
@@ -108,8 +108,7 @@ static int compare_areas_with_type(struct mc_compare_state& state,
 {
   mc_process_t process = &mc_model_checker->process();
 
-  unsigned int cursor = 0;
-  mc_type_t member, subtype, subsubtype;
+  mc_type_t subtype, subsubtype;
   int elm_size, i, res;
 
   top:
@@ -232,18 +231,18 @@ static int compare_areas_with_type(struct mc_compare_state& state,
   }
   case DW_TAG_structure_type:
   case DW_TAG_class_type:
-    xbt_dynar_foreach(type->members, cursor, member) {
+    for(simgrid::mc::Type& member : type->members) {
       void *member1 =
-        mc_member_resolve(real_area1, type, member, snapshot1, process_index);
+        mc_member_resolve(real_area1, type, &member, snapshot1, process_index);
       void *member2 =
-        mc_member_resolve(real_area2, type, member, snapshot2, process_index);
+        mc_member_resolve(real_area2, type, &member, snapshot2, process_index);
       mc_mem_region_t subregion1 = mc_get_region_hinted(member1, snapshot1, process_index, region1);
       mc_mem_region_t subregion2 = mc_get_region_hinted(member2, snapshot2, process_index, region2);
       res =
           compare_areas_with_type(state, process_index,
                                   member1, snapshot1, subregion1,
                                   member2, snapshot2, subregion2,
-                                  member->subtype, pointer_level);
+                                  member.subtype, pointer_level);
       if (res == 1)
         return res;
     }
index 7e3bb37..d489ae5 100644 (file)
@@ -895,9 +895,7 @@ top:
 
   mc_type_t subtype, subsubtype;
   int res, elm_size;
-  unsigned int cursor = 0;
-  mc_type_t member;
-  const void *addr_pointed1, *addr_pointed2;;
+  const void *addr_pointed1, *addr_pointed2;
 
   mc_mem_region_t heap_region1 = MC_get_heap_region(snapshot1);
   mc_mem_region_t heap_region2 = MC_get_heap_region(snapshot2);
@@ -1042,17 +1040,16 @@ top:
         return -1;
       }
     } else {
-      cursor = 0;
-      xbt_dynar_foreach(type->members, cursor, member) {
+      for(simgrid::mc::Type& member : type->members) {
         // TODO, optimize this? (for the offset case)
         void *real_member1 =
-            mc_member_resolve(real_area1, type, member, (mc_address_space_t) snapshot1, process_index);
+            mc_member_resolve(real_area1, type, &member, (mc_address_space_t) snapshot1, process_index);
         void *real_member2 =
-            mc_member_resolve(real_area2, type, member, (mc_address_space_t) snapshot2, process_index);
+            mc_member_resolve(real_area2, type, &member, (mc_address_space_t) snapshot2, process_index);
         res =
             compare_heap_area_with_type(state, process_index, real_member1, real_member2,
                                         snapshot1, snapshot2,
-                                        previous, member->subtype, -1,
+                                        previous, member.subtype, -1,
                                         check_ignore, 0);
         if (res == 1) {
           return res;
@@ -1104,20 +1101,18 @@ static mc_type_t get_offset_type(void *real_base_address, mc_type_t type,
       else
         return NULL;
     } else {
-      unsigned int cursor = 0;
-      mc_type_t member;
-      xbt_dynar_foreach(type->members, cursor, member) {
+      for(simgrid::mc::Type& member : type->members) {
 
-        if (member->has_offset_location()) {
+        if (member.has_offset_location()) {
           // We have the offset, use it directly (shortcut):
-          if (member->offset() == offset)
-            return member->subtype;
+          if (member.offset() == offset)
+            return member.subtype;
         } else {
           void *real_member =
-            mc_member_resolve(real_base_address, type, member,
+            mc_member_resolve(real_base_address, type, &member,
               snapshot, process_index);
           if ((char*) real_member - (char *) real_base_address == offset)
-            return member->subtype;
+            return member.subtype;
         }
 
       }
index ea43d50..f83f146 100644 (file)
@@ -541,9 +541,7 @@ static void MC_dwarf_add_members(mc_object_info_t info, Dwarf_Die * die,
 {
   int res;
   Dwarf_Die child;
-  xbt_assert(!type->members);
-  type->members =
-      xbt_dynar_new(sizeof(mc_type_t), (void (*)(void *)) dw_type_free_voidp);
+  xbt_assert(type->members.empty());
   for (res = dwarf_child(die, &child); res == 0;
        res = dwarf_siblingof(&child, &child)) {
     int tag = dwarf_tag(&child);
@@ -558,22 +556,22 @@ static void MC_dwarf_add_members(mc_object_info_t info, Dwarf_Die * die,
         continue;
 
       // TODO, we should use another type (because is is not a type but a member)
-      mc_type_t member = new simgrid::mc::Type();
-      member->type = tag;
+      simgrid::mc::Type member;
+      member.type = tag;
 
       // Global Offset:
-      member->id = dwarf_dieoffset(&child);
+      member.id = dwarf_dieoffset(&child);
 
       const char *name = MC_dwarf_attr_integrate_string(&child, DW_AT_name);
       if (name)
-        member->name = name;
-      member->byte_size =
+        member.name = name;
+      member.byte_size =
           MC_dwarf_attr_integrate_uint(&child, DW_AT_byte_size, 0);
-      member->element_count = -1;
+      member.element_count = -1;
 
       char* type_id = MC_dwarf_at_type(&child);
       if (type_id) {
-        member->dw_type_id = type_id;
+        member.dw_type_id = type_id;
         free(type_id);
       }
 
@@ -581,15 +579,15 @@ static void MC_dwarf_add_members(mc_object_info_t info, Dwarf_Die * die,
         xbt_die("Can't groke DW_AT_data_bit_offset.");
       }
 
-      MC_dwarf_fill_member_location(type, member, &child);
+      MC_dwarf_fill_member_location(type, &member, &child);
 
-      if (member->dw_type_id.empty()) {
+      if (member.dw_type_id.empty()) {
         xbt_die("Missing type for member %s of <%" PRIx64 ">%s",
-                member->name.c_str(),
+                member.name.c_str(),
                 (uint64_t) type->id, type->name.c_str());
       }
 
-      xbt_dynar_push(type->members, &member);
+      type->members.push_back(std::move(member));
     }
   }
 }
@@ -1257,13 +1255,8 @@ static void MC_post_process_types(mc_object_info_t info)
   // Lookup "subtype" field:
   xbt_dict_foreach(info->types, cursor, origin, type) {
     MC_resolve_subtype(info, type);
-
-    mc_type_t member;
-    unsigned int i = 0;
-    if (type->members != NULL)
-      xbt_dynar_foreach(type->members, i, member) {
-      MC_resolve_subtype(info, member);
-      }
+    for (simgrid::mc::Type& member : type->members)
+      MC_resolve_subtype(info, &member);
   }
 }
 
index 8301068..5027e08 100644 (file)
@@ -22,17 +22,11 @@ Type::Type()
   this->id = 0;
   this->byte_size = 0;
   this->element_count = 0;
-  this->members = nullptr;
   this->is_pointer_type = 0;
   this->subtype = nullptr;
   this->full_type = nullptr;
 }
 
-Type::~Type()
-{
-  xbt_dynar_free(&this->members);
-}
-
 // ObjectInformations
 
 dw_frame_t ObjectInformation::find_function(const void *ip) const
index 9dbbf53..237d1cb 100644 (file)
@@ -40,9 +40,10 @@ namespace mc {
 class Type {
 public:
   Type();
-  ~Type();
-  Type(Type const& type) = delete;
-  Type& operator=(Type const&) = delete;
+  Type(Type const& type) = default;
+  Type& operator=(Type const&) = default;
+  Type(Type&& type) = default;
+  Type& operator=(Type&&) = default;
 
   e_mc_type_type type;
   Dwarf_Off id; /* Offset in the section (in hexadecimal form) */
@@ -50,7 +51,7 @@ public:
   int byte_size; /* Size in bytes */
   int element_count; /* Number of elements for array type */
   std::string dw_type_id; /* DW_AT_type id */
-  xbt_dynar_t members; /* if DW_TAG_structure_type, DW_TAG_class_type, DW_TAG_union_type*/
+  std::vector<Type> members; /* if DW_TAG_structure_type, DW_TAG_class_type, DW_TAG_union_type*/
   int is_pointer_type;
 
   // Location (for members) is either of:
index 399795a..930e72a 100644 (file)
@@ -98,13 +98,12 @@ static dw_variable_t test_global_variable(mc_process_t process, mc_object_info_t
   return variable;
 }
 
-static mc_type_t find_member(mc_object_info_t info, const char* name, mc_type_t type) {
-  unsigned int cursor = 0;
-  mc_type_t member;
-  xbt_dynar_foreach(type->members, cursor, member)
-    if(member->name == name)
-      return member;
-  return NULL;
+static mc_type_t find_member(mc_object_info_t info, const char* name, mc_type_t type)
+{
+  for (simgrid::mc::Type& member : type->members)
+    if(member.name == name)
+      return &member;
+  return nullptr;
 }
 
 int some_local_variable = 0;