Changeset 194021 in webkit for trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp
- Timestamp:
- Dec 13, 2015, 6:52:51 PM (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp
r193974 r194021 603 603 // ------------------------------ BracketAccessorNode -------------------------------- 604 604 605 static bool isNonIndexStringElement(ExpressionNode& element) 606 { 607 return element.isString() && !parseIndex(static_cast<StringNode&>(element).value()); 608 } 609 605 610 RegisterID* BracketAccessorNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst) 606 611 { 607 612 if (m_base->isSuperNode()) { 608 613 // FIXME: Should we generate the profiler info? 609 if ( m_subscript->isString()) {614 if (isNonIndexStringElement(*m_subscript)) { 610 615 const Identifier& id = static_cast<StringNode*>(m_subscript)->value(); 611 616 return generator.emitGetById(generator.finalDestination(dst), emitSuperBaseForCallee(generator), id); … … 617 622 RegisterID* finalDest = generator.finalDestination(dst); 618 623 619 if ( m_subscript->isString()) {624 if (isNonIndexStringElement(*m_subscript)) { 620 625 RefPtr<RegisterID> base = generator.emitNode(m_base); 621 626 ret = generator.emitGetById(finalDest, base.get(), static_cast<StringNode*>(m_subscript)->value()); … … 847 852 { 848 853 bool baseIsSuper = m_base->isSuperNode(); 849 bool subscriptIs String = m_subscript->isString();854 bool subscriptIsNonIndexString = isNonIndexStringElement(*m_subscript); 850 855 851 856 RefPtr<RegisterID> base; … … 853 858 base = emitSuperBaseForCallee(generator); 854 859 else { 855 if (subscriptIs String)860 if (subscriptIsNonIndexString) 856 861 base = generator.emitNode(m_base); 857 862 else … … 860 865 861 866 RefPtr<RegisterID> function; 862 if (subscriptIs String) {867 if (subscriptIsNonIndexString) { 863 868 generator.emitExpressionInfo(subexpressionDivot(), subexpressionStart(), subexpressionEnd()); 864 869 function = generator.emitGetById(generator.tempDestination(dst), base.get(), static_cast<StringNode*>(m_subscript)->value()); … … 1978 1983 RegisterID* forwardResult = (dst == generator.ignoredResult()) ? result.get() : generator.moveToDestinationIfNeeded(generator.tempDestination(result.get()), result.get()); 1979 1984 1980 if ( m_subscript->isString())1985 if (isNonIndexStringElement(*m_subscript)) 1981 1986 generator.emitPutById(base.get(), static_cast<StringNode*>(m_subscript)->value(), forwardResult); 1982 1987 else … … 3486 3491 auto& target = m_targetPatterns[i]; 3487 3492 RefPtr<RegisterID> temp = generator.newTemporary(); 3488 if (!target.propertyExpression) 3489 generator.emitGetById(temp.get(), rhs, target.propertyName); 3490 else { 3493 if (!target.propertyExpression) { 3494 // Should not emit get_by_id for indexed ones. 3495 Optional<uint32_t> optionalIndex = parseIndex(target.propertyName); 3496 if (!optionalIndex) 3497 generator.emitGetById(temp.get(), rhs, target.propertyName); 3498 else { 3499 RefPtr<RegisterID> index = generator.emitLoad(generator.newTemporary(), jsNumber(optionalIndex.value())); 3500 generator.emitGetByVal(temp.get(), rhs, index.get()); 3501 } 3502 } else { 3491 3503 RefPtr<RegisterID> propertyName = generator.emitNode(target.propertyExpression); 3492 3504 generator.emitGetByVal(temp.get(), rhs, propertyName.get());
Note:
See TracChangeset
for help on using the changeset viewer.