Reviewed by Darin.
authoraroben <aroben@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 10 Oct 2006 01:49:26 +0000 (01:49 +0000)
committeraroben <aroben@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 10 Oct 2006 01:49:26 +0000 (01:49 +0000)
        Add ASSERTs to RefPtr to make sure we don't ref within a destructor, as
        this could cause recursive calls to the destructor. RefPtr now also
        inherits from Noncopyable.

        * dom/NodeFilter.h:
        * dom/Traversal.h:
        * page/DOMWindow.h:
        * page/Frame.cpp:
        (WebCore::Frame::finishedParsing):
        * page/Frame.h:
        * page/Plugin.h:
        * platform/FontFallbackList.h:
        * platform/Icon.h:
        * platform/Shared.h:
        (WebCore::Shared::Shared):
        (WebCore::Shared::ref):
        (WebCore::Shared::deref):
        (WebCore::Shared::hasOneRef):
        (WebCore::Shared::refCount):
        * platform/StringImpl.h:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@16954 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebCore/ChangeLog
WebCore/dom/NodeFilter.h
WebCore/dom/Traversal.h
WebCore/page/DOMWindow.h
WebCore/page/Frame.cpp
WebCore/page/Frame.h
WebCore/page/Plugin.h
WebCore/platform/FontFallbackList.h
WebCore/platform/Icon.h
WebCore/platform/Shared.h
WebCore/platform/StringImpl.h

index 7782d5dcf22d72d3dde3337603a9a0cb2ef4713c..3a5600419d79ec1df674820c13df7cf7df34919a 100644 (file)
@@ -1,3 +1,28 @@
+2006-10-09  Adam Roben  <aroben@apple.com>
+
+        Reviewed by Darin.
+
+        Add ASSERTs to RefPtr to make sure we don't ref within a destructor, as
+        this could cause recursive calls to the destructor. RefPtr now also
+        inherits from Noncopyable.
+
+        * dom/NodeFilter.h:
+        * dom/Traversal.h:
+        * page/DOMWindow.h:
+        * page/Frame.cpp:
+        (WebCore::Frame::finishedParsing):
+        * page/Frame.h:
+        * page/Plugin.h:
+        * platform/FontFallbackList.h:
+        * platform/Icon.h:
+        * platform/Shared.h:
+        (WebCore::Shared::Shared):
+        (WebCore::Shared::ref):
+        (WebCore::Shared::deref):
+        (WebCore::Shared::hasOneRef):
+        (WebCore::Shared::refCount):
+        * platform/StringImpl.h:
+
 2006-10-09  Oliver Hunt <ohunt@apple.com>
 
         Reviewed by Anders.
index c7ac0c99fd7e4516f28c57c4eee0d2734ff005cd..9865b9cfe4bfacf3d9954da12455e24a899a6136 100644 (file)
 #define NodeFilter_h
 
 #include "NodeFilterCondition.h"
