Changeset 235356 in webkit
- Timestamp:
- Aug 27, 2018 1:31:43 AM (6 years ago)
- Location:
- trunk
- Files:
-
- 1 added
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JSTests/ChangeLog
r235189 r235356 1 2018-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 1 14 2018-08-22 Saam barati <sbarati@apple.com> 2 15 -
trunk/Source/JavaScriptCore/ChangeLog
r235333 r235356 1 2018-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 1 18 2018-08-24 Michael Saboff <msaboff@apple.com> 2 19 -
trunk/Source/JavaScriptCore/runtime/ArrayPrototype.cpp
r234269 r235356 856 856 RETURN_IF_EXCEPTION(scope, encodedJSValue()); 857 857 858 thisObject->ensureWritable(vm); 859 858 860 switch (thisObject->indexingType()) { 859 861 case ALL_CONTIGUOUS_INDEXING_TYPES: -
trunk/Source/JavaScriptCore/runtime/JSArray.cpp
r234089 r235356 288 288 } 289 289 290 if (isCopyOnWrite(thisObject->indexingMode())) 291 thisObject->convertFromCopyOnWrite(vm); 290 thisObject->ensureWritable(vm); 292 291 293 292 if (propertyName == vm.propertyNames->length) { … … 663 662 auto scope = DECLARE_THROW_SCOPE(vm); 664 663 665 if (isCopyOnWrite(indexingMode())) 666 convertFromCopyOnWrite(vm); 664 ensureWritable(vm); 667 665 668 666 Butterfly* butterfly = this->butterfly(); … … 771 769 { 772 770 VM& vm = exec.vm(); 771 772 ensureWritable(vm); 773 773 774 auto arrayType = indexingMode(); 774 775 switch (arrayType) { 775 case CopyOnWriteArrayWithInt32:776 case CopyOnWriteArrayWithDouble:777 case CopyOnWriteArrayWithContiguous:778 convertFromCopyOnWrite(vm);779 arrayType = indexingMode();780 FALLTHROUGH;781 776 case ArrayWithDouble: 782 777 case ArrayWithInt32: … … 923 918 RELEASE_ASSERT(count > 0); 924 919 925 if (isCopyOnWrite(indexingMode())) 926 convertFromCopyOnWrite(vm); 920 ensureWritable(vm); 927 921 928 922 Butterfly* butterfly = this->butterfly(); … … 1082 1076 auto scope = DECLARE_THROW_SCOPE(vm); 1083 1077 1084 if (isCopyOnWrite(indexingMode())) 1085 convertFromCopyOnWrite(vm); 1078 ensureWritable(vm); 1086 1079 1087 1080 Butterfly* butterfly = this->butterfly(); -
trunk/Source/JavaScriptCore/runtime/JSArrayInlines.h
r233122 r235356 89 89 auto scope = DECLARE_THROW_SCOPE(vm); 90 90 91 reloop: 91 ensureWritable(vm); 92 92 93 Butterfly* butterfly = this->butterfly(); 93 94 … … 229 230 } 230 231 231 default: { 232 RELEASE_ASSERT(isCopyOnWrite(indexingMode())); 233 convertFromCopyOnWrite(vm); 234 goto reloop; 235 } 232 default: 233 RELEASE_ASSERT_NOT_REACHED(); 236 234 } 237 235 } -
trunk/Source/JavaScriptCore/runtime/JSObject.cpp
r234434 r235356 839 839 } 840 840 841 if (isCopyOnWrite(thisObject->indexingMode())) 842 thisObject->convertFromCopyOnWrite(vm); 841 thisObject->ensureWritable(vm); 843 842 844 843 switch (thisObject->indexingType()) { … … 1637 1636 return nullptr; 1638 1637 1639 if (isCopyOnWrite(indexingMode())) 1640 convertFromCopyOnWrite(vm); 1641 1638 ensureWritable(vm); 1639 1642 1640 switch (indexingType()) { 1643 1641 case ALL_BLANK_INDEXING_TYPES: … … 1674 1672 ArrayStorage* JSObject::ensureArrayStorageExistsAndEnterDictionaryIndexingMode(VM& vm) 1675 1673 { 1676 if (isCopyOnWrite(indexingMode())) 1677 convertFromCopyOnWrite(vm); 1674 ensureWritable(vm); 1678 1675 1679 1676 switch (indexingType()) { … … 1708 1705 void JSObject::switchToSlowPutArrayStorage(VM& vm) 1709 1706 { 1710 if (isCopyOnWrite(indexingMode())) 1711 convertFromCopyOnWrite(vm); 1707 ensureWritable(vm); 1712 1708 1713 1709 switch (indexingType()) { … … 2545 2541 ASSERT(index <= MAX_ARRAY_INDEX); 2546 2542 2547 if (isCopyOnWrite(indexingMode())) 2548 convertFromCopyOnWrite(vm); 2543 ensureWritable(vm); 2549 2544 2550 2545 if (!inSparseIndexingMode()) { -
trunk/Source/JavaScriptCore/runtime/JSObject.h
r234363 r235356 866 866 return ensureArrayStorageSlow(vm); 867 867 } 868 869 void ensureWritable(VM& vm) 870 { 871 if (isCopyOnWrite(indexingMode())) 872 convertFromCopyOnWrite(vm); 873 } 868 874 869 875 static size_t offsetOfInlineStorage();
Note: See TracChangeset
for help on using the changeset viewer.