Changeset 127654 in webkit for trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp
- Timestamp:
- Sep 5, 2012, 4:00:29 PM (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp
r127647 r127654 591 591 } 592 592 593 // ------------------------------ Postfix ResolveNode ----------------------------------593 // ------------------------------ PostfixNode ---------------------------------- 594 594 595 595 static RegisterID* emitPreIncOrDec(BytecodeGenerator& generator, RegisterID* srcDst, Operator oper) … … 605 605 } 606 606 607 RegisterID* PostfixResolveNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst) 608 { 609 ResolveResult resolveResult = generator.resolve(m_ident); 607 RegisterID* PostfixNode::emitResolve(BytecodeGenerator& generator, RegisterID* dst) 608 { 609 ASSERT(m_expr->isResolveNode()); 610 ResolveNode* resolve = static_cast<ResolveNode*>(m_expr); 611 const Identifier& ident = resolve->identifier(); 612 613 ResolveResult resolveResult = generator.resolve(ident); 610 614 611 615 if (RegisterID* local = resolveResult.local()) { … … 620 624 621 625 if (resolveResult.isStatic() && !resolveResult.isReadOnly()) { 622 RefPtr<RegisterID> value = generator.emitGetStaticVar(generator.newTemporary(), resolveResult, m_ident);626 RefPtr<RegisterID> value = generator.emitGetStaticVar(generator.newTemporary(), resolveResult, ident); 623 627 RegisterID* oldValue; 624 628 if (dst == generator.ignoredResult()) { … … 628 632 oldValue = emitPostIncOrDec(generator, generator.finalDestination(dst), value.get(), m_operator); 629 633 } 630 generator.emitPutStaticVar(resolveResult, m_ident, value.get());634 generator.emitPutStaticVar(resolveResult, ident, value.get()); 631 635 return oldValue; 632 636 } … … 634 638 generator.emitExpressionInfo(divot(), startOffset(), endOffset()); 635 639 RefPtr<RegisterID> value = generator.newTemporary(); 636 RefPtr<RegisterID> base = generator.emitResolveWithBase(generator.newTemporary(), value.get(), resolveResult, m_ident);640 RefPtr<RegisterID> base = generator.emitResolveWithBase(generator.newTemporary(), value.get(), resolveResult, ident); 637 641 RegisterID* oldValue; 638 642 if (dst == generator.ignoredResult()) { … … 642 646 oldValue = emitPostIncOrDec(generator, generator.finalDestination(dst), value.get(), m_operator); 643 647 } 644 generator.emitPutById(base.get(), m_ident, value.get());648 generator.emitPutById(base.get(), ident, value.get()); 645 649 return oldValue; 646 650 } 647 651 648 // ------------------------------ PostfixBracketNode ---------------------------------- 649 650 RegisterID* PostfixBracketNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst) 651 { 652 RefPtr<RegisterID> base = generator.emitNode(m_base); 653 RefPtr<RegisterID> property = generator.emitNode(m_subscript); 654 655 generator.emitExpressionInfo(divot() - m_subexpressionDivotOffset, startOffset() - m_subexpressionDivotOffset, m_subexpressionEndOffset); 652 RegisterID* PostfixNode::emitBracket(BytecodeGenerator& generator, RegisterID* dst) 653 { 654 ASSERT(m_expr->isBracketAccessorNode()); 655 BracketAccessorNode* bracketAccessor = static_cast<BracketAccessorNode*>(m_expr); 656 ExpressionNode* baseNode = bracketAccessor->base(); 657 ExpressionNode* subscript = bracketAccessor->subscript(); 658 659 RefPtr<RegisterID> base = generator.emitNode(baseNode); 660 RefPtr<RegisterID> property = generator.emitNode(subscript); 661 662 generator.emitExpressionInfo(bracketAccessor->divot(), bracketAccessor->startOffset(), bracketAccessor->endOffset()); 656 663 RefPtr<RegisterID> value = generator.emitGetByVal(generator.newTemporary(), base.get(), property.get()); 657 664 RegisterID* oldValue; … … 670 677 } 671 678 672 // ------------------------------ PostfixDotNode ---------------------------------- 673 674 RegisterID* PostfixDotNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst) 675 { 676 RefPtr<RegisterID> base = generator.emitNode(m_base); 677 678 generator.emitExpressionInfo(divot() - m_subexpressionDivotOffset, startOffset() - m_subexpressionDivotOffset, m_subexpressionEndOffset); 679 RefPtr<RegisterID> value = generator.emitGetById(generator.newTemporary(), base.get(), m_ident); 679 RegisterID* PostfixNode::emitDot(BytecodeGenerator& generator, RegisterID* dst) 680 { 681 ASSERT(m_expr->isDotAccessorNode()); 682 DotAccessorNode* dotAccessor = static_cast<DotAccessorNode*>(m_expr); 683 ExpressionNode* baseNode = dotAccessor->base(); 684 const Identifier& ident = dotAccessor->identifier(); 685 686 RefPtr<RegisterID> base = generator.emitNode(baseNode); 687 688 generator.emitExpressionInfo(dotAccessor->divot(), dotAccessor->startOffset(), dotAccessor->endOffset()); 689 RefPtr<RegisterID> value = generator.emitGetById(generator.newTemporary(), base.get(), ident); 680 690 RegisterID* oldValue; 681 691 if (dst == generator.ignoredResult()) { … … 689 699 } 690 700 generator.emitExpressionInfo(divot(), startOffset(), endOffset()); 691 generator.emitPutById(base.get(), m_ident, value.get());701 generator.emitPutById(base.get(), ident, value.get()); 692 702 return oldValue; 693 703 } 694 704 695 // ------------------------------ PostfixErrorNode ----------------------------------- 696 697 RegisterID* PostfixErrorNode::emitBytecode(BytecodeGenerator& generator, RegisterID*) 698 { 705 RegisterID* PostfixNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst) 706 { 707 if (m_expr->isResolveNode()) 708 return emitResolve(generator, dst); 709 710 if (m_expr->isBracketAccessorNode()) 711 return emitBracket(generator, dst); 712 713 if (m_expr->isDotAccessorNode()) 714 return emitDot(generator, dst); 715 699 716 return emitThrowReferenceError(generator, m_operator == OpPlusPlus 700 717 ? "Postfix ++ operator applied to value that is not a reference." … … 788 805 } 789 806 790 // ------------------------------ PrefixResolveNode ---------------------------------- 791 792 RegisterID* PrefixResolveNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst) 793 { 794 ResolveResult resolveResult = generator.resolve(m_ident); 807 // ------------------------------ PrefixNode ---------------------------------- 808 809 RegisterID* PrefixNode::emitResolve(BytecodeGenerator& generator, RegisterID* dst) 810 { 811 ASSERT(m_expr->isResolveNode()); 812 ResolveNode* resolve = static_cast<ResolveNode*>(m_expr); 813 const Identifier& ident = resolve->identifier(); 814 815 ResolveResult resolveResult = generator.resolve(ident); 795 816 if (RegisterID* local = resolveResult.local()) { 796 817 if (resolveResult.isReadOnly()) { … … 807 828 808 829 if (resolveResult.isStatic() && !resolveResult.isReadOnly()) { 809 RefPtr<RegisterID> propDst = generator.emitGetStaticVar(generator.tempDestination(dst), resolveResult, m_ident);830 RefPtr<RegisterID> propDst = generator.emitGetStaticVar(generator.tempDestination(dst), resolveResult, ident); 810 831 emitPreIncOrDec(generator, propDst.get(), m_operator); 811 generator.emitPutStaticVar(resolveResult, m_ident, propDst.get());832 generator.emitPutStaticVar(resolveResult, ident, propDst.get()); 812 833 return generator.moveToDestinationIfNeeded(dst, propDst.get()); 813 834 } … … 815 836 generator.emitExpressionInfo(divot(), startOffset(), endOffset()); 816 837 RefPtr<RegisterID> propDst = generator.tempDestination(dst); 817 RefPtr<RegisterID> base = generator.emitResolveWithBase(generator.newTemporary(), propDst.get(), resolveResult, m_ident);838 RefPtr<RegisterID> base = generator.emitResolveWithBase(generator.newTemporary(), propDst.get(), resolveResult, ident); 818 839 emitPreIncOrDec(generator, propDst.get(), m_operator); 819 generator.emitPutById(base.get(), m_ident, propDst.get());840 generator.emitPutById(base.get(), ident, propDst.get()); 820 841 return generator.moveToDestinationIfNeeded(dst, propDst.get()); 821 842 } 822 843 823 // ------------------------------ PrefixBracketNode ---------------------------------- 824 825 RegisterID* PrefixBracketNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst) 826 { 827 RefPtr<RegisterID> base = generator.emitNode(m_base); 828 RefPtr<RegisterID> property = generator.emitNode(m_subscript); 844 RegisterID* PrefixNode::emitBracket(BytecodeGenerator& generator, RegisterID* dst) 845 { 846 ASSERT(m_expr->isBracketAccessorNode()); 847 BracketAccessorNode* bracketAccessor = static_cast<BracketAccessorNode*>(m_expr); 848 ExpressionNode* baseNode = bracketAccessor->base(); 849 ExpressionNode* subscript = bracketAccessor->subscript(); 850 851 RefPtr<RegisterID> base = generator.emitNode(baseNode); 852 RefPtr<RegisterID> property = generator.emitNode(subscript); 829 853 RefPtr<RegisterID> propDst = generator.tempDestination(dst); 830 854 831 generator.emitExpressionInfo( divot() + m_subexpressionDivotOffset, m_subexpressionStartOffset, endOffset() - m_subexpressionDivotOffset);855 generator.emitExpressionInfo(bracketAccessor->divot(), bracketAccessor->startOffset(), bracketAccessor->endOffset()); 832 856 RegisterID* value = generator.emitGetByVal(propDst.get(), base.get(), property.get()); 833 857 if (m_operator == OpPlusPlus) … … 840 864 } 841 865 842 // ------------------------------ PrefixDotNode ---------------------------------- 843 844 RegisterID* PrefixDotNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst) 845 { 846 RefPtr<RegisterID> base = generator.emitNode(m_base); 866 RegisterID* PrefixNode::emitDot(BytecodeGenerator& generator, RegisterID* dst) 867 { 868 ASSERT(m_expr->isDotAccessorNode()); 869 DotAccessorNode* dotAccessor = static_cast<DotAccessorNode*>(m_expr); 870 ExpressionNode* baseNode = dotAccessor->base(); 871 const Identifier& ident = dotAccessor->identifier(); 872 873 RefPtr<RegisterID> base = generator.emitNode(baseNode); 847 874 RefPtr<RegisterID> propDst = generator.tempDestination(dst); 848 875 849 generator.emitExpressionInfo(d ivot() + m_subexpressionDivotOffset, m_subexpressionStartOffset, endOffset() - m_subexpressionDivotOffset);850 RegisterID* value = generator.emitGetById(propDst.get(), base.get(), m_ident);876 generator.emitExpressionInfo(dotAccessor->divot(), dotAccessor->startOffset(), dotAccessor->endOffset()); 877 RegisterID* value = generator.emitGetById(propDst.get(), base.get(), ident); 851 878 if (m_operator == OpPlusPlus) 852 879 generator.emitPreInc(value); … … 854 881 generator.emitPreDec(value); 855 882 generator.emitExpressionInfo(divot(), startOffset(), endOffset()); 856 generator.emitPutById(base.get(), m_ident, value);883 generator.emitPutById(base.get(), ident, value); 857 884 return generator.moveToDestinationIfNeeded(dst, propDst.get()); 858 885 } 859 886 860 // ------------------------------ PrefixErrorNode ----------------------------------- 861 862 RegisterID* PrefixErrorNode::emitBytecode(BytecodeGenerator& generator, RegisterID*) 863 { 887 RegisterID* PrefixNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst) 888 { 889 if (m_expr->isResolveNode()) 890 return emitResolve(generator, dst); 891 892 if (m_expr->isBracketAccessorNode()) 893 return emitBracket(generator, dst); 894 895 if (m_expr->isDotAccessorNode()) 896 return emitDot(generator, dst); 897 864 898 return emitThrowReferenceError(generator, m_operator == OpPlusPlus 865 899 ? "Prefix ++ operator applied to value that is not a reference."
Note:
See TracChangeset
for help on using the changeset viewer.