Changeset 249976 in webkit for trunk/Source/JavaScriptCore/dfg/DFGArrayMode.cpp
- Timestamp:
- Sep 17, 2019, 12:52:43 PM (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/dfg/DFGArrayMode.cpp
r249880 r249976 418 418 bool ArrayMode::alreadyChecked(Graph& graph, Node* node, const AbstractValue& value, IndexingType shape) const 419 419 { 420 ASSERT(isSpecific()); 421 422 IndexingType indexingModeMask = IsArray | IndexingShapeMask; 423 if (action() == Array::Write) 424 indexingModeMask |= CopyOnWrite; 425 420 426 switch (arrayClass()) { 421 case Array::OriginalArray: { 422 if (value.m_structure.isTop()) 427 case Array::Array: { 428 if (arrayModesAlreadyChecked(value.m_arrayModes, asArrayModesIgnoringTypedArrays(shape | IsArray))) 429 return true; 430 if (!value.m_structure.isFinite()) 423 431 return false; 424 432 for (unsigned i = value.m_structure.size(); i--;) { 425 433 RegisteredStructure structure = value.m_structure[i]; 426 if ((structure->indexing Type() & IndexingShapeMask) != shape)434 if ((structure->indexingMode() & indexingModeMask) != (shape | IsArray)) 427 435 return false; 428 if (isCopyOnWrite(structure->indexingMode()) && action() == Array::Write)429 return false;430 if (!(structure->indexingType() & IsArray))431 return false;432 if (!graph.globalObjectFor(node->origin.semantic)->isOriginalArrayStructure(structure.get()))433 return false;434 436 } 435 437 return true; 436 438 } 437 438 case Array::Array: { 439 if (arrayModesAlreadyChecked(value.m_arrayModes, asArrayModesIgnoringTypedArrays(shape | IsArray))) 439 440 // Array::OriginalNonArray can be shown when the value is a TypedArray with original structure. 441 // But here, we already filtered TypedArrays. So, just handle it like a NonArray. 442 case Array::OriginalNonArray: 443 case Array::NonArray: { 444 if (arrayModesAlreadyChecked(value.m_arrayModes, asArrayModesIgnoringTypedArrays(shape))) 440 445 return true; 441 if ( value.m_structure.isTop())446 if (!value.m_structure.isFinite()) 442 447 return false; 443 448 for (unsigned i = value.m_structure.size(); i--;) { 444 449 RegisteredStructure structure = value.m_structure[i]; 445 if ((structure->indexingMode() & IndexingShapeMask) != shape)450 if ((structure->indexingMode() & indexingModeMask) != shape) 446 451 return false; 447 if (isCopyOnWrite(structure->indexingMode()) && action() == Array::Write)448 return false;449 if (!(structure->indexingType() & IsArray))450 return false;451 452 } 452 453 return true; 453 454 } 454 455 default: {455 456 case Array::PossiblyArray: { 456 457 if (arrayModesAlreadyChecked(value.m_arrayModes, asArrayModesIgnoringTypedArrays(shape) | asArrayModesIgnoringTypedArrays(shape | IsArray))) 457 458 return true; 458 if ( value.m_structure.isTop())459 if (!value.m_structure.isFinite()) 459 460 return false; 460 461 for (unsigned i = value.m_structure.size(); i--;) { 461 462 RegisteredStructure structure = value.m_structure[i]; 462 if ((structure->indexingMode() & IndexingShapeMask) != shape)463 if ((structure->indexingMode() & (indexingModeMask & ~IsArray)) != shape) 463 464 return false; 464 if (isCopyOnWrite(structure->indexingMode()) && action() == Array::Write)465 return false;466 465 } 467 466 return true; 468 } } 467 } 468 469 // If ArrayMode is Array::OriginalCopyOnWriteArray or Array::OriginalArray, CheckArray is never emitted. Instead, we always emit CheckStructure. 470 // So, we should perform the same check to the CheckStructure here. 471 case Array::OriginalArray: 472 case Array::OriginalCopyOnWriteArray: { 473 if (!value.m_structure.isFinite()) 474 return false; 475 Structure* originalStructure = originalArrayStructure(graph, node); 476 if (value.m_structure.size() != 1) 477 return false; 478 return value.m_structure.onlyStructure().get() == originalStructure; 479 } 480 } 469 481 } 470 482
Note:
See TracChangeset
for help on using the changeset viewer.