Changeset 225913 in webkit for trunk/Source/JavaScriptCore/runtime/JSObject.h
- Timestamp:
- Dec 14, 2017, 11:11:49 AM (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/runtime/JSObject.h
r224564 r225913 263 263 case ALL_INT32_INDEXING_TYPES: 264 264 case ALL_CONTIGUOUS_INDEXING_TYPES: 265 return i < butterfly->vectorLength() && butterfly->contiguous() [i];265 return i < butterfly->vectorLength() && butterfly->contiguous().at(this, i); 266 266 case ALL_DOUBLE_INDEXING_TYPES: { 267 267 if (i >= butterfly->vectorLength()) 268 268 return false; 269 double value = butterfly->contiguousDouble() [i];269 double value = butterfly->contiguousDouble().at(this, i); 270 270 if (value != value) 271 271 return false; … … 285 285 switch (indexingType()) { 286 286 case ALL_INT32_INDEXING_TYPES: 287 return jsNumber(butterfly->contiguous() [i].get().asInt32());287 return jsNumber(butterfly->contiguous().at(this, i).get().asInt32()); 288 288 case ALL_CONTIGUOUS_INDEXING_TYPES: 289 return butterfly->contiguous() [i].get();289 return butterfly->contiguous().at(this, i).get(); 290 290 case ALL_DOUBLE_INDEXING_TYPES: 291 return JSValue(JSValue::EncodeAsDouble, butterfly->contiguousDouble() [i]);291 return JSValue(JSValue::EncodeAsDouble, butterfly->contiguousDouble().at(this, i)); 292 292 case ALL_ARRAY_STORAGE_INDEXING_TYPES: 293 293 return butterfly->arrayStorage()->m_vector[i].get(); … … 307 307 case ALL_INT32_INDEXING_TYPES: 308 308 if (i < butterfly->publicLength()) { 309 JSValue result = butterfly->contiguous() [i].get();309 JSValue result = butterfly->contiguous().at(this, i).get(); 310 310 ASSERT(result.isInt32() || !result); 311 311 return result; … … 314 314 case ALL_CONTIGUOUS_INDEXING_TYPES: 315 315 if (i < butterfly->publicLength()) 316 return butterfly->contiguous() [i].get();316 return butterfly->contiguous().at(this, i).get(); 317 317 break; 318 318 case ALL_DOUBLE_INDEXING_TYPES: { 319 319 if (i >= butterfly->publicLength()) 320 320 break; 321 double result = butterfly->contiguousDouble() [i];321 double result = butterfly->contiguousDouble().at(this, i); 322 322 if (result != result) 323 323 break; … … 389 389 case ALL_CONTIGUOUS_INDEXING_TYPES: { 390 390 ASSERT(i < butterfly->vectorLength()); 391 butterfly->contiguous() [i].set(vm, this, v);391 butterfly->contiguous().at(this, i).set(vm, this, v); 392 392 if (i >= butterfly->publicLength()) 393 393 butterfly->setPublicLength(i + 1); … … 405 405 return; 406 406 } 407 butterfly->contiguousDouble() [i]= value;407 butterfly->contiguousDouble().at(this, i) = value; 408 408 if (i >= butterfly->publicLength()) 409 409 butterfly->setPublicLength(i + 1); … … 455 455 ASSERT(i < butterfly->publicLength()); 456 456 ASSERT(i < butterfly->vectorLength()); 457 butterfly->contiguous() [i].set(vm, this, v);457 butterfly->contiguous().at(this, i).set(vm, this, v); 458 458 break; 459 459 } … … 470 470 return; 471 471 } 472 butterfly->contiguousDouble() [i]= value;472 butterfly->contiguousDouble().at(this, i) = value; 473 473 break; 474 474 } … … 509 509 ASSERT(i < butterfly->publicLength()); 510 510 ASSERT(i < butterfly->vectorLength()); 511 butterfly->contiguous() [i].setWithoutWriteBarrier(v);511 butterfly->contiguous().at(this, i).setWithoutWriteBarrier(v); 512 512 break; 513 513 } … … 518 518 double value = v.asNumber(); 519 519 RELEASE_ASSERT(value == value); 520 butterfly->contiguousDouble() [i]= value;520 butterfly->contiguousDouble().at(this, i) = value; 521 521 break; 522 522 } … … 771 771 // in-place. 772 772 void nukeStructureAndSetButterfly(VM&, StructureID, Butterfly*); 773 774 // Call this only if you are a JSGenericTypedArrayView or are clearing the butterfly. 775 void setButterflyWithIndexingMask(VM&, Butterfly*, uint32_t indexingMask); 773 776 774 777 void setStructure(VM&, Structure*); … … 859 862 return OBJECT_OFFSETOF(JSObject, m_butterfly); 860 863 } 864 static ptrdiff_t butterflyIndexingMaskOffset() { return OBJECT_OFFSETOF(JSObject, m_butterflyIndexingMask); } 865 uintptr_t butterflyIndexingMask() const { return m_butterflyIndexingMask; } 861 866 862 867 void* butterflyAddress() … … 886 891 // To instantiate objects you likely want JSFinalObject, below. 887 892 // To create derived types you likely want JSNonFinalObject, below. 888 JSObject(VM&, Structure*, Butterfly* = 0);893 JSObject(VM&, Structure*, Butterfly* = nullptr); 889 894 890 895 // Visits the butterfly unless there is a race. Returns the structure if there was no race. … … 1052 1057 PropertyOffset prepareToPutDirectWithoutTransition(VM&, PropertyName, unsigned attributes, StructureID, Structure*); 1053 1058 1054 protected:1055 1059 AuxiliaryBarrier<Butterfly*> m_butterfly; 1056 #if USE(JSVALUE32_64) 1057 private: 1058 uint32_t m_padding; 1059 #endif 1060 uint32_t m_butterflyIndexingMask { 0 }; 1060 1061 }; 1061 1062 … … 1248 1249 } 1249 1250 1250 inline void JSObject::setButterfly(VM& vm, Butterfly* butterfly) 1251 { 1251 inline void JSObject::setButterflyWithIndexingMask(VM& vm, Butterfly* butterfly, uint32_t indexingMask) 1252 { 1253 // These are the only two current use cases for this. 1254 ASSERT(structure()->hijacksIndexingHeader() || !butterfly); 1255 m_butterflyIndexingMask = indexingMask; 1252 1256 if (isX86() || vm.heap.mutatorShouldBeFenced()) { 1253 1257 WTF::storeStoreFence(); … … 1256 1260 return; 1257 1261 } 1258 1262 1259 1263 m_butterfly.set(vm, this, butterfly); 1260 1264 } 1261 1265 1266 inline void JSObject::setButterfly(VM& vm, Butterfly* butterfly) 1267 { 1268 ASSERT(!structure()->hijacksIndexingHeader()); 1269 m_butterflyIndexingMask = butterfly->computeIndexingMask(); 1270 ASSERT(m_butterflyIndexingMask >= butterfly->vectorLength()); 1271 if (isX86() || vm.heap.mutatorShouldBeFenced()) { 1272 WTF::storeStoreFence(); 1273 m_butterfly.set(vm, this, butterfly); 1274 WTF::storeStoreFence(); 1275 return; 1276 } 1277 1278 m_butterfly.set(vm, this, butterfly); 1279 } 1280 1262 1281 inline void JSObject::nukeStructureAndSetButterfly(VM& vm, StructureID oldStructureID, Butterfly* butterfly) 1263 1282 { 1283 ASSERT(!vm.getStructure(oldStructureID)->hijacksIndexingHeader()); 1284 m_butterflyIndexingMask = butterfly->computeIndexingMask(); 1285 ASSERT(m_butterflyIndexingMask >= butterfly->vectorLength()); 1264 1286 if (isX86() || vm.heap.mutatorShouldBeFenced()) { 1265 1287 setStructureIDDirectly(nuke(oldStructureID)); … … 1269 1291 return; 1270 1292 } 1271 1293 1272 1294 m_butterfly.set(vm, this, butterfly); 1273 1295 } … … 1302 1324 , m_butterfly(vm, this, butterfly) 1303 1325 { 1326 if (butterfly) 1327 m_butterflyIndexingMask = butterfly->computeIndexingMask(); 1304 1328 } 1305 1329
Note:
See TracChangeset
for help on using the changeset viewer.