-#include <wtf/Noncopyable.h>
 #include <wtf/RefPtr.h>
 
 namespace WebCore {
 
-    class NodeFilter : public Shared<NodeFilter>, Noncopyable {
+    class NodeFilter : public Shared<NodeFilter> {
     public:
         /**
          * The following constants are returned by the acceptNode()
index eaba2a57ffc651d58c650c301cfd05bc5fbdffd4..7fda771cb541bb90da113945452a5baf93427b6b 100644 (file)
@@ -29,7 +29,6 @@
 
 #include "Shared.h"
 #include <wtf/Forward.h>
-#include <wtf/Noncopyable.h>
 #include <wtf/RefPtr.h>
 
 namespace WebCore {
@@ -37,7 +36,7 @@ namespace WebCore {
     class Node;
     class NodeFilter;
 
-    class Traversal : public Shared<Traversal>, Noncopyable {
+    class Traversal : public Shared<Traversal> {
     public:
         Traversal(Node*, unsigned whatToShow, PassRefPtr<NodeFilter>, bool expandEntityReferences);
         virtual ~Traversal();
index 8983ef15bcb31205258603e85f19b9af899c71c6..788ddb8aec7083a09a31afedaabb26780ee193c8 100644 (file)
@@ -27,7 +27,6 @@
 #define DOMWindow_h
 
 #include "Shared.h"
-#include <wtf/Noncopyable.h>
 #include <wtf/PassRefPtr.h>
 
 namespace WebCore {
@@ -38,7 +37,7 @@ namespace WebCore {
     class Frame;
     class String;
     
-    class DOMWindow : public Shared<DOMWindow>, Noncopyable {
+    class DOMWindow : public Shared<DOMWindow> {
     public:
         DOMWindow(Frame*);
         Frame* frame();
index eda76afaa4a843fa4002fe879ff5da2ec7be7d2c..76381326ee4806577fcc38afb96dc45e6db2607a 100644 (file)
@@ -851,7 +851,7 @@ void Frame::finishedParsing()
 {
   // This method can be called from our destructor, in which case we shouldn't protect ourselves
   // because doing so will cause us to re-enter our destructor when protector goes out of scope.
-  RefPtr<Frame> protector = refCount() > 0 ? this : 0;
+  RefPtr<Frame> protector = this;
   checkCompleted();
 
   if (!d->m_view)
index 4fbe420bdade60180739295c133b2c96ca180c80..f45301f9bd4391eb807ac5bb99048cfdd8f40ca6 100644 (file)
@@ -94,7 +94,7 @@ enum ObjectContentType {
     ObjectContentPlugin
 };
 
-class Frame : public Shared<Frame>, Noncopyable {
+class Frame : public Shared<Frame> {
 public:
   enum { NoXPosForVerticalArrowNavigation = INT_MIN };
 
index 17d52142774dd78d6dda7e188e5671ba3b1c532f..7d7e665ce4f711b261d46fe9878a123b9ef68ee4 100644 (file)
 #define PLUGIN_H
 
 #include "Shared.h"
-#include <wtf/Noncopyable.h>
 
 namespace WebCore {
 
     class Widget;
 
-    class Plugin : public Shared<Plugin>, Noncopyable {
+    class Plugin : public Shared<Plugin> {
     public:
         Plugin(Widget* view) : m_view(view) { }
         Widget* view() const { return m_view; }
index 0769b68bfd3ad57f5c61beebd20af62336fa22c0..67f0c46de7f3854852afb207cfc15a624653b89f 100644 (file)
@@ -26,7 +26,6 @@
 
 #include "FontData.h"
 #include "Shared.h"
-#include <wtf/Noncopyable.h>
 #include <wtf/Vector.h>
 
 namespace WebCore {
@@ -39,7 +38,7 @@ class FontPlatformData;
 
 const int cAllFamiliesScanned = -1;
 
-class FontFallbackList : public Shared<FontFallbackList>, Noncopyable {
+class FontFallbackList : public Shared<FontFallbackList> {
 public:
     FontFallbackList();
 
index ff3df64ca6be43ffc1d1646e90b17c9b57b59e4f..475c1049cd67ae739e4b85cb7141ce141807d9fd 100644 (file)
@@ -23,7 +23,6 @@
 
 #include "Shared.h"
 
-#include <wtf/Noncopyable.h>
 #include <wtf/PassRefPtr.h>
 
 #if PLATFORM(MAC)
@@ -42,7 +41,7 @@ class GraphicsContext;
 class IntRect;
 class String;
     
-class Icon : public Shared<Icon>, Noncopyable {
+class Icon : public Shared<Icon> {
 public:
     Icon();
     ~Icon();
index eb8b1d8683ae56a432e2d08d5a50b582673d9bbe..ae43e7f74cc19cf1eabb7668aef4e2acf0667f8e 100644 (file)
@@ -1,43 +1,74 @@
 /*
-    This file is part of the KDE libraries
-
-    Copyright (C) 2005 Apple Computer, Inc.
-
-    This library is free software; you can redistribute it and/or
-    modify it under the terms of the GNU Library General Public
-    License as published by the Free Software Foundation; either
-    version 2 of the License, or (at your option) any later version.
-
-    This library is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-    Library General Public License for more details.
-
-    You should have received a copy of the GNU Library General Public License
-    along with this library; see the file COPYING.LIB.  If not, write to
-    the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-    Boston, MA 02111-1307, USA.
-*/
+ * Copyright (C) 2006 Apple Computer, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+ */
 
 #ifndef SHARED_H
 #define SHARED_H
 
+#include <wtf/Assertions.h>
+#include <wtf/Noncopyable.h>
+
 namespace WebCore {
 
-template<class T> class Shared {
+template<class T> class Shared : Noncopyable {
 public:
-    Shared() : m_refCount(0) { }
+    Shared()
+        : m_refCount(0)
+#ifndef NDEBUG
+        , m_inDestructor(0)
+#endif
+    {
+    }
+
+    void ref()
+    {
+        ASSERT(!m_inDestructor);
+        ++m_refCount;
+    }
+
+    void deref()
+    {
+        ASSERT(!m_inDestructor);
+        if (--m_refCount <= 0) {
+#ifndef NDEBUG
+            m_inDestructor = true;
+#endif
+            delete static_cast<T*>(this);
+        }
+    }
 
-    void ref() { ++m_refCount; }
-    void deref() { if (--m_refCount <= 0) delete static_cast<T*>(this); }
-    bool hasOneRef() { return m_refCount == 1; }
-    int refCount() const { return m_refCount; }
+    bool hasOneRef()
+    {
+        ASSERT(!m_inDestructor);
+        return m_refCount == 1;
+    }
+
+    int refCount() const
+    {
+        return m_refCount;
+    }
 
 private:
     int m_refCount;
-
-    Shared(const Shared&);
-    Shared& operator=(const Shared&);
+#ifndef NDEBUG
+    bool m_inDestructor;
+#endif
 };
 
 template<class T> class TreeShared {
index 28188c1bae00d9f95dfb6f7f4749d7204038c8a9..bb67180a6d2ab27d9044807251450fec7121b7b2 100644 (file)
@@ -28,7 +28,6 @@
 #include "UChar.h"
 #include <kjs/identifier.h>
 #include <wtf/Forward.h>
-#include <wtf/Noncopyable.h>
 #include <wtf/Vector.h>
 #include <limits.h>
 
@@ -50,7 +49,7 @@ struct UCharBufferTranslator;
 struct CStringTranslator;
 struct Length;
 
-class StringImpl : public Shared<StringImpl>, Noncopyable {
+class StringImpl : public Shared<StringImpl> {
 private:
     struct WithOneRef { };
     StringImpl(WithOneRef) : m_length(0), m_data(0), m_hash(0), m_inTable(false) { ref(); }