Changeset 27216 in webkit for trunk/JavaScriptCore/kjs
- Timestamp:
- Oct 29, 2007, 12:05:49 AM (18 years ago)
- Location:
- trunk/JavaScriptCore/kjs
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/kjs/nodes.cpp
r27215 r27216 1177 1177 } 1178 1178 1179 void TypeOfResolveNode::optimizeVariableAccess(FunctionBodyNode* functionBody, DeclarationStacks::NodeStack&) 1180 { 1181 size_t index = functionBody->symbolTable().get(m_ident.ustring().rep()); 1182 if (index != missingSymbolMarker()) 1183 new (this) LocalTypeOfAccessNode(index); 1184 } 1185 1186 JSValue* LocalTypeOfAccessNode::evaluate(ExecState* exec) 1187 { 1188 ActivationImp* variableObject = static_cast<ActivationImp*>(exec->variableObject()); 1189 ASSERT(variableObject->isActivation()); 1190 ASSERT(variableObject == exec->scopeChain().top()); 1191 return typeStringForValue(variableObject->localStorage()[m_index].value); 1192 } 1193 1179 1194 JSValue *TypeOfResolveNode::evaluate(ExecState *exec) 1180 1195 { … … 1214 1229 1215 1230 // ------------------------------ PrefixResolveNode ---------------------------------- 1231 1232 void PrefixResolveNode::optimizeVariableAccess(FunctionBodyNode* functionBody, DeclarationStacks::NodeStack&) 1233 { 1234 size_t index = functionBody->symbolTable().get(m_ident.ustring().rep()); 1235 if (index != missingSymbolMarker()) 1236 new (this) PrefixLocalAccessNode(index); 1237 } 1238 1239 JSValue* PrefixLocalAccessNode::evaluate(ExecState* exec) 1240 { 1241 ActivationImp* variableObject = static_cast<ActivationImp*>(exec->variableObject()); 1242 ASSERT(variableObject->isActivation()); 1243 ASSERT(variableObject == exec->scopeChain().top()); 1244 JSValue* v = variableObject->localStorage()[m_index].value; 1245 1246 double n = v->toNumber(exec); 1247 1248 double newValue = (m_oper == OpPlusPlus) ? n + 1 : n - 1; 1249 JSValue* n2 = jsNumber(newValue); 1250 variableObject->localStorage()[m_index].value = n2; 1251 return n2; 1252 } 1216 1253 1217 1254 JSValue *PrefixResolveNode::evaluate(ExecState *exec) … … 1964 2001 // ------------------------------ AssignResolveNode ----------------------------------- 1965 2002 1966 void AssignResolveNode::optimizeVariableAccess(FunctionBodyNode* , DeclarationStacks::NodeStack& nodeStack)2003 void AssignResolveNode::optimizeVariableAccess(FunctionBodyNode* functionBody, DeclarationStacks::NodeStack& nodeStack) 1967 2004 { 1968 2005 nodeStack.append(m_right.get()); 2006 size_t index = functionBody->symbolTable().get(m_ident.ustring().rep()); 2007 if (index != missingSymbolMarker()) 2008 new (this) AssignLocalAccessNode(index); 2009 } 2010 2011 JSValue* AssignLocalAccessNode::evaluate(ExecState* exec) 2012 { 2013 ActivationImp* variableObject = static_cast<ActivationImp*>(exec->variableObject()); 2014 ASSERT(variableObject->isActivation()); 2015 ASSERT(variableObject == exec->scopeChain().top()); 2016 JSValue* v; 2017 2018 if (m_oper == OpEqual) 2019 v = m_right->evaluate(exec); 2020 else { 2021 JSValue* v1 = variableObject->localStorage()[m_index].value; 2022 KJS_CHECKEXCEPTIONVALUE 2023 JSValue* v2 = m_right->evaluate(exec); 2024 v = valueForReadModifyAssignment(exec, v1, v2, m_oper); 2025 } 2026 2027 KJS_CHECKEXCEPTIONVALUE 2028 2029 variableObject->localStorage()[m_index].value = v; 2030 return v; 1969 2031 } 1970 2032 -
trunk/JavaScriptCore/kjs/nodes.h
r27215 r27216 684 684 class TypeOfResolveNode : public Node { 685 685 public: 686 TypeOfResolveNode(const Identifier& i) KJS_FAST_CALL : m_ident(i) {} 686 TypeOfResolveNode(const Identifier &s) KJS_FAST_CALL 687 : m_ident(s) 688 { 689 } 690 691 TypeOfResolveNode(PlacementNewAdoptType) KJS_FAST_CALL 692 : Node(PlacementNewAdopt) 693 , m_ident(PlacementNewAdopt) 694 { 695 } 696 697 virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL; 698 687 699 JSValue* evaluate(ExecState*) KJS_FAST_CALL; 688 700 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; 689 701 virtual Precedence precedence() const { return PrecUnary; } 690 private: 702 703 const Identifier& identifier() const KJS_FAST_CALL { return m_ident; } 704 705 protected: 691 706 Identifier m_ident; 707 size_t m_index; // Used by LocalTypeOfNode. 708 }; 709 710 class LocalTypeOfAccessNode : public TypeOfResolveNode { 711 public: 712 LocalTypeOfAccessNode(size_t i) KJS_FAST_CALL 713 : TypeOfResolveNode(PlacementNewAdopt) 714 { 715 ASSERT(i != missingSymbolMarker()); 716 m_index = i; 717 } 718 719 JSValue* evaluate(ExecState*) KJS_FAST_CALL; 692 720 }; 693 721 … … 705 733 class PrefixResolveNode : public Node { 706 734 public: 707 PrefixResolveNode(const Identifier& i, Operator o) KJS_FAST_CALL : m_ident(i), m_oper(o) {} 735 PrefixResolveNode(const Identifier &s, Operator o) KJS_FAST_CALL 736 : m_ident(s) 737 , m_oper(o) 738 { 739 } 740 741 PrefixResolveNode(PlacementNewAdoptType) KJS_FAST_CALL 742 : Node(PlacementNewAdopt) 743 , m_ident(PlacementNewAdopt) 744 , m_oper(m_oper) 745 { 746 } 747 748 virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL; 749 708 750 JSValue* evaluate(ExecState*) KJS_FAST_CALL; 709 751 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; 710 752 virtual Precedence precedence() const { return PrecUnary; } 711 private: 753 754 protected: 712 755 Identifier m_ident; 713 756 Operator m_oper; 757 size_t m_index; 758 }; 759 760 class PrefixLocalAccessNode : public PrefixResolveNode { 761 public: 762 PrefixLocalAccessNode(size_t i) KJS_FAST_CALL 763 : PrefixResolveNode(PlacementNewAdopt) 764 { 765 ASSERT(i != missingSymbolMarker()); 766 m_index = i; 767 } 768 769 JSValue* evaluate(ExecState*) KJS_FAST_CALL; 714 770 }; 715 771 … … 1112 1168 public: 1113 1169 AssignResolveNode(const Identifier &ident, Operator oper, Node *right) KJS_FAST_CALL 1114 : m_ident(ident), m_oper(oper), m_right(right) {} 1170 : m_ident(ident) 1171 , m_oper(oper) 1172 , m_right(right) 1173 { 1174 } 1175 1176 AssignResolveNode(PlacementNewAdoptType) KJS_FAST_CALL 1177 : Node(PlacementNewAdopt) 1178 , m_ident(PlacementNewAdopt) 1179 , m_oper(m_oper) 1180 , m_right(PlacementNewAdopt) 1181 { 1182 } 1183 1115 1184 virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL; 1116 1185 JSValue* evaluate(ExecState*) KJS_FAST_CALL; … … 1121 1190 Operator m_oper; 1122 1191 RefPtr<Node> m_right; 1192 size_t m_index; 1193 }; 1194 1195 class AssignLocalAccessNode : public AssignResolveNode { 1196 public: 1197 AssignLocalAccessNode(size_t i) KJS_FAST_CALL 1198 : AssignResolveNode(PlacementNewAdopt) 1199 { 1200 ASSERT(i != missingSymbolMarker()); 1201 m_index = i; 1202 } 1203 1204 JSValue* evaluate(ExecState*) KJS_FAST_CALL; 1123 1205 }; 1124 1206
Note:
See TracChangeset
for help on using the changeset viewer.