Changeset 98887 in webkit for trunk/Source/JavaScriptCore/parser/ASTBuilder.h
- Timestamp:
- Oct 31, 2011, 3:13:01 PM (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/parser/ASTBuilder.h
r95901 r98887 74 74 }; 75 75 public: 76 ASTBuilder(JSGlobalData* globalData, Lexer* lexer)76 ASTBuilder(JSGlobalData* globalData, SourceCode* sourceCode) 77 77 : m_globalData(globalData) 78 , m_ lexer(lexer)78 , m_sourceCode(sourceCode) 79 79 , m_scope(globalData) 80 80 , m_evalCount(0) … … 113 113 static const int DontBuildStrings = 0; 114 114 115 ExpressionNode* makeBinaryNode(int token, std::pair<ExpressionNode*, BinaryOpInfo>, std::pair<ExpressionNode*, BinaryOpInfo>);116 ExpressionNode* makeFunctionCallNode( ExpressionNode* func, ArgumentsNode* args, int start, int divot, int end);117 118 JSC::SourceElements* createSourceElements() { return new (m_globalData) JSC::SourceElements( m_globalData); }115 ExpressionNode* makeBinaryNode(int lineNumber, int token, std::pair<ExpressionNode*, BinaryOpInfo>, std::pair<ExpressionNode*, BinaryOpInfo>); 116 ExpressionNode* makeFunctionCallNode(int lineNumber, ExpressionNode* func, ArgumentsNode* args, int start, int divot, int end); 117 118 JSC::SourceElements* createSourceElements() { return new (m_globalData) JSC::SourceElements(); } 119 119 120 120 ParserArenaData<DeclarationStacks::VarStack>* varDeclarations() { return m_scope.m_varDeclarations; } … … 125 125 void appendToComma(CommaNode* commaNode, ExpressionNode* expr) { commaNode->append(expr); } 126 126 127 CommaNode* createCommaExpr( ExpressionNode* lhs, ExpressionNode* rhs) { return new (m_globalData) CommaNode(m_globalData, lhs, rhs); }128 129 ExpressionNode* makeAssignNode( ExpressionNode* left, Operator, ExpressionNode* right, bool leftHasAssignments, bool rightHasAssignments, int start, int divot, int end);130 ExpressionNode* makePrefixNode( ExpressionNode*, Operator, int start, int divot, int end);131 ExpressionNode* makePostfixNode( ExpressionNode*, Operator, int start, int divot, int end);132 ExpressionNode* makeTypeOfNode( ExpressionNode*);133 ExpressionNode* makeDeleteNode( ExpressionNode*, int start, int divot, int end);134 ExpressionNode* makeNegateNode( ExpressionNode*);135 ExpressionNode* makeBitwiseNotNode( ExpressionNode*);136 ExpressionNode* makeMultNode( ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments);137 ExpressionNode* makeDivNode( ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments);138 ExpressionNode* makeModNode( ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments);139 ExpressionNode* makeAddNode( ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments);140 ExpressionNode* makeSubNode( ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments);141 ExpressionNode* makeBitXOrNode( ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments);142 ExpressionNode* makeBitAndNode( ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments);143 ExpressionNode* makeBitOrNode( ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments);144 ExpressionNode* makeLeftShiftNode( ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments);145 ExpressionNode* makeRightShiftNode( ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments);146 ExpressionNode* makeURightShiftNode( ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments);147 148 ExpressionNode* createLogicalNot( ExpressionNode* expr) { return new (m_globalData) LogicalNotNode(m_globalData, expr); }149 ExpressionNode* createUnaryPlus( ExpressionNode* expr) { return new (m_globalData) UnaryPlusNode(m_globalData, expr); }150 ExpressionNode* createVoid( ExpressionNode* expr)127 CommaNode* createCommaExpr(int lineNumber, ExpressionNode* lhs, ExpressionNode* rhs) { return new (m_globalData) CommaNode(lineNumber, lhs, rhs); } 128 129 ExpressionNode* makeAssignNode(int lineNumber, ExpressionNode* left, Operator, ExpressionNode* right, bool leftHasAssignments, bool rightHasAssignments, int start, int divot, int end); 130 ExpressionNode* makePrefixNode(int lineNumber, ExpressionNode*, Operator, int start, int divot, int end); 131 ExpressionNode* makePostfixNode(int lineNumber, ExpressionNode*, Operator, int start, int divot, int end); 132 ExpressionNode* makeTypeOfNode(int lineNumber, ExpressionNode*); 133 ExpressionNode* makeDeleteNode(int lineNumber, ExpressionNode*, int start, int divot, int end); 134 ExpressionNode* makeNegateNode(int lineNumber, ExpressionNode*); 135 ExpressionNode* makeBitwiseNotNode(int lineNumber, ExpressionNode*); 136 ExpressionNode* makeMultNode(int lineNumber, ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments); 137 ExpressionNode* makeDivNode(int lineNumber, ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments); 138 ExpressionNode* makeModNode(int lineNumber, ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments); 139 ExpressionNode* makeAddNode(int lineNumber, ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments); 140 ExpressionNode* makeSubNode(int lineNumber, ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments); 141 ExpressionNode* makeBitXOrNode(int lineNumber, ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments); 142 ExpressionNode* makeBitAndNode(int lineNumber, ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments); 143 ExpressionNode* makeBitOrNode(int lineNumber, ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments); 144 ExpressionNode* makeLeftShiftNode(int lineNumber, ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments); 145 ExpressionNode* makeRightShiftNode(int lineNumber, ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments); 146 ExpressionNode* makeURightShiftNode(int lineNumber, ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments); 147 148 ExpressionNode* createLogicalNot(int lineNumber, ExpressionNode* expr) { return new (m_globalData) LogicalNotNode(lineNumber, expr); } 149 ExpressionNode* createUnaryPlus(int lineNumber, ExpressionNode* expr) { return new (m_globalData) UnaryPlusNode(lineNumber, expr); } 150 ExpressionNode* createVoid(int lineNumber, ExpressionNode* expr) 151 151 { 152 152 incConstants(); 153 return new (m_globalData) VoidNode( m_globalData, expr);154 } 155 ExpressionNode* thisExpr( )153 return new (m_globalData) VoidNode(lineNumber, expr); 154 } 155 ExpressionNode* thisExpr(int lineNumber) 156 156 { 157 157 usesThis(); 158 return new (m_globalData) ThisNode( m_globalData);159 } 160 ExpressionNode* createResolve( const Identifier* ident, int start)158 return new (m_globalData) ThisNode(lineNumber); 159 } 160 ExpressionNode* createResolve(int lineNumber, const Identifier* ident, int start) 161 161 { 162 162 if (m_globalData->propertyNames->arguments == *ident) 163 163 usesArguments(); 164 return new (m_globalData) ResolveNode( m_globalData, *ident, start);165 } 166 ExpressionNode* createObjectLiteral( ) { return new (m_globalData) ObjectLiteralNode(m_globalData); }167 ExpressionNode* createObjectLiteral( PropertyListNode* properties) { return new (m_globalData) ObjectLiteralNode(m_globalData, properties); }168 169 ExpressionNode* createArray(int elisions)164 return new (m_globalData) ResolveNode(lineNumber, *ident, start); 165 } 166 ExpressionNode* createObjectLiteral(int lineNumber) { return new (m_globalData) ObjectLiteralNode(lineNumber); } 167 ExpressionNode* createObjectLiteral(int lineNumber, PropertyListNode* properties) { return new (m_globalData) ObjectLiteralNode(lineNumber, properties); } 168 169 ExpressionNode* createArray(int lineNumber, int elisions) 170 170 { 171 171 if (elisions) 172 172 incConstants(); 173 return new (m_globalData) ArrayNode( m_globalData, elisions);174 } 175 176 ExpressionNode* createArray( ElementNode* elems) { return new (m_globalData) ArrayNode(m_globalData, elems); }177 ExpressionNode* createArray(int elisions, ElementNode* elems)173 return new (m_globalData) ArrayNode(lineNumber, elisions); 174 } 175 176 ExpressionNode* createArray(int lineNumber, ElementNode* elems) { return new (m_globalData) ArrayNode(lineNumber, elems); } 177 ExpressionNode* createArray(int lineNumber, int elisions, ElementNode* elems) 178 178 { 179 179 if (elisions) 180 180 incConstants(); 181 return new (m_globalData) ArrayNode( m_globalData, elisions, elems);182 } 183 ExpressionNode* createNumberExpr( double d)181 return new (m_globalData) ArrayNode(lineNumber, elisions, elems); 182 } 183 ExpressionNode* createNumberExpr(int lineNumber, double d) 184 184 { 185 185 incConstants(); 186 return new (m_globalData) NumberNode( m_globalData, d);187 } 188 189 ExpressionNode* createString( const Identifier* string)186 return new (m_globalData) NumberNode(lineNumber, d); 187 } 188 189 ExpressionNode* createString(int lineNumber, const Identifier* string) 190 190 { 191 191 incConstants(); 192 return new (m_globalData) StringNode( m_globalData, *string);193 } 194 195 ExpressionNode* createBoolean( bool b)192 return new (m_globalData) StringNode(lineNumber, *string); 193 } 194 195 ExpressionNode* createBoolean(int lineNumber, bool b) 196 196 { 197 197 incConstants(); 198 return new (m_globalData) BooleanNode( m_globalData, b);199 } 200 201 ExpressionNode* createNull( )198 return new (m_globalData) BooleanNode(lineNumber, b); 199 } 200 201 ExpressionNode* createNull(int lineNumber) 202 202 { 203 203 incConstants(); 204 return new (m_globalData) NullNode( m_globalData);205 } 206 207 ExpressionNode* createBracketAccess( ExpressionNode* base, ExpressionNode* property, bool propertyHasAssignments, int start, int divot, int end)208 { 209 BracketAccessorNode* node = new (m_globalData) BracketAccessorNode( m_globalData, base, property, propertyHasAssignments);204 return new (m_globalData) NullNode(lineNumber); 205 } 206 207 ExpressionNode* createBracketAccess(int lineNumber, ExpressionNode* base, ExpressionNode* property, bool propertyHasAssignments, int start, int divot, int end) 208 { 209 BracketAccessorNode* node = new (m_globalData) BracketAccessorNode(lineNumber, base, property, propertyHasAssignments); 210 210 setExceptionLocation(node, start, divot, end); 211 211 return node; 212 212 } 213 213 214 ExpressionNode* createDotAccess( ExpressionNode* base, const Identifier* property, int start, int divot, int end)215 { 216 DotAccessorNode* node = new (m_globalData) DotAccessorNode( m_globalData, base, *property);214 ExpressionNode* createDotAccess(int lineNumber, ExpressionNode* base, const Identifier* property, int start, int divot, int end) 215 { 216 DotAccessorNode* node = new (m_globalData) DotAccessorNode(lineNumber, base, *property); 217 217 setExceptionLocation(node, start, divot, end); 218 218 return node; 219 219 } 220 220 221 ExpressionNode* createRegExp( const Identifier& pattern, const Identifier& flags, int start)221 ExpressionNode* createRegExp(int lineNumber, const Identifier& pattern, const Identifier& flags, int start) 222 222 { 223 223 if (Yarr::checkSyntax(pattern.ustring())) 224 224 return 0; 225 RegExpNode* node = new (m_globalData) RegExpNode( m_globalData, pattern, flags);225 RegExpNode* node = new (m_globalData) RegExpNode(lineNumber, pattern, flags); 226 226 int size = pattern.length() + 2; // + 2 for the two /'s 227 227 setExceptionLocation(node, start, start + size, start + size); … … 229 229 } 230 230 231 ExpressionNode* createNewExpr( ExpressionNode* expr, ArgumentsNode* arguments, int start, int divot, int end)232 { 233 NewExprNode* node = new (m_globalData) NewExprNode( m_globalData, expr, arguments);231 ExpressionNode* createNewExpr(int lineNumber, ExpressionNode* expr, ArgumentsNode* arguments, int start, int divot, int end) 232 { 233 NewExprNode* node = new (m_globalData) NewExprNode(lineNumber, expr, arguments); 234 234 setExceptionLocation(node, start, divot, end); 235 235 return node; 236 236 } 237 237 238 ExpressionNode* createNewExpr( ExpressionNode* expr, int start, int end)239 { 240 NewExprNode* node = new (m_globalData) NewExprNode( m_globalData, expr);238 ExpressionNode* createNewExpr(int lineNumber, ExpressionNode* expr, int start, int end) 239 { 240 NewExprNode* node = new (m_globalData) NewExprNode(lineNumber, expr); 241 241 setExceptionLocation(node, start, end, end); 242 242 return node; 243 243 } 244 244 245 ExpressionNode* createConditionalExpr( ExpressionNode* condition, ExpressionNode* lhs, ExpressionNode* rhs)246 { 247 return new (m_globalData) ConditionalNode( m_globalData, condition, lhs, rhs);248 } 249 250 ExpressionNode* createAssignResolve( const Identifier& ident, ExpressionNode* rhs, bool rhsHasAssignment, int start, int divot, int end)251 { 252 AssignResolveNode* node = new (m_globalData) AssignResolveNode( m_globalData, ident, rhs, rhsHasAssignment);245 ExpressionNode* createConditionalExpr(int lineNumber, ExpressionNode* condition, ExpressionNode* lhs, ExpressionNode* rhs) 246 { 247 return new (m_globalData) ConditionalNode(lineNumber, condition, lhs, rhs); 248 } 249 250 ExpressionNode* createAssignResolve(int lineNumber, const Identifier& ident, ExpressionNode* rhs, bool rhsHasAssignment, int start, int divot, int end) 251 { 252 AssignResolveNode* node = new (m_globalData) AssignResolveNode(lineNumber, ident, rhs, rhsHasAssignment); 253 253 setExceptionLocation(node, start, divot, end); 254 254 return node; 255 255 } 256 256 257 ExpressionNode* createFunctionExpr( const Identifier* name, FunctionBodyNode* body, ParameterNode* parameters, int openBracePos, int closeBracePos, int bodyStartLine, int bodyEndLine)258 { 259 FuncExprNode* result = new (m_globalData) FuncExprNode( m_globalData, *name, body, m_lexer->sourceCode(openBracePos, closeBracePos, bodyStartLine), parameters);257 ExpressionNode* createFunctionExpr(int lineNumber, const Identifier* name, FunctionBodyNode* body, ParameterNode* parameters, int openBracePos, int closeBracePos, int bodyStartLine, int bodyEndLine) 258 { 259 FuncExprNode* result = new (m_globalData) FuncExprNode(lineNumber, *name, body, m_sourceCode->subExpression(openBracePos, closeBracePos, bodyStartLine), parameters); 260 260 body->setLoc(bodyStartLine, bodyEndLine); 261 261 return result; 262 262 } 263 263 264 FunctionBodyNode* createFunctionBody( bool inStrictContext)264 FunctionBodyNode* createFunctionBody(int lineNumber, bool inStrictContext) 265 265 { 266 266 usesClosures(); 267 return FunctionBodyNode::create(m_globalData, inStrictContext);268 } 269 270 template <bool> PropertyNode* createGetterOrSetterProperty( PropertyNode::Type type, const Identifier* name, ParameterNode* params, FunctionBodyNode* body, int openBracePos, int closeBracePos, int bodyStartLine, int bodyEndLine)267 return FunctionBodyNode::create(m_globalData, lineNumber, inStrictContext); 268 } 269 270 template <bool> PropertyNode* createGetterOrSetterProperty(int lineNumber, PropertyNode::Type type, const Identifier* name, ParameterNode* params, FunctionBodyNode* body, int openBracePos, int closeBracePos, int bodyStartLine, int bodyEndLine) 271 271 { 272 272 ASSERT(name); 273 273 body->setLoc(bodyStartLine, bodyEndLine); 274 return new (m_globalData) PropertyNode(m_globalData, *name, new (m_globalData) FuncExprNode( m_globalData, m_globalData->propertyNames->nullIdentifier, body, m_lexer->sourceCode(openBracePos, closeBracePos, bodyStartLine), params), type);275 } 276 277 278 ArgumentsNode* createArguments() { return new (m_globalData) ArgumentsNode( m_globalData); }279 ArgumentsNode* createArguments(ArgumentListNode* args) { return new (m_globalData) ArgumentsNode( m_globalData,args); }280 ArgumentListNode* createArgumentsList( ExpressionNode* arg) { return new (m_globalData) ArgumentListNode(m_globalData, arg); }281 ArgumentListNode* createArgumentsList( ArgumentListNode* args, ExpressionNode* arg) { return new (m_globalData) ArgumentListNode(m_globalData, args, arg); }274 return new (m_globalData) PropertyNode(m_globalData, *name, new (m_globalData) FuncExprNode(lineNumber, m_globalData->propertyNames->nullIdentifier, body, m_sourceCode->subExpression(openBracePos, closeBracePos, bodyStartLine), params), type); 275 } 276 277 278 ArgumentsNode* createArguments() { return new (m_globalData) ArgumentsNode(); } 279 ArgumentsNode* createArguments(ArgumentListNode* args) { return new (m_globalData) ArgumentsNode(args); } 280 ArgumentListNode* createArgumentsList(int lineNumber, ExpressionNode* arg) { return new (m_globalData) ArgumentListNode(lineNumber, arg); } 281 ArgumentListNode* createArgumentsList(int lineNumber, ArgumentListNode* args, ExpressionNode* arg) { return new (m_globalData) ArgumentListNode(lineNumber, args, arg); } 282 282 283 283 template <bool> PropertyNode* createProperty(const Identifier* propertyName, ExpressionNode* node, PropertyNode::Type type) { return new (m_globalData) PropertyNode(m_globalData, *propertyName, node, type); } 284 284 template <bool> PropertyNode* createProperty(JSGlobalData*, double propertyName, ExpressionNode* node, PropertyNode::Type type) { return new (m_globalData) PropertyNode(m_globalData, propertyName, node, type); } 285 PropertyListNode* createPropertyList( PropertyNode* property) { return new (m_globalData) PropertyListNode(m_globalData, property); }286 PropertyListNode* createPropertyList( PropertyNode* property, PropertyListNode* tail) { return new (m_globalData) PropertyListNode(m_globalData, property, tail); }287 288 ElementNode* createElementList(int elisions, ExpressionNode* expr) { return new (m_globalData) ElementNode( m_globalData,elisions, expr); }289 ElementNode* createElementList(ElementNode* elems, int elisions, ExpressionNode* expr) { return new (m_globalData) ElementNode( m_globalData,elems, elisions, expr); }290 291 ParameterNode* createFormalParameterList(const Identifier& ident) { return new (m_globalData) ParameterNode( m_globalData,ident); }292 ParameterNode* createFormalParameterList(ParameterNode* list, const Identifier& ident) { return new (m_globalData) ParameterNode( m_globalData,list, ident); }293 294 CaseClauseNode* createClause(ExpressionNode* expr, JSC::SourceElements* statements) { return new (m_globalData) CaseClauseNode( m_globalData,expr, statements); }295 ClauseListNode* createClauseList(CaseClauseNode* clause) { return new (m_globalData) ClauseListNode( m_globalData,clause); }296 ClauseListNode* createClauseList(ClauseListNode* tail, CaseClauseNode* clause) { return new (m_globalData) ClauseListNode( m_globalData,tail, clause); }285 PropertyListNode* createPropertyList(int lineNumber, PropertyNode* property) { return new (m_globalData) PropertyListNode(lineNumber, property); } 286 PropertyListNode* createPropertyList(int lineNumber, PropertyNode* property, PropertyListNode* tail) { return new (m_globalData) PropertyListNode(lineNumber, property, tail); } 287 288 ElementNode* createElementList(int elisions, ExpressionNode* expr) { return new (m_globalData) ElementNode(elisions, expr); } 289 ElementNode* createElementList(ElementNode* elems, int elisions, ExpressionNode* expr) { return new (m_globalData) ElementNode(elems, elisions, expr); } 290 291 ParameterNode* createFormalParameterList(const Identifier& ident) { return new (m_globalData) ParameterNode(ident); } 292 ParameterNode* createFormalParameterList(ParameterNode* list, const Identifier& ident) { return new (m_globalData) ParameterNode(list, ident); } 293 294 CaseClauseNode* createClause(ExpressionNode* expr, JSC::SourceElements* statements) { return new (m_globalData) CaseClauseNode(expr, statements); } 295 ClauseListNode* createClauseList(CaseClauseNode* clause) { return new (m_globalData) ClauseListNode(clause); } 296 ClauseListNode* createClauseList(ClauseListNode* tail, CaseClauseNode* clause) { return new (m_globalData) ClauseListNode(tail, clause); } 297 297 298 298 void setUsesArguments(FunctionBodyNode* node) { node->setUsesArguments(); } 299 299 300 StatementNode* createFuncDeclStatement( const Identifier* name, FunctionBodyNode* body, ParameterNode* parameters, int openBracePos, int closeBracePos, int bodyStartLine, int bodyEndLine)301 { 302 FuncDeclNode* decl = new (m_globalData) FuncDeclNode( m_globalData, *name, body, m_lexer->sourceCode(openBracePos, closeBracePos, bodyStartLine), parameters);300 StatementNode* createFuncDeclStatement(int lineNumber, const Identifier* name, FunctionBodyNode* body, ParameterNode* parameters, int openBracePos, int closeBracePos, int bodyStartLine, int bodyEndLine) 301 { 302 FuncDeclNode* decl = new (m_globalData) FuncDeclNode(lineNumber, *name, body, m_sourceCode->subExpression(openBracePos, closeBracePos, bodyStartLine), parameters); 303 303 if (*name == m_globalData->propertyNames->arguments) 304 304 usesArguments(); … … 308 308 } 309 309 310 StatementNode* createBlockStatement( JSC::SourceElements* elements, int startLine, int endLine)311 { 312 BlockNode* block = new (m_globalData) BlockNode( m_globalData, elements);310 StatementNode* createBlockStatement(int lineNumber, JSC::SourceElements* elements, int startLine, int endLine) 311 { 312 BlockNode* block = new (m_globalData) BlockNode(lineNumber, elements); 313 313 block->setLoc(startLine, endLine); 314 314 return block; 315 315 } 316 316 317 StatementNode* createExprStatement( ExpressionNode* expr, int start, int end)318 { 319 ExprStatementNode* result = new (m_globalData) ExprStatementNode( m_globalData, expr);317 StatementNode* createExprStatement(int lineNumber, ExpressionNode* expr, int start, int end) 318 { 319 ExprStatementNode* result = new (m_globalData) ExprStatementNode(lineNumber, expr); 320 320 result->setLoc(start, end); 321 321 return result; 322 322 } 323 323 324 StatementNode* createIfStatement( ExpressionNode* condition, StatementNode* trueBlock, int start, int end)325 { 326 IfNode* result = new (m_globalData) IfNode( m_globalData, condition, trueBlock);324 StatementNode* createIfStatement(int lineNumber, ExpressionNode* condition, StatementNode* trueBlock, int start, int end) 325 { 326 IfNode* result = new (m_globalData) IfNode(lineNumber, condition, trueBlock); 327 327 result->setLoc(start, end); 328 328 return result; 329 329 } 330 330 331 StatementNode* createIfStatement( ExpressionNode* condition, StatementNode* trueBlock, StatementNode* falseBlock, int start, int end)332 { 333 IfNode* result = new (m_globalData) IfElseNode( m_globalData, condition, trueBlock, falseBlock);331 StatementNode* createIfStatement(int lineNumber, ExpressionNode* condition, StatementNode* trueBlock, StatementNode* falseBlock, int start, int end) 332 { 333 IfNode* result = new (m_globalData) IfElseNode(lineNumber, condition, trueBlock, falseBlock); 334 334 result->setLoc(start, end); 335 335 return result; 336 336 } 337 337 338 StatementNode* createForLoop( ExpressionNode* initializer, ExpressionNode* condition, ExpressionNode* iter, StatementNode* statements, bool b, int start, int end)339 { 340 ForNode* result = new (m_globalData) ForNode( m_globalData, initializer, condition, iter, statements, b);338 StatementNode* createForLoop(int lineNumber, ExpressionNode* initializer, ExpressionNode* condition, ExpressionNode* iter, StatementNode* statements, bool b, int start, int end) 339 { 340 ForNode* result = new (m_globalData) ForNode(lineNumber, initializer, condition, iter, statements, b); 341 341 result->setLoc(start, end); 342 342 return result; 343 343 } 344 344 345 StatementNode* createForInLoop( const Identifier* ident, ExpressionNode* initializer, ExpressionNode* iter, StatementNode* statements, int start, int divot, int end, int initStart, int initEnd, int startLine, int endLine)346 { 347 ForInNode* result = new (m_globalData) ForInNode(m_globalData, *ident, initializer, iter, statements, initStart, initStart - start, initEnd - initStart);345 StatementNode* createForInLoop(int lineNumber, const Identifier* ident, ExpressionNode* initializer, ExpressionNode* iter, StatementNode* statements, int start, int divot, int end, int initStart, int initEnd, int startLine, int endLine) 346 { 347 ForInNode* result = new (m_globalData) ForInNode(m_globalData, lineNumber, *ident, initializer, iter, statements, initStart, initStart - start, initEnd - initStart); 348 348 result->setLoc(startLine, endLine); 349 349 setExceptionLocation(result, start, divot + 1, end); … … 351 351 } 352 352 353 StatementNode* createForInLoop( ExpressionNode* lhs, ExpressionNode* iter, StatementNode* statements, int eStart, int eDivot, int eEnd, int start, int end)354 { 355 ForInNode* result = new (m_globalData) ForInNode(m_globalData, l hs, iter, statements);353 StatementNode* createForInLoop(int lineNumber, ExpressionNode* lhs, ExpressionNode* iter, StatementNode* statements, int eStart, int eDivot, int eEnd, int start, int end) 354 { 355 ForInNode* result = new (m_globalData) ForInNode(m_globalData, lineNumber, lhs, iter, statements); 356 356 result->setLoc(start, end); 357 357 setExceptionLocation(result, eStart, eDivot, eEnd); … … 359 359 } 360 360 361 StatementNode* createEmptyStatement( ) { return new (m_globalData) EmptyStatementNode(m_globalData); }362 363 StatementNode* createVarStatement( ExpressionNode* expr, int start, int end)361 StatementNode* createEmptyStatement(int lineNumber) { return new (m_globalData) EmptyStatementNode(lineNumber); } 362 363 StatementNode* createVarStatement(int lineNumber, ExpressionNode* expr, int start, int end) 364 364 { 365 365 StatementNode* result; 366 366 if (!expr) 367 result = new (m_globalData) EmptyStatementNode( m_globalData);367 result = new (m_globalData) EmptyStatementNode(lineNumber); 368 368 else 369 result = new (m_globalData) VarStatementNode( m_globalData, expr);369 result = new (m_globalData) VarStatementNode(lineNumber, expr); 370 370 result->setLoc(start, end); 371 371 return result; 372 372 } 373 373 374 StatementNode* createReturnStatement( ExpressionNode* expression, int eStart, int eEnd, int startLine, int endLine)375 { 376 ReturnNode* result = new (m_globalData) ReturnNode( m_globalData, expression);374 StatementNode* createReturnStatement(int lineNumber, ExpressionNode* expression, int eStart, int eEnd, int startLine, int endLine) 375 { 376 ReturnNode* result = new (m_globalData) ReturnNode(lineNumber, expression); 377 377 setExceptionLocation(result, eStart, eEnd, eEnd); 378 378 result->setLoc(startLine, endLine); … … 380 380 } 381 381 382 StatementNode* createBreakStatement(int eStart, int eEnd, int startLine, int endLine)383 { 384 BreakNode* result = new (m_globalData) BreakNode(m_globalData );382 StatementNode* createBreakStatement(int lineNumber, int eStart, int eEnd, int startLine, int endLine) 383 { 384 BreakNode* result = new (m_globalData) BreakNode(m_globalData, lineNumber); 385 385 setExceptionLocation(result, eStart, eEnd, eEnd); 386 386 result->setLoc(startLine, endLine); … … 388 388 } 389 389 390 StatementNode* createBreakStatement( const Identifier* ident, int eStart, int eEnd, int startLine, int endLine)391 { 392 BreakNode* result = new (m_globalData) BreakNode( m_globalData, *ident);390 StatementNode* createBreakStatement(int lineNumber, const Identifier* ident, int eStart, int eEnd, int startLine, int endLine) 391 { 392 BreakNode* result = new (m_globalData) BreakNode(lineNumber, *ident); 393 393 setExceptionLocation(result, eStart, eEnd, eEnd); 394 394 result->setLoc(startLine, endLine); … … 396 396 } 397 397 398 StatementNode* createContinueStatement(int eStart, int eEnd, int startLine, int endLine)399 { 400 ContinueNode* result = new (m_globalData) ContinueNode(m_globalData );398 StatementNode* createContinueStatement(int lineNumber, int eStart, int eEnd, int startLine, int endLine) 399 { 400 ContinueNode* result = new (m_globalData) ContinueNode(m_globalData, lineNumber); 401 401 setExceptionLocation(result, eStart, eEnd, eEnd); 402 402 result->setLoc(startLine, endLine); … … 404 404 } 405 405 406 StatementNode* createContinueStatement( const Identifier* ident, int eStart, int eEnd, int startLine, int endLine)407 { 408 ContinueNode* result = new (m_globalData) ContinueNode( m_globalData, *ident);406 StatementNode* createContinueStatement(int lineNumber, const Identifier* ident, int eStart, int eEnd, int startLine, int endLine) 407 { 408 ContinueNode* result = new (m_globalData) ContinueNode(lineNumber, *ident); 409 409 setExceptionLocation(result, eStart, eEnd, eEnd); 410 410 result->setLoc(startLine, endLine); … … 412 412 } 413 413 414 StatementNode* createTryStatement( StatementNode* tryBlock, const Identifier* ident, bool catchHasEval, StatementNode* catchBlock, StatementNode* finallyBlock, int startLine, int endLine)415 { 416 TryNode* result = new (m_globalData) TryNode( m_globalData, tryBlock, *ident, catchHasEval, catchBlock, finallyBlock);414 StatementNode* createTryStatement(int lineNumber, StatementNode* tryBlock, const Identifier* ident, bool catchHasEval, StatementNode* catchBlock, StatementNode* finallyBlock, int startLine, int endLine) 415 { 416 TryNode* result = new (m_globalData) TryNode(lineNumber, tryBlock, *ident, catchHasEval, catchBlock, finallyBlock); 417 417 if (catchBlock) 418 418 usesCatch(); … … 421 421 } 422 422 423 StatementNode* createSwitchStatement( ExpressionNode* expr, ClauseListNode* firstClauses, CaseClauseNode* defaultClause, ClauseListNode* secondClauses, int startLine, int endLine)424 { 425 CaseBlockNode* cases = new (m_globalData) CaseBlockNode( m_globalData,firstClauses, defaultClause, secondClauses);426 SwitchNode* result = new (m_globalData) SwitchNode( m_globalData, expr, cases);427 result->setLoc(startLine, endLine); 428 return result; 429 } 430 431 StatementNode* createWhileStatement( ExpressionNode* expr, StatementNode* statement, int startLine, int endLine)432 { 433 WhileNode* result = new (m_globalData) WhileNode( m_globalData, expr, statement);434 result->setLoc(startLine, endLine); 435 return result; 436 } 437 438 StatementNode* createDoWhileStatement( StatementNode* statement, ExpressionNode* expr, int startLine, int endLine)439 { 440 DoWhileNode* result = new (m_globalData) DoWhileNode( m_globalData, statement, expr);441 result->setLoc(startLine, endLine); 442 return result; 443 } 444 445 StatementNode* createLabelStatement( const Identifier* ident, StatementNode* statement, int start, int end)446 { 447 LabelNode* result = new (m_globalData) LabelNode( m_globalData, *ident, statement);423 StatementNode* createSwitchStatement(int lineNumber, ExpressionNode* expr, ClauseListNode* firstClauses, CaseClauseNode* defaultClause, ClauseListNode* secondClauses, int startLine, int endLine) 424 { 425 CaseBlockNode* cases = new (m_globalData) CaseBlockNode(firstClauses, defaultClause, secondClauses); 426 SwitchNode* result = new (m_globalData) SwitchNode(lineNumber, expr, cases); 427 result->setLoc(startLine, endLine); 428 return result; 429 } 430 431 StatementNode* createWhileStatement(int lineNumber, ExpressionNode* expr, StatementNode* statement, int startLine, int endLine) 432 { 433 WhileNode* result = new (m_globalData) WhileNode(lineNumber, expr, statement); 434 result->setLoc(startLine, endLine); 435 return result; 436 } 437 438 StatementNode* createDoWhileStatement(int lineNumber, StatementNode* statement, ExpressionNode* expr, int startLine, int endLine) 439 { 440 DoWhileNode* result = new (m_globalData) DoWhileNode(lineNumber, statement, expr); 441 result->setLoc(startLine, endLine); 442 return result; 443 } 444 445 StatementNode* createLabelStatement(int lineNumber, const Identifier* ident, StatementNode* statement, int start, int end) 446 { 447 LabelNode* result = new (m_globalData) LabelNode(lineNumber, *ident, statement); 448 448 setExceptionLocation(result, start, end, end); 449 449 return result; 450 450 } 451 451 452 StatementNode* createWithStatement( ExpressionNode* expr, StatementNode* statement, int start, int end, int startLine, int endLine)452 StatementNode* createWithStatement(int lineNumber, ExpressionNode* expr, StatementNode* statement, int start, int end, int startLine, int endLine) 453 453 { 454 454 usesWith(); 455 WithNode* result = new (m_globalData) WithNode( m_globalData, expr, statement, end, end - start);455 WithNode* result = new (m_globalData) WithNode(lineNumber, expr, statement, end, end - start); 456 456 result->setLoc(startLine, endLine); 457 457 return result; 458 458 } 459 459 460 StatementNode* createThrowStatement( ExpressionNode* expr, int start, int end, int startLine, int endLine)461 { 462 ThrowNode* result = new (m_globalData) ThrowNode( m_globalData, expr);460 StatementNode* createThrowStatement(int lineNumber, ExpressionNode* expr, int start, int end, int startLine, int endLine) 461 { 462 ThrowNode* result = new (m_globalData) ThrowNode(lineNumber, expr); 463 463 result->setLoc(startLine, endLine); 464 464 setExceptionLocation(result, start, end, end); … … 466 466 } 467 467 468 StatementNode* createDebugger(int startLine, int endLine)469 { 470 DebuggerStatementNode* result = new (m_globalData) DebuggerStatementNode( m_globalData);471 result->setLoc(startLine, endLine); 472 return result; 473 } 474 475 StatementNode* createConstStatement( ConstDeclNode* decls, int startLine, int endLine)476 { 477 ConstStatementNode* result = new (m_globalData) ConstStatementNode( m_globalData, decls);478 result->setLoc(startLine, endLine); 479 return result; 480 } 481 482 ConstDeclNode* appendConstDecl( ConstDeclNode* tail, const Identifier* name, ExpressionNode* initializer)483 { 484 ConstDeclNode* result = new (m_globalData) ConstDeclNode( m_globalData, *name, initializer);468 StatementNode* createDebugger(int lineNumber, int startLine, int endLine) 469 { 470 DebuggerStatementNode* result = new (m_globalData) DebuggerStatementNode(lineNumber); 471 result->setLoc(startLine, endLine); 472 return result; 473 } 474 475 StatementNode* createConstStatement(int lineNumber, ConstDeclNode* decls, int startLine, int endLine) 476 { 477 ConstStatementNode* result = new (m_globalData) ConstStatementNode(lineNumber, decls); 478 result->setLoc(startLine, endLine); 479 return result; 480 } 481 482 ConstDeclNode* appendConstDecl(int lineNumber, ConstDeclNode* tail, const Identifier* name, ExpressionNode* initializer) 483 { 484 ConstDeclNode* result = new (m_globalData) ConstDeclNode(lineNumber, *name, initializer); 485 485 if (tail) 486 486 tail->m_next = result; … … 500 500 } 501 501 502 ExpressionNode* combineCommaNodes( ExpressionNode* list, ExpressionNode* init)502 ExpressionNode* combineCommaNodes(int lineNumber, ExpressionNode* list, ExpressionNode* init) 503 503 { 504 504 if (!list) … … 508 508 return list; 509 509 } 510 return new (m_globalData) CommaNode( m_globalData, list, init);510 return new (m_globalData) CommaNode(lineNumber, list, init); 511 511 } 512 512 … … 536 536 m_binaryOperandStack.resize(m_binaryOperandStack.size() - amount); 537 537 } 538 void appendBinaryOperation(int & operandStackDepth, int&, const BinaryOperand& lhs, const BinaryOperand& rhs)538 void appendBinaryOperation(int lineNumber, int& operandStackDepth, int&, const BinaryOperand& lhs, const BinaryOperand& rhs) 539 539 { 540 540 operandStackDepth++; 541 m_binaryOperandStack.append(std::make_pair(makeBinaryNode( m_binaryOperatorStack.last().first, lhs, rhs), BinaryOpInfo(lhs.second, rhs.second)));541 m_binaryOperandStack.append(std::make_pair(makeBinaryNode(lineNumber, m_binaryOperatorStack.last().first, lhs, rhs), BinaryOpInfo(lhs.second, rhs.second))); 542 542 } 543 543 void operatorStackAppend(int& operatorStackDepth, int op, int precedence) … … 581 581 } 582 582 583 ExpressionNode* createAssignment(int & assignmentStackDepth, ExpressionNode* rhs, int initialAssignmentCount, int currentAssignmentCount, int lastTokenEnd)584 { 585 ExpressionNode* result = makeAssignNode( m_assignmentInfoStack.last().m_node, m_assignmentInfoStack.last().m_op, rhs, m_assignmentInfoStack.last().m_initAssignments != initialAssignmentCount, m_assignmentInfoStack.last().m_initAssignments != currentAssignmentCount, m_assignmentInfoStack.last().m_start, m_assignmentInfoStack.last().m_divot + 1, lastTokenEnd);583 ExpressionNode* createAssignment(int lineNumber, int& assignmentStackDepth, ExpressionNode* rhs, int initialAssignmentCount, int currentAssignmentCount, int lastTokenEnd) 584 { 585 ExpressionNode* result = makeAssignNode(lineNumber, m_assignmentInfoStack.last().m_node, m_assignmentInfoStack.last().m_op, rhs, m_assignmentInfoStack.last().m_initAssignments != initialAssignmentCount, m_assignmentInfoStack.last().m_initAssignments != currentAssignmentCount, m_assignmentInfoStack.last().m_start, m_assignmentInfoStack.last().m_divot + 1, lastTokenEnd); 586 586 m_assignmentInfoStack.removeLast(); 587 587 assignmentStackDepth--; … … 626 626 m_scope.m_features |= EvalFeature; 627 627 } 628 ExpressionNode* createNumber( double d)629 { 630 return new (m_globalData) NumberNode( m_globalData, d);628 ExpressionNode* createNumber(int lineNumber, double d) 629 { 630 return new (m_globalData) NumberNode(lineNumber, d); 631 631 } 632 632 633 633 JSGlobalData* m_globalData; 634 Lexer* m_lexer;634 SourceCode* m_sourceCode; 635 635 Scope m_scope; 636 636 Vector<BinaryOperand, 10> m_binaryOperandStack; … … 641 641 }; 642 642 643 ExpressionNode* ASTBuilder::makeTypeOfNode( ExpressionNode* expr)643 ExpressionNode* ASTBuilder::makeTypeOfNode(int lineNumber, ExpressionNode* expr) 644 644 { 645 645 if (expr->isResolveNode()) { 646 646 ResolveNode* resolve = static_cast<ResolveNode*>(expr); 647 return new (m_globalData) TypeOfResolveNode( m_globalData, resolve->identifier());648 } 649 return new (m_globalData) TypeOfValueNode( m_globalData, expr);650 } 651 652 ExpressionNode* ASTBuilder::makeDeleteNode( ExpressionNode* expr, int start, int divot, int end)647 return new (m_globalData) TypeOfResolveNode(lineNumber, resolve->identifier()); 648 } 649 return new (m_globalData) TypeOfValueNode(lineNumber, expr); 650 } 651 652 ExpressionNode* ASTBuilder::makeDeleteNode(int lineNumber, ExpressionNode* expr, int start, int divot, int end) 653 653 { 654 654 if (!expr->isLocation()) 655 return new (m_globalData) DeleteValueNode( m_globalData, expr);655 return new (m_globalData) DeleteValueNode(lineNumber, expr); 656 656 if (expr->isResolveNode()) { 657 657 ResolveNode* resolve = static_cast<ResolveNode*>(expr); 658 return new (m_globalData) DeleteResolveNode( m_globalData, resolve->identifier(), divot, divot - start, end - divot);658 return new (m_globalData) DeleteResolveNode(lineNumber, resolve->identifier(), divot, divot - start, end - divot); 659 659 } 660 660 if (expr->isBracketAccessorNode()) { 661 661 BracketAccessorNode* bracket = static_cast<BracketAccessorNode*>(expr); 662 return new (m_globalData) DeleteBracketNode( m_globalData, bracket->base(), bracket->subscript(), divot, divot - start, end - divot);662 return new (m_globalData) DeleteBracketNode(lineNumber, bracket->base(), bracket->subscript(), divot, divot - start, end - divot); 663 663 } 664 664 ASSERT(expr->isDotAccessorNode()); 665 665 DotAccessorNode* dot = static_cast<DotAccessorNode*>(expr); 666 return new (m_globalData) DeleteDotNode( m_globalData, dot->base(), dot->identifier(), divot, divot - start, end - divot);667 } 668 669 ExpressionNode* ASTBuilder::makeNegateNode( ExpressionNode* n)666 return new (m_globalData) DeleteDotNode(lineNumber, dot->base(), dot->identifier(), divot, divot - start, end - divot); 667 } 668 669 ExpressionNode* ASTBuilder::makeNegateNode(int lineNumber, ExpressionNode* n) 670 670 { 671 671 if (n->isNumber()) { … … 675 675 } 676 676 677 return new (m_globalData) NegateNode( m_globalData, n);678 } 679 680 ExpressionNode* ASTBuilder::makeBitwiseNotNode( ExpressionNode* expr)677 return new (m_globalData) NegateNode(lineNumber, n); 678 } 679 680 ExpressionNode* ASTBuilder::makeBitwiseNotNode(int lineNumber, ExpressionNode* expr) 681 681 { 682 682 if (expr->isNumber()) 683 return createNumber( ~toInt32(static_cast<NumberNode*>(expr)->value()));684 return new (m_globalData) BitwiseNotNode( m_globalData, expr);685 } 686 687 ExpressionNode* ASTBuilder::makeMultNode( ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)683 return createNumber(lineNumber, ~toInt32(static_cast<NumberNode*>(expr)->value())); 684 return new (m_globalData) BitwiseNotNode(lineNumber, expr); 685 } 686 687 ExpressionNode* ASTBuilder::makeMultNode(int lineNumber, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 688 688 { 689 689 expr1 = expr1->stripUnaryPlus(); … … 691 691 692 692 if (expr1->isNumber() && expr2->isNumber()) 693 return createNumber( static_cast<NumberNode*>(expr1)->value() * static_cast<NumberNode*>(expr2)->value());693 return createNumber(lineNumber, static_cast<NumberNode*>(expr1)->value() * static_cast<NumberNode*>(expr2)->value()); 694 694 695 695 if (expr1->isNumber() && static_cast<NumberNode*>(expr1)->value() == 1) 696 return new (m_globalData) UnaryPlusNode( m_globalData, expr2);696 return new (m_globalData) UnaryPlusNode(lineNumber, expr2); 697 697 698 698 if (expr2->isNumber() && static_cast<NumberNode*>(expr2)->value() == 1) 699 return new (m_globalData) UnaryPlusNode( m_globalData, expr1);700 701 return new (m_globalData) MultNode( m_globalData, expr1, expr2, rightHasAssignments);702 } 703 704 ExpressionNode* ASTBuilder::makeDivNode( ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)699 return new (m_globalData) UnaryPlusNode(lineNumber, expr1); 700 701 return new (m_globalData) MultNode(lineNumber, expr1, expr2, rightHasAssignments); 702 } 703 704 ExpressionNode* ASTBuilder::makeDivNode(int lineNumber, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 705 705 { 706 706 expr1 = expr1->stripUnaryPlus(); … … 708 708 709 709 if (expr1->isNumber() && expr2->isNumber()) 710 return createNumber( static_cast<NumberNode*>(expr1)->value() / static_cast<NumberNode*>(expr2)->value());711 return new (m_globalData) DivNode( m_globalData, expr1, expr2, rightHasAssignments);712 } 713 714 ExpressionNode* ASTBuilder::makeModNode( ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)710 return createNumber(lineNumber, static_cast<NumberNode*>(expr1)->value() / static_cast<NumberNode*>(expr2)->value()); 711 return new (m_globalData) DivNode(lineNumber, expr1, expr2, rightHasAssignments); 712 } 713 714 ExpressionNode* ASTBuilder::makeModNode(int lineNumber, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 715 715 { 716 716 expr1 = expr1->stripUnaryPlus(); … … 718 718 719 719 if (expr1->isNumber() && expr2->isNumber()) 720 return createNumber( fmod(static_cast<NumberNode*>(expr1)->value(), static_cast<NumberNode*>(expr2)->value()));721 return new (m_globalData) ModNode( m_globalData, expr1, expr2, rightHasAssignments);722 } 723 724 ExpressionNode* ASTBuilder::makeAddNode( ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)725 { 726 if (expr1->isNumber() && expr2->isNumber()) 727 return createNumber( static_cast<NumberNode*>(expr1)->value() + static_cast<NumberNode*>(expr2)->value());728 return new (m_globalData) AddNode( m_globalData, expr1, expr2, rightHasAssignments);729 } 730 731 ExpressionNode* ASTBuilder::makeSubNode( ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)720 return createNumber(lineNumber, fmod(static_cast<NumberNode*>(expr1)->value(), static_cast<NumberNode*>(expr2)->value())); 721 return new (m_globalData) ModNode(lineNumber, expr1, expr2, rightHasAssignments); 722 } 723 724 ExpressionNode* ASTBuilder::makeAddNode(int lineNumber, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 725 { 726 if (expr1->isNumber() && expr2->isNumber()) 727 return createNumber(lineNumber, static_cast<NumberNode*>(expr1)->value() + static_cast<NumberNode*>(expr2)->value()); 728 return new (m_globalData) AddNode(lineNumber, expr1, expr2, rightHasAssignments); 729 } 730 731 ExpressionNode* ASTBuilder::makeSubNode(int lineNumber, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 732 732 { 733 733 expr1 = expr1->stripUnaryPlus(); … … 735 735 736 736 if (expr1->isNumber() && expr2->isNumber()) 737 return createNumber( static_cast<NumberNode*>(expr1)->value() - static_cast<NumberNode*>(expr2)->value());738 return new (m_globalData) SubNode( m_globalData, expr1, expr2, rightHasAssignments);739 } 740 741 ExpressionNode* ASTBuilder::makeLeftShiftNode( ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)742 { 743 if (expr1->isNumber() && expr2->isNumber()) 744 return createNumber( toInt32(static_cast<NumberNode*>(expr1)->value()) << (toUInt32(static_cast<NumberNode*>(expr2)->value()) & 0x1f));745 return new (m_globalData) LeftShiftNode( m_globalData, expr1, expr2, rightHasAssignments);746 } 747 748 ExpressionNode* ASTBuilder::makeRightShiftNode( ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)749 { 750 if (expr1->isNumber() && expr2->isNumber()) 751 return createNumber( toInt32(static_cast<NumberNode*>(expr1)->value()) >> (toUInt32(static_cast<NumberNode*>(expr2)->value()) & 0x1f));752 return new (m_globalData) RightShiftNode( m_globalData, expr1, expr2, rightHasAssignments);753 } 754 755 ExpressionNode* ASTBuilder::makeURightShiftNode( ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)756 { 757 if (expr1->isNumber() && expr2->isNumber()) 758 return createNumber( toUInt32(static_cast<NumberNode*>(expr1)->value()) >> (toUInt32(static_cast<NumberNode*>(expr2)->value()) & 0x1f));759 return new (m_globalData) UnsignedRightShiftNode( m_globalData, expr1, expr2, rightHasAssignments);760 } 761 762 ExpressionNode* ASTBuilder::makeBitOrNode( ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)763 { 764 if (expr1->isNumber() && expr2->isNumber()) 765 return createNumber( toInt32(static_cast<NumberNode*>(expr1)->value()) | toInt32(static_cast<NumberNode*>(expr2)->value()));766 return new (m_globalData) BitOrNode( m_globalData, expr1, expr2, rightHasAssignments);767 } 768 769 ExpressionNode* ASTBuilder::makeBitAndNode( ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)770 { 771 if (expr1->isNumber() && expr2->isNumber()) 772 return createNumber( toInt32(static_cast<NumberNode*>(expr1)->value()) & toInt32(static_cast<NumberNode*>(expr2)->value()));773 return new (m_globalData) BitAndNode( m_globalData, expr1, expr2, rightHasAssignments);774 } 775 776 ExpressionNode* ASTBuilder::makeBitXOrNode( ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)777 { 778 if (expr1->isNumber() && expr2->isNumber()) 779 return createNumber( toInt32(static_cast<NumberNode*>(expr1)->value()) ^ toInt32(static_cast<NumberNode*>(expr2)->value()));780 return new (m_globalData) BitXOrNode( m_globalData, expr1, expr2, rightHasAssignments);781 } 782 783 ExpressionNode* ASTBuilder::makeFunctionCallNode( ExpressionNode* func, ArgumentsNode* args, int start, int divot, int end)737 return createNumber(lineNumber, static_cast<NumberNode*>(expr1)->value() - static_cast<NumberNode*>(expr2)->value()); 738 return new (m_globalData) SubNode(lineNumber, expr1, expr2, rightHasAssignments); 739 } 740 741 ExpressionNode* ASTBuilder::makeLeftShiftNode(int lineNumber, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 742 { 743 if (expr1->isNumber() && expr2->isNumber()) 744 return createNumber(lineNumber, toInt32(static_cast<NumberNode*>(expr1)->value()) << (toUInt32(static_cast<NumberNode*>(expr2)->value()) & 0x1f)); 745 return new (m_globalData) LeftShiftNode(lineNumber, expr1, expr2, rightHasAssignments); 746 } 747 748 ExpressionNode* ASTBuilder::makeRightShiftNode(int lineNumber, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 749 { 750 if (expr1->isNumber() && expr2->isNumber()) 751 return createNumber(lineNumber, toInt32(static_cast<NumberNode*>(expr1)->value()) >> (toUInt32(static_cast<NumberNode*>(expr2)->value()) & 0x1f)); 752 return new (m_globalData) RightShiftNode(lineNumber, expr1, expr2, rightHasAssignments); 753 } 754 755 ExpressionNode* ASTBuilder::makeURightShiftNode(int lineNumber, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 756 { 757 if (expr1->isNumber() && expr2->isNumber()) 758 return createNumber(lineNumber, toUInt32(static_cast<NumberNode*>(expr1)->value()) >> (toUInt32(static_cast<NumberNode*>(expr2)->value()) & 0x1f)); 759 return new (m_globalData) UnsignedRightShiftNode(lineNumber, expr1, expr2, rightHasAssignments); 760 } 761 762 ExpressionNode* ASTBuilder::makeBitOrNode(int lineNumber, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 763 { 764 if (expr1->isNumber() && expr2->isNumber()) 765 return createNumber(lineNumber, toInt32(static_cast<NumberNode*>(expr1)->value()) | toInt32(static_cast<NumberNode*>(expr2)->value())); 766 return new (m_globalData) BitOrNode(lineNumber, expr1, expr2, rightHasAssignments); 767 } 768 769 ExpressionNode* ASTBuilder::makeBitAndNode(int lineNumber, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 770 { 771 if (expr1->isNumber() && expr2->isNumber()) 772 return createNumber(lineNumber, toInt32(static_cast<NumberNode*>(expr1)->value()) & toInt32(static_cast<NumberNode*>(expr2)->value())); 773 return new (m_globalData) BitAndNode(lineNumber, expr1, expr2, rightHasAssignments); 774 } 775 776 ExpressionNode* ASTBuilder::makeBitXOrNode(int lineNumber, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 777 { 778 if (expr1->isNumber() && expr2->isNumber()) 779 return createNumber(lineNumber, toInt32(static_cast<NumberNode*>(expr1)->value()) ^ toInt32(static_cast<NumberNode*>(expr2)->value())); 780 return new (m_globalData) BitXOrNode(lineNumber, expr1, expr2, rightHasAssignments); 781 } 782 783 ExpressionNode* ASTBuilder::makeFunctionCallNode(int lineNumber, ExpressionNode* func, ArgumentsNode* args, int start, int divot, int end) 784 784 { 785 785 if (!func->isLocation()) 786 return new (m_globalData) FunctionCallValueNode( m_globalData, func, args, divot, divot - start, end - divot);786 return new (m_globalData) FunctionCallValueNode(lineNumber, func, args, divot, divot - start, end - divot); 787 787 if (func->isResolveNode()) { 788 788 ResolveNode* resolve = static_cast<ResolveNode*>(func); … … 790 790 if (identifier == m_globalData->propertyNames->eval) { 791 791 usesEval(); 792 return new (m_globalData) EvalFunctionCallNode( m_globalData, args, divot, divot - start, end - divot);792 return new (m_globalData) EvalFunctionCallNode(lineNumber, args, divot, divot - start, end - divot); 793 793 } 794 return new (m_globalData) FunctionCallResolveNode( m_globalData, identifier, args, divot, divot - start, end - divot);794 return new (m_globalData) FunctionCallResolveNode(lineNumber, identifier, args, divot, divot - start, end - divot); 795 795 } 796 796 if (func->isBracketAccessorNode()) { 797 797 BracketAccessorNode* bracket = static_cast<BracketAccessorNode*>(func); 798 FunctionCallBracketNode* node = new (m_globalData) FunctionCallBracketNode( m_globalData, bracket->base(), bracket->subscript(), args, divot, divot - start, end - divot);798 FunctionCallBracketNode* node = new (m_globalData) FunctionCallBracketNode(lineNumber, bracket->base(), bracket->subscript(), args, divot, divot - start, end - divot); 799 799 node->setSubexpressionInfo(bracket->divot(), bracket->endOffset()); 800 800 return node; … … 804 804 FunctionCallDotNode* node; 805 805 if (dot->identifier() == m_globalData->propertyNames->call) 806 node = new (m_globalData) CallFunctionCallDotNode( m_globalData, dot->base(), dot->identifier(), args, divot, divot - start, end - divot);806 node = new (m_globalData) CallFunctionCallDotNode(lineNumber, dot->base(), dot->identifier(), args, divot, divot - start, end - divot); 807 807 else if (dot->identifier() == m_globalData->propertyNames->apply) 808 node = new (m_globalData) ApplyFunctionCallDotNode( m_globalData, dot->base(), dot->identifier(), args, divot, divot - start, end - divot);808 node = new (m_globalData) ApplyFunctionCallDotNode(lineNumber, dot->base(), dot->identifier(), args, divot, divot - start, end - divot); 809 809 else 810 node = new (m_globalData) FunctionCallDotNode( m_globalData, dot->base(), dot->identifier(), args, divot, divot - start, end - divot);810 node = new (m_globalData) FunctionCallDotNode(lineNumber, dot->base(), dot->identifier(), args, divot, divot - start, end - divot); 811 811 node->setSubexpressionInfo(dot->divot(), dot->endOffset()); 812 812 return node; 813 813 } 814 814 815 ExpressionNode* ASTBuilder::makeBinaryNode(int token, pair<ExpressionNode*, BinaryOpInfo> lhs, pair<ExpressionNode*, BinaryOpInfo> rhs)815 ExpressionNode* ASTBuilder::makeBinaryNode(int lineNumber, int token, pair<ExpressionNode*, BinaryOpInfo> lhs, pair<ExpressionNode*, BinaryOpInfo> rhs) 816 816 { 817 817 switch (token) { 818 818 case OR: 819 return new (m_globalData) LogicalOpNode( m_globalData, lhs.first, rhs.first, OpLogicalOr);819 return new (m_globalData) LogicalOpNode(lineNumber, lhs.first, rhs.first, OpLogicalOr); 820 820 821 821 case AND: 822 return new (m_globalData) LogicalOpNode( m_globalData, lhs.first, rhs.first, OpLogicalAnd);822 return new (m_globalData) LogicalOpNode(lineNumber, lhs.first, rhs.first, OpLogicalAnd); 823 823 824 824 case BITOR: 825 return makeBitOrNode(l hs.first, rhs.first, rhs.second.hasAssignment);825 return makeBitOrNode(lineNumber, lhs.first, rhs.first, rhs.second.hasAssignment); 826 826 827 827 case BITXOR: 828 return makeBitXOrNode(l hs.first, rhs.first, rhs.second.hasAssignment);828 return makeBitXOrNode(lineNumber, lhs.first, rhs.first, rhs.second.hasAssignment); 829 829 830 830 case BITAND: 831 return makeBitAndNode(l hs.first, rhs.first, rhs.second.hasAssignment);831 return makeBitAndNode(lineNumber, lhs.first, rhs.first, rhs.second.hasAssignment); 832 832 833 833 case EQEQ: 834 return new (m_globalData) EqualNode( m_globalData, lhs.first, rhs.first, rhs.second.hasAssignment);834 return new (m_globalData) EqualNode(lineNumber, lhs.first, rhs.first, rhs.second.hasAssignment); 835 835 836 836 case NE: 837 return new (m_globalData) NotEqualNode( m_globalData, lhs.first, rhs.first, rhs.second.hasAssignment);837 return new (m_globalData) NotEqualNode(lineNumber, lhs.first, rhs.first, rhs.second.hasAssignment); 838 838 839 839 case STREQ: 840 return new (m_globalData) StrictEqualNode( m_globalData, lhs.first, rhs.first, rhs.second.hasAssignment);840 return new (m_globalData) StrictEqualNode(lineNumber, lhs.first, rhs.first, rhs.second.hasAssignment); 841 841 842 842 case STRNEQ: 843 return new (m_globalData) NotStrictEqualNode( m_globalData, lhs.first, rhs.first, rhs.second.hasAssignment);843 return new (m_globalData) NotStrictEqualNode(lineNumber, lhs.first, rhs.first, rhs.second.hasAssignment); 844 844 845 845 case LT: 846 return new (m_globalData) LessNode( m_globalData, lhs.first, rhs.first, rhs.second.hasAssignment);846 return new (m_globalData) LessNode(lineNumber, lhs.first, rhs.first, rhs.second.hasAssignment); 847 847 848 848 case GT: 849 return new (m_globalData) GreaterNode( m_globalData, lhs.first, rhs.first, rhs.second.hasAssignment);849 return new (m_globalData) GreaterNode(lineNumber, lhs.first, rhs.first, rhs.second.hasAssignment); 850 850 851 851 case LE: 852 return new (m_globalData) LessEqNode( m_globalData, lhs.first, rhs.first, rhs.second.hasAssignment);852 return new (m_globalData) LessEqNode(lineNumber, lhs.first, rhs.first, rhs.second.hasAssignment); 853 853 854 854 case GE: 855 return new (m_globalData) GreaterEqNode( m_globalData, lhs.first, rhs.first, rhs.second.hasAssignment);855 return new (m_globalData) GreaterEqNode(lineNumber, lhs.first, rhs.first, rhs.second.hasAssignment); 856 856 857 857 case INSTANCEOF: { 858 InstanceOfNode* node = new (m_globalData) InstanceOfNode( m_globalData, lhs.first, rhs.first, rhs.second.hasAssignment);858 InstanceOfNode* node = new (m_globalData) InstanceOfNode(lineNumber, lhs.first, rhs.first, rhs.second.hasAssignment); 859 859 setExceptionLocation(node, lhs.second.start, rhs.second.start, rhs.second.end); 860 860 return node; … … 862 862 863 863 case INTOKEN: { 864 InNode* node = new (m_globalData) InNode( m_globalData, lhs.first, rhs.first, rhs.second.hasAssignment);864 InNode* node = new (m_globalData) InNode(lineNumber, lhs.first, rhs.first, rhs.second.hasAssignment); 865 865 setExceptionLocation(node, lhs.second.start, rhs.second.start, rhs.second.end); 866 866 return node; … … 868 868 869 869 case LSHIFT: 870 return makeLeftShiftNode(l hs.first, rhs.first, rhs.second.hasAssignment);870 return makeLeftShiftNode(lineNumber, lhs.first, rhs.first, rhs.second.hasAssignment); 871 871 872 872 case RSHIFT: 873 return makeRightShiftNode(l hs.first, rhs.first, rhs.second.hasAssignment);873 return makeRightShiftNode(lineNumber, lhs.first, rhs.first, rhs.second.hasAssignment); 874 874 875 875 case URSHIFT: 876 return makeURightShiftNode(l hs.first, rhs.first, rhs.second.hasAssignment);876 return makeURightShiftNode(lineNumber, lhs.first, rhs.first, rhs.second.hasAssignment); 877 877 878 878 case PLUS: 879 return makeAddNode(l hs.first, rhs.first, rhs.second.hasAssignment);879 return makeAddNode(lineNumber, lhs.first, rhs.first, rhs.second.hasAssignment); 880 880 881 881 case MINUS: 882 return makeSubNode(l hs.first, rhs.first, rhs.second.hasAssignment);882 return makeSubNode(lineNumber, lhs.first, rhs.first, rhs.second.hasAssignment); 883 883 884 884 case TIMES: 885 return makeMultNode(l hs.first, rhs.first, rhs.second.hasAssignment);885 return makeMultNode(lineNumber, lhs.first, rhs.first, rhs.second.hasAssignment); 886 886 887 887 case DIVIDE: 888 return makeDivNode(l hs.first, rhs.first, rhs.second.hasAssignment);888 return makeDivNode(lineNumber, lhs.first, rhs.first, rhs.second.hasAssignment); 889 889 890 890 case MOD: 891 return makeModNode(l hs.first, rhs.first, rhs.second.hasAssignment);891 return makeModNode(lineNumber, lhs.first, rhs.first, rhs.second.hasAssignment); 892 892 } 893 893 CRASH(); … … 895 895 } 896 896 897 ExpressionNode* ASTBuilder::makeAssignNode( ExpressionNode* loc, Operator op, ExpressionNode* expr, bool locHasAssignments, bool exprHasAssignments, int start, int divot, int end)897 ExpressionNode* ASTBuilder::makeAssignNode(int lineNumber, ExpressionNode* loc, Operator op, ExpressionNode* expr, bool locHasAssignments, bool exprHasAssignments, int start, int divot, int end) 898 898 { 899 899 usesAssignment(); 900 900 if (!loc->isLocation()) 901 return new (m_globalData) AssignErrorNode( m_globalData, loc, op, expr, divot, divot - start, end - divot);901 return new (m_globalData) AssignErrorNode(lineNumber, loc, op, expr, divot, divot - start, end - divot); 902 902 903 903 if (loc->isResolveNode()) { 904 904 ResolveNode* resolve = static_cast<ResolveNode*>(loc); 905 905 if (op == OpEqual) { 906 AssignResolveNode* node = new (m_globalData) AssignResolveNode( m_globalData, resolve->identifier(), expr, exprHasAssignments);906 AssignResolveNode* node = new (m_globalData) AssignResolveNode(lineNumber, resolve->identifier(), expr, exprHasAssignments); 907 907 setExceptionLocation(node, start, divot, end); 908 908 return node; 909 909 } 910 return new (m_globalData) ReadModifyResolveNode( m_globalData, resolve->identifier(), op, expr, exprHasAssignments, divot, divot - start, end - divot);910 return new (m_globalData) ReadModifyResolveNode(lineNumber, resolve->identifier(), op, expr, exprHasAssignments, divot, divot - start, end - divot); 911 911 } 912 912 if (loc->isBracketAccessorNode()) { 913 913 BracketAccessorNode* bracket = static_cast<BracketAccessorNode*>(loc); 914 914 if (op == OpEqual) 915 return new (m_globalData) AssignBracketNode( m_globalData, bracket->base(), bracket->subscript(), expr, locHasAssignments, exprHasAssignments, bracket->divot(), bracket->divot() - start, end - bracket->divot());916 ReadModifyBracketNode* node = new (m_globalData) ReadModifyBracketNode( m_globalData, bracket->base(), bracket->subscript(), op, expr, locHasAssignments, exprHasAssignments, divot, divot - start, end - divot);915 return new (m_globalData) AssignBracketNode(lineNumber, bracket->base(), bracket->subscript(), expr, locHasAssignments, exprHasAssignments, bracket->divot(), bracket->divot() - start, end - bracket->divot()); 916 ReadModifyBracketNode* node = new (m_globalData) ReadModifyBracketNode(lineNumber, bracket->base(), bracket->subscript(), op, expr, locHasAssignments, exprHasAssignments, divot, divot - start, end - divot); 917 917 node->setSubexpressionInfo(bracket->divot(), bracket->endOffset()); 918 918 return node; … … 921 921 DotAccessorNode* dot = static_cast<DotAccessorNode*>(loc); 922 922 if (op == OpEqual) 923 return new (m_globalData) AssignDotNode( m_globalData, dot->base(), dot->identifier(), expr, exprHasAssignments, dot->divot(), dot->divot() - start, end - dot->divot());924 925 ReadModifyDotNode* node = new (m_globalData) ReadModifyDotNode( m_globalData, dot->base(), dot->identifier(), op, expr, exprHasAssignments, divot, divot - start, end - divot);923 return new (m_globalData) AssignDotNode(lineNumber, dot->base(), dot->identifier(), expr, exprHasAssignments, dot->divot(), dot->divot() - start, end - dot->divot()); 924 925 ReadModifyDotNode* node = new (m_globalData) ReadModifyDotNode(lineNumber, dot->base(), dot->identifier(), op, expr, exprHasAssignments, divot, divot - start, end - divot); 926 926 node->setSubexpressionInfo(dot->divot(), dot->endOffset()); 927 927 return node; 928 928 } 929 929 930 ExpressionNode* ASTBuilder::makePrefixNode( ExpressionNode* expr, Operator op, int start, int divot, int end)930 ExpressionNode* ASTBuilder::makePrefixNode(int lineNumber, ExpressionNode* expr, Operator op, int start, int divot, int end) 931 931 { 932 932 usesAssignment(); 933 933 if (!expr->isLocation()) 934 return new (m_globalData) PrefixErrorNode( m_globalData, expr, op, divot, divot - start, end - divot);934 return new (m_globalData) PrefixErrorNode(lineNumber, expr, op, divot, divot - start, end - divot); 935 935 936 936 if (expr->isResolveNode()) { 937 937 ResolveNode* resolve = static_cast<ResolveNode*>(expr); 938 return new (m_globalData) PrefixResolveNode( m_globalData, resolve->identifier(), op, divot, divot - start, end - divot);938 return new (m_globalData) PrefixResolveNode(lineNumber, resolve->identifier(), op, divot, divot - start, end - divot); 939 939 } 940 940 if (expr->isBracketAccessorNode()) { 941 941 BracketAccessorNode* bracket = static_cast<BracketAccessorNode*>(expr); 942 PrefixBracketNode* node = new (m_globalData) PrefixBracketNode( m_globalData, bracket->base(), bracket->subscript(), op, divot, divot - start, end - divot);942 PrefixBracketNode* node = new (m_globalData) PrefixBracketNode(lineNumber, bracket->base(), bracket->subscript(), op, divot, divot - start, end - divot); 943 943 node->setSubexpressionInfo(bracket->divot(), bracket->startOffset()); 944 944 return node; … … 946 946 ASSERT(expr->isDotAccessorNode()); 947 947 DotAccessorNode* dot = static_cast<DotAccessorNode*>(expr); 948 PrefixDotNode* node = new (m_globalData) PrefixDotNode( m_globalData, dot->base(), dot->identifier(), op, divot, divot - start, end - divot);948 PrefixDotNode* node = new (m_globalData) PrefixDotNode(lineNumber, dot->base(), dot->identifier(), op, divot, divot - start, end - divot); 949 949 node->setSubexpressionInfo(dot->divot(), dot->startOffset()); 950 950 return node; 951 951 } 952 952 953 ExpressionNode* ASTBuilder::makePostfixNode( ExpressionNode* expr, Operator op, int start, int divot, int end)953 ExpressionNode* ASTBuilder::makePostfixNode(int lineNumber, ExpressionNode* expr, Operator op, int start, int divot, int end) 954 954 { 955 955 usesAssignment(); 956 956 if (!expr->isLocation()) 957 return new (m_globalData) PostfixErrorNode( m_globalData, expr, op, divot, divot - start, end - divot);957 return new (m_globalData) PostfixErrorNode(lineNumber, expr, op, divot, divot - start, end - divot); 958 958 959 959 if (expr->isResolveNode()) { 960 960 ResolveNode* resolve = static_cast<ResolveNode*>(expr); 961 return new (m_globalData) PostfixResolveNode( m_globalData, resolve->identifier(), op, divot, divot - start, end - divot);961 return new (m_globalData) PostfixResolveNode(lineNumber, resolve->identifier(), op, divot, divot - start, end - divot); 962 962 } 963 963 if (expr->isBracketAccessorNode()) { 964 964 BracketAccessorNode* bracket = static_cast<BracketAccessorNode*>(expr); 965 PostfixBracketNode* node = new (m_globalData) PostfixBracketNode( m_globalData, bracket->base(), bracket->subscript(), op, divot, divot - start, end - divot);965 PostfixBracketNode* node = new (m_globalData) PostfixBracketNode(lineNumber, bracket->base(), bracket->subscript(), op, divot, divot - start, end - divot); 966 966 node->setSubexpressionInfo(bracket->divot(), bracket->endOffset()); 967 967 return node; … … 970 970 ASSERT(expr->isDotAccessorNode()); 971 971 DotAccessorNode* dot = static_cast<DotAccessorNode*>(expr); 972 PostfixDotNode* node = new (m_globalData) PostfixDotNode( m_globalData, dot->base(), dot->identifier(), op, divot, divot - start, end - divot);972 PostfixDotNode* node = new (m_globalData) PostfixDotNode(lineNumber, dot->base(), dot->identifier(), op, divot, divot - start, end - divot); 973 973 node->setSubexpressionInfo(dot->divot(), dot->endOffset()); 974 974 return node;
Note:
See TracChangeset
for help on using the changeset viewer.