Changeset 229993 in webkit for trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp
- Timestamp:
- Mar 27, 2018, 1:49:41 AM (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp
r229852 r229993 385 385 RegisterID* ArrayNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst) 386 386 { 387 // FIXME: Should we put all of this code into emitNewArray? 388 387 bool hadVariableExpression = false; 389 388 unsigned length = 0; 390 389 ElementNode* firstPutElement; … … 392 391 if (firstPutElement->elision() || firstPutElement->value()->isSpreadExpression()) 393 392 break; 393 if (!firstPutElement->value()->isConstant()) 394 hadVariableExpression = true; 394 395 ++length; 395 396 } 396 397 398 auto newArray = [&generator] (RegisterID* dst, ElementNode* elements, unsigned length, bool hadVariableExpression) { 399 if (length && !hadVariableExpression) { 400 auto* array = JSFixedArray::create(*generator.vm(), length); 401 unsigned index = 0; 402 for (ElementNode* element = elements; index < length; element = element->next()) { 403 ASSERT(element->value()->isConstant()); 404 array->set(*generator.vm(), index++, static_cast<ConstantNode*>(element->value())->jsValue(generator)); 405 } 406 return generator.emitNewArrayBuffer(dst, array); 407 } 408 return generator.emitNewArray(dst, elements, length); 409 }; 410 397 411 if (!firstPutElement && !m_elision) 398 return generator.emitNewArray(generator.finalDestination(dst), m_element, length);412 return newArray(generator.finalDestination(dst), m_element, length, hadVariableExpression); 399 413 400 414 if (firstPutElement && firstPutElement->value()->isSpreadExpression()) { 401 bool hasElision = false; 402 for (ElementNode* node = m_element; node; node = node->next()) { 403 if (!!node->elision()) { 404 hasElision = true; 405 break; 415 bool hasElision = m_elision; 416 if (!hasElision) { 417 for (ElementNode* node = firstPutElement; node; node = node->next()) { 418 if (node->elision()) { 419 hasElision = true; 420 break; 421 } 406 422 } 407 423 } 408 if (!!m_elision)409 hasElision = true;410 424 411 425 if (!hasElision) … … 413 427 } 414 428 415 RefPtr<RegisterID> array = generator.emitNewArray(generator.tempDestination(dst), m_element, length);429 RefPtr<RegisterID> array = newArray(generator.tempDestination(dst), m_element, length, hadVariableExpression); 416 430 ElementNode* n = firstPutElement; 417 431 for (; n; n = n->next()) { … … 4082 4096 4083 4097 case BindingType::RestElement: { 4084 RefPtr<RegisterID> array = generator.emitNewArray(generator.newTemporary(), 0, 0);4098 RefPtr<RegisterID> array = generator.emitNewArray(generator.newTemporary(), nullptr, 0); 4085 4099 4086 4100 Ref<Label> iterationDone = generator.newLabel(); … … 4134 4148 RefPtr<RegisterID> resultRegister; 4135 4149 if (dst && dst != generator.ignoredResult()) 4136 resultRegister = generator.emitNewArray(generator.newTemporary(), 0, 0);4150 resultRegister = generator.emitNewArray(generator.newTemporary(), nullptr, 0); 4137 4151 if (m_targetPatterns.size() != elements.size()) 4138 4152 return nullptr;
Note:
See TracChangeset
for help on using the changeset viewer.