Changeset 235356 in webkit


Ignore:
Timestamp:
Aug 27, 2018 1:31:43 AM (6 years ago)
Author:
yusukesuzuki@slowstart.org
Message:

[JSC] Array.prototype.reverse modifies JSImmutableButterfly
https://bugs.webkit.org/show_bug.cgi?id=188794

Reviewed by Saam Barati.

JSTests:

  • stress/reverse-with-immutable-butterfly.js: Added.

(shouldBe):
(reverseInt):
(reverseDouble):
(reverseContiguous):

Source/JavaScriptCore:

While Array.prototype.reverse modifies the butterfly of the given Array,
it does not account JSImmutableButterfly case. So it accidentally modifies
the content of JSImmutableButterfly.
This patch converts CoW arrays to writable arrays before reversing.

  • runtime/ArrayPrototype.cpp:

(JSC::arrayProtoFuncReverse):

  • runtime/JSObject.h:

(JSC::JSObject::ensureWritable):

Location:
trunk
Files:
1 added
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/JSTests/ChangeLog

    r235189 r235356  
     12018-08-24  Yusuke Suzuki  <yusukesuzuki@slowstart.org>
     2
     3        [JSC] Array.prototype.reverse modifies JSImmutableButterfly
     4        https://bugs.webkit.org/show_bug.cgi?id=188794
     5
     6        Reviewed by Saam Barati.
     7
     8        * stress/reverse-with-immutable-butterfly.js: Added.
     9        (shouldBe):
     10        (reverseInt):
     11        (reverseDouble):
     12        (reverseContiguous):
     13
    1142018-08-22  Saam barati  <sbarati@apple.com>
    215
  • trunk/Source/JavaScriptCore/ChangeLog

    r235333 r235356  
     12018-08-24  Yusuke Suzuki  <yusukesuzuki@slowstart.org>
     2
     3        [JSC] Array.prototype.reverse modifies JSImmutableButterfly
     4        https://bugs.webkit.org/show_bug.cgi?id=188794
     5
     6        Reviewed by Saam Barati.
     7
     8        While Array.prototype.reverse modifies the butterfly of the given Array,
     9        it does not account JSImmutableButterfly case. So it accidentally modifies
     10        the content of JSImmutableButterfly.
     11        This patch converts CoW arrays to writable arrays before reversing.
     12
     13        * runtime/ArrayPrototype.cpp:
     14        (JSC::arrayProtoFuncReverse):
     15        * runtime/JSObject.h:
     16        (JSC::JSObject::ensureWritable):
     17
    1182018-08-24  Michael Saboff  <msaboff@apple.com>
    219
  • trunk/Source/JavaScriptCore/runtime/ArrayPrototype.cpp

    r234269 r235356  
    856856    RETURN_IF_EXCEPTION(scope, encodedJSValue());
    857857
     858    thisObject->ensureWritable(vm);
     859
    858860    switch (thisObject->indexingType()) {
    859861    case ALL_CONTIGUOUS_INDEXING_TYPES:
  • trunk/Source/JavaScriptCore/runtime/JSArray.cpp

    r234089 r235356  
    288288    }
    289289
    290     if (isCopyOnWrite(thisObject->indexingMode()))
    291         thisObject->convertFromCopyOnWrite(vm);
     290    thisObject->ensureWritable(vm);
    292291
    293292    if (propertyName == vm.propertyNames->length) {
     
    663662    auto scope = DECLARE_THROW_SCOPE(vm);
    664663
    665     if (isCopyOnWrite(indexingMode()))
    666         convertFromCopyOnWrite(vm);
     664    ensureWritable(vm);
    667665
    668666    Butterfly* butterfly = this->butterfly();
     
    771769{
    772770    VM& vm = exec.vm();
     771
     772    ensureWritable(vm);
     773
    773774    auto arrayType = indexingMode();
    774775    switch (arrayType) {
    775     case CopyOnWriteArrayWithInt32:
    776     case CopyOnWriteArrayWithDouble:
    777     case CopyOnWriteArrayWithContiguous:
    778         convertFromCopyOnWrite(vm);
    779         arrayType = indexingMode();
    780         FALLTHROUGH;
    781776    case ArrayWithDouble:
    782777    case ArrayWithInt32:
     
    923918    RELEASE_ASSERT(count > 0);
    924919
    925     if (isCopyOnWrite(indexingMode()))
    926         convertFromCopyOnWrite(vm);
     920    ensureWritable(vm);
    927921
    928922    Butterfly* butterfly = this->butterfly();
     
    10821076    auto scope = DECLARE_THROW_SCOPE(vm);
    10831077
    1084     if (isCopyOnWrite(indexingMode()))
    1085         convertFromCopyOnWrite(vm);
     1078    ensureWritable(vm);
    10861079
    10871080    Butterfly* butterfly = this->butterfly();
  • trunk/Source/JavaScriptCore/runtime/JSArrayInlines.h

    r233122 r235356  
    8989    auto scope = DECLARE_THROW_SCOPE(vm);
    9090
    91 reloop:
     91    ensureWritable(vm);
     92
    9293    Butterfly* butterfly = this->butterfly();
    9394
     
    229230    }
    230231
    231     default: {
    232         RELEASE_ASSERT(isCopyOnWrite(indexingMode()));
    233         convertFromCopyOnWrite(vm);
    234         goto reloop;
    235     }
     232    default:
     233        RELEASE_ASSERT_NOT_REACHED();
    236234    }
    237235}
  • trunk/Source/JavaScriptCore/runtime/JSObject.cpp

    r234434 r235356  
    839839    }
    840840
    841     if (isCopyOnWrite(thisObject->indexingMode()))
    842         thisObject->convertFromCopyOnWrite(vm);
     841    thisObject->ensureWritable(vm);
    843842
    844843    switch (thisObject->indexingType()) {
     
    16371636        return nullptr;
    16381637
    1639     if (isCopyOnWrite(indexingMode()))
    1640         convertFromCopyOnWrite(vm);
    1641    
     1638    ensureWritable(vm);
     1639
    16421640    switch (indexingType()) {
    16431641    case ALL_BLANK_INDEXING_TYPES:
     
    16741672ArrayStorage* JSObject::ensureArrayStorageExistsAndEnterDictionaryIndexingMode(VM& vm)
    16751673{
    1676     if (isCopyOnWrite(indexingMode()))
    1677         convertFromCopyOnWrite(vm);
     1674    ensureWritable(vm);
    16781675
    16791676    switch (indexingType()) {
     
    17081705void JSObject::switchToSlowPutArrayStorage(VM& vm)
    17091706{
    1710     if (isCopyOnWrite(indexingMode()))
    1711         convertFromCopyOnWrite(vm);
     1707    ensureWritable(vm);
    17121708
    17131709    switch (indexingType()) {
     
    25452541    ASSERT(index <= MAX_ARRAY_INDEX);
    25462542
    2547     if (isCopyOnWrite(indexingMode()))
    2548         convertFromCopyOnWrite(vm);
     2543    ensureWritable(vm);
    25492544
    25502545    if (!inSparseIndexingMode()) {
  • trunk/Source/JavaScriptCore/runtime/JSObject.h

    r234363 r235356  
    866866        return ensureArrayStorageSlow(vm);
    867867    }
     868
     869    void ensureWritable(VM& vm)
     870    {
     871        if (isCopyOnWrite(indexingMode()))
     872            convertFromCopyOnWrite(vm);
     873    }
    868874       
    869875    static size_t offsetOfInlineStorage();
Note: See TracChangeset for help on using the changeset viewer.