Reviewed by Darin Adler.
authorggaren <ggaren@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 22 Feb 2007 22:10:38 +0000 (22:10 +0000)
committerggaren <ggaren@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 22 Feb 2007 22:10:38 +0000 (22:10 +0000)
        Fixed <rdar://problem/4942528> Installer.app Stuck "Examining additional
        volumes..."

        The problem was that JavaScriptGlue held a JSObject in a static pointer
        without protecting it from garbage collection.

            sUserObjectPrototypeImp  = new UserObjectPrototypeImp();
            static ProtectedPtr<UserObjectPrototypeImp> protectPrototype; // valiant, brave, but useless

        Through an interesting comedy of errors, this object would be collected
        and then assigned as the prototype of another object allocated at the
        same address, thus becoming its own prototype. (See http://www.ziplo.com/grandpa.htm
        for further explanation of this phenomenon.) Hence the infinte loop in
        property lookup.

        The solution is equally humorous: all of this code was completely useless --
        it only served to create an empty object in the prototype chain -- so
        I just removed it.

        * UserObjectImp.cpp:
        (UserObjectImp::UserObjectImp):
        * UserObjectImp.h:

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

JavaScriptGlue/ChangeLog
JavaScriptGlue/UserObjectImp.cpp
JavaScriptGlue/UserObjectImp.h

index ba750be3f1bcece4375e3c5d82fe167168b17584..bd6d06ffc3b3c4c7854e1682ecf1923a4c556916 100644 (file)
@@ -1,3 +1,30 @@
+2007-02-22  Geoffrey Garen  <ggaren@apple.com>
+
+        Reviewed by Darin Adler.
+        
+        Fixed <rdar://problem/4942528> Installer.app Stuck "Examining additional 
+        volumes..."
+        
+        The problem was that JavaScriptGlue held a JSObject in a static pointer
+        without protecting it from garbage collection. 
+        
+            sUserObjectPrototypeImp  = new UserObjectPrototypeImp();
+            static ProtectedPtr<UserObjectPrototypeImp> protectPrototype; // valiant, brave, but useless
+
+        Through an interesting comedy of errors, this object would be collected 
+        and then assigned as the prototype of another object allocated at the 
+        same address, thus becoming its own prototype. (See http://www.ziplo.com/grandpa.htm
+        for further explanation of this phenomenon.) Hence the infinte loop in 
+        property lookup.
+        
+        The solution is equally humorous: all of this code was completely useless --
+        it only served to create an empty object in the prototype chain -- so
+        I just removed it.
+
+        * UserObjectImp.cpp:
+        (UserObjectImp::UserObjectImp):
+        * UserObjectImp.h:
+
 2007-02-19  Timothy Hatcher  <timothy@apple.com>
 
         Reviewed by Geoff.
 2007-02-19  Timothy Hatcher  <timothy@apple.com>
 
         Reviewed by Geoff.
index 6c1ad9d08a1be35f7e67b4388332c22c3f2eca2a..a341449c2c3fc3923fcdbe7974c58cf46c819588 100644 (file)
 
 const ClassInfo UserObjectImp::info = {"UserObject", 0, 0, 0};
 
 
 const ClassInfo UserObjectImp::info = {"UserObject", 0, 0, 0};
 
-class UserObjectPrototypeImp : public UserObjectImp {
-  public:
-    UserObjectPrototypeImp();
-    static UserObjectPrototypeImp* GlobalUserObjectPrototypeImp();
-  private:
-    static UserObjectPrototypeImp* sUserObjectPrototypeImp;
-};
-
-UserObjectPrototypeImp* UserObjectPrototypeImp::sUserObjectPrototypeImp = 0;
-
-UserObjectPrototypeImp::UserObjectPrototypeImp()
-  : UserObjectImp()
-{
-}
-
-UserObjectPrototypeImp* UserObjectPrototypeImp::GlobalUserObjectPrototypeImp()
-{
-    if (!sUserObjectPrototypeImp)
-    {
-            sUserObjectPrototypeImp  = new UserObjectPrototypeImp();
-            static ProtectedPtr<UserObjectPrototypeImp> protectPrototype;
-    }
-    return sUserObjectPrototypeImp;
-}
-
-
-UserObjectImp::UserObjectImp(): JSObject(), fJSUserObject(0)
-{
-}
-
-UserObjectImp::UserObjectImp(JSUserObject* userObject) :
-    JSObject(UserObjectPrototypeImp::GlobalUserObjectPrototypeImp()),
-    fJSUserObject((JSUserObject*)userObject->Retain())
+UserObjectImp::UserObjectImp(JSUserObject* userObject)
+    : fJSUserObject((JSUserObject*)userObject->Retain())
 {
 }
 
 {
 }
 
index 5ac0f9900cc33f0d5f7643cd24e926eddcfc4512..54e5ab637ed4d3f3f9a70d9a168e24a7464ba7a5 100644 (file)
@@ -58,8 +58,6 @@ public:
     virtual void mark();
 
     JSUserObject *GetJSUserObject() const;
     virtual void mark();
 
     JSUserObject *GetJSUserObject() const;
-protected:
-    UserObjectImp();
 private:
     static JSValue *userObjectGetter(ExecState *, JSObject *originalObject, const Identifier& propertyName, const PropertySlot&);
 
 private:
     static JSValue *userObjectGetter(ExecState *, JSObject *originalObject, const Identifier& propertyName, const PropertySlot&);