Changeset 29818 in webkit for trunk/JavaScriptCore/kjs
- Timestamp:
- Jan 27, 2008, 1:38:01 AM (17 years ago)
- Location:
- trunk/JavaScriptCore/kjs
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/kjs/JSGlobalObject.cpp
r29810 r29818 154 154 void JSGlobalObject::put(ExecState* exec, const Identifier& propertyName, JSValue* value, int attr) 155 155 { 156 if (symbolTablePut(propertyName, value, attr))156 if (symbolTablePut(propertyName, value, !(attr & ~DontDelete))) 157 157 return; 158 158 return JSVariableObject::put(exec, propertyName, value, attr); -
trunk/JavaScriptCore/kjs/JSVariableObject.h
r29663 r29818 83 83 84 84 bool symbolTableGet(const Identifier&, PropertySlot&); 85 bool symbolTablePut(const Identifier&, JSValue*, int attr);85 bool symbolTablePut(const Identifier&, JSValue*, bool checkReadOnly); 86 86 87 87 JSVariableObjectData* d; … … 111 111 } 112 112 113 inline bool JSVariableObject::symbolTablePut(const Identifier& propertyName, JSValue* value, int attr)113 inline bool JSVariableObject::symbolTablePut(const Identifier& propertyName, JSValue* value, bool checkReadOnly) 114 114 { 115 115 size_t index = symbolTable().get(propertyName.ustring().rep()); 116 if (index != missingSymbolMarker()) {117 LocalStorageEntry& entry = d->localStorage[index];118 entry.value = value;119 entry.attributes = attr;116 if (index == missingSymbolMarker()) 117 return false; 118 LocalStorageEntry& entry = d->localStorage[index]; 119 if (checkReadOnly && (entry.attributes & ReadOnly)) 120 120 return true; 121 } 122 123 return false; 121 entry.value = value; 122 return true; 124 123 } 125 124 -
trunk/JavaScriptCore/kjs/function.cpp
r29810 r29818 420 420 void ActivationImp::put(ExecState*, const Identifier& propertyName, JSValue* value, int attr) 421 421 { 422 if (symbolTablePut(propertyName, value, attr)) 422 // If any bits other than DontDelete are set, then we bypass the read-only check. 423 bool checkReadOnly = !(attr & ~DontDelete); 424 if (symbolTablePut(propertyName, value, checkReadOnly)) 423 425 return; 424 426 … … 427 429 // expose in the activation object. 428 430 ASSERT(!_prop.hasGetterSetterProperties()); 429 _prop.put(propertyName, value, attr, (attr == None || attr == DontDelete));431 _prop.put(propertyName, value, attr, checkReadOnly); 430 432 } 431 433 -
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); -
trunk/JavaScriptCore/kjs/nodes.h
r29815 r29818 90 90 struct DeclarationStacks { 91 91 typedef Vector<Node*, 16> NodeStack; 92 enum { IsConstant , HasInitializer} VarAttrs;92 enum { IsConstant = 1, HasInitializer = 2 } VarAttrs; 93 93 typedef Vector<std::pair<Identifier, unsigned>, 16> VarStack; 94 94 typedef Vector<FuncDeclNode*, 16> FunctionStack; … … 125 125 class Node : public ParserRefCounted { 126 126 public: 127 typedef DeclarationStacks::NodeStack NodeStack; 128 typedef DeclarationStacks::VarStack VarStack; 129 typedef DeclarationStacks::FunctionStack FunctionStack; 130 127 131 Node() KJS_FAST_CALL; 128 132 Node(PlacementNewAdoptType placementAdopt) KJS_FAST_CALL … … 138 142 139 143 // Used for iterative, depth-first traversal of the node tree. Does not cross function call boundaries. 140 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL { }144 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL { } 141 145 142 146 protected: … … 324 328 } 325 329 326 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;330 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 327 331 328 332 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; … … 369 373 virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; } 370 374 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; 371 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;375 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 372 376 373 377 PassRefPtr<ElementNode> releaseNext() KJS_FAST_CALL { return next.release(); } … … 389 393 ArrayNode(int eli, ElementNode* ele) KJS_FAST_CALL 390 394 : element(ele), elision(eli), opt(true) { } 391 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;395 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 392 396 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 393 397 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; … … 404 408 PropertyNode(const Identifier& n, ExpressionNode* a, Type t) KJS_FAST_CALL 405 409 : m_name(n), assign(a), type(t) { } 406 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;410 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 407 411 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; 408 412 virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; } … … 424 428 PropertyListNode(PropertyNode* n, PropertyListNode* l) KJS_FAST_CALL 425 429 : node(n) { l->next = this; } 426 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;430 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 427 431 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; 428 432 virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; } … … 441 445 ObjectLiteralNode() KJS_FAST_CALL { } 442 446 ObjectLiteralNode(PropertyListNode* l) KJS_FAST_CALL : list(l) { } 443 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;447 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 444 448 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 445 449 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; … … 453 457 public: 454 458 BracketAccessorNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL : expr1(e1), expr2(e2) {} 455 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;459 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 456 460 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 457 461 virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL; … … 476 480 public: 477 481 DotAccessorNode(ExpressionNode* e, const Identifier& s) KJS_FAST_CALL : expr(e), ident(s) { } 478 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;482 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 479 483 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 480 484 virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL; … … 501 505 ArgumentListNode(ArgumentListNode* l, ExpressionNode* e) KJS_FAST_CALL 502 506 : expr(e) { l->next = this; } 503 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;507 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 504 508 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; 505 509 virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; } … … 519 523 ArgumentsNode(ArgumentListNode* l) KJS_FAST_CALL 520 524 : listNode(l) { } 521 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;525 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 522 526 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; 523 527 virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; } … … 533 537 NewExprNode(ExpressionNode* e) KJS_FAST_CALL : expr(e) {} 534 538 NewExprNode(ExpressionNode* e, ArgumentsNode* a) KJS_FAST_CALL : expr(e), args(a) {} 535 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;539 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 536 540 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 537 541 virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL; … … 550 554 public: 551 555 FunctionCallValueNode(ExpressionNode* e, ArgumentsNode* a) KJS_FAST_CALL : expr(e), args(a) {} 552 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;556 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 553 557 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 554 558 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; … … 574 578 } 575 579 576 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;580 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 577 581 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 578 582 virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL; … … 611 615 public: 612 616 FunctionCallBracketNode(ExpressionNode* b, ExpressionNode* s, ArgumentsNode* a) KJS_FAST_CALL : base(b), subscript(s), args(a) {} 613 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;617 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 614 618 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 615 619 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; … … 624 628 public: 625 629 FunctionCallDotNode(ExpressionNode* b, const Identifier& i, ArgumentsNode* a) KJS_FAST_CALL : base(b), ident(i), args(a) {} 626 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;630 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 627 631 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 628 632 virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL; … … 663 667 } 664 668 665 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;669 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 666 670 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 667 671 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; 668 672 virtual Precedence precedence() const { return PrecPostfix; } 669 673 virtual void optimizeForUnnecessaryResult(); 670 671 674 }; 672 675 … … 684 687 }; 685 688 689 class PostIncConstNode : public PostIncResolveNode { 690 public: 691 PostIncConstNode(size_t i) KJS_FAST_CALL 692 : PostIncResolveNode(PlacementNewAdopt) 693 { 694 ASSERT(i != missingSymbolMarker()); 695 m_index = i; 696 } 697 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 698 }; 699 686 700 class PostDecResolveNode : public PrePostResolveNode { 687 701 public: … … 693 707 } 694 708 695 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;709 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 696 710 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 697 711 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; … … 719 733 }; 720 734 735 class PostDecConstNode : public PostDecResolveNode { 736 public: 737 PostDecConstNode(size_t i) KJS_FAST_CALL 738 : PostDecResolveNode(PlacementNewAdopt) 739 { 740 ASSERT(i != missingSymbolMarker()); 741 m_index = i; 742 } 743 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 744 }; 745 721 746 class PostfixBracketNode : public ExpressionNode { 722 747 public: 723 748 PostfixBracketNode(ExpressionNode* b, ExpressionNode* s) KJS_FAST_CALL : m_base(b), m_subscript(s) {} 724 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;749 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 725 750 virtual Precedence precedence() const { return PrecPostfix; } 726 751 protected: … … 746 771 public: 747 772 PostfixDotNode(ExpressionNode* b, const Identifier& i) KJS_FAST_CALL : m_base(b), m_ident(i) {} 748 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;773 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 749 774 virtual Precedence precedence() const { return PrecPostfix; } 750 775 protected: … … 787 812 } 788 813 789 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;814 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 790 815 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 791 816 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; … … 808 833 public: 809 834 DeleteBracketNode(ExpressionNode* base, ExpressionNode* subscript) KJS_FAST_CALL : m_base(base), m_subscript(subscript) {} 810 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;835 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 811 836 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 812 837 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; … … 820 845 public: 821 846 DeleteDotNode(ExpressionNode* base, const Identifier& i) KJS_FAST_CALL : m_base(base), m_ident(i) {} 822 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;847 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 823 848 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 824 849 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; … … 832 857 public: 833 858 DeleteValueNode(ExpressionNode* e) KJS_FAST_CALL : m_expr(e) {} 834 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;859 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 835 860 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 836 861 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; … … 843 868 public: 844 869 VoidNode(ExpressionNode* e) KJS_FAST_CALL : expr(e) {} 845 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;870 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 846 871 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 847 872 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; … … 863 888 } 864 889 865 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;890 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 866 891 867 892 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; … … 892 917 public: 893 918 TypeOfValueNode(ExpressionNode* e) KJS_FAST_CALL : ExpressionNode(StringType), m_expr(e) {} 894 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;919 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 895 920 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 896 921 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; … … 912 937 } 913 938 914 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;939 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 915 940 916 941 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; … … 931 956 }; 932 957 958 class PreIncConstNode : public PreIncResolveNode { 959 public: 960 PreIncConstNode(size_t i) KJS_FAST_CALL 961 : PreIncResolveNode(PlacementNewAdopt) 962 { 963 ASSERT(i != missingSymbolMarker()); 964 m_index = i; 965 } 966 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 967 }; 968 933 969 class PreDecResolveNode : public PrePostResolveNode { 934 970 public: … … 943 979 } 944 980 945 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;981 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 946 982 947 983 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; … … 962 998 }; 963 999 1000 class PreDecConstNode : public PreDecResolveNode { 1001 public: 1002 PreDecConstNode(size_t i) KJS_FAST_CALL 1003 : PreDecResolveNode(PlacementNewAdopt) 1004 { 1005 ASSERT(i != missingSymbolMarker()); 1006 m_index = i; 1007 } 1008 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 1009 }; 1010 964 1011 class PrefixBracketNode : public ExpressionNode { 965 1012 public: 966 1013 PrefixBracketNode(ExpressionNode* b, ExpressionNode* s) KJS_FAST_CALL : m_base(b), m_subscript(s) {} 967 1014 968 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;1015 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 969 1016 virtual Precedence precedence() const { return PrecUnary; } 970 1017 protected: … … 990 1037 public: 991 1038 PrefixDotNode(ExpressionNode* b, const Identifier& i) KJS_FAST_CALL : m_base(b), m_ident(i) {} 992 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;1039 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 993 1040 virtual Precedence precedence() const { return PrecPostfix; } 994 1041 protected: … … 1025 1072 public: 1026 1073 UnaryPlusNode(ExpressionNode* e) KJS_FAST_CALL : ExpressionNode(NumberType), m_expr(e) {} 1027 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;1074 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 1028 1075 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 1029 1076 virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL; … … 1040 1087 public: 1041 1088 NegateNode(ExpressionNode* e) KJS_FAST_CALL : ExpressionNode(NumberType), expr(e) {} 1042 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;1089 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 1043 1090 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 1044 1091 virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL; … … 1052 1099 public: 1053 1100 BitwiseNotNode(ExpressionNode* e) KJS_FAST_CALL : ExpressionNode(NumberType), expr(e) {} 1054 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;1101 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 1055 1102 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 1056 1103 virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL; … … 1068 1115 public: 1069 1116 LogicalNotNode(ExpressionNode* e) KJS_FAST_CALL : ExpressionNode(BooleanType), expr(e) {} 1070 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;1117 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 1071 1118 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 1072 1119 virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL; … … 1080 1127 public: 1081 1128 MultNode(ExpressionNode* t1, ExpressionNode* t2) KJS_FAST_CALL : ExpressionNode(NumberType), term1(t1), term2(t2) {} 1082 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;1129 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 1083 1130 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 1084 1131 virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL; … … 1097 1144 public: 1098 1145 DivNode(ExpressionNode* t1, ExpressionNode* t2) KJS_FAST_CALL : ExpressionNode(NumberType), term1(t1), term2(t2) {} 1099 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;1146 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 1100 1147 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 1101 1148 virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL; … … 1113 1160 public: 1114 1161 ModNode(ExpressionNode* t1, ExpressionNode* t2) KJS_FAST_CALL : ExpressionNode(NumberType), term1(t1), term2(t2) {} 1115 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;1162 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 1116 1163 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 1117 1164 virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL; … … 1130 1177 public: 1131 1178 AddNode(ExpressionNode* t1, ExpressionNode* t2) KJS_FAST_CALL : term1(t1), term2(t2) {} 1132 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;1179 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 1133 1180 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 1134 1181 virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL; … … 1177 1224 public: 1178 1225 SubNode(ExpressionNode* t1, ExpressionNode* t2) KJS_FAST_CALL : ExpressionNode(NumberType), term1(t1), term2(t2) {} 1179 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;1226 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 1180 1227 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 1181 1228 virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL; … … 1194 1241 LeftShiftNode(ExpressionNode* t1, ExpressionNode* t2) KJS_FAST_CALL 1195 1242 : ExpressionNode(NumberType), term1(t1), term2(t2) {} 1196 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;1243 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 1197 1244 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 1198 1245 virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL; … … 1211 1258 RightShiftNode(ExpressionNode* t1, ExpressionNode* t2) KJS_FAST_CALL 1212 1259 : ExpressionNode(NumberType), term1(t1), term2(t2) {} 1213 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;1260 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 1214 1261 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 1215 1262 virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL; … … 1228 1275 UnsignedRightShiftNode(ExpressionNode* t1, ExpressionNode* t2) KJS_FAST_CALL 1229 1276 : ExpressionNode(NumberType), term1(t1), term2(t2) {} 1230 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;1277 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 1231 1278 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 1232 1279 virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL; … … 1245 1292 LessNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL 1246 1293 : ExpressionNode(BooleanType), expr1(e1), expr2(e2) {} 1247 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;1294 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 1248 1295 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 1249 1296 virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL; … … 1281 1328 GreaterNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL : 1282 1329 expr1(e1), expr2(e2) {} 1283 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;1330 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 1284 1331 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 1285 1332 virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL; … … 1296 1343 LessEqNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL : 1297 1344 expr1(e1), expr2(e2) {} 1298 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;1345 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 1299 1346 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 1300 1347 virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL; … … 1311 1358 GreaterEqNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL : 1312 1359 expr1(e1), expr2(e2) {} 1313 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;1360 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 1314 1361 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 1315 1362 virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL; … … 1326 1373 InstanceOfNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL 1327 1374 : ExpressionNode(BooleanType), expr1(e1), expr2(e2) {} 1328 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;1375 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 1329 1376 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 1330 1377 virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL; … … 1340 1387 InNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL : 1341 1388 expr1(e1), expr2(e2) {} 1342 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;1389 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 1343 1390 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 1344 1391 virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL; … … 1354 1401 EqualNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL 1355 1402 : ExpressionNode(BooleanType), expr1(e1), expr2(e2) {} 1356 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;1403 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 1357 1404 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 1358 1405 virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL; … … 1369 1416 NotEqualNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL 1370 1417 : ExpressionNode(BooleanType), expr1(e1), expr2(e2) {} 1371 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;1418 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 1372 1419 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 1373 1420 virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL; … … 1384 1431 StrictEqualNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL 1385 1432 : ExpressionNode(BooleanType), expr1(e1), expr2(e2) {} 1386 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;1433 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 1387 1434 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 1388 1435 virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL; … … 1399 1446 NotStrictEqualNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL 1400 1447 : ExpressionNode(BooleanType), expr1(e1), expr2(e2) {} 1401 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;1448 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 1402 1449 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 1403 1450 virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL; … … 1414 1461 BitAndNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL 1415 1462 : ExpressionNode(NumberType), expr1(e1), expr2(e2) {} 1416 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;1463 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 1417 1464 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 1418 1465 virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL; … … 1432 1479 BitOrNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL 1433 1480 : ExpressionNode(NumberType), expr1(e1), expr2(e2) {} 1434 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;1481 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 1435 1482 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 1436 1483 virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL; … … 1450 1497 BitXOrNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL 1451 1498 : ExpressionNode(NumberType), expr1(e1), expr2(e2) {} 1452 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;1499 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 1453 1500 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 1454 1501 virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL; … … 1471 1518 LogicalAndNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL 1472 1519 : ExpressionNode(BooleanType), expr1(e1), expr2(e2) {} 1473 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;1520 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 1474 1521 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 1475 1522 virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL; … … 1486 1533 LogicalOrNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL 1487 1534 : ExpressionNode(BooleanType), expr1(e1), expr2(e2) {} 1488 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;1535 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 1489 1536 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 1490 1537 virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL; … … 1504 1551 ConditionalNode(ExpressionNode* l, ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL : 1505 1552 logical(l), expr1(e1), expr2(e2) {} 1506 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;1553 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 1507 1554 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 1508 1555 virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL; … … 1534 1581 } 1535 1582 1536 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;1583 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 1537 1584 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 1538 1585 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; … … 1557 1604 }; 1558 1605 1606 class ReadModifyConstNode : public ReadModifyResolveNode { 1607 public: 1608 ReadModifyConstNode(size_t i) KJS_FAST_CALL 1609 : ReadModifyResolveNode(PlacementNewAdopt) 1610 { 1611 ASSERT(i != missingSymbolMarker()); 1612 m_index = i; 1613 } 1614 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 1615 }; 1616 1559 1617 class AssignResolveNode : public ExpressionNode { 1560 1618 public: … … 1572 1630 } 1573 1631 1574 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;1632 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 1575 1633 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 1576 1634 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; … … 1594 1652 }; 1595 1653 1654 class AssignConstNode : public AssignResolveNode { 1655 public: 1656 AssignConstNode() KJS_FAST_CALL 1657 : AssignResolveNode(PlacementNewAdopt) 1658 { 1659 } 1660 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 1661 }; 1662 1596 1663 class ReadModifyBracketNode : public ExpressionNode { 1597 1664 public: 1598 1665 ReadModifyBracketNode(ExpressionNode* base, ExpressionNode* subscript, Operator oper, ExpressionNode* right) KJS_FAST_CALL 1599 1666 : m_base(base), m_subscript(subscript), m_oper(oper), m_right(right) {} 1600 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;1667 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 1601 1668 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 1602 1669 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; … … 1613 1680 AssignBracketNode(ExpressionNode* base, ExpressionNode* subscript, ExpressionNode* right) KJS_FAST_CALL 1614 1681 : m_base(base), m_subscript(subscript), m_right(right) {} 1615 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;1682 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 1616 1683 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 1617 1684 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; … … 1627 1694 AssignDotNode(ExpressionNode* base, const Identifier& ident, ExpressionNode* right) KJS_FAST_CALL 1628 1695 : m_base(base), m_ident(ident), m_right(right) {} 1629 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;1696 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 1630 1697 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 1631 1698 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; … … 1641 1708 ReadModifyDotNode(ExpressionNode* base, const Identifier& ident, Operator oper, ExpressionNode* right) KJS_FAST_CALL 1642 1709 : m_base(base), m_ident(ident), m_oper(oper), m_right(right) {} 1643 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;1710 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 1644 1711 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 1645 1712 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; … … 1671 1738 e1->optimizeForUnnecessaryResult(); 1672 1739 } 1673 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;1740 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 1674 1741 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 1675 1742 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; … … 1683 1750 public: 1684 1751 ConstDeclNode(const Identifier& id, ExpressionNode* in) KJS_FAST_CALL; 1685 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;1752 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 1686 1753 virtual KJS::JSValue* evaluate(ExecState*) KJS_FAST_CALL; 1687 1754 void evaluateSingle(ExecState*) KJS_FAST_CALL; … … 1700 1767 public: 1701 1768 ConstStatementNode(ConstDeclNode* l) KJS_FAST_CALL : next(l) { } 1702 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;1769 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 1703 1770 virtual JSValue* execute(ExecState*) KJS_FAST_CALL; 1704 1771 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; … … 1724 1791 public: 1725 1792 BlockNode(SourceElements* children) KJS_FAST_CALL; 1726 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;1793 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 1727 1794 virtual JSValue* execute(ExecState*) KJS_FAST_CALL; 1728 1795 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; … … 1742 1809 public: 1743 1810 ExprStatementNode(ExpressionNode* e) KJS_FAST_CALL : expr(e) { } 1744 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;1811 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 1745 1812 virtual JSValue* execute(ExecState*) KJS_FAST_CALL; 1746 1813 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; … … 1752 1819 public: 1753 1820 VarStatementNode(ExpressionNode* e) KJS_FAST_CALL : expr(e) { } 1754 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;1821 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 1755 1822 virtual JSValue* execute(ExecState*) KJS_FAST_CALL; 1756 1823 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; … … 1763 1830 IfNode(ExpressionNode* e, StatementNode *s) KJS_FAST_CALL 1764 1831 : m_condition(e), m_ifBlock(s) { } 1765 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;1832 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 1766 1833 virtual JSValue* execute(ExecState*) KJS_FAST_CALL; 1767 1834 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; … … 1775 1842 IfElseNode(ExpressionNode* e, StatementNode* ifBlock, StatementNode* elseBlock) KJS_FAST_CALL 1776 1843 : IfNode(e, ifBlock), m_elseBlock(elseBlock) { } 1777 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;1844 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 1778 1845 virtual JSValue* execute(ExecState*) KJS_FAST_CALL; 1779 1846 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; … … 1785 1852 public: 1786 1853 DoWhileNode(StatementNode *s, ExpressionNode* e) KJS_FAST_CALL : statement(s), expr(e) { } 1787 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;1854 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 1788 1855 virtual JSValue* execute(ExecState*) KJS_FAST_CALL; 1789 1856 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; … … 1796 1863 public: 1797 1864 WhileNode(ExpressionNode* e, StatementNode *s) KJS_FAST_CALL : expr(e), statement(s) { } 1798 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;1865 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 1799 1866 virtual JSValue* execute(ExecState*) KJS_FAST_CALL; 1800 1867 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; … … 1822 1889 } 1823 1890 1824 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;1891 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 1825 1892 virtual JSValue* execute(ExecState*) KJS_FAST_CALL; 1826 1893 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; … … 1837 1904 ForInNode(ExpressionNode* l, ExpressionNode* e, StatementNode *s) KJS_FAST_CALL; 1838 1905 ForInNode(const Identifier &i, ExpressionNode *in, ExpressionNode* e, StatementNode *s) KJS_FAST_CALL; 1839 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;1906 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 1840 1907 virtual JSValue* execute(ExecState*) KJS_FAST_CALL; 1841 1908 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; … … 1872 1939 public: 1873 1940 ReturnNode(ExpressionNode* v) KJS_FAST_CALL : value(v) {} 1874 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;1941 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 1875 1942 virtual JSValue* execute(ExecState*) KJS_FAST_CALL; 1876 1943 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; … … 1882 1949 public: 1883 1950 WithNode(ExpressionNode* e, StatementNode* s) KJS_FAST_CALL : expr(e), statement(s) { } 1884 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;1951 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 1885 1952 virtual JSValue* execute(ExecState*) KJS_FAST_CALL; 1886 1953 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; … … 1893 1960 public: 1894 1961 LabelNode(const Identifier &l, StatementNode *s) KJS_FAST_CALL : label(l), statement(s) { } 1895 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;1962 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 1896 1963 virtual JSValue* execute(ExecState*) KJS_FAST_CALL; 1897 1964 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; … … 1904 1971 public: 1905 1972 ThrowNode(ExpressionNode* e) KJS_FAST_CALL : expr(e) {} 1906 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;1973 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 1907 1974 virtual JSValue* execute(ExecState*) KJS_FAST_CALL; 1908 1975 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; … … 1915 1982 TryNode(StatementNode *b, const Identifier &e, StatementNode *c, StatementNode *f) KJS_FAST_CALL 1916 1983 : tryBlock(b), exceptionIdent(e), catchBlock(c), finallyBlock(f) { } 1917 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;1984 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 1918 1985 virtual JSValue* execute(ExecState*) KJS_FAST_CALL; 1919 1986 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; … … 1944 2011 class ScopeNode : public BlockNode { 1945 2012 public: 1946 ScopeNode(SourceElements*, DeclarationStacks::VarStack*, DeclarationStacks::FunctionStack*) KJS_FAST_CALL;2013 ScopeNode(SourceElements*, VarStack*, FunctionStack*) KJS_FAST_CALL; 1947 2014 1948 2015 int sourceId() const KJS_FAST_CALL { return m_sourceId; } … … 1953 2020 void optimizeVariableAccess(ExecState*) KJS_FAST_CALL; 1954 2021 1955 DeclarationStacks::VarStack m_varStack;1956 DeclarationStacks::FunctionStack m_functionStack;2022 VarStack m_varStack; 2023 FunctionStack m_functionStack; 1957 2024 1958 2025 private: … … 1963 2030 class ProgramNode : public ScopeNode { 1964 2031 public: 1965 static ProgramNode* create(SourceElements*, DeclarationStacks::VarStack*, DeclarationStacks::FunctionStack*) KJS_FAST_CALL;2032 static ProgramNode* create(SourceElements*, VarStack*, FunctionStack*) KJS_FAST_CALL; 1966 2033 virtual JSValue* execute(ExecState*) KJS_FAST_CALL; 1967 2034 1968 2035 private: 1969 ProgramNode(SourceElements*, DeclarationStacks::VarStack*, DeclarationStacks::FunctionStack*) KJS_FAST_CALL;2036 ProgramNode(SourceElements*, VarStack*, FunctionStack*) KJS_FAST_CALL; 1970 2037 void initializeSymbolTable(ExecState*) KJS_FAST_CALL; 1971 2038 ALWAYS_INLINE void processDeclarations(ExecState*) KJS_FAST_CALL; … … 1977 2044 class EvalNode : public ScopeNode { 1978 2045 public: 1979 static EvalNode* create(SourceElements*, DeclarationStacks::VarStack*, DeclarationStacks::FunctionStack*) KJS_FAST_CALL;2046 static EvalNode* create(SourceElements*, VarStack*, FunctionStack*) KJS_FAST_CALL; 1980 2047 virtual JSValue* execute(ExecState*) KJS_FAST_CALL; 1981 2048 1982 2049 private: 1983 EvalNode(SourceElements*, DeclarationStacks::VarStack*, DeclarationStacks::FunctionStack*) KJS_FAST_CALL;2050 EvalNode(SourceElements*, VarStack*, FunctionStack*) KJS_FAST_CALL; 1984 2051 ALWAYS_INLINE void processDeclarations(ExecState*) KJS_FAST_CALL; 1985 2052 }; … … 1987 2054 class FunctionBodyNode : public ScopeNode { 1988 2055 public: 1989 static FunctionBodyNode* create(SourceElements*, DeclarationStacks::VarStack*, DeclarationStacks::FunctionStack*) KJS_FAST_CALL;2056 static FunctionBodyNode* create(SourceElements*, VarStack*, FunctionStack*) KJS_FAST_CALL; 1990 2057 1991 2058 virtual JSValue* execute(ExecState*) KJS_FAST_CALL; … … 1997 2064 1998 2065 protected: 1999 FunctionBodyNode(SourceElements*, DeclarationStacks::VarStack*, DeclarationStacks::FunctionStack*) KJS_FAST_CALL;2066 FunctionBodyNode(SourceElements*, VarStack*, FunctionStack*) KJS_FAST_CALL; 2000 2067 2001 2068 private: … … 2046 2113 CaseClauseNode(ExpressionNode* e, SourceElements* children) KJS_FAST_CALL 2047 2114 : expr(e) { if (children) children->releaseContentsIntoVector(m_children); } 2048 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;2115 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 2049 2116 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; 2050 2117 virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; } … … 2063 2130 ClauseListNode(ClauseListNode* n, CaseClauseNode* c) KJS_FAST_CALL 2064 2131 : clause(c) { n->next = this; } 2065 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;2132 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 2066 2133 CaseClauseNode* getClause() const KJS_FAST_CALL { return clause.get(); } 2067 2134 ClauseListNode* getNext() const KJS_FAST_CALL { return next.get(); } … … 2078 2145 public: 2079 2146 CaseBlockNode(ClauseListNode* l1, CaseClauseNode* d, ClauseListNode* l2) KJS_FAST_CALL; 2080 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;2147 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 2081 2148 JSValue* executeBlock(ExecState*, JSValue *input) KJS_FAST_CALL; 2082 2149 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; … … 2091 2158 public: 2092 2159 SwitchNode(ExpressionNode* e, CaseBlockNode *b) KJS_FAST_CALL : expr(e), block(b) { } 2093 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;2160 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 2094 2161 virtual JSValue* execute(ExecState*) KJS_FAST_CALL; 2095 2162 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; … … 2104 2171 virtual JSValue* execute(ExecState*) KJS_FAST_CALL; 2105 2172 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; 2106 virtual void optimizeVariableAccess( SymbolTable&, DeclarationStacks::NodeStack&) KJS_FAST_CALL;2173 virtual void optimizeVariableAccess(const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL; 2107 2174 private: 2108 2175 RefPtr<StatementNode> m_statement; -
trunk/JavaScriptCore/kjs/object.cpp
r29067 r29818 209 209 ASSERT(value); 210 210 211 // non-standard netscape extension212 211 if (propertyName == exec->propertyNames().underscoreProto) { 213 212 JSObject* proto = value->getObject(); … … 222 221 } 223 222 224 /* TODO: check for write permissions directly w/o this call */ 225 /* Doesn't look very easy with the PropertyMap API - David */ 226 // putValue() is used for JS assignemnts. It passes no attribute. 227 // Assume that a C++ implementation knows what it is doing 228 // and let it override the canPut() check. 229 bool checkReadOnly = !(attr & (ReadOnly | DontEnum | Internal | Function | GetterSetter)); 223 // The put calls from JavaScript execution either have no attributes set, or in some cases 224 // have DontDelete set. For those calls, respect the ReadOnly flag. 225 bool checkReadOnly = !(attr & ~DontDelete); 226 230 227 // Check if there are any setters or getters in the prototype chain 231 228 JSObject *obj = this;
Note:
See TracChangeset
for help on using the changeset viewer.