Intermittent crash running Internal/Tests/InternalJSTests/Regress/radar-24300617.js
authormsaboff@apple.com <msaboff@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 16 Jun 2017 21:12:15 +0000 (21:12 +0000)
committermsaboff@apple.com <msaboff@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 16 Jun 2017 21:12:15 +0000 (21:12 +0000)
https://bugs.webkit.org/show_bug.cgi?id=173488

Reviewed by Filip Pizlo.

ClonedArguments lazily sets its callee and interator properties and it used its own inline
code to initialize its butterfly.  This means that these lazily set properties can have
bogus values in those slots.  Instead, let's use the standard BUtterfly:tryCreate() method
to create the butterfly as it clears out of line properties.

* runtime/ClonedArguments.cpp:
(JSC::ClonedArguments::createEmpty):

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

Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/runtime/ClonedArguments.cpp

index c31a3f0..1faa3be 100644 (file)
@@ -1,3 +1,18 @@
+2017-06-16  Michael Saboff  <msaboff@apple.com>
+
+        Intermittent crash running Internal/Tests/InternalJSTests/Regress/radar-24300617.js
+        https://bugs.webkit.org/show_bug.cgi?id=173488
+
+        Reviewed by Filip Pizlo.
+
+        ClonedArguments lazily sets its callee and interator properties and it used its own inline
+        code to initialize its butterfly.  This means that these lazily set properties can have
+        bogus values in those slots.  Instead, let's use the standard BUtterfly:tryCreate() method
+        to create the butterfly as it clears out of line properties.
+
+        * runtime/ClonedArguments.cpp:
+        (JSC::ClonedArguments::createEmpty):
+
 2017-06-16  Mark Lam  <mark.lam@apple.com>
 
         Interpreter methods for mapping between Opcode and OpcodeID need not be instance methods.
index e9f900d..f09788b 100644 (file)
@@ -54,13 +54,13 @@ ClonedArguments* ClonedArguments::createEmpty(
         butterfly->arrayStorage()->m_numValuesInVector = vectorLength;
 
     } else {
-        void* temp = vm.auxiliarySpace.tryAllocate(Butterfly::totalSize(0, structure->outOfLineCapacity(), true, vectorLength * sizeof(EncodedJSValue)));
-        if (!temp)
+        IndexingHeader indexingHeader;
+        indexingHeader.setVectorLength(vectorLength);
+        indexingHeader.setPublicLength(length);
+        butterfly = Butterfly::tryCreate(vm, 0, 0, structure->outOfLineCapacity(), true, indexingHeader, vectorLength * sizeof(EncodedJSValue));
+        if (!butterfly)
             return 0;
-        butterfly = Butterfly::fromBase(temp, 0, structure->outOfLineCapacity());
-        butterfly->setVectorLength(vectorLength);
-        butterfly->setPublicLength(length);
-        
+
         for (unsigned i = length; i < vectorLength; ++i)
             butterfly->contiguous()[i].clear();
     }