revert a workaround fix to CDMap that was committed as part of the arith-indexed...
authorMorgan Deters <mdeters@gmail.com>
Sat, 2 Oct 2010 23:53:18 +0000 (23:53 +0000)
committerMorgan Deters <mdeters@gmail.com>
Sat, 2 Oct 2010 23:53:18 +0000 (23:53 +0000)
src/context/cdmap.h
src/expr/attribute.cpp
src/expr/attribute.h

index b7fc5dcc6c4615ad9c4bdaf2b9e2b6e8f00cd15f..0b75ee2845c81c509a18036b72536cfca05ca7e8 100644 (file)
@@ -344,13 +344,13 @@ public:
     emptyTrash();
     Debug("gc") << "done emptying trash for " << this << std::endl;
 
-    for(Element* i = d_first; i != NULL;) {
+    for(typename table_type::iterator i = d_map.begin();
+        i != d_map.end();
+        ++i) {
       // mark it as being a destruction (short-circuit restore())
-      Element* thisOne = i;
-      i = i->next();
-      thisOne->d_map = NULL;
-      if(!thisOne->d_noTrash) {
-        thisOne->deleteSelf();
+      (*i).second->d_map = NULL;
+      if(!(*i).second->d_noTrash) {
+        (*i).second->deleteSelf();
       }
     }
     d_map.clear();
index 5aaa7393a430d7af1ac0e4ed58f1d0b361e28126..2952444732801ce1c8ecc05a67e102d31d27469a 100644 (file)
@@ -38,24 +38,12 @@ void AttributeManager::deleteAllAttributes(NodeValue* nv) {
   deleteFromTable(d_ptrs, nv);
 
   // FIXME CD-bools in optimized table
-  for(unsigned id = 0; id < attr::LastAttributeId<bool, true>::s_id; ++id) {
-    d_cdbools.obliterate(std::make_pair(id, nv));
-  }
-  for(unsigned id = 0; id < attr::LastAttributeId<uint64_t, true>::s_id; ++id) {
-    d_cdints.obliterate(std::make_pair(id, nv));
-  }
-  for(unsigned id = 0; id < attr::LastAttributeId<TNode, true>::s_id; ++id) {
-    d_cdtnodes.obliterate(std::make_pair(id, nv));
-  }
-  for(unsigned id = 0; id < attr::LastAttributeId<TNode, true>::s_id; ++id) {
-    d_cdnodes.obliterate(std::make_pair(id, nv));
-  }
-  for(unsigned id = 0; id < attr::LastAttributeId<std::string, true>::s_id; ++id) {
-    d_cdstrings.obliterate(std::make_pair(id, nv));
-  }
-  for(unsigned id = 0; id < attr::LastAttributeId<void*, true>::s_id; ++id) {
-    d_cdptrs.obliterate(std::make_pair(id, nv));
-  }
+  deleteFromTable(d_cdbools, nv);
+  deleteFromTable(d_cdints, nv);
+  deleteFromTable(d_cdtnodes, nv);
+  deleteFromTable(d_cdnodes, nv);
+  deleteFromTable(d_cdstrings, nv);
+  deleteFromTable(d_cdptrs, nv);
 }
 
 void AttributeManager::deleteAllAttributes() {
index 2ef34a7719a39550c632829a5d1034d22d548788..0668c5f8f7742c1146f74770c76ede587aedb12d 100644 (file)
@@ -89,6 +89,9 @@ class AttributeManager {
   template <class T>
   void deleteFromTable(AttrHash<T>& table, NodeValue* nv);
 
+  template <class T>
+  void deleteFromTable(CDAttrHash<T>& table, NodeValue* nv);
+
   template <class T>
   void deleteAllFromTable(AttrHash<T>& table);
 
@@ -553,6 +556,17 @@ inline void AttributeManager::deleteFromTable(AttrHash<T>& table,
   }
 }
 
+/**
+ * Obliterate a NodeValue from a (context-dependent) attribute table.
+ */
+template <class T>
+inline void AttributeManager::deleteFromTable(CDAttrHash<T>& table,
+                                              NodeValue* nv) {
+  for(unsigned id = 0; id < attr::LastAttributeId<T, true>::s_id; ++id) {
+    table.obliterate(std::make_pair(id, nv));
+  }
+}
+
 /**
  * Remove all attributes from the table calling the cleanup function if one is defined.
  */