Changeset 29818 in webkit for trunk/JavaScriptCore/kjs/nodes.cpp
- Timestamp:
- Jan 27, 2008, 1:38:01 AM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/kjs/nodes.cpp
r29810 r29818 47 47 class FunctionBodyNodeWithDebuggerHooks : public FunctionBodyNode { 48 48 public: 49 FunctionBodyNodeWithDebuggerHooks(SourceElements*, DeclarationStacks::VarStack*, DeclarationStacks::FunctionStack*) KJS_FAST_CALL;49 FunctionBodyNodeWithDebuggerHooks(SourceElements*, VarStack*, FunctionStack*) KJS_FAST_CALL; 50 50 virtual JSValue* execute(ExecState*) KJS_FAST_CALL; 51 51 }; … … 98 98 } 99 99 #endif 100 101 static inline bool isConstant(const LocalStorage& localStorage, size_t index) 102 { 103 ASSERT(index < localStorage.size()); 104 return localStorage[index].attributes & ReadOnly; 105 } 100 106 101 107 // ------------------------------ Node ----------------------------------------- … … 417 423 } 418 424 419 void BreakpointCheckStatement::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)425 void BreakpointCheckStatement::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 420 426 { 421 427 nodeStack.append(m_statement.get()); … … 585 591 } 586 592 587 void ResolveNode::optimizeVariableAccess( SymbolTable& symbolTable, DeclarationStacks::NodeStack&)593 void ResolveNode::optimizeVariableAccess(const SymbolTable& symbolTable, const LocalStorage&, NodeStack&) 588 594 { 589 595 size_t index = symbolTable.get(ident.ustring().rep()); … … 625 631 // ------------------------------ ElementNode ---------------------------------- 626 632 627 void ElementNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)633 void ElementNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 628 634 { 629 635 if (next) … … 649 655 // ------------------------------ ArrayNode ------------------------------------ 650 656 651 void ArrayNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)657 void ArrayNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 652 658 { 653 659 if (element) … … 680 686 // ------------------------------ ObjectLiteralNode ---------------------------- 681 687 682 void ObjectLiteralNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)688 void ObjectLiteralNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 683 689 { 684 690 if (list) … … 697 703 // ------------------------------ PropertyListNode ----------------------------- 698 704 699 void PropertyListNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)705 void PropertyListNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 700 706 { 701 707 if (next) … … 733 739 // ------------------------------ PropertyNode ----------------------------- 734 740 735 void PropertyNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)741 void PropertyNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 736 742 { 737 743 nodeStack.append(assign.get()); … … 747 753 // ------------------------------ BracketAccessorNode -------------------------------- 748 754 749 void BracketAccessorNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)755 void BracketAccessorNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 750 756 { 751 757 nodeStack.append(expr2.get()); … … 802 808 // ------------------------------ DotAccessorNode -------------------------------- 803 809 804 void DotAccessorNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)810 void DotAccessorNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 805 811 { 806 812 nodeStack.append(expr.get()); … … 850 856 // ------------------------------ ArgumentListNode ----------------------------- 851 857 852 void ArgumentListNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)858 void ArgumentListNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 853 859 { 854 860 if (next) … … 870 876 // ------------------------------ ArgumentsNode -------------------------------- 871 877 872 void ArgumentsNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)878 void ArgumentsNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 873 879 { 874 880 if (listNode) … … 878 884 // ------------------------------ NewExprNode ---------------------------------- 879 885 880 void NewExprNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)886 void NewExprNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 881 887 { 882 888 if (args) … … 941 947 } 942 948 943 void FunctionCallValueNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)949 void FunctionCallValueNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 944 950 { 945 951 nodeStack.append(args.get()); … … 972 978 } 973 979 974 void FunctionCallResolveNode::optimizeVariableAccess( SymbolTable& symbolTable, DeclarationStacks::NodeStack& nodeStack)980 void FunctionCallResolveNode::optimizeVariableAccess(const SymbolTable& symbolTable, const LocalStorage&, NodeStack& nodeStack) 975 981 { 976 982 nodeStack.append(args.get()); … … 1118 1124 } 1119 1125 1120 void FunctionCallBracketNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)1126 void FunctionCallBracketNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 1121 1127 { 1122 1128 nodeStack.append(args.get()); … … 1187 1193 } 1188 1194 1189 void FunctionCallDotNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)1195 void FunctionCallDotNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 1190 1196 { 1191 1197 nodeStack.append(args.get()); … … 1262 1268 1263 1269 // Increment 1264 void PostIncResolveNode::optimizeVariableAccess( SymbolTable& symbolTable, DeclarationStacks::NodeStack&)1270 void PostIncResolveNode::optimizeVariableAccess(const SymbolTable& symbolTable, const LocalStorage& localStorage, NodeStack&) 1265 1271 { 1266 1272 size_t index = symbolTable.get(m_ident.ustring().rep()); 1267 if (index != missingSymbolMarker()) 1268 new (this) PostIncLocalVarNode(index); 1273 if (index != missingSymbolMarker()) { 1274 if (isConstant(localStorage, index)) 1275 new (this) PostIncConstNode(index); 1276 else 1277 new (this) PostIncLocalVarNode(index); 1278 } 1269 1279 } 1270 1280 … … 1320 1330 1321 1331 // Decrement 1322 void PostDecResolveNode::optimizeVariableAccess( SymbolTable& symbolTable, DeclarationStacks::NodeStack&)1332 void PostDecResolveNode::optimizeVariableAccess(const SymbolTable& symbolTable, const LocalStorage& localStorage, NodeStack&) 1323 1333 { 1324 1334 size_t index = symbolTable.get(m_ident.ustring().rep()); 1325 if (index != missingSymbolMarker()) 1326 new (this) PostDecLocalVarNode(index); 1335 if (index != missingSymbolMarker()) { 1336 if (isConstant(localStorage, index)) 1337 new (this) PostDecConstNode(index); 1338 else 1339 new (this) PostDecLocalVarNode(index); 1340 } 1327 1341 } 1328 1342 … … 1408 1422 // ------------------------------ PostfixBracketNode ---------------------------------- 1409 1423 1410 void PostfixBracketNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)1424 void PostfixBracketNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 1411 1425 { 1412 1426 nodeStack.append(m_subscript.get()); … … 1477 1491 // ------------------------------ PostfixDotNode ---------------------------------- 1478 1492 1479 void PostfixDotNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)1493 void PostfixDotNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 1480 1494 { 1481 1495 nodeStack.append(m_base.get()); … … 1524 1538 // ------------------------------ DeleteResolveNode ----------------------------------- 1525 1539 1526 void DeleteResolveNode::optimizeVariableAccess( SymbolTable& symbolTable, DeclarationStacks::NodeStack&)1540 void DeleteResolveNode::optimizeVariableAccess(const SymbolTable& symbolTable, const LocalStorage&, NodeStack&) 1527 1541 { 1528 1542 size_t index = symbolTable.get(m_ident.ustring().rep()); … … 1566 1580 // ------------------------------ DeleteBracketNode ----------------------------------- 1567 1581 1568 void DeleteBracketNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)1582 void DeleteBracketNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 1569 1583 { 1570 1584 nodeStack.append(m_subscript.get()); … … 1591 1605 // ------------------------------ DeleteDotNode ----------------------------------- 1592 1606 1593 void DeleteDotNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)1607 void DeleteDotNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 1594 1608 { 1595 1609 nodeStack.append(m_base.get()); … … 1607 1621 // ------------------------------ DeleteValueNode ----------------------------------- 1608 1622 1609 void DeleteValueNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)1623 void DeleteValueNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 1610 1624 { 1611 1625 nodeStack.append(m_expr.get()); … … 1623 1637 // ------------------------------ VoidNode ------------------------------------- 1624 1638 1625 void VoidNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)1639 void VoidNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 1626 1640 { 1627 1641 nodeStack.append(expr.get()); … … 1641 1655 // ------------------------------ TypeOfValueNode ----------------------------------- 1642 1656 1643 void TypeOfValueNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)1657 void TypeOfValueNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 1644 1658 { 1645 1659 nodeStack.append(m_expr.get()); … … 1674 1688 } 1675 1689 1676 void TypeOfResolveNode::optimizeVariableAccess( SymbolTable& symbolTable, DeclarationStacks::NodeStack&)1690 void TypeOfResolveNode::optimizeVariableAccess(const SymbolTable& symbolTable, const LocalStorage&, NodeStack&) 1677 1691 { 1678 1692 size_t index = symbolTable.get(m_ident.ustring().rep()); … … 1726 1740 // ------------------------------ PrefixResolveNode ---------------------------------- 1727 1741 1728 void PreIncResolveNode::optimizeVariableAccess( SymbolTable& symbolTable, DeclarationStacks::NodeStack&)1742 void PreIncResolveNode::optimizeVariableAccess(const SymbolTable& symbolTable, const LocalStorage& localStorage, NodeStack&) 1729 1743 { 1730 1744 size_t index = symbolTable.get(m_ident.ustring().rep()); 1731 if (index != missingSymbolMarker()) 1732 new (this) PreIncLocalVarNode(index); 1745 if (index != missingSymbolMarker()) { 1746 if (isConstant(localStorage, index)) 1747 new (this) PreIncConstNode(index); 1748 else 1749 new (this) PreIncLocalVarNode(index); 1750 } 1733 1751 } 1734 1752 … … 1774 1792 } 1775 1793 1776 void PreDecResolveNode::optimizeVariableAccess( SymbolTable& symbolTable, DeclarationStacks::NodeStack&)1794 void PreDecResolveNode::optimizeVariableAccess(const SymbolTable& symbolTable, const LocalStorage& localStorage, NodeStack&) 1777 1795 { 1778 1796 size_t index = symbolTable.get(m_ident.ustring().rep()); 1779 if (index != missingSymbolMarker()) 1780 new (this) PreDecLocalVarNode(index); 1797 if (index != missingSymbolMarker()) { 1798 if (isConstant(localStorage, index)) 1799 new (this) PreDecConstNode(index); 1800 else 1801 new (this) PreDecLocalVarNode(index); 1802 } 1781 1803 } 1782 1804 … … 1822 1844 } 1823 1845 1846 // ------------------------------ PreIncConstNode ---------------------------------- 1847 1848 JSValue* PreIncConstNode::evaluate(ExecState* exec) 1849 { 1850 ASSERT(exec->variableObject() == exec->scopeChain().top()); 1851 return jsNumber(exec->localStorage()[m_index].value->toNumber(exec) + 1); 1852 } 1853 1854 // ------------------------------ PreDecConstNode ---------------------------------- 1855 1856 JSValue* PreDecConstNode::evaluate(ExecState* exec) 1857 { 1858 ASSERT(exec->variableObject() == exec->scopeChain().top()); 1859 return jsNumber(exec->localStorage()[m_index].value->toNumber(exec) - 1); 1860 } 1861 1862 // ------------------------------ PostIncConstNode ---------------------------------- 1863 1864 JSValue* PostIncConstNode::evaluate(ExecState* exec) 1865 { 1866 ASSERT(exec->variableObject() == exec->scopeChain().top()); 1867 return jsNumber(exec->localStorage()[m_index].value->toNumber(exec)); 1868 } 1869 1870 // ------------------------------ PostDecConstNode ---------------------------------- 1871 1872 JSValue* PostDecConstNode::evaluate(ExecState* exec) 1873 { 1874 ASSERT(exec->variableObject() == exec->scopeChain().top()); 1875 return jsNumber(exec->localStorage()[m_index].value->toNumber(exec)); 1876 } 1877 1824 1878 // ------------------------------ PrefixBracketNode ---------------------------------- 1825 1879 1826 void PrefixBracketNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)1880 void PrefixBracketNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 1827 1881 { 1828 1882 nodeStack.append(m_subscript.get()); … … 1896 1950 // ------------------------------ PrefixDotNode ---------------------------------- 1897 1951 1898 void PrefixDotNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)1952 void PrefixDotNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 1899 1953 { 1900 1954 nodeStack.append(m_base.get()); … … 1947 2001 // ------------------------------ UnaryPlusNode -------------------------------- 1948 2002 1949 void UnaryPlusNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)2003 void UnaryPlusNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 1950 2004 { 1951 2005 nodeStack.append(m_expr.get()); … … 1982 2036 // ------------------------------ NegateNode ----------------------------------- 1983 2037 1984 void NegateNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)2038 void NegateNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 1985 2039 { 1986 2040 nodeStack.append(expr.get()); … … 2002 2056 // ------------------------------ BitwiseNotNode ------------------------------- 2003 2057 2004 void BitwiseNotNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)2058 void BitwiseNotNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 2005 2059 { 2006 2060 nodeStack.append(expr.get()); … … 2040 2094 // ------------------------------ LogicalNotNode ------------------------------- 2041 2095 2042 void LogicalNotNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)2096 void LogicalNotNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 2043 2097 { 2044 2098 nodeStack.append(expr.get()); … … 2058 2112 // ------------------------------ Multiplicative Nodes ----------------------------------- 2059 2113 2060 void MultNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)2114 void MultNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 2061 2115 { 2062 2116 nodeStack.append(term1.get()); … … 2098 2152 } 2099 2153 2100 void DivNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)2154 void DivNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 2101 2155 { 2102 2156 nodeStack.append(term1.get()); … … 2133 2187 } 2134 2188 2135 void ModNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)2189 void ModNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 2136 2190 { 2137 2191 nodeStack.append(term1.get()); … … 2270 2324 } 2271 2325 2272 void AddNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)2326 void AddNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 2273 2327 { 2274 2328 nodeStack.append(term1.get()); … … 2377 2431 } 2378 2432 2379 void SubNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)2433 void SubNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 2380 2434 { 2381 2435 nodeStack.append(term1.get()); … … 2414 2468 // ------------------------------ Shift Nodes ------------------------------------ 2415 2469 2416 void LeftShiftNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)2470 void LeftShiftNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 2417 2471 { 2418 2472 nodeStack.append(term1.get()); … … 2449 2503 } 2450 2504 2451 void RightShiftNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)2505 void RightShiftNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 2452 2506 { 2453 2507 nodeStack.append(term1.get()); … … 2484 2538 } 2485 2539 2486 void UnsignedRightShiftNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)2540 void UnsignedRightShiftNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 2487 2541 { 2488 2542 nodeStack.append(term1.get()); … … 2551 2605 } 2552 2606 2553 void LessNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)2607 void LessNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 2554 2608 { 2555 2609 nodeStack.append(expr2.get()); … … 2613 2667 } 2614 2668 2615 void GreaterNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)2669 void GreaterNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 2616 2670 { 2617 2671 nodeStack.append(expr2.get()); … … 2639 2693 } 2640 2694 2641 void LessEqNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)2695 void LessEqNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 2642 2696 { 2643 2697 nodeStack.append(expr2.get()); … … 2665 2719 } 2666 2720 2667 void GreaterEqNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)2721 void GreaterEqNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 2668 2722 { 2669 2723 nodeStack.append(expr2.get()); … … 2691 2745 } 2692 2746 2693 void InstanceOfNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)2747 void InstanceOfNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 2694 2748 { 2695 2749 nodeStack.append(expr2.get()); … … 2744 2798 } 2745 2799 2746 void InNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)2800 void InNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 2747 2801 { 2748 2802 nodeStack.append(expr2.get()); … … 2781 2835 // ------------------------------ Equality Nodes ------------------------------------ 2782 2836 2783 void EqualNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)2837 void EqualNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 2784 2838 { 2785 2839 nodeStack.append(expr2.get()); … … 2808 2862 } 2809 2863 2810 void NotEqualNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)2864 void NotEqualNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 2811 2865 { 2812 2866 nodeStack.append(expr2.get()); … … 2835 2889 } 2836 2890 2837 void StrictEqualNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)2891 void StrictEqualNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 2838 2892 { 2839 2893 nodeStack.append(expr2.get()); … … 2862 2916 } 2863 2917 2864 void NotStrictEqualNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)2918 void NotStrictEqualNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 2865 2919 { 2866 2920 nodeStack.append(expr2.get()); … … 2891 2945 // ------------------------------ Bit Operation Nodes ---------------------------------- 2892 2946 2893 void BitAndNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)2947 void BitAndNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 2894 2948 { 2895 2949 nodeStack.append(expr2.get()); … … 2936 2990 } 2937 2991 2938 void BitXOrNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)2992 void BitXOrNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 2939 2993 { 2940 2994 nodeStack.append(expr2.get()); … … 2975 3029 } 2976 3030 2977 void BitOrNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)3031 void BitOrNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 2978 3032 { 2979 3033 nodeStack.append(expr2.get()); … … 3016 3070 // ------------------------------ Binary Logical Nodes ---------------------------- 3017 3071 3018 void LogicalAndNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)3072 void LogicalAndNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 3019 3073 { 3020 3074 nodeStack.append(expr2.get()); … … 3043 3097 } 3044 3098 3045 void LogicalOrNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)3099 void LogicalOrNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 3046 3100 { 3047 3101 nodeStack.append(expr2.get()); … … 3067 3121 // ------------------------------ ConditionalNode ------------------------------ 3068 3122 3069 void ConditionalNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)3123 void ConditionalNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 3070 3124 { 3071 3125 nodeStack.append(expr2.get()); … … 3178 3232 // ------------------------------ ReadModifyResolveNode ----------------------------------- 3179 3233 3180 void ReadModifyResolveNode::optimizeVariableAccess( SymbolTable& symbolTable, DeclarationStacks::NodeStack& nodeStack)3234 void ReadModifyResolveNode::optimizeVariableAccess(const SymbolTable& symbolTable, const LocalStorage& localStorage, NodeStack& nodeStack) 3181 3235 { 3182 3236 nodeStack.append(m_right.get()); 3183 3237 size_t index = symbolTable.get(m_ident.ustring().rep()); 3184 if (index != missingSymbolMarker()) 3185 new (this) ReadModifyLocalVarNode(index); 3186 } 3187 3188 void AssignResolveNode::optimizeVariableAccess(SymbolTable& symbolTable, DeclarationStacks::NodeStack& nodeStack) 3238 if (index != missingSymbolMarker()) { 3239 if (isConstant(localStorage, index)) 3240 new (this) ReadModifyConstNode(index); 3241 else 3242 new (this) ReadModifyLocalVarNode(index); 3243 } 3244 } 3245 3246 // ------------------------------ AssignResolveNode ----------------------------------- 3247 3248 void AssignResolveNode::optimizeVariableAccess(const SymbolTable& symbolTable, const LocalStorage& localStorage, NodeStack& nodeStack) 3189 3249 { 3190 3250 nodeStack.append(m_right.get()); 3191 3251 size_t index = symbolTable.get(m_ident.ustring().rep()); 3192 if (index != missingSymbolMarker()) 3193 new (this) AssignLocalVarNode(index); 3194 } 3252 if (index != missingSymbolMarker()) { 3253 if (isConstant(localStorage, index)) 3254 new (this) AssignConstNode; 3255 else 3256 new (this) AssignLocalVarNode(index); 3257 } 3258 } 3259 3260 // ------------------------------ ReadModifyLocalVarNode ----------------------------------- 3195 3261 3196 3262 JSValue* ReadModifyLocalVarNode::evaluate(ExecState* exec) … … 3207 3273 return v; 3208 3274 } 3275 3276 // ------------------------------ AssignLocalVarNode ----------------------------------- 3209 3277 3210 3278 JSValue* AssignLocalVarNode::evaluate(ExecState* exec) … … 3218 3286 3219 3287 return v; 3288 } 3289 3290 // ------------------------------ ReadModifyConstNode ----------------------------------- 3291 3292 JSValue* ReadModifyConstNode::evaluate(ExecState* exec) 3293 { 3294 ASSERT(exec->variableObject() == exec->scopeChain().top()); 3295 JSValue* left = exec->localStorage()[m_index].value; 3296 ASSERT(m_oper != OpEqual); 3297 JSValue* result = valueForReadModifyAssignment(exec, left, m_right.get(), m_oper); 3298 KJS_CHECKEXCEPTIONVALUE 3299 return result; 3300 } 3301 3302 // ------------------------------ AssignConstNode ----------------------------------- 3303 3304 JSValue* AssignConstNode::evaluate(ExecState* exec) 3305 { 3306 return m_right->evaluate(exec); 3220 3307 } 3221 3308 … … 3295 3382 // ------------------------------ ReadModifyDotNode ----------------------------------- 3296 3383 3297 void AssignDotNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)3384 void AssignDotNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 3298 3385 { 3299 3386 nodeStack.append(m_right.get()); … … 3315 3402 } 3316 3403 3317 void ReadModifyDotNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)3404 void ReadModifyDotNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 3318 3405 { 3319 3406 nodeStack.append(m_right.get()); … … 3352 3439 // ------------------------------ AssignBracketNode ----------------------------------- 3353 3440 3354 void AssignBracketNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)3441 void AssignBracketNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 3355 3442 { 3356 3443 nodeStack.append(m_right.get()); … … 3384 3471 return v; 3385 3472 } 3386 void ReadModifyBracketNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)3473 void ReadModifyBracketNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 3387 3474 { 3388 3475 nodeStack.append(m_right.get()); … … 3432 3519 // ------------------------------ CommaNode ------------------------------------ 3433 3520 3434 void CommaNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)3521 void CommaNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 3435 3522 { 3436 3523 nodeStack.append(expr2.get()); … … 3454 3541 } 3455 3542 3456 void ConstDeclNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)3543 void ConstDeclNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 3457 3544 { 3458 3545 if (next) … … 3542 3629 // ------------------------------ ConstStatementNode ----------------------------- 3543 3630 3544 void ConstStatementNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)3631 void ConstStatementNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 3545 3632 { 3546 3633 ASSERT(next); … … 3608 3695 } 3609 3696 3610 void BlockNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)3697 void BlockNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 3611 3698 { 3612 3699 statementListPushFIFO(m_children, nodeStack); … … 3629 3716 // ------------------------------ ExprStatementNode ---------------------------- 3630 3717 3631 void ExprStatementNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)3718 void ExprStatementNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 3632 3719 { 3633 3720 ASSERT(expr); … … 3646 3733 // ------------------------------ VarStatementNode ---------------------------- 3647 3734 3648 void VarStatementNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)3735 void VarStatementNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 3649 3736 { 3650 3737 ASSERT(expr); … … 3662 3749 // ------------------------------ IfNode --------------------------------------- 3663 3750 3664 void IfNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)3751 void IfNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 3665 3752 { 3666 3753 nodeStack.append(m_ifBlock.get()); … … 3679 3766 } 3680 3767 3681 void IfElseNode::optimizeVariableAccess( SymbolTable& table, DeclarationStacks::NodeStack& nodeStack)3768 void IfElseNode::optimizeVariableAccess(const SymbolTable& symbolTable, const LocalStorage& localStorage, NodeStack& nodeStack) 3682 3769 { 3683 3770 nodeStack.append(m_elseBlock.get()); 3684 IfNode::optimizeVariableAccess( table, nodeStack);3771 IfNode::optimizeVariableAccess(symbolTable, localStorage, nodeStack); 3685 3772 } 3686 3773 … … 3699 3786 // ------------------------------ DoWhileNode ---------------------------------- 3700 3787 3701 void DoWhileNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)3788 void DoWhileNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 3702 3789 { 3703 3790 nodeStack.append(statement.get()); … … 3741 3828 // ------------------------------ WhileNode ------------------------------------ 3742 3829 3743 void WhileNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)3830 void WhileNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 3744 3831 { 3745 3832 nodeStack.append(statement.get()); … … 3782 3869 // ------------------------------ ForNode -------------------------------------- 3783 3870 3784 void ForNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)3871 void ForNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 3785 3872 { 3786 3873 nodeStack.append(statement.get()); … … 3844 3931 } 3845 3932 3846 void ForInNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)3933 void ForInNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 3847 3934 { 3848 3935 nodeStack.append(statement.get()); … … 3973 4060 // ------------------------------ ReturnNode ----------------------------------- 3974 4061 3975 void ReturnNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)4062 void ReturnNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 3976 4063 { 3977 4064 if (value) … … 3997 4084 // ------------------------------ WithNode ------------------------------------- 3998 4085 3999 void WithNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)4086 void WithNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 4000 4087 { 4001 4088 // Can't optimize within statement because "with" introduces a dynamic scope. … … 4020 4107 // ------------------------------ CaseClauseNode ------------------------------- 4021 4108 4022 void CaseClauseNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)4109 void CaseClauseNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 4023 4110 { 4024 4111 if (expr) … … 4044 4131 // ------------------------------ ClauseListNode ------------------------------- 4045 4132 4046 void ClauseListNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)4133 void ClauseListNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 4047 4134 { 4048 4135 if (next) … … 4060 4147 } 4061 4148 4062 void CaseBlockNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)4149 void CaseBlockNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 4063 4150 { 4064 4151 if (list2) … … 4130 4217 // ------------------------------ SwitchNode ----------------------------------- 4131 4218 4132 void SwitchNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)4219 void SwitchNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 4133 4220 { 4134 4221 nodeStack.append(block.get()); … … 4153 4240 // ------------------------------ LabelNode ------------------------------------ 4154 4241 4155 void LabelNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)4242 void LabelNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 4156 4243 { 4157 4244 nodeStack.append(statement.get()); … … 4173 4260 // ------------------------------ ThrowNode ------------------------------------ 4174 4261 4175 void ThrowNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)4262 void ThrowNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 4176 4263 { 4177 4264 nodeStack.append(expr.get()); … … 4190 4277 // ------------------------------ TryNode -------------------------------------- 4191 4278 4192 void TryNode::optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack& nodeStack)4279 void TryNode::optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack& nodeStack) 4193 4280 { 4194 4281 // Can't optimize within catchBlock because "catch" introduces a dynamic scope. … … 4229 4316 // ------------------------------ FunctionBodyNode ----------------------------- 4230 4317 4231 ScopeNode::ScopeNode(SourceElements* children, DeclarationStacks::VarStack* varStack, DeclarationStacks::FunctionStack* funcStack)4318 ScopeNode::ScopeNode(SourceElements* children, VarStack* varStack, FunctionStack* funcStack) 4232 4319 : BlockNode(children) 4233 4320 , m_sourceURL(parser().sourceURL()) … … 4236 4323 if (varStack) 4237 4324 m_varStack = *varStack; 4238 4239 4325 if (funcStack) 4240 4326 m_functionStack = *funcStack; 4241 4327 } 4242 4328 4243 ProgramNode::ProgramNode(SourceElements* children, DeclarationStacks::VarStack* varStack, DeclarationStacks::FunctionStack* funcStack) 4329 // ------------------------------ ProgramNode ----------------------------- 4330 4331 ProgramNode::ProgramNode(SourceElements* children, VarStack* varStack, FunctionStack* funcStack) 4244 4332 : ScopeNode(children, varStack, funcStack) 4245 4333 { 4246 4334 } 4247 4335 4248 ProgramNode* ProgramNode::create(SourceElements* children, DeclarationStacks::VarStack* varStack, DeclarationStacks::FunctionStack* funcStack)4336 ProgramNode* ProgramNode::create(SourceElements* children, VarStack* varStack, FunctionStack* funcStack) 4249 4337 { 4250 4338 return new ProgramNode(children, varStack, funcStack); 4251 4339 } 4252 4340 4253 EvalNode::EvalNode(SourceElements* children, DeclarationStacks::VarStack* varStack, DeclarationStacks::FunctionStack* funcStack) 4341 // ------------------------------ EvalNode ----------------------------- 4342 4343 EvalNode::EvalNode(SourceElements* children, VarStack* varStack, FunctionStack* funcStack) 4254 4344 : ScopeNode(children, varStack, funcStack) 4255 4345 { 4256 4346 } 4257 4347 4258 EvalNode* EvalNode::create(SourceElements* children, DeclarationStacks::VarStack* varStack, DeclarationStacks::FunctionStack* funcStack)4348 EvalNode* EvalNode::create(SourceElements* children, VarStack* varStack, FunctionStack* funcStack) 4259 4349 { 4260 4350 return new EvalNode(children, varStack, funcStack); 4261 4351 } 4262 4352 4263 FunctionBodyNode::FunctionBodyNode(SourceElements* children, DeclarationStacks::VarStack* varStack, DeclarationStacks::FunctionStack* funcStack) 4353 // ------------------------------ FunctionBodyNode ----------------------------- 4354 4355 FunctionBodyNode::FunctionBodyNode(SourceElements* children, VarStack* varStack, FunctionStack* funcStack) 4264 4356 : ScopeNode(children, varStack, funcStack) 4265 4357 , m_initialized(false) … … 4267 4359 } 4268 4360 4269 FunctionBodyNode* FunctionBodyNode::create(SourceElements* children, DeclarationStacks::VarStack* varStack, DeclarationStacks::FunctionStack* funcStack)4361 FunctionBodyNode* FunctionBodyNode::create(SourceElements* children, VarStack* varStack, FunctionStack* funcStack) 4270 4362 { 4271 4363 if (Debugger::debuggersPresent) … … 4280 4372 4281 4373 size_t localStorageIndex = 0; 4374 4375 // Order must match the order in processDeclarations. 4282 4376 4283 4377 for (size_t i = 0, size = m_parameters.size(); i < size; ++i, ++localStorageIndex) { … … 4312 4406 size_t localStorageIndex = symbolTable.size(); 4313 4407 size_t size; 4408 4409 // Order must match the order in processDeclarations. 4314 4410 4315 4411 size = m_functionStack.size(); … … 4338 4434 continue; 4339 4435 } 4436 4340 4437 m_varIndexes[i] = result.first->second; 4341 4438 ++localStorageIndex; … … 4345 4442 void ScopeNode::optimizeVariableAccess(ExecState* exec) 4346 4443 { 4347 DeclarationStacks::NodeStack nodeStack;4444 NodeStack nodeStack; 4348 4445 Node* node = statementListInitializeVariableAccessStack(m_children, nodeStack); 4349 4446 if (!node) 4350 4447 return; 4351 4448 4352 SymbolTable& symbolTable = exec->variableObject()->symbolTable(); 4449 const SymbolTable& symbolTable = exec->variableObject()->symbolTable(); 4450 const LocalStorage& localStorage = exec->variableObject()->localStorage(); 4353 4451 while (true) { 4354 node->optimizeVariableAccess(symbolTable, nodeStack);4452 node->optimizeVariableAccess(symbolTable, localStorage, nodeStack); 4355 4453 4356 4454 size_t size = nodeStack.size(); … … 4365 4463 void FunctionBodyNode::processDeclarations(ExecState* exec) 4366 4464 { 4367 if (!m_initialized) {4465 if (!m_initialized) 4368 4466 initializeSymbolTable(exec); 4369 optimizeVariableAccess(exec);4370 4371 m_initialized = true;4372 }4373 4467 4374 4468 if (m_functionStack.size() != 0) 4375 exec->dynamicGlobalObject()->tearOffActivation(exec);4469 exec->dynamicGlobalObject()->tearOffActivation(exec); 4376 4470 4377 4471 LocalStorage& localStorage = exec->variableObject()->localStorage(); … … 4398 4492 4399 4493 for (size_t i = 0, size = m_varStack.size(); i < size; ++i) { 4400 bool isConstant = m_varStack[i].second & DeclarationStacks::IsConstant;4401 4494 int attributes = minAttributes; 4402 if ( isConstant)4495 if (m_varStack[i].second & DeclarationStacks::IsConstant) 4403 4496 attributes |= ReadOnly; 4404 4497 localStorage.uncheckedAppend(LocalStorageEntry(jsUndefined(), attributes)); 4498 } 4499 4500 if (!m_initialized) { 4501 optimizeVariableAccess(exec); 4502 m_initialized = true; 4405 4503 } 4406 4504 } … … 4419 4517 4420 4518 initializeSymbolTable(exec); 4421 optimizeVariableAccess(exec);4422 4519 4423 4520 LocalStorage& localStorage = exec->variableObject()->localStorage(); … … 4450 4547 continue; 4451 4548 4452 bool isConstant = m_varStack[i].second & DeclarationStacks::IsConstant;4453 4549 int attributes = minAttributes; 4454 if ( isConstant)4550 if (m_varStack[i].second & DeclarationStacks::IsConstant) 4455 4551 attributes |= ReadOnly; 4456 4552 LocalStorageEntry entry = LocalStorageEntry(jsUndefined(), attributes); … … 4459 4555 localStorage.uncheckedAppend(entry); 4460 4556 } 4557 4558 optimizeVariableAccess(exec); 4461 4559 } 4462 4560 … … 4474 4572 for (i = 0, size = m_varStack.size(); i < size; ++i) { 4475 4573 Identifier& ident = m_varStack[i].first; 4476 bool isConstant = m_varStack[i].second & DeclarationStacks::IsConstant;4477 4574 if (variableObject->hasProperty(exec, ident)) 4478 4575 continue; 4479 4576 int attributes = minAttributes; 4480 if ( isConstant)4577 if (m_varStack[i].second & DeclarationStacks::IsConstant) 4481 4578 attributes |= ReadOnly; 4482 4579 variableObject->put(exec, ident, jsUndefined(), attributes);
Note:
See TracChangeset
for help on using the changeset viewer.