Reviewed by Darin.
authormjs <mjs@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 8 Dec 2004 22:54:45 +0000 (22:54 +0000)
committermjs <mjs@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 8 Dec 2004 22:54:45 +0000 (22:54 +0000)
<rdar://problem/3908017> REGRESSION (172-173): assertion in ObjectImp::construct trying to create JS error (24hourfitness.com)

The fix was to implement copy constructor and assignment operator,
the ones that worked on the base class did not replace the
defaults apparently!

        * kjs/protect.h:
        (KJS::ProtectedValue::ProtectedValue):
        (KJS::ProtectedValue::operator=):
        (KJS::ProtectedObject::ProtectedObject):
        (KJS::ProtectedObject::operator=):

Also fixed a bug in the GC test mode that compares the results of
the old collector and the new collector.

* kjs/value.cpp:
        (ValueImp::mark):

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

JavaScriptCore/ChangeLog
JavaScriptCore/kjs/protect.h
JavaScriptCore/kjs/value.cpp

index 75349d730d8b72f0c134066299bf69b75a456d1c..c188424324efe49f64aa8427c9fea2bc9febce16 100644 (file)
@@ -1,3 +1,25 @@
+2004-12-07  Maciej Stachowiak  <mjs@apple.com>
+
+        Reviewed by Darin.
+
+       <rdar://problem/3908017> REGRESSION (172-173): assertion in ObjectImp::construct trying to create JS error (24hourfitness.com)
+
+       The fix was to implement copy constructor and assignment operator,
+       the ones that worked on the base class did not replace the
+       defaults apparently!
+       
+        * kjs/protect.h:
+        (KJS::ProtectedValue::ProtectedValue):
+        (KJS::ProtectedValue::operator=):
+        (KJS::ProtectedObject::ProtectedObject):
+        (KJS::ProtectedObject::operator=):
+        
+       Also fixed a bug in the GC test mode that compares the results of
+       the old collector and the new collector.
+
+       * kjs/value.cpp:
+        (ValueImp::mark):
+
 === Safari-173 ===
 
 2004-11-23  Richard Williamson   <rjw@apple.com>
index 3f3ee9d6d15c14accaffc03765d63e7c8fd278e6..f94cec7b8f8233ca76e0684fa9697d04daff78b9 100644 (file)
@@ -59,6 +59,7 @@ namespace KJS {
     public:
       ProtectedValue() : Value() {}
       ProtectedValue(const Value&v)  : Value(v) { gcProtectNullTolerant(v.imp()); };
+      ProtectedValue(const ProtectedValue&v)  : Value(v) { gcProtectNullTolerant(v.imp()); };
       ~ProtectedValue() { gcUnprotectNullTolerant(imp());}
       ProtectedValue& operator=(const Value &v)
        { 
@@ -68,6 +69,14 @@ namespace KJS {
          gcUnprotectNullTolerant(old); 
          return *this;
        }
+      ProtectedValue& operator=(const ProtectedValue &v)
+       { 
+         ValueImp *old = imp();
+         Value::operator=(v); 
+         gcProtectNullTolerant(v.imp());
+         gcUnprotectNullTolerant(old); 
+         return *this;
+       }
     private:
       explicit ProtectedValue(ValueImp *v);
     };
@@ -76,7 +85,8 @@ namespace KJS {
     class ProtectedObject : public Object {
     public:
       ProtectedObject() : Object() {}
-      ProtectedObject(const Object&o)  : Object(o) { gcProtectNullTolerant(o.imp()); };
+      ProtectedObject(const Object &o)  : Object(o) { gcProtectNullTolerant(o.imp()); };
+      ProtectedObject(const ProtectedObject &o)  : Object(o) { gcProtectNullTolerant(o.imp()); };
       ~ProtectedObject() { gcUnprotectNullTolerant(imp());}
       ProtectedObject& operator=(const Object &o)
        { 
@@ -86,6 +96,14 @@ namespace KJS {
          gcUnprotectNullTolerant(old); 
          return *this;
        }
+      ProtectedObject& operator=(const ProtectedObject &o)
+       { 
+         ValueImp *old = imp();
+         Object::operator=(o); 
+         gcProtectNullTolerant(o.imp());
+         gcUnprotectNullTolerant(old); 
+         return *this;
+       }
     private:
       explicit ProtectedObject(ObjectImp *o);
     };
index 22676086cb86ac3d1741c75b2c5969e36e4e6518..e9a374d25dd3a4468da55d3f9e33ee50005fadc3 100644 (file)
@@ -76,8 +76,8 @@ void ValueImp::mark()
   if (conservativeMark) {
     _flags |= VI_CONSERVATIVE_MARKED;
   } else {
-    if (!(_flags | VI_CONSERVATIVE_MARKED)) {
-      printf("Conservative collector missed ValueImp 0x%x.\n", (int)this);
+    if (!(_flags & VI_CONSERVATIVE_MARKED)) {
+      printf("Conservative collector missed ValueImp 0x%x. refcount %d, protect count %d\n", (int)this, refcount, ProtectedValues::getProtectCount(this));
     }
     _flags |= VI_MARKED;
   }