2008-10-09 Cameron Zwarich <zwarich@apple.com>
authorcwzwarich@webkit.org <cwzwarich@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 9 Oct 2008 21:47:31 +0000 (21:47 +0000)
committercwzwarich@webkit.org <cwzwarich@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 9 Oct 2008 21:47:31 +0000 (21:47 +0000)
        Reviewed by Oliver Hunt.

        Bug 21459: REGRESSION (r37324): Safari crashes inside JavaScriptCore while browsing hulu.com
        <https://bugs.webkit.org/show_bug.cgi?id=21459>

        After r37324, an Arguments object does not mark an associated activation
        object. This change was made because Arguments no longer directly used
        the activation object in any way. However, if an activation is torn off,
        then the backing store of Arguments becomes the register array of the
        activation object. Arguments directly marks all of the arguments, but
        the activation object is being collected, which causes its register
        array to be freed and new memory to be allocated in its place.

        Unfortunately, it does not seem possible to reproduce this issue in a
        layout test.

        * kjs/Arguments.cpp:
        (JSC::Arguments::mark):
        * kjs/Arguments.h:
        (JSC::Arguments::setActivation):
        (JSC::Arguments::Arguments):
        (JSC::JSActivation::copyRegisters):

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

JavaScriptCore/ChangeLog
JavaScriptCore/kjs/Arguments.cpp
JavaScriptCore/kjs/Arguments.h

index b3107b58ca7a4342c4fc70e7799fd4058eaeda19..7711351c51988edab9dd8f23b93f4bfbd2088350 100644 (file)
@@ -1,3 +1,28 @@
+2008-10-09  Cameron Zwarich  <zwarich@apple.com>
+
+        Reviewed by Oliver Hunt.
+
+        Bug 21459: REGRESSION (r37324): Safari crashes inside JavaScriptCore while browsing hulu.com
+        <https://bugs.webkit.org/show_bug.cgi?id=21459>
+
+        After r37324, an Arguments object does not mark an associated activation
+        object. This change was made because Arguments no longer directly used
+        the activation object in any way. However, if an activation is torn off,
+        then the backing store of Arguments becomes the register array of the
+        activation object. Arguments directly marks all of the arguments, but
+        the activation object is being collected, which causes its register
+        array to be freed and new memory to be allocated in its place.
+
+        Unfortunately, it does not seem possible to reproduce this issue in a
+        layout test.
+
+        * kjs/Arguments.cpp:
+        (JSC::Arguments::mark):
+        * kjs/Arguments.h:
+        (JSC::Arguments::setActivation):
+        (JSC::Arguments::Arguments):
+        (JSC::JSActivation::copyRegisters):
+
 2008-10-09  Ariya Hidayat  <ariya.hidayat@trolltech.com>
 
         Reviewed by Simon.
index b99c1f72ec308c0a8a868e66cb1de880769ef13a..fe1de62fc9d1771b91315198af511dffb7927304 100644 (file)
@@ -64,6 +64,9 @@ void Arguments::mark()
 
     if (!d->callee->marked())
         d->callee->mark();
+
+    if (d->activation && !d->activation->marked())
+        d->activation->mark();
 }
 
 void Arguments::fillArgList(ExecState* exec, ArgList& args)
index ab88097e49b3964641a43eb06605b6f54433e8a6..8f48eaf8b5a4b6f08729b63c9062904c0a187a32 100644 (file)
@@ -32,6 +32,8 @@
 namespace JSC {
 
     struct ArgumentsData : Noncopyable {
+        JSActivation* activation;
+
         unsigned numParameters;
         ptrdiff_t firstParameterIndex;
         unsigned numArguments;
@@ -62,7 +64,11 @@ namespace JSC {
 
         void copyRegisters();
         bool isTornOff() const { return d->registerArray; }
-        void setRegisters(Register* registers) { d->registers = registers; }
+        void setActivation(JSActivation* activation)
+        {
+            d->activation = activation;
+            d->registers = &activation->registerAt(0);
+        }
 
     private:
         virtual bool getOwnPropertySlot(ExecState*, const Identifier& propertyName, PropertySlot&);
@@ -93,6 +99,7 @@ namespace JSC {
         d->firstParameterIndex = firstParameterIndex;
         d->numArguments = numArguments;
 
+        d->activation = 0;
         d->registers = callFrame->registers();
 
         Register* extraArguments;
@@ -149,7 +156,7 @@ namespace JSC {
         Register* registerArray = copyRegisterArray(d()->registers - registerOffset, registerArraySize);
         setRegisters(registerArray + registerOffset, registerArray);
         if (arguments && !arguments->isTornOff())
-            static_cast<Arguments*>(arguments)->setRegisters(registerArray + registerOffset);
+            static_cast<Arguments*>(arguments)->setActivation(this);
     }
 
 } // namespace JSC