Changeset 27695 in webkit for trunk/JavaScriptCore
- Timestamp:
- Nov 11, 2007, 4:34:37 PM (18 years ago)
- Location:
- trunk/JavaScriptCore
- Files:
-
- 12 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/ChangeLog
r27689 r27695 1 2007-11-10 Eric Seidel <[email protected]> 2 3 Reviewed by darin. 4 5 Add simple type inferencing to the parser, and create custom 6 AddNode and LessNode subclasses based on inferred types. 7 http://bugs.webkit.org/show_bug.cgi?id=15884 8 9 SunSpider claims this is at least a 0.5% speedup. 10 11 * JavaScriptCore.exp: 12 * kjs/grammar.y: 13 * kjs/internal.cpp: 14 (KJS::NumberImp::getPrimitiveNumber): 15 (KJS::GetterSetterImp::getPrimitiveNumber): 16 * kjs/internal.h: 17 * kjs/lexer.cpp: 18 (KJS::Lexer::lex): 19 * kjs/nodes.cpp: 20 (KJS::Node::Node): 21 (KJS::StringNode::evaluate): 22 (KJS::StringNode::evaluateToNumber): 23 (KJS::StringNode::evaluateToBoolean): 24 (KJS::RegExpNode::evaluate): 25 (KJS::UnaryPlusNode::optimizeVariableAccess): 26 (KJS::AddNode::evaluate): 27 (KJS::AddNode::evaluateToNumber): 28 (KJS::AddNumbersNode::inlineEvaluateToNumber): 29 (KJS::AddNumbersNode::evaluate): 30 (KJS::AddNumbersNode::evaluateToNumber): 31 (KJS::AddStringsNode::evaluate): 32 (KJS::AddStringLeftNode::evaluate): 33 (KJS::AddStringRightNode::evaluate): 34 (KJS::lessThan): 35 (KJS::lessThanEq): 36 (KJS::LessNumbersNode::evaluate): 37 (KJS::LessStringsNode::evaluate): 38 * kjs/nodes.h: 39 (KJS::ExpressionNode::): 40 (KJS::RegExpNode::): 41 (KJS::RegExpNode::precedence): 42 (KJS::TypeOfResolveNode::): 43 (KJS::LocalVarTypeOfNode::): 44 (KJS::UnaryPlusNode::): 45 (KJS::UnaryPlusNode::precedence): 46 (KJS::AddNode::): 47 (KJS::AddNode::precedence): 48 (KJS::AddNumbersNode::): 49 (KJS::AddStringLeftNode::): 50 (KJS::AddStringRightNode::): 51 (KJS::AddStringsNode::): 52 (KJS::LessNode::): 53 (KJS::LessNode::precedence): 54 (KJS::LessNumbersNode::): 55 (KJS::LessStringsNode::): 56 * kjs/nodes2string.cpp: 57 (KJS::StringNode::streamTo): 58 * kjs/object.cpp: 59 * kjs/object.h: 60 * kjs/value.h: 61 (KJS::JSValue::getPrimitiveNumber): 62 1 63 2007-11-11 Darin Adler <[email protected]> 2 64 -
trunk/JavaScriptCore/JavaScriptCore.exp
r27686 r27695 270 270 __ZNK3KJS8JSObject12defaultValueEPNS_9ExecStateENS_6JSTypeE 271 271 __ZNK3KJS8JSObject14implementsCallEv 272 __ZNK3KJS8JSObject18getPrimitiveNumberEPNS_9ExecStateERd 273 __ZNK3KJS8JSObject18getPrimitiveNumberEPNS_9ExecStateERd 272 __ZN3KJS8JSObject18getPrimitiveNumberEPNS_9ExecStateERdRPNS_7JSValueE 274 273 __ZNK3KJS8JSObject19implementsConstructEv 275 274 __ZNK3KJS8JSObject21implementsHasInstanceEv -
trunk/JavaScriptCore/kjs/grammar.y
r27664 r27695 58 58 using namespace KJS; 59 59 60 static AddNode* makeAddNode(ExpressionNode*, ExpressionNode*); 61 static LessNode* makeLessNode(ExpressionNode*, ExpressionNode*); 60 62 static ExpressionNode* makeAssignNode(ExpressionNode* loc, Operator, ExpressionNode* expr); 61 63 static ExpressionNode* makePrefixNode(ExpressionNode* expr, Operator); … … 85 87 86 88 %union { 87 int ival; 88 double dval; 89 UString *ustr; 90 Identifier *ident; 91 ExpressionNode *node; 92 StatementNode *stat; 93 ParameterList param; 94 FunctionBodyNode *body; 95 FuncDeclNode *func; 96 FuncExprNode *funcExpr; 97 ProgramNode *prog; 98 AssignExprNode *init; 99 SourceElements *srcs; 100 ArgumentsNode *args; 101 ArgumentList alist; 102 VarDeclNode *decl; 103 VarDeclList vlist; 104 CaseBlockNode *cblk; 105 ClauseList clist; 106 CaseClauseNode *ccl; 107 ElementList elm; 108 Operator op; 109 PropertyList plist; 110 PropertyNode *pnode; 89 int intValue; 90 double doubleValue; 91 UString* string; 92 Identifier* ident; 93 94 // expression subtrees 95 ExpressionNode* expressionNode; 96 FuncDeclNode* funcDeclNode; 97 PropertyNode* propertyNode; 98 ArgumentsNode* argumentsNode; 99 VarDeclNode* varDeclNode; 100 CaseBlockNode* caseBlockNode; 101 CaseClauseNode* caseClauseNode; 102 FuncExprNode* funcExprNode; 103 AssignExprNode* assignExprNode; 104 105 // statement nodes 106 StatementNode* statementNode; 107 FunctionBodyNode* functionBodyNode; 108 ProgramNode* programNode; 109 110 SourceElements* sourceElements; 111 PropertyList propertyList; 112 ArgumentList argumentList; 113 VarDeclList varDeclList; 114 ClauseList clauseList; 115 ElementList elementList; 116 ParameterList parameterList; 117 118 Operator op; 111 119 } 112 120 … … 144 152 145 153 /* terminal types */ 146 %token <d val> NUMBER147 %token < ustr> STRING154 %token <doubleValue> NUMBER 155 %token <string> STRING 148 156 %token <ident> IDENT 149 157 … … 152 160 153 161 /* non-terminal types */ 154 %type < node> Literal ArrayLiteral155 156 %type < node> PrimaryExpr PrimaryExprNoBrace157 %type < node> MemberExpr MemberExprNoBF /* BF => brace or function */158 %type < node> NewExpr NewExprNoBF159 %type < node> CallExpr CallExprNoBF160 %type < node> LeftHandSideExpr LeftHandSideExprNoBF161 %type < node> PostfixExpr PostfixExprNoBF162 %type < node> UnaryExpr UnaryExprNoBF UnaryExprCommon163 %type < node> MultiplicativeExpr MultiplicativeExprNoBF164 %type < node> AdditiveExpr AdditiveExprNoBF165 %type < node> ShiftExpr ShiftExprNoBF166 %type < node> RelationalExpr RelationalExprNoIn RelationalExprNoBF167 %type < node> EqualityExpr EqualityExprNoIn EqualityExprNoBF168 %type < node> BitwiseANDExpr BitwiseANDExprNoIn BitwiseANDExprNoBF169 %type < node> BitwiseXORExpr BitwiseXORExprNoIn BitwiseXORExprNoBF170 %type < node> BitwiseORExpr BitwiseORExprNoIn BitwiseORExprNoBF171 %type < node> LogicalANDExpr LogicalANDExprNoIn LogicalANDExprNoBF172 %type < node> LogicalORExpr LogicalORExprNoIn LogicalORExprNoBF173 %type < node> ConditionalExpr ConditionalExprNoIn ConditionalExprNoBF174 %type < node> AssignmentExpr AssignmentExprNoIn AssignmentExprNoBF175 %type < node> Expr ExprNoIn ExprNoBF176 177 %type < node> ExprOpt ExprNoInOpt178 179 %type <stat >Statement Block180 %type <stat >VariableStatement ConstStatement EmptyStatement ExprStatement181 %type <stat >IfStatement IterationStatement ContinueStatement182 %type <stat >BreakStatement ReturnStatement WithStatement183 %type <stat >SwitchStatement LabelledStatement184 %type <stat >ThrowStatement TryStatement185 %type <stat >DebuggerStatement186 %type <stat >SourceElement187 188 %type < init> Initializer InitializerNoIn189 %type <func >FunctionDeclaration190 %type <funcExpr >FunctionExpr191 %type < body> FunctionBody192 %type <s rcs> SourceElements193 %type <param >FormalParameterList194 %type <op> AssignmentOperator195 %type <arg s>Arguments196 %type <a list>ArgumentList197 %type <v list>VariableDeclarationList VariableDeclarationListNoIn ConstDeclarationList198 %type < decl>VariableDeclaration VariableDeclarationNoIn ConstDeclaration199 %type <c blk>CaseBlock200 %type <c cl>CaseClause DefaultClause201 %type <cl ist>CaseClauses CaseClausesOpt202 %type <i val>Elision ElisionOpt203 %type <el m>ElementList204 %type <p node>Property205 %type <p list>PropertyList162 %type <expressionNode> Literal ArrayLiteral 163 164 %type <expressionNode> PrimaryExpr PrimaryExprNoBrace 165 %type <expressionNode> MemberExpr MemberExprNoBF /* BF => brace or function */ 166 %type <expressionNode> NewExpr NewExprNoBF 167 %type <expressionNode> CallExpr CallExprNoBF 168 %type <expressionNode> LeftHandSideExpr LeftHandSideExprNoBF 169 %type <expressionNode> PostfixExpr PostfixExprNoBF 170 %type <expressionNode> UnaryExpr UnaryExprNoBF UnaryExprCommon 171 %type <expressionNode> MultiplicativeExpr MultiplicativeExprNoBF 172 %type <expressionNode> AdditiveExpr AdditiveExprNoBF 173 %type <expressionNode> ShiftExpr ShiftExprNoBF 174 %type <expressionNode> RelationalExpr RelationalExprNoIn RelationalExprNoBF 175 %type <expressionNode> EqualityExpr EqualityExprNoIn EqualityExprNoBF 176 %type <expressionNode> BitwiseANDExpr BitwiseANDExprNoIn BitwiseANDExprNoBF 177 %type <expressionNode> BitwiseXORExpr BitwiseXORExprNoIn BitwiseXORExprNoBF 178 %type <expressionNode> BitwiseORExpr BitwiseORExprNoIn BitwiseORExprNoBF 179 %type <expressionNode> LogicalANDExpr LogicalANDExprNoIn LogicalANDExprNoBF 180 %type <expressionNode> LogicalORExpr LogicalORExprNoIn LogicalORExprNoBF 181 %type <expressionNode> ConditionalExpr ConditionalExprNoIn ConditionalExprNoBF 182 %type <expressionNode> AssignmentExpr AssignmentExprNoIn AssignmentExprNoBF 183 %type <expressionNode> Expr ExprNoIn ExprNoBF 184 185 %type <expressionNode> ExprOpt ExprNoInOpt 186 187 %type <statementNode> Statement Block 188 %type <statementNode> VariableStatement ConstStatement EmptyStatement ExprStatement 189 %type <statementNode> IfStatement IterationStatement ContinueStatement 190 %type <statementNode> BreakStatement ReturnStatement WithStatement 191 %type <statementNode> SwitchStatement LabelledStatement 192 %type <statementNode> ThrowStatement TryStatement 193 %type <statementNode> DebuggerStatement 194 %type <statementNode> SourceElement 195 196 %type <assignExprNode> Initializer InitializerNoIn 197 %type <funcDeclNode> FunctionDeclaration 198 %type <funcExprNode> FunctionExpr 199 %type <functionBodyNode> FunctionBody 200 %type <sourceElements> SourceElements 201 %type <parameterList> FormalParameterList 202 %type <op> AssignmentOperator 203 %type <argumentsNode> Arguments 204 %type <argumentList> ArgumentList 205 %type <varDeclList> VariableDeclarationList VariableDeclarationListNoIn ConstDeclarationList 206 %type <varDeclNode> VariableDeclaration VariableDeclarationNoIn ConstDeclaration 207 %type <caseBlockNode> CaseBlock 208 %type <caseClauseNode> CaseClause DefaultClause 209 %type <clauseList> CaseClauses CaseClausesOpt 210 %type <intValue> Elision ElisionOpt 211 %type <elementList> ElementList 212 %type <propertyNode> Property 213 %type <propertyList> PropertyList 206 214 %% 207 215 … … 263 271 264 272 ElementList: 265 ElisionOpt AssignmentExpr { $$.head = new ElementNode($1, $2); 273 ElisionOpt AssignmentExpr { $$.head = new ElementNode($1, $2); 266 274 $$.tail = $$.head; } 267 275 | ElementList ',' ElisionOpt AssignmentExpr … … 395 403 AdditiveExpr: 396 404 MultiplicativeExpr 397 | AdditiveExpr '+' MultiplicativeExpr { $$ = newAddNode($1, $3); }405 | AdditiveExpr '+' MultiplicativeExpr { $$ = makeAddNode($1, $3); } 398 406 | AdditiveExpr '-' MultiplicativeExpr { $$ = new SubNode($1, $3); } 399 407 ; … … 402 410 MultiplicativeExprNoBF 403 411 | AdditiveExprNoBF '+' MultiplicativeExpr 404 { $$ = newAddNode($1, $3); }412 { $$ = makeAddNode($1, $3); } 405 413 | AdditiveExprNoBF '-' MultiplicativeExpr 406 414 { $$ = new SubNode($1, $3); } … … 423 431 RelationalExpr: 424 432 ShiftExpr 425 | RelationalExpr '<' ShiftExpr { $$ = newLessNode($1, $3); }433 | RelationalExpr '<' ShiftExpr { $$ = makeLessNode($1, $3); } 426 434 | RelationalExpr '>' ShiftExpr { $$ = new GreaterNode($1, $3); } 427 435 | RelationalExpr LE ShiftExpr { $$ = new LessEqNode($1, $3); } … … 433 441 RelationalExprNoIn: 434 442 ShiftExpr 435 | RelationalExprNoIn '<' ShiftExpr { $$ = newLessNode($1, $3); }443 | RelationalExprNoIn '<' ShiftExpr { $$ = makeLessNode($1, $3); } 436 444 | RelationalExprNoIn '>' ShiftExpr { $$ = new GreaterNode($1, $3); } 437 445 | RelationalExprNoIn LE ShiftExpr { $$ = new LessEqNode($1, $3); } … … 443 451 RelationalExprNoBF: 444 452 ShiftExprNoBF 445 | RelationalExprNoBF '<' ShiftExpr { $$ = newLessNode($1, $3); }453 | RelationalExprNoBF '<' ShiftExpr { $$ = makeLessNode($1, $3); } 446 454 | RelationalExprNoBF '>' ShiftExpr { $$ = new GreaterNode($1, $3); } 447 455 | RelationalExprNoBF LE ShiftExpr { $$ = new LessEqNode($1, $3); } … … 888 896 %% 889 897 898 static AddNode* makeAddNode(ExpressionNode* left, ExpressionNode* right) 899 { 900 JSType t1 = left->expectedReturnType(); 901 JSType t2 = right->expectedReturnType(); 902 903 if (t1 == NumberType && t2 == NumberType) 904 return new AddNumbersNode(left, right); 905 if (t1 == StringType && t2 == StringType) 906 return new AddStringsNode(left, right); 907 if (t1 == StringType) 908 return new AddStringLeftNode(left, right); 909 if (t2 == StringType) 910 return new AddStringRightNode(left, right); 911 return new AddNode(left, right); 912 } 913 914 static LessNode* makeLessNode(ExpressionNode* left, ExpressionNode* right) 915 { 916 JSType t1 = left->expectedReturnType(); 917 JSType t2 = right->expectedReturnType(); 918 919 if (t1 == StringType && t2 == StringType) 920 return new LessStringsNode(left, right); 921 922 // There are certainly more efficient ways to do this type check if necessary 923 if (t1 == NumberType || t1 == BooleanType || t1 == UndefinedType || t1 == NullType || 924 t2 == NumberType || t2 == BooleanType || t2 == UndefinedType || t2 == NullType) 925 return new LessNumbersNode(left, right); 926 927 // Neither is certain to be a number, nor were both certain to be strings, so we use the default (slow) implementation. 928 return new LessNode(left, right); 929 } 930 890 931 static ExpressionNode* makeAssignNode(ExpressionNode* loc, Operator op, ExpressionNode* expr) 891 932 { -
trunk/JavaScriptCore/kjs/internal.cpp
r27413 r27695 57 57 } 58 58 59 bool StringImp::getPrimitiveNumber(ExecState*, double& number) const 60 { 59 bool StringImp::getPrimitiveNumber(ExecState*, double& number, JSValue*& value) 60 { 61 value = this; 61 62 number = val.toDouble(); 62 63 return false; … … 90 91 } 91 92 92 bool NumberImp::getPrimitiveNumber(ExecState*, double& number ) const93 bool NumberImp::getPrimitiveNumber(ExecState*, double& number, JSValue*& value) 93 94 { 94 95 number = val; 96 value = this; 95 97 return true; 96 98 } … … 159 161 } 160 162 161 bool GetterSetterImp::getPrimitiveNumber(ExecState*, double& number ) const162 { 163 ASSERT (false);163 bool GetterSetterImp::getPrimitiveNumber(ExecState*, double& number, JSValue*& value) 164 { 165 ASSERT_NOT_REACHED(); 164 166 number = 0; 167 value = 0; 165 168 return true; 166 169 } -
trunk/JavaScriptCore/kjs/internal.h
r27218 r27695 56 56 57 57 virtual JSValue* toPrimitive(ExecState*, JSType preferred = UnspecifiedType) const; 58 virtual bool getPrimitiveNumber(ExecState*, double& number ) const;58 virtual bool getPrimitiveNumber(ExecState*, double& number, JSValue*& value); 59 59 virtual bool toBoolean(ExecState *exec) const; 60 60 virtual double toNumber(ExecState *exec) const; … … 74 74 75 75 virtual JSValue* toPrimitive(ExecState*, JSType preferred = UnspecifiedType) const; 76 virtual bool getPrimitiveNumber(ExecState*, double& number ) const;76 virtual bool getPrimitiveNumber(ExecState*, double& number, JSValue*& value); 77 77 virtual bool toBoolean(ExecState *exec) const; 78 78 virtual double toNumber(ExecState *exec) const; -
trunk/JavaScriptCore/kjs/lexer.cpp
r27011 r27695 557 557 break; 558 558 case String: 559 kjsyylval. ustr= makeUString(buffer16, pos16);559 kjsyylval.string = makeUString(buffer16, pos16); 560 560 token = STRING; 561 561 break; 562 562 case Number: 563 kjsyylval.d val= dval;563 kjsyylval.doubleValue = dval; 564 564 token = NUMBER; 565 565 break; -
trunk/JavaScriptCore/kjs/nodes.cpp
r27684 r27695 128 128 Node::Node() 129 129 : m_mayHaveDeclarations(false) 130 , m_expectedReturnType(ObjectType) 130 131 { 131 132 #ifndef NDEBUG … … 136 137 newNodes = new HashSet<Node*>; 137 138 newNodes->add(this); 139 } 140 141 Node::Node(JSType expectedReturn) 142 : m_mayHaveDeclarations(false) 143 , m_expectedReturnType(expectedReturn) 144 { 145 #ifndef NDEBUG 146 ++NodeCounter::count; 147 #endif 148 m_line = Lexer::curr()->lineNo(); 149 if (!newNodes) 150 newNodes = new HashSet<Node*>; 151 newNodes->add(this); 138 152 } 139 153 … … 421 435 // ------------------------------ StringNode ----------------------------------- 422 436 423 JSValue *StringNode::evaluate(ExecState*)424 { 425 return jsOwnedString( value);437 JSValue* StringNode::evaluate(ExecState*) 438 { 439 return jsOwnedString(m_value); 426 440 } 427 441 428 442 double StringNode::evaluateToNumber(ExecState*) 429 443 { 430 return value.toDouble();444 return m_value.toDouble(); 431 445 } 432 446 433 447 bool StringNode::evaluateToBoolean(ExecState*) 434 448 { 435 return ! value.isEmpty();449 return !m_value.isEmpty(); 436 450 } 437 451 438 452 // ------------------------------ RegExpNode ----------------------------------- 439 453 440 JSValue *RegExpNode::evaluate(ExecState *exec)454 JSValue* RegExpNode::evaluate(ExecState* exec) 441 455 { 442 456 List list; 443 list.append(jsOwnedString( pattern));444 list.append(jsOwnedString( flags));445 446 JSObject *reg = exec->lexicalInterpreter()->builtinRegExp();447 return reg->construct(exec, list);457 list.append(jsOwnedString(m_pattern)); 458 list.append(jsOwnedString(m_flags)); 459 460 JSObject* reg = exec->lexicalInterpreter()->builtinRegExp(); 461 return reg->construct(exec, list); 448 462 } 449 463 … … 1633 1647 void UnaryPlusNode::optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack& nodeStack) 1634 1648 { 1635 nodeStack.append( expr.get());1649 nodeStack.append(m_expr.get()); 1636 1650 } 1637 1651 1638 1652 // ECMA 11.4.6 1639 JSValue *UnaryPlusNode::evaluate(ExecState *exec)1640 { 1641 JSValue *v = expr->evaluate(exec);1653 JSValue* UnaryPlusNode::evaluate(ExecState* exec) 1654 { 1655 JSValue *v = m_expr->evaluate(exec); 1642 1656 KJS_CHECKEXCEPTIONVALUE 1643 1657 … … 1711 1725 double n1 = term1->evaluateToNumber(exec); 1712 1726 KJS_CHECKEXCEPTIONNUMBER 1713 1714 1727 double n2 = term2->evaluateToNumber(exec); 1715 KJS_CHECKEXCEPTIONNUMBER1716 1717 1728 return n1 * n2; 1718 1729 } … … 1739 1750 double n1 = term1->evaluateToNumber(exec); 1740 1751 KJS_CHECKEXCEPTIONNUMBER 1741 1742 1752 double n2 = term2->evaluateToNumber(exec); 1743 KJS_CHECKEXCEPTIONNUMBER1744 1745 1753 return n1 / n2; 1746 1754 } … … 1767 1775 double n1 = term1->evaluateToNumber(exec); 1768 1776 KJS_CHECKEXCEPTIONNUMBER 1769 1770 1777 double n2 = term2->evaluateToNumber(exec); 1771 KJS_CHECKEXCEPTIONNUMBER1772 1773 1778 return fmod(n1, n2); 1774 1779 } … … 1888 1893 1889 1894 // ECMA 11.6.1 1890 JSValue *AddNode::evaluate(ExecState *exec)1891 { 1892 JSValue *v1 = term1->evaluate(exec);1893 KJS_CHECKEXCEPTIONVALUE 1894 1895 JSValue *v2 = term2->evaluate(exec);1895 JSValue* AddNode::evaluate(ExecState* exec) 1896 { 1897 JSValue* v1 = term1->evaluate(exec); 1898 KJS_CHECKEXCEPTIONVALUE 1899 1900 JSValue* v2 = term2->evaluate(exec); 1896 1901 KJS_CHECKEXCEPTIONVALUE 1897 1902 … … 1901 1906 double AddNode::evaluateToNumber(ExecState* exec) 1902 1907 { 1903 JSValue *v1 = term1->evaluate(exec);1908 JSValue* v1 = term1->evaluate(exec); 1904 1909 KJS_CHECKEXCEPTIONNUMBER 1905 1910 1906 JSValue *v2 = term2->evaluate(exec);1911 JSValue* v2 = term2->evaluate(exec); 1907 1912 KJS_CHECKEXCEPTIONNUMBER 1908 1913 1909 1914 return addToNumber(exec, v1, v2); 1915 } 1916 1917 double AddNumbersNode::inlineEvaluateToNumber(ExecState* exec) 1918 { 1919 double n1 = term1->evaluateToNumber(exec); 1920 KJS_CHECKEXCEPTIONNUMBER 1921 double n2 = term2->evaluateToNumber(exec); 1922 return n1 + n2; 1923 } 1924 1925 JSValue* AddNumbersNode::evaluate(ExecState* exec) 1926 { 1927 return jsNumber(inlineEvaluateToNumber(exec)); 1928 } 1929 1930 double AddNumbersNode::evaluateToNumber(ExecState* exec) 1931 { 1932 return inlineEvaluateToNumber(exec); 1933 } 1934 1935 JSValue* AddStringsNode::evaluate(ExecState* exec) 1936 { 1937 JSValue* v1 = term1->evaluate(exec); 1938 KJS_CHECKEXCEPTIONVALUE 1939 1940 JSValue* v2 = term2->evaluate(exec); 1941 KJS_CHECKEXCEPTIONVALUE 1942 1943 return jsString(static_cast<StringImp*>(v1)->value() + static_cast<StringImp*>(v2)->value()); 1944 } 1945 1946 JSValue* AddStringLeftNode::evaluate(ExecState* exec) 1947 { 1948 JSValue* v1 = term1->evaluate(exec); 1949 KJS_CHECKEXCEPTIONVALUE 1950 1951 JSValue* v2 = term2->evaluate(exec); 1952 KJS_CHECKEXCEPTIONVALUE 1953 1954 JSValue* p2 = v2->toPrimitive(exec, UnspecifiedType); 1955 return jsString(static_cast<StringImp*>(v1)->value() + p2->toString(exec)); 1956 } 1957 1958 JSValue* AddStringRightNode::evaluate(ExecState* exec) 1959 { 1960 JSValue* v1 = term1->evaluate(exec); 1961 KJS_CHECKEXCEPTIONVALUE 1962 1963 JSValue* v2 = term2->evaluate(exec); 1964 KJS_CHECKEXCEPTIONVALUE 1965 1966 JSValue* p1 = v1->toPrimitive(exec, UnspecifiedType); 1967 return jsString(p1->toString(exec) + static_cast<StringImp*>(v2)->value()); 1910 1968 } 1911 1969 … … 1921 1979 double n1 = term1->evaluateToNumber(exec); 1922 1980 KJS_CHECKEXCEPTIONNUMBER 1923 1924 1981 double n2 = term2->evaluateToNumber(exec); 1925 KJS_CHECKEXCEPTIONNUMBER1926 1927 1982 return n1 - n2; 1928 1983 } … … 2003 2058 double n1; 2004 2059 double n2; 2005 bool wasNotString1 = v1->getPrimitiveNumber(exec, n1); 2006 bool wasNotString2 = v2->getPrimitiveNumber(exec, n2); 2060 JSValue* p1; 2061 JSValue* p2; 2062 bool wasNotString1 = v1->getPrimitiveNumber(exec, n1, p1); 2063 bool wasNotString2 = v2->getPrimitiveNumber(exec, n2, p2); 2007 2064 2008 2065 if (wasNotString1 | wasNotString2) 2009 2066 return n1 < n2; 2010 2067 2011 return v1->toString(exec) < v2->toString(exec);2068 return static_cast<const StringImp*>(p1)->value() < static_cast<const StringImp*>(p2)->value(); 2012 2069 } 2013 2070 … … 2016 2073 double n1; 2017 2074 double n2; 2018 bool wasNotString1 = v1->getPrimitiveNumber(exec, n1); 2019 bool wasNotString2 = v2->getPrimitiveNumber(exec, n2); 2075 JSValue* p1; 2076 JSValue* p2; 2077 bool wasNotString1 = v1->getPrimitiveNumber(exec, n1, p1); 2078 bool wasNotString2 = v2->getPrimitiveNumber(exec, n2, p2); 2020 2079 2021 2080 if (wasNotString1 | wasNotString2) 2022 2081 return n1 <= n2; 2023 2082 2024 return !( v2->toString(exec) < v1->toString(exec));2083 return !(static_cast<const StringImp*>(p2)->value() < static_cast<const StringImp*>(p1)->value()); 2025 2084 } 2026 2085 … … 2048 2107 KJS_CHECKEXCEPTIONBOOLEAN 2049 2108 return lessThan(exec, v1, v2); 2109 } 2110 2111 JSValue* LessNumbersNode::evaluate(ExecState* exec) 2112 { 2113 double n1 = expr1->evaluateToNumber(exec); 2114 KJS_CHECKEXCEPTIONVALUE 2115 double n2 = expr2->evaluateToNumber(exec); 2116 return jsBoolean(n1 < n2); 2117 } 2118 2119 JSValue* LessStringsNode::evaluate(ExecState* exec) 2120 { 2121 JSValue* v1 = expr1->evaluate(exec); 2122 KJS_CHECKEXCEPTIONVALUE 2123 JSValue* v2 = expr2->evaluate(exec); 2124 return jsBoolean(static_cast<StringImp*>(v1)->value() < static_cast<StringImp*>(v2)->value()); 2050 2125 } 2051 2126 -
trunk/JavaScriptCore/kjs/nodes.h
r27678 r27695 136 136 137 137 protected: 138 Node(JSType) KJS_FAST_CALL; // used by ExpressionNode 138 139 Completion createErrorCompletion(ExecState *, ErrorType, const char *msg) KJS_FAST_CALL; 139 140 Completion createErrorCompletion(ExecState *, ErrorType, const char *msg, const Identifier &) KJS_FAST_CALL; … … 154 155 Completion rethrowException(ExecState*) KJS_FAST_CALL; 155 156 156 int m_line : 31;157 int m_line : 28; 157 158 bool m_mayHaveDeclarations : 1; 159 unsigned m_expectedReturnType : 3; // JSType 158 160 }; 159 161 160 162 class ExpressionNode : public Node { 161 163 public: 162 ExpressionNode() KJS_FAST_CALL { } 164 ExpressionNode() KJS_FAST_CALL : Node() {} 165 ExpressionNode(JSType expectedReturn) KJS_FAST_CALL 166 : Node(expectedReturn) {} 163 167 164 168 // Special constructor for cases where we overwrite an object in place. 165 169 ExpressionNode(PlacementNewAdoptType) KJS_FAST_CALL 166 : Node(PlacementNewAdopt) 167 { 168 } 170 : Node(PlacementNewAdopt) {} 169 171 170 172 virtual bool isNumber() const KJS_FAST_CALL { return false; } … … 173 175 virtual bool isBracketAccessorNode() const KJS_FAST_CALL { return false; } 174 176 virtual bool isDotAccessorNode() const KJS_FAST_CALL { return false; } 177 178 JSType expectedReturnType() const KJS_FAST_CALL { return static_cast<JSType>(m_expectedReturnType); } 175 179 176 180 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL = 0; … … 200 204 class NullNode : public ExpressionNode { 201 205 public: 202 NullNode() KJS_FAST_CALL {}206 NullNode() KJS_FAST_CALL : ExpressionNode(NullType) {} 203 207 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 204 208 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; … … 208 212 class FalseNode : public ExpressionNode { 209 213 public: 210 FalseNode() KJS_FAST_CALL {}214 FalseNode() KJS_FAST_CALL : ExpressionNode(BooleanType) {} 211 215 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 212 216 virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL { return false; } … … 217 221 class TrueNode : public ExpressionNode { 218 222 public: 219 TrueNode() KJS_FAST_CALL {}223 TrueNode() KJS_FAST_CALL : ExpressionNode(BooleanType) {} 220 224 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 221 225 virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL { return true; } … … 226 230 class NumberNode : public ExpressionNode { 227 231 public: 228 NumberNode(double v) KJS_FAST_CALL : m_double(v) {}232 NumberNode(double v) KJS_FAST_CALL : ExpressionNode(NumberType), m_double(v) {} 229 233 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 230 234 virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL; … … 248 252 virtual void setValue(double d) KJS_FAST_CALL { m_double = d; m_value = JSImmediate::from(d); ASSERT(m_value); } 249 253 private: 250 JSValue* m_value; 254 JSValue* m_value; // This is never a JSCell, only JSImmediate, thus no ProtectedPtr 251 255 }; 252 256 253 257 class StringNode : public ExpressionNode { 254 258 public: 255 StringNode(const UString *v) KJS_FAST_CALL { value = *v;}259 StringNode(const UString* v) KJS_FAST_CALL : ExpressionNode(StringType), m_value(*v) {} 256 260 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 257 261 virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL; … … 261 265 262 266 private: 263 UString value;267 UString m_value; 264 268 }; 265 269 266 270 class RegExpNode : public ExpressionNode { 267 271 public: 268 RegExpNode(const UString &p, const UString &f) KJS_FAST_CALL269 : pattern(p), flags(f) { }272 RegExpNode(const UString& pattern, const UString& flags) KJS_FAST_CALL 273 : m_pattern(pattern), m_flags(flags) { } 270 274 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 271 275 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; 272 276 virtual Precedence precedence() const { return PrecPrimary; } 273 277 private: 274 UString pattern, flags; 278 UString m_pattern; 279 UString m_flags; 275 280 }; 276 281 … … 578 583 class PrePostResolveNode : public ExpressionNode { 579 584 public: 580 PrePostResolveNode(const Identifier& i) KJS_FAST_CALL : m_ident(i) {}585 PrePostResolveNode(const Identifier& i) KJS_FAST_CALL : ExpressionNode(NumberType), m_ident(i) {} 581 586 582 587 PrePostResolveNode(PlacementNewAdoptType) KJS_FAST_CALL … … 793 798 public: 794 799 TypeOfResolveNode(const Identifier &s) KJS_FAST_CALL 795 : m_ident(s) 796 { 797 } 800 : ExpressionNode(StringType), m_ident(s) {} 798 801 799 802 TypeOfResolveNode(PlacementNewAdoptType) KJS_FAST_CALL … … 801 804 , m_ident(PlacementNewAdopt) 802 805 { 806 m_expectedReturnType = StringType; 803 807 } 804 808 … … 820 824 LocalVarTypeOfNode(size_t i) KJS_FAST_CALL 821 825 : TypeOfResolveNode(PlacementNewAdopt) 822 { 826 { 827 m_expectedReturnType = StringType; 823 828 ASSERT(i != missingSymbolMarker()); 824 829 m_index = i; … … 830 835 class TypeOfValueNode : public ExpressionNode { 831 836 public: 832 TypeOfValueNode(ExpressionNode* e) KJS_FAST_CALL : m_expr(e) {}837 TypeOfValueNode(ExpressionNode* e) KJS_FAST_CALL : ExpressionNode(StringType), m_expr(e) {} 833 838 virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL; 834 839 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; … … 971 976 class UnaryPlusNode : public ExpressionNode { 972 977 public: 973 UnaryPlusNode(ExpressionNode* e) KJS_FAST_CALL : expr(e) {}978 UnaryPlusNode(ExpressionNode* e) KJS_FAST_CALL : ExpressionNode(NumberType), m_expr(e) {} 974 979 virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL; 975 980 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; … … 977 982 virtual Precedence precedence() const { return PrecUnary; } 978 983 private: 984 RefPtr<ExpressionNode> m_expr; 985 }; 986 987 class NegateNode : public ExpressionNode { 988 public: 989 NegateNode(ExpressionNode* e) KJS_FAST_CALL : ExpressionNode(NumberType), expr(e) {} 990 virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL; 991 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 992 virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL; 993 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; 994 virtual Precedence precedence() const { return PrecUnary; } 995 private: 979 996 RefPtr<ExpressionNode> expr; 980 997 }; 981 998 982 class NegateNode : public ExpressionNode { 983 public: 984 NegateNode(ExpressionNode* e) KJS_FAST_CALL : expr(e) {} 985 virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL; 986 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 987 virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL; 999 class BitwiseNotNode : public ExpressionNode { 1000 public: 1001 BitwiseNotNode(ExpressionNode* e) KJS_FAST_CALL : ExpressionNode(NumberType), expr(e) {} 1002 virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL; 1003 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 988 1004 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; 989 1005 virtual Precedence precedence() const { return PrecUnary; } … … 992 1008 }; 993 1009 994 class BitwiseNotNode : public ExpressionNode {995 public:996 BitwiseNotNode(ExpressionNode* e) KJS_FAST_CALL : expr(e) {}997 virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL;998 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;999 virtual void streamTo(SourceStream&) const KJS_FAST_CALL;1000 virtual Precedence precedence() const { return PrecUnary; }1001 private:1002 RefPtr<ExpressionNode> expr;1003 };1004 1005 1010 class LogicalNotNode : public ExpressionNode { 1006 1011 public: 1007 LogicalNotNode(ExpressionNode* e) KJS_FAST_CALL : expr(e) {}1012 LogicalNotNode(ExpressionNode* e) KJS_FAST_CALL : ExpressionNode(BooleanType), expr(e) {} 1008 1013 virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL; 1009 1014 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; … … 1017 1022 class MultNode : public ExpressionNode { 1018 1023 public: 1019 MultNode(ExpressionNode* t1, ExpressionNode* t2) KJS_FAST_CALL :term1(t1), term2(t2) {}1024 MultNode(ExpressionNode* t1, ExpressionNode* t2) KJS_FAST_CALL : ExpressionNode(NumberType), term1(t1), term2(t2) {} 1020 1025 virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL; 1021 1026 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; … … 1031 1036 class DivNode : public ExpressionNode { 1032 1037 public: 1033 DivNode(ExpressionNode* t1, ExpressionNode* t2) KJS_FAST_CALL :term1(t1), term2(t2) {}1038 DivNode(ExpressionNode* t1, ExpressionNode* t2) KJS_FAST_CALL : ExpressionNode(NumberType), term1(t1), term2(t2) {} 1034 1039 virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL; 1035 1040 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; … … 1045 1050 class ModNode : public ExpressionNode { 1046 1051 public: 1047 ModNode(ExpressionNode* t1, ExpressionNode* t2) KJS_FAST_CALL :term1(t1), term2(t2) {}1052 ModNode(ExpressionNode* t1, ExpressionNode* t2) KJS_FAST_CALL : ExpressionNode(NumberType), term1(t1), term2(t2) {} 1048 1053 virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL; 1049 1054 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; … … 1059 1064 class AddNode : public ExpressionNode { 1060 1065 public: 1061 AddNode(ExpressionNode* t1, ExpressionNode*t2) KJS_FAST_CALL : term1(t1), term2(t2) {}1066 AddNode(ExpressionNode* t1, ExpressionNode* t2) KJS_FAST_CALL : term1(t1), term2(t2) {} 1062 1067 virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL; 1063 1068 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; … … 1065 1070 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; 1066 1071 virtual Precedence precedence() const { return PrecAdditive; } 1067 private: 1072 protected: 1073 AddNode(ExpressionNode* t1, ExpressionNode* t2, JSType expectedReturn) KJS_FAST_CALL : ExpressionNode(expectedReturn), term1(t1), term2(t2) {} 1068 1074 RefPtr<ExpressionNode> term1; 1069 1075 RefPtr<ExpressionNode> term2; 1070 1076 }; 1071 1077 1078 class AddNumbersNode : public AddNode { 1079 public: 1080 AddNumbersNode(ExpressionNode* t1, ExpressionNode* t2) KJS_FAST_CALL : AddNode(t1, t2, NumberType) {} 1081 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 1082 virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL; 1083 private: 1084 ALWAYS_INLINE double inlineEvaluateToNumber(ExecState*) KJS_FAST_CALL; 1085 }; 1086 1087 class AddStringLeftNode : public AddNode { 1088 public: 1089 AddStringLeftNode(ExpressionNode* t1, ExpressionNode* t2) KJS_FAST_CALL : AddNode(t1, t2, StringType) {} 1090 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 1091 }; 1092 1093 class AddStringRightNode : public AddNode { 1094 public: 1095 AddStringRightNode(ExpressionNode* t1, ExpressionNode* t2) KJS_FAST_CALL : AddNode(t1, t2, StringType) {} 1096 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 1097 }; 1098 1099 class AddStringsNode : public AddNode { 1100 public: 1101 AddStringsNode(ExpressionNode* t1, ExpressionNode* t2) KJS_FAST_CALL : AddNode(t1, t2, StringType) {} 1102 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 1103 }; 1104 1072 1105 class SubNode : public ExpressionNode { 1073 1106 public: 1074 SubNode(ExpressionNode* t1, ExpressionNode* t2) KJS_FAST_CALL :term1(t1), term2(t2) {}1107 SubNode(ExpressionNode* t1, ExpressionNode* t2) KJS_FAST_CALL : ExpressionNode(NumberType), term1(t1), term2(t2) {} 1075 1108 virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL; 1076 1109 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; … … 1086 1119 class LeftShiftNode : public ExpressionNode { 1087 1120 public: 1088 LeftShiftNode(ExpressionNode* t1, ExpressionNode*t2) KJS_FAST_CALL1089 : term1(t1), term2(t2) {}1121 LeftShiftNode(ExpressionNode* t1, ExpressionNode* t2) KJS_FAST_CALL 1122 : ExpressionNode(NumberType), term1(t1), term2(t2) {} 1090 1123 virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL; 1091 1124 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; … … 1099 1132 class RightShiftNode : public ExpressionNode { 1100 1133 public: 1101 RightShiftNode(ExpressionNode* t1, ExpressionNode*t2) KJS_FAST_CALL1102 : term1(t1), term2(t2) {}1134 RightShiftNode(ExpressionNode* t1, ExpressionNode* t2) KJS_FAST_CALL 1135 : ExpressionNode(NumberType), term1(t1), term2(t2) {} 1103 1136 virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL; 1104 1137 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; … … 1112 1145 class UnsignedRightShiftNode : public ExpressionNode { 1113 1146 public: 1114 UnsignedRightShiftNode(ExpressionNode* t1, ExpressionNode*t2) KJS_FAST_CALL1115 : term1(t1), term2(t2) {}1147 UnsignedRightShiftNode(ExpressionNode* t1, ExpressionNode* t2) KJS_FAST_CALL 1148 : ExpressionNode(NumberType), term1(t1), term2(t2) {} 1116 1149 virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL; 1117 1150 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; … … 1125 1158 class LessNode : public ExpressionNode { 1126 1159 public: 1127 LessNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL :1128 expr1(e1), expr2(e2) {}1160 LessNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL 1161 : ExpressionNode(BooleanType), expr1(e1), expr2(e2) {} 1129 1162 virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL; 1130 1163 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; … … 1132 1165 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; 1133 1166 virtual Precedence precedence() const { return PrecRelational; } 1134 pr ivate:1167 protected: 1135 1168 RefPtr<ExpressionNode> expr1; 1136 1169 RefPtr<ExpressionNode> expr2; 1137 1170 }; 1138 1171 1172 class LessNumbersNode : public LessNode { 1173 public: 1174 LessNumbersNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL 1175 : LessNode(e1, e2) {} 1176 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 1177 }; 1178 1179 class LessStringsNode : public LessNode { 1180 public: 1181 LessStringsNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL 1182 : LessNode(e1, e2) {} 1183 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; 1184 }; 1185 1139 1186 class GreaterNode : public ExpressionNode { 1140 1187 public: … … 1181 1228 class InstanceOfNode : public ExpressionNode { 1182 1229 public: 1183 InstanceOfNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL :1184 expr1(e1), expr2(e2) {}1230 InstanceOfNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL 1231 : ExpressionNode(BooleanType), expr1(e1), expr2(e2) {} 1185 1232 virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL; 1186 1233 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; … … 1210 1257 public: 1211 1258 EqualNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL 1212 :expr1(e1), expr2(e2) {}1259 : ExpressionNode(BooleanType), expr1(e1), expr2(e2) {} 1213 1260 virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL; 1214 1261 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; … … 1224 1271 public: 1225 1272 NotEqualNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL 1226 :expr1(e1), expr2(e2) {}1273 : ExpressionNode(BooleanType), expr1(e1), expr2(e2) {} 1227 1274 virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL; 1228 1275 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; … … 1238 1285 public: 1239 1286 StrictEqualNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL 1240 :expr1(e1), expr2(e2) {}1287 : ExpressionNode(BooleanType), expr1(e1), expr2(e2) {} 1241 1288 virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL; 1242 1289 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; … … 1252 1299 public: 1253 1300 NotStrictEqualNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL 1254 :expr1(e1), expr2(e2) {}1301 : ExpressionNode(BooleanType), expr1(e1), expr2(e2) {} 1255 1302 virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL; 1256 1303 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; … … 1265 1312 class BitAndNode : public ExpressionNode { 1266 1313 public: 1267 BitAndNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL :1268 expr1(e1), expr2(e2) {}1314 BitAndNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL 1315 : ExpressionNode(NumberType), expr1(e1), expr2(e2) {} 1269 1316 virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL; 1270 1317 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; … … 1278 1325 class BitOrNode : public ExpressionNode { 1279 1326 public: 1280 BitOrNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL :1281 expr1(e1), expr2(e2) {}1327 BitOrNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL 1328 : ExpressionNode(NumberType), expr1(e1), expr2(e2) {} 1282 1329 virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL; 1283 1330 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; … … 1291 1338 class BitXOrNode : public ExpressionNode { 1292 1339 public: 1293 BitXOrNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL :1294 expr1(e1), expr2(e2) {}1340 BitXOrNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL 1341 : ExpressionNode(NumberType), expr1(e1), expr2(e2) {} 1295 1342 virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL; 1296 1343 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; … … 1307 1354 class LogicalAndNode : public ExpressionNode { 1308 1355 public: 1309 LogicalAndNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL :1310 expr1(e1), expr2(e2) {}1356 LogicalAndNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL 1357 : ExpressionNode(BooleanType), expr1(e1), expr2(e2) {} 1311 1358 virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL; 1312 1359 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; … … 1321 1368 class LogicalOrNode : public ExpressionNode { 1322 1369 public: 1323 LogicalOrNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL :1324 expr1(e1), expr2(e2) {}1370 LogicalOrNode(ExpressionNode* e1, ExpressionNode* e2) KJS_FAST_CALL 1371 : ExpressionNode(BooleanType), expr1(e1), expr2(e2) {} 1325 1372 virtual void optimizeVariableAccess(FunctionBodyNode*, DeclarationStacks::NodeStack&) KJS_FAST_CALL; 1326 1373 virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL; -
trunk/JavaScriptCore/kjs/nodes2string.cpp
r27664 r27695 286 286 void StringNode::streamTo(SourceStream& s) const 287 287 { 288 s << '"' << escapeStringForPrettyPrinting( value) << '"';288 s << '"' << escapeStringForPrettyPrinting(m_value) << '"'; 289 289 } 290 290 291 291 void RegExpNode::streamTo(SourceStream& s) const 292 292 { 293 s << '/' << pattern << '/' <<flags;293 s << '/' << m_pattern << '/' << m_flags; 294 294 } 295 295 … … 525 525 void UnaryPlusNode::streamTo(SourceStream& s) const 526 526 { 527 s << "+ " << PrecUnary << expr;527 s << "+ " << PrecUnary << m_expr; 528 528 } 529 529 -
trunk/JavaScriptCore/kjs/object.cpp
r27086 r27695 355 355 } 356 356 357 bool JSObject::getPrimitiveNumber(ExecState* exec, double& number ) const358 { 359 JSValue*result = defaultValue(exec, NumberType);357 bool JSObject::getPrimitiveNumber(ExecState* exec, double& number, JSValue*& result) 358 { 359 result = defaultValue(exec, NumberType); 360 360 number = result->toNumber(exec); 361 361 return !result->isString(); -
trunk/JavaScriptCore/kjs/object.h
r27413 r27695 79 79 80 80 virtual JSValue* toPrimitive(ExecState*, JSType preferred = UnspecifiedType) const; 81 virtual bool getPrimitiveNumber(ExecState*, double& number ) const;81 virtual bool getPrimitiveNumber(ExecState*, double& number, JSValue*& value); 82 82 virtual bool toBoolean(ExecState *exec) const; 83 83 virtual double toNumber(ExecState *exec) const; … … 413 413 414 414 virtual JSValue* toPrimitive(ExecState*, JSType preferredType = UnspecifiedType) const; 415 virtual bool getPrimitiveNumber(ExecState*, double& number ) const;415 virtual bool getPrimitiveNumber(ExecState*, double& number, JSValue*& value); 416 416 virtual bool toBoolean(ExecState *exec) const; 417 417 virtual double toNumber(ExecState *exec) const; -
trunk/JavaScriptCore/kjs/value.h
r27648 r27695 82 82 // Basic conversions. 83 83 JSValue* toPrimitive(ExecState* exec, JSType preferredType = UnspecifiedType) const; 84 bool getPrimitiveNumber(ExecState* exec, double& number ) const;84 bool getPrimitiveNumber(ExecState* exec, double& number, JSValue*& value); 85 85 86 86 bool toBoolean(ExecState *exec) const; … … 150 150 // Basic conversions. 151 151 virtual JSValue *toPrimitive(ExecState *exec, JSType preferredType = UnspecifiedType) const = 0; 152 virtual bool getPrimitiveNumber(ExecState* exec, double& number ) const= 0;152 virtual bool getPrimitiveNumber(ExecState* exec, double& number, JSValue*& value) = 0; 153 153 virtual bool toBoolean(ExecState *exec) const = 0; 154 154 virtual double toNumber(ExecState *exec) const = 0; … … 421 421 } 422 422 423 inline bool JSValue::getPrimitiveNumber(ExecState* exec, double& number ) const423 inline bool JSValue::getPrimitiveNumber(ExecState* exec, double& number, JSValue*& value) 424 424 { 425 425 if (JSImmediate::isImmediate(this)) { 426 426 number = JSImmediate::toDouble(this); 427 value = this; 427 428 return true; 428 429 } 429 return asCell()->getPrimitiveNumber(exec, number );430 return asCell()->getPrimitiveNumber(exec, number, value); 430 431 } 431 432
Note:
See TracChangeset
for help on using the changeset viewer.