1/* 2 * Copyright (C) 2009, 2013 Apple Inc. All rights reserved. 3 * 4 * This library is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU Library General Public 6 * License as published by the Free Software Foundation; either 7 * version 2 of the License, or (at your option) any later version. 8 * 9 * This library is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 * Library General Public License for more details. 13 * 14 * You should have received a copy of the GNU Library General Public License 15 * along with this library; see the file COPYING.LIB. If not, write to 16 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 17 * Boston, MA 02110-1301, USA. 18 * 19 */ 20 21#ifndef NodeConstructors_h 22#define NodeConstructors_h 23 24#include "Nodes.h" 25#include "Lexer.h" 26#include "Parser.h" 27 28namespace JSC { 29 30 inline void* ParserArenaFreeable::operator new(size_t size, VM* vm) 31 { 32 return vm->parserArena->allocateFreeable(size); 33 } 34 35 inline void* ParserArenaDeletable::operator new(size_t size, VM* vm) 36 { 37 return vm->parserArena->allocateDeletable(size); 38 } 39 40 inline ParserArenaRefCounted::ParserArenaRefCounted(VM* vm) 41 { 42 vm->parserArena->derefWithArena(adoptRef(this)); 43 } 44 45 inline Node::Node(const JSTokenLocation& location) 46 : m_lineNumber(location.line) 47 , m_startOffset(location.startOffset) 48 , m_lineStartOffset(location.lineStartOffset) 49 { 50 ASSERT(location.startOffset >= location.lineStartOffset); 51 } 52 53 inline ExpressionNode::ExpressionNode(const JSTokenLocation& location, ResultType resultType) 54 : Node(location) 55 , m_resultType(resultType) 56 { 57 } 58 59 inline StatementNode::StatementNode(const JSTokenLocation& location) 60 : Node(location) 61 , m_lastLine(-1) 62 { 63 } 64 65 inline ConstantNode::ConstantNode(const JSTokenLocation& location, ResultType resultType) 66 : ExpressionNode(location, resultType) 67 { 68 } 69 70 inline NullNode::NullNode(const JSTokenLocation& location) 71 : ConstantNode(location, ResultType::nullType()) 72 { 73 } 74 75 inline BooleanNode::BooleanNode(const JSTokenLocation& location, bool value) 76 : ConstantNode(location, ResultType::booleanType()) 77 , m_value(value) 78 { 79 } 80 81 inline NumberNode::NumberNode(const JSTokenLocation& location, double value) 82 : ConstantNode(location, JSValue(value).isInt32() ? ResultType::numberTypeIsInt32() : ResultType::numberType()) 83 , m_value(value) 84 { 85 } 86 87 inline StringNode::StringNode(const JSTokenLocation& location, const Identifier& value) 88 : ConstantNode(location, ResultType::stringType()) 89 , m_value(value) 90 { 91 } 92 93 inline RegExpNode::RegExpNode(const JSTokenLocation& location, const Identifier& pattern, const Identifier& flags) 94 : ExpressionNode(location) 95 , m_pattern(pattern) 96 , m_flags(flags) 97 { 98 } 99 100 inline ThisNode::ThisNode(const JSTokenLocation& location) 101 : ExpressionNode(location) 102 { 103 } 104 105inline ResolveNode::ResolveNode(const JSTokenLocation& location, const Identifier& ident, unsigned startOffset, unsigned divotLine, unsigned divotLineStart) 106 : ExpressionNode(location) 107 , m_ident(ident) 108 , m_startOffset(startOffset) 109 , m_divotLine(divotLine) 110 , m_divotLineStart(divotLineStart) 111 { 112 ASSERT(m_startOffset >= m_divotLineStart); 113 } 114 115 inline ElementNode::ElementNode(int elision, ExpressionNode* node) 116 : m_next(0) 117 , m_elision(elision) 118 , m_node(node) 119 { 120 } 121 122 inline ElementNode::ElementNode(ElementNode* l, int elision, ExpressionNode* node) 123 : m_next(0) 124 , m_elision(elision) 125 , m_node(node) 126 { 127 l->m_next = this; 128 } 129 130 inline ArrayNode::ArrayNode(const JSTokenLocation& location, int elision) 131 : ExpressionNode(location) 132 , m_element(0) 133 , m_elision(elision) 134 , m_optional(true) 135 { 136 } 137 138 inline ArrayNode::ArrayNode(const JSTokenLocation& location, ElementNode* element) 139 : ExpressionNode(location) 140 , m_element(element) 141 , m_elision(0) 142 , m_optional(false) 143 { 144 } 145 146 inline ArrayNode::ArrayNode(const JSTokenLocation& location, int elision, ElementNode* element) 147 : ExpressionNode(location) 148 , m_element(element) 149 , m_elision(elision) 150 , m_optional(true) 151 { 152 } 153 154 inline PropertyNode::PropertyNode(VM*, const Identifier& name, ExpressionNode* assign, Type type) 155 : m_name(name) 156 , m_assign(assign) 157 , m_type(type) 158 { 159 } 160 161 inline PropertyNode::PropertyNode(VM* vm, double name, ExpressionNode* assign, Type type) 162 : m_name(vm->parserArena->identifierArena().makeNumericIdentifier(vm, name)) 163 , m_assign(assign) 164 , m_type(type) 165 { 166 } 167 168 inline PropertyListNode::PropertyListNode(const JSTokenLocation& location, PropertyNode* node) 169 : ExpressionNode(location) 170 , m_node(node) 171 , m_next(0) 172 { 173 } 174 175 inline PropertyListNode::PropertyListNode(const JSTokenLocation& location, PropertyNode* node, PropertyListNode* list) 176 : ExpressionNode(location) 177 , m_node(node) 178 , m_next(0) 179 { 180 list->m_next = this; 181 } 182 183 inline ObjectLiteralNode::ObjectLiteralNode(const JSTokenLocation& location) 184 : ExpressionNode(location) 185 , m_list(0) 186 { 187 } 188 189 inline ObjectLiteralNode::ObjectLiteralNode(const JSTokenLocation& location, PropertyListNode* list) 190 : ExpressionNode(location) 191 , m_list(list) 192 { 193 } 194 195 inline BracketAccessorNode::BracketAccessorNode(const JSTokenLocation& location, ExpressionNode* base, ExpressionNode* subscript, bool subscriptHasAssignments) 196 : ExpressionNode(location) 197 , m_base(base) 198 , m_subscript(subscript) 199 , m_subscriptHasAssignments(subscriptHasAssignments) 200 { 201 } 202 203 inline DotAccessorNode::DotAccessorNode(const JSTokenLocation& location, ExpressionNode* base, const Identifier& ident) 204 : ExpressionNode(location) 205 , m_base(base) 206 , m_ident(ident) 207 { 208 } 209 210 inline ArgumentListNode::ArgumentListNode(const JSTokenLocation& location, ExpressionNode* expr) 211 : ExpressionNode(location) 212 , m_next(0) 213 , m_expr(expr) 214 { 215 } 216 217 inline ArgumentListNode::ArgumentListNode(const JSTokenLocation& location, ArgumentListNode* listNode, ExpressionNode* expr) 218 : ExpressionNode(location) 219 , m_next(0) 220 , m_expr(expr) 221 { 222 listNode->m_next = this; 223 } 224 225 inline ArgumentsNode::ArgumentsNode() 226 : m_listNode(0) 227 { 228 } 229 230 inline ArgumentsNode::ArgumentsNode(ArgumentListNode* listNode) 231 : m_listNode(listNode) 232 { 233 } 234 235 inline NewExprNode::NewExprNode(const JSTokenLocation& location, ExpressionNode* expr) 236 : ExpressionNode(location) 237 , m_expr(expr) 238 , m_args(0) 239 { 240 } 241 242 inline NewExprNode::NewExprNode(const JSTokenLocation& location, ExpressionNode* expr, ArgumentsNode* args) 243 : ExpressionNode(location) 244 , m_expr(expr) 245 , m_args(args) 246 { 247 } 248 249 inline EvalFunctionCallNode::EvalFunctionCallNode(const JSTokenLocation& location, ArgumentsNode* args, unsigned divot, unsigned startOffset, unsigned endOffset, unsigned divotLine, unsigned divotLineStart) 250 : ExpressionNode(location) 251 , ThrowableExpressionData(divot, startOffset, endOffset, divotLine, divotLineStart) 252 , m_args(args) 253 { 254 ASSERT(divot >= divotLineStart); 255 } 256 257 inline FunctionCallValueNode::FunctionCallValueNode(const JSTokenLocation& location, ExpressionNode* expr, ArgumentsNode* args, unsigned divot, unsigned startOffset, unsigned endOffset, unsigned divotLine, unsigned divotLineStart) 258 : ExpressionNode(location) 259 , ThrowableExpressionData(divot, startOffset, endOffset, divotLine, divotLineStart) 260 , m_expr(expr) 261 , m_args(args) 262 { 263 } 264 265 inline FunctionCallResolveNode::FunctionCallResolveNode(const JSTokenLocation& location, const Identifier& ident, ArgumentsNode* args, unsigned divot, unsigned startOffset, unsigned endOffset, unsigned divotLine, unsigned divotLineStart) 266 : ExpressionNode(location) 267 , ThrowableExpressionData(divot, startOffset, endOffset, divotLine, divotLineStart) 268 , m_ident(ident) 269 , m_args(args) 270 { 271 } 272 273 inline FunctionCallBracketNode::FunctionCallBracketNode(const JSTokenLocation& location, ExpressionNode* base, ExpressionNode* subscript, ArgumentsNode* args, unsigned divot, unsigned startOffset, unsigned endOffset, unsigned divotLine, unsigned divotLineStart) 274 : ExpressionNode(location) 275 , ThrowableSubExpressionData(divot, startOffset, endOffset, divotLine, divotLineStart) 276 , m_base(base) 277 , m_subscript(subscript) 278 , m_args(args) 279 { 280 } 281 282 inline FunctionCallDotNode::FunctionCallDotNode(const JSTokenLocation& location, ExpressionNode* base, const Identifier& ident, ArgumentsNode* args, unsigned divot, unsigned startOffset, unsigned endOffset, unsigned divotLine, unsigned divotLineStart) 283 : ExpressionNode(location) 284 , ThrowableSubExpressionData(divot, startOffset, endOffset, divotLine, divotLineStart) 285 , m_base(base) 286 , m_ident(ident) 287 , m_args(args) 288 { 289 } 290 291 inline CallFunctionCallDotNode::CallFunctionCallDotNode(const JSTokenLocation& location, ExpressionNode* base, const Identifier& ident, ArgumentsNode* args, unsigned divot, unsigned startOffset, unsigned endOffset, unsigned divotLine, unsigned divotLineStart) 292 : FunctionCallDotNode(location, base, ident, args, divot, startOffset, endOffset, divotLine, divotLineStart) 293 { 294 } 295 296 inline ApplyFunctionCallDotNode::ApplyFunctionCallDotNode(const JSTokenLocation& location, ExpressionNode* base, const Identifier& ident, ArgumentsNode* args, unsigned divot, unsigned startOffset, unsigned endOffset, unsigned divotLine, unsigned divotLineStart) 297 : FunctionCallDotNode(location, base, ident, args, divot, startOffset, endOffset, divotLine, divotLineStart) 298 { 299 } 300 301 inline PostfixNode::PostfixNode(const JSTokenLocation& location, ExpressionNode* expr, Operator oper, unsigned divot, unsigned startOffset, unsigned endOffset, unsigned divotLine, unsigned divotLineStart) 302 : PrefixNode(location, expr, oper, divot, startOffset, endOffset, divotLine, divotLineStart) 303 { 304 } 305 306 inline DeleteResolveNode::DeleteResolveNode(const JSTokenLocation& location, const Identifier& ident, unsigned divot, unsigned startOffset, unsigned endOffset, unsigned divotLine, unsigned divotLineStart) 307 : ExpressionNode(location) 308 , ThrowableExpressionData(divot, startOffset, endOffset, divotLine, divotLineStart) 309 , m_ident(ident) 310 { 311 } 312 313 inline DeleteBracketNode::DeleteBracketNode(const JSTokenLocation& location, ExpressionNode* base, ExpressionNode* subscript, unsigned divot, unsigned startOffset, unsigned endOffset, unsigned divotLine, unsigned divotLineStart) 314 : ExpressionNode(location) 315 , ThrowableExpressionData(divot, startOffset, endOffset, divotLine, divotLineStart) 316 , m_base(base) 317 , m_subscript(subscript) 318 { 319 } 320 321 inline DeleteDotNode::DeleteDotNode(const JSTokenLocation& location, ExpressionNode* base, const Identifier& ident, unsigned divot, unsigned startOffset, unsigned endOffset, unsigned divotLine, unsigned divotLineStart) 322 : ExpressionNode(location) 323 , ThrowableExpressionData(divot, startOffset, endOffset, divotLine, divotLineStart) 324 , m_base(base) 325 , m_ident(ident) 326 { 327 } 328 329 inline DeleteValueNode::DeleteValueNode(const JSTokenLocation& location, ExpressionNode* expr) 330 : ExpressionNode(location) 331 , m_expr(expr) 332 { 333 } 334 335 inline VoidNode::VoidNode(const JSTokenLocation& location, ExpressionNode* expr) 336 : ExpressionNode(location) 337 , m_expr(expr) 338 { 339 } 340 341 inline TypeOfResolveNode::TypeOfResolveNode(const JSTokenLocation& location, const Identifier& ident) 342 : ExpressionNode(location, ResultType::stringType()) 343 , m_ident(ident) 344 { 345 } 346 347 inline TypeOfValueNode::TypeOfValueNode(const JSTokenLocation& location, ExpressionNode* expr) 348 : ExpressionNode(location, ResultType::stringType()) 349 , m_expr(expr) 350 { 351 } 352 353 inline PrefixNode::PrefixNode(const JSTokenLocation& location, ExpressionNode* expr, Operator oper, unsigned divot, unsigned startOffset, unsigned endOffset, unsigned divotLine, unsigned divotLineStart) 354 : ExpressionNode(location) 355 , ThrowablePrefixedSubExpressionData(divot, startOffset, endOffset, divotLine, divotLineStart) 356 , m_expr(expr) 357 , m_operator(oper) 358 { 359 } 360 361 inline UnaryOpNode::UnaryOpNode(const JSTokenLocation& location, ResultType type, ExpressionNode* expr, OpcodeID opcodeID) 362 : ExpressionNode(location, type) 363 , m_expr(expr) 364 , m_opcodeID(opcodeID) 365 { 366 } 367 368 inline UnaryPlusNode::UnaryPlusNode(const JSTokenLocation& location, ExpressionNode* expr) 369 : UnaryOpNode(location, ResultType::numberType(), expr, op_to_number) 370 { 371 } 372 373 inline NegateNode::NegateNode(const JSTokenLocation& location, ExpressionNode* expr) 374 : UnaryOpNode(location, ResultType::numberType(), expr, op_negate) 375 { 376 } 377 378 inline BitwiseNotNode::BitwiseNotNode(const JSTokenLocation& location, ExpressionNode* expr) 379 : ExpressionNode(location, ResultType::forBitOp()) 380 , m_expr(expr) 381 { 382 } 383 384 inline LogicalNotNode::LogicalNotNode(const JSTokenLocation& location, ExpressionNode* expr) 385 : UnaryOpNode(location, ResultType::booleanType(), expr, op_not) 386 { 387 } 388 389 inline BinaryOpNode::BinaryOpNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, OpcodeID opcodeID, bool rightHasAssignments) 390 : ExpressionNode(location) 391 , m_expr1(expr1) 392 , m_expr2(expr2) 393 , m_opcodeID(opcodeID) 394 , m_rightHasAssignments(rightHasAssignments) 395 { 396 } 397 398 inline BinaryOpNode::BinaryOpNode(const JSTokenLocation& location, ResultType type, ExpressionNode* expr1, ExpressionNode* expr2, OpcodeID opcodeID, bool rightHasAssignments) 399 : ExpressionNode(location, type) 400 , m_expr1(expr1) 401 , m_expr2(expr2) 402 , m_opcodeID(opcodeID) 403 , m_rightHasAssignments(rightHasAssignments) 404 { 405 } 406 407 inline MultNode::MultNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 408 : BinaryOpNode(location, ResultType::numberType(), expr1, expr2, op_mul, rightHasAssignments) 409 { 410 } 411 412 inline DivNode::DivNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 413 : BinaryOpNode(location, ResultType::numberType(), expr1, expr2, op_div, rightHasAssignments) 414 { 415 } 416 417 418 inline ModNode::ModNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 419 : BinaryOpNode(location, ResultType::numberType(), expr1, expr2, op_mod, rightHasAssignments) 420 { 421 } 422 423 inline AddNode::AddNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 424 : BinaryOpNode(location, ResultType::forAdd(expr1->resultDescriptor(), expr2->resultDescriptor()), expr1, expr2, op_add, rightHasAssignments) 425 { 426 } 427 428 inline SubNode::SubNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 429 : BinaryOpNode(location, ResultType::numberType(), expr1, expr2, op_sub, rightHasAssignments) 430 { 431 } 432 433 inline LeftShiftNode::LeftShiftNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 434 : BinaryOpNode(location, ResultType::forBitOp(), expr1, expr2, op_lshift, rightHasAssignments) 435 { 436 } 437 438 inline RightShiftNode::RightShiftNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 439 : BinaryOpNode(location, ResultType::forBitOp(), expr1, expr2, op_rshift, rightHasAssignments) 440 { 441 } 442 443 inline UnsignedRightShiftNode::UnsignedRightShiftNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 444 : BinaryOpNode(location, ResultType::numberType(), expr1, expr2, op_urshift, rightHasAssignments) 445 { 446 } 447 448 inline LessNode::LessNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 449 : BinaryOpNode(location, ResultType::booleanType(), expr1, expr2, op_less, rightHasAssignments) 450 { 451 } 452 453 inline GreaterNode::GreaterNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 454 : BinaryOpNode(location, ResultType::booleanType(), expr1, expr2, op_greater, rightHasAssignments) 455 { 456 } 457 458 inline LessEqNode::LessEqNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 459 : BinaryOpNode(location, ResultType::booleanType(), expr1, expr2, op_lesseq, rightHasAssignments) 460 { 461 } 462 463 inline GreaterEqNode::GreaterEqNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 464 : BinaryOpNode(location, ResultType::booleanType(), expr1, expr2, op_greatereq, rightHasAssignments) 465 { 466 } 467 468 inline ThrowableBinaryOpNode::ThrowableBinaryOpNode(const JSTokenLocation& location, ResultType type, ExpressionNode* expr1, ExpressionNode* expr2, OpcodeID opcodeID, bool rightHasAssignments) 469 : BinaryOpNode(location, type, expr1, expr2, opcodeID, rightHasAssignments) 470 { 471 } 472 473 inline ThrowableBinaryOpNode::ThrowableBinaryOpNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, OpcodeID opcodeID, bool rightHasAssignments) 474 : BinaryOpNode(location, expr1, expr2, opcodeID, rightHasAssignments) 475 { 476 } 477 478 inline InstanceOfNode::InstanceOfNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 479 : ThrowableBinaryOpNode(location, ResultType::booleanType(), expr1, expr2, op_instanceof, rightHasAssignments) 480 { 481 } 482 483 inline InNode::InNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 484 : ThrowableBinaryOpNode(location, expr1, expr2, op_in, rightHasAssignments) 485 { 486 } 487 488 inline EqualNode::EqualNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 489 : BinaryOpNode(location, ResultType::booleanType(), expr1, expr2, op_eq, rightHasAssignments) 490 { 491 } 492 493 inline NotEqualNode::NotEqualNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 494 : BinaryOpNode(location, ResultType::booleanType(), expr1, expr2, op_neq, rightHasAssignments) 495 { 496 } 497 498 inline StrictEqualNode::StrictEqualNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 499 : BinaryOpNode(location, ResultType::booleanType(), expr1, expr2, op_stricteq, rightHasAssignments) 500 { 501 } 502 503 inline NotStrictEqualNode::NotStrictEqualNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 504 : BinaryOpNode(location, ResultType::booleanType(), expr1, expr2, op_nstricteq, rightHasAssignments) 505 { 506 } 507 508 inline BitAndNode::BitAndNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 509 : BinaryOpNode(location, ResultType::forBitOp(), expr1, expr2, op_bitand, rightHasAssignments) 510 { 511 } 512 513 inline BitOrNode::BitOrNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 514 : BinaryOpNode(location, ResultType::forBitOp(), expr1, expr2, op_bitor, rightHasAssignments) 515 { 516 } 517 518 inline BitXOrNode::BitXOrNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 519 : BinaryOpNode(location, ResultType::forBitOp(), expr1, expr2, op_bitxor, rightHasAssignments) 520 { 521 } 522 523 inline LogicalOpNode::LogicalOpNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, LogicalOperator oper) 524 : ExpressionNode(location, ResultType::forLogicalOp(expr1->resultDescriptor(), expr2->resultDescriptor())) 525 , m_expr1(expr1) 526 , m_expr2(expr2) 527 , m_operator(oper) 528 { 529 } 530 531 inline ConditionalNode::ConditionalNode(const JSTokenLocation& location, ExpressionNode* logical, ExpressionNode* expr1, ExpressionNode* expr2) 532 : ExpressionNode(location) 533 , m_logical(logical) 534 , m_expr1(expr1) 535 , m_expr2(expr2) 536 { 537 } 538 539 inline ReadModifyResolveNode::ReadModifyResolveNode(const JSTokenLocation& location, const Identifier& ident, Operator oper, ExpressionNode* right, bool rightHasAssignments, unsigned divot, unsigned startOffset, unsigned endOffset, unsigned divotLine, unsigned divotLineStart) 540 : ExpressionNode(location) 541 , ThrowableExpressionData(divot, startOffset, endOffset, divotLine, divotLineStart) 542 , m_ident(ident) 543 , m_right(right) 544 , m_operator(oper) 545 , m_rightHasAssignments(rightHasAssignments) 546 { 547 ASSERT(divot >= divotLineStart); 548 ASSERT(divot - startOffset >= divotLineStart); 549 } 550 551 inline AssignResolveNode::AssignResolveNode(const JSTokenLocation& location, const Identifier& ident, ExpressionNode* right) 552 : ExpressionNode(location) 553 , m_ident(ident) 554 , m_right(right) 555 { 556 } 557 558 inline ReadModifyBracketNode::ReadModifyBracketNode(const JSTokenLocation& location, ExpressionNode* base, ExpressionNode* subscript, Operator oper, ExpressionNode* right, bool subscriptHasAssignments, bool rightHasAssignments, unsigned divot, unsigned startOffset, unsigned endOffset, unsigned divotLine, unsigned divotLineStart) 559 : ExpressionNode(location) 560 , ThrowableSubExpressionData(divot, startOffset, endOffset, divotLine, divotLineStart) 561 , m_base(base) 562 , m_subscript(subscript) 563 , m_right(right) 564 , m_operator(oper) 565 , m_subscriptHasAssignments(subscriptHasAssignments) 566 , m_rightHasAssignments(rightHasAssignments) 567 { 568 } 569 570 inline AssignBracketNode::AssignBracketNode(const JSTokenLocation& location, ExpressionNode* base, ExpressionNode* subscript, ExpressionNode* right, bool subscriptHasAssignments, bool rightHasAssignments, unsigned divot, unsigned startOffset, unsigned endOffset, unsigned divotLine, unsigned divotLineStart) 571 : ExpressionNode(location) 572 , ThrowableExpressionData(divot, startOffset, endOffset, divotLine, divotLineStart) 573 , m_base(base) 574 , m_subscript(subscript) 575 , m_right(right) 576 , m_subscriptHasAssignments(subscriptHasAssignments) 577 , m_rightHasAssignments(rightHasAssignments) 578 { 579 } 580 581 inline AssignDotNode::AssignDotNode(const JSTokenLocation& location, ExpressionNode* base, const Identifier& ident, ExpressionNode* right, bool rightHasAssignments, unsigned divot, unsigned startOffset, unsigned endOffset, unsigned divotLine, unsigned divotLineStart) 582 : ExpressionNode(location) 583 , ThrowableExpressionData(divot, startOffset, endOffset, divotLine, divotLineStart) 584 , m_base(base) 585 , m_ident(ident) 586 , m_right(right) 587 , m_rightHasAssignments(rightHasAssignments) 588 { 589 } 590 591 inline ReadModifyDotNode::ReadModifyDotNode(const JSTokenLocation& location, ExpressionNode* base, const Identifier& ident, Operator oper, ExpressionNode* right, bool rightHasAssignments, unsigned divot, unsigned startOffset, unsigned endOffset, unsigned divotLine, unsigned divotLineStart) 592 : ExpressionNode(location) 593 , ThrowableSubExpressionData(divot, startOffset, endOffset, divotLine, divotLineStart) 594 , m_base(base) 595 , m_ident(ident) 596 , m_right(right) 597 , m_operator(oper) 598 , m_rightHasAssignments(rightHasAssignments) 599 { 600 } 601 602 inline AssignErrorNode::AssignErrorNode(const JSTokenLocation& location, unsigned divot, unsigned startOffset, unsigned endOffset, unsigned divotLine, unsigned divotLineStart) 603 : ExpressionNode(location) 604 , ThrowableExpressionData(divot, startOffset, endOffset, divotLine, divotLineStart) 605 { 606 } 607 608 inline CommaNode::CommaNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2) 609 : ExpressionNode(location) 610 { 611 m_expressions.append(expr1); 612 m_expressions.append(expr2); 613 } 614 615 inline ConstStatementNode::ConstStatementNode(const JSTokenLocation& location, ConstDeclNode* next) 616 : StatementNode(location) 617 , m_next(next) 618 { 619 } 620 621 inline SourceElements::SourceElements() 622 { 623 } 624 625 inline EmptyStatementNode::EmptyStatementNode(const JSTokenLocation& location) 626 : StatementNode(location) 627 { 628 } 629 630 inline DebuggerStatementNode::DebuggerStatementNode(const JSTokenLocation& location) 631 : StatementNode(location) 632 { 633 } 634 635 inline ExprStatementNode::ExprStatementNode(const JSTokenLocation& location, ExpressionNode* expr) 636 : StatementNode(location) 637 , m_expr(expr) 638 { 639 } 640 641 inline VarStatementNode::VarStatementNode(const JSTokenLocation& location, ExpressionNode* expr) 642 : StatementNode(location) 643 , m_expr(expr) 644 { 645 } 646 647 inline IfElseNode::IfElseNode(const JSTokenLocation& location, ExpressionNode* condition, StatementNode* ifBlock, StatementNode* elseBlock) 648 : StatementNode(location) 649 , m_condition(condition) 650 , m_ifBlock(ifBlock) 651 , m_elseBlock(elseBlock) 652 { 653 } 654 655 inline DoWhileNode::DoWhileNode(const JSTokenLocation& location, StatementNode* statement, ExpressionNode* expr) 656 : StatementNode(location) 657 , m_statement(statement) 658 , m_expr(expr) 659 { 660 } 661 662 inline WhileNode::WhileNode(const JSTokenLocation& location, ExpressionNode* expr, StatementNode* statement) 663 : StatementNode(location) 664 , m_expr(expr) 665 , m_statement(statement) 666 { 667 } 668 669 inline ForNode::ForNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, ExpressionNode* expr3, StatementNode* statement) 670 : StatementNode(location) 671 , m_expr1(expr1) 672 , m_expr2(expr2) 673 , m_expr3(expr3) 674 , m_statement(statement) 675 { 676 ASSERT(statement); 677 } 678 679 inline ContinueNode::ContinueNode(VM* vm, const JSTokenLocation& location) 680 : StatementNode(location) 681 , m_ident(vm->propertyNames->nullIdentifier) 682 { 683 } 684 685 inline ContinueNode::ContinueNode(const JSTokenLocation& location, const Identifier& ident) 686 : StatementNode(location) 687 , m_ident(ident) 688 { 689 } 690 691 inline BreakNode::BreakNode(VM* vm, const JSTokenLocation& location) 692 : StatementNode(location) 693 , m_ident(vm->propertyNames->nullIdentifier) 694 { 695 } 696 697 inline BreakNode::BreakNode(const JSTokenLocation& location, const Identifier& ident) 698 : StatementNode(location) 699 , m_ident(ident) 700 { 701 } 702 703 inline ReturnNode::ReturnNode(const JSTokenLocation& location, ExpressionNode* value) 704 : StatementNode(location) 705 , m_value(value) 706 { 707 } 708 709 inline WithNode::WithNode(const JSTokenLocation& location, ExpressionNode* expr, StatementNode* statement, uint32_t divot, unsigned divotLine, unsigned divotLineStart, uint32_t expressionLength) 710 : StatementNode(location) 711 , m_expr(expr) 712 , m_statement(statement) 713 , m_divot(divot) 714 , m_divotLine(divotLine) 715 , m_divotLineStart(divotLineStart) 716 , m_expressionLength(expressionLength) 717 { 718 } 719 720 inline LabelNode::LabelNode(const JSTokenLocation& location, const Identifier& name, StatementNode* statement) 721 : StatementNode(location) 722 , m_name(name) 723 , m_statement(statement) 724 { 725 } 726 727 inline ThrowNode::ThrowNode(const JSTokenLocation& location, ExpressionNode* expr) 728 : StatementNode(location) 729 , m_expr(expr) 730 { 731 } 732 733 inline TryNode::TryNode(const JSTokenLocation& location, StatementNode* tryBlock, const Identifier& exceptionIdent, StatementNode* catchBlock, StatementNode* finallyBlock) 734 : StatementNode(location) 735 , m_tryBlock(tryBlock) 736 , m_exceptionIdent(exceptionIdent) 737 , m_catchBlock(catchBlock) 738 , m_finallyBlock(finallyBlock) 739 { 740 } 741 742 inline ParameterNode::ParameterNode(const Identifier& ident) 743 : m_ident(ident) 744 , m_next(0) 745 { 746 } 747 748 inline ParameterNode::ParameterNode(ParameterNode* l, const Identifier& ident) 749 : m_ident(ident) 750 , m_next(0) 751 { 752 l->m_next = this; 753 } 754 755 inline FuncExprNode::FuncExprNode(const JSTokenLocation& location, const Identifier& ident, FunctionBodyNode* body, const SourceCode& source, ParameterNode* parameter) 756 : ExpressionNode(location) 757 , m_body(body) 758 { 759 m_body->finishParsing(source, parameter, ident, FunctionNameIsInScope); 760 } 761 762 inline FuncDeclNode::FuncDeclNode(const JSTokenLocation& location, const Identifier& ident, FunctionBodyNode* body, const SourceCode& source, ParameterNode* parameter) 763 : StatementNode(location) 764 , m_body(body) 765 { 766 m_body->finishParsing(source, parameter, ident, FunctionNameIsNotInScope); 767 } 768 769 inline CaseClauseNode::CaseClauseNode(ExpressionNode* expr, SourceElements* statements) 770 : m_expr(expr) 771 , m_statements(statements) 772 { 773 } 774 775 inline ClauseListNode::ClauseListNode(CaseClauseNode* clause) 776 : m_clause(clause) 777 , m_next(0) 778 { 779 } 780 781 inline ClauseListNode::ClauseListNode(ClauseListNode* clauseList, CaseClauseNode* clause) 782 : m_clause(clause) 783 , m_next(0) 784 { 785 clauseList->m_next = this; 786 } 787 788 inline CaseBlockNode::CaseBlockNode(ClauseListNode* list1, CaseClauseNode* defaultClause, ClauseListNode* list2) 789 : m_list1(list1) 790 , m_defaultClause(defaultClause) 791 , m_list2(list2) 792 { 793 } 794 795 inline SwitchNode::SwitchNode(const JSTokenLocation& location, ExpressionNode* expr, CaseBlockNode* block) 796 : StatementNode(location) 797 , m_expr(expr) 798 , m_block(block) 799 { 800 } 801 802 inline ConstDeclNode::ConstDeclNode(const JSTokenLocation& location, const Identifier& ident, ExpressionNode* init) 803 : ExpressionNode(location) 804 , m_ident(ident) 805 , m_next(0) 806 , m_init(init) 807 { 808 } 809 810 inline BlockNode::BlockNode(const JSTokenLocation& location, SourceElements* statements) 811 : StatementNode(location) 812 , m_statements(statements) 813 { 814 } 815 816 inline ForInNode::ForInNode(const JSTokenLocation& location, ExpressionNode* l, ExpressionNode* expr, StatementNode* statement) 817 : StatementNode(location) 818 , m_init(0) 819 , m_lexpr(l) 820 , m_expr(expr) 821 , m_statement(statement) 822 { 823 } 824 825 inline ForInNode::ForInNode(VM* vm, const JSTokenLocation& location, const Identifier& ident, ExpressionNode* in, ExpressionNode* expr, StatementNode* statement, unsigned divot, int startOffset, int endOffset, unsigned divotLine, unsigned divotLineStart) 826 : StatementNode(location) 827 , m_init(0) 828 , m_lexpr(new (vm) ResolveNode(location, ident, divot - startOffset, divotLine, divotLineStart)) 829 , m_expr(expr) 830 , m_statement(statement) 831 { 832 if (in) { 833 AssignResolveNode* node = new (vm) AssignResolveNode(location, ident, in); 834 ASSERT(divot >= divotLineStart); 835 node->setExceptionSourceCode(divot, divot - startOffset, endOffset - divot, divotLine, divotLineStart); 836 m_init = node; 837 } 838 // for( var foo = bar in baz ) 839 } 840 841} // namespace JSC 842 843#endif // NodeConstructors_h 844