Fix for bug 45
authorClark Barrett <barrett@cs.nyu.edu>
Sat, 13 Mar 2010 01:57:01 +0000 (01:57 +0000)
committerClark Barrett <barrett@cs.nyu.edu>
Sat, 13 Mar 2010 01:57:01 +0000 (01:57 +0000)
src/context/cdlist.h
src/context/cdmap.h
src/context/cdo.h
src/context/context.cpp
src/context/context.h

index fd50d41497bf6cb79721ff3791076fb08228c50d..e3c7e155cf756aada28798c42911c8c80d6fc7cb 100644 (file)
@@ -138,15 +138,9 @@ public:
    * Destructor: delete the list
    */
   ~CDList() throw(AssertionException) {
-    if(d_list != NULL) {
-      if(d_callDestructor) {
-        while(d_size != 0) {
-          --d_size;
-          d_list[d_size].~T();
-        }
-      }
-      free(d_list);
-    }
+    T* list = d_list;
+    destroy();
+    free(list);
   }
 
   /**
index b1bb47c4c7064cdcf1f94837cf26a7f20f8fe6ac..460f917ffe076f705b4adbed868055aa27139874 100644 (file)
@@ -101,7 +101,7 @@ public:
     }
   }
 
-  ~CDOmap() throw(AssertionException) {}
+  ~CDOmap() throw(AssertionException) { destroy(); }
 
   void set(const Data& data) {
     makeCurrent();
index aca48d2648fb1cadbbef66ab58340c4788575e11..f2d6e7b4b5e432f075612e9785b50f117124b86e 100644 (file)
@@ -84,9 +84,9 @@ public:
   }
 
   /**
-   * Destructor - no need to do anything.
+   * Destructor - call destroy() method
    */
-  ~CDO() throw() {}
+  ~CDO() throw() { destroy(); }
 
   /**
    * Set the data in the CDO.  First call makeCurrent.
index 8e87741b555fbc52c9c0d623eace7ea167672104..d2e2bfa1bc9a558e5ea2381311733916786651ad 100644 (file)
@@ -175,17 +175,7 @@ ContextObj* ContextObj::restoreAndContinue() {
 }
 
 
-ContextObj::ContextObj(Context* pContext) :
-  d_pContextObjRestore(NULL) {
-
-  Assert(pContext != NULL, "NULL context pointer");
-
-  d_pScope = pContext->getBottomScope();
-  d_pScope->addToChain(this);
-}
-
-
-ContextObj::~ContextObj() throw(AssertionException) {
+void ContextObj::destroy() throw(AssertionException) {
   for(;;) {
     if(next() != NULL) {
       next()->prev() = prev();
@@ -199,6 +189,16 @@ ContextObj::~ContextObj() throw(AssertionException) {
 }
 
 
+ContextObj::ContextObj(Context* pContext) :
+  d_pContextObjRestore(NULL) {
+
+  Assert(pContext != NULL, "NULL context pointer");
+
+  d_pScope = pContext->getBottomScope();
+  d_pScope->addToChain(this);
+}
+
+
 ContextNotifyObj::ContextNotifyObj(Context* pContext, bool preNotify) {
   if(preNotify) {
     pContext->addNotifyObjPre(this);
index 69e8fe7768c7eb0ca078a76e68a87da1375fbdb4..6b9f9fd6d85fa638f9891463f7b52abdfbfe0f3f 100644 (file)
@@ -273,6 +273,10 @@ public:
  *    ContextMemoryManager (see item 2 above).
  * 4. In the subclass implementation, any time the state is about to be
  *    changed, first call makeCurrent().
+ * 5. In the subclass implementation, the destructor should call destroy().
+ *    Unfortunately, the destroy() functionality cannot be in the ContextObj
+ *    destructor since it needs to call the subclass-specific restore() method
+ *    in order to properly clean up saved copies.
  */
 class ContextObj {
   /**
@@ -352,6 +356,14 @@ protected:
     }
   }
 
+  /**
+   * Should be called from sub-class destructor: calls restore until restored
+   * to initial version.  Also removes object from all Scope lists.  Note that
+   * this doesn't actually free the memory allocated by the ContextMemoryManager
+   * for this object.  This isn't done until the corresponding Scope is popped.
+   */
+  void destroy() throw(AssertionException);
+
   /**
    * operator new using ContextMemoryManager (common case used by
    * subclasses during save() ).  No delete is required for memory
@@ -385,13 +397,9 @@ public:
   ContextObj(Context* context);
 
   /**
-   * Destructor: Calls restore until restored to initial version.
-   * Also removes object from all Scope lists.  Note that this doesn't
-   * actually free the memory allocated by the ContextMemoryManager
-   * for this object.  This isn't done until the corresponding Scope
-   * is popped.
+   * Destructor does nothing: subclass must explicitly call destroy() instead.
    */
-  virtual ~ContextObj() throw(AssertionException);
+  virtual ~ContextObj() {}
 
   /**
    * If you want to allocate a ContextObj object on the heap, use this