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_position(location.line, location.startOffset, location.lineStartOffset) 47 { 48 ASSERT(location.startOffset >= location.lineStartOffset); 49 } 50 51 inline ExpressionNode::ExpressionNode(const JSTokenLocation& location, ResultType resultType) 52 : Node(location) 53 , m_resultType(resultType) 54 { 55 } 56 57 inline StatementNode::StatementNode(const JSTokenLocation& location) 58 : Node(location) 59 , m_lastLine(-1) 60 { 61 } 62 63 inline ConstantNode::ConstantNode(const JSTokenLocation& location, ResultType resultType) 64 : ExpressionNode(location, resultType) 65 { 66 } 67 68 inline NullNode::NullNode(const JSTokenLocation& location) 69 : ConstantNode(location, ResultType::nullType()) 70 { 71 } 72 73 inline BooleanNode::BooleanNode(const JSTokenLocation& location, bool value) 74 : ConstantNode(location, ResultType::booleanType()) 75 , m_value(value) 76 { 77 } 78 79 inline NumberNode::NumberNode(const JSTokenLocation& location, double value) 80 : ConstantNode(location, JSValue(value).isInt32() ? ResultType::numberTypeIsInt32() : ResultType::numberType()) 81 , m_value(value) 82 { 83 } 84 85 inline StringNode::StringNode(const JSTokenLocation& location, const Identifier& value) 86 : ConstantNode(location, ResultType::stringType()) 87 , m_value(value) 88 { 89 } 90 91 inline RegExpNode::RegExpNode(const JSTokenLocation& location, const Identifier& pattern, const Identifier& flags) 92 : ExpressionNode(location) 93 , m_pattern(pattern) 94 , m_flags(flags) 95 { 96 } 97 98 inline ThisNode::ThisNode(const JSTokenLocation& location) 99 : ExpressionNode(location) 100 { 101 } 102 103inline ResolveNode::ResolveNode(const JSTokenLocation& location, const Identifier& ident, const JSTextPosition& start) 104 : ExpressionNode(location) 105 , m_ident(ident) 106 , m_start(start) 107 { 108 ASSERT(m_start.offset >= m_start.lineStartOffset); 109 } 110 111 inline ElementNode::ElementNode(int elision, ExpressionNode* node) 112 : m_next(0) 113 , m_elision(elision) 114 , m_node(node) 115 { 116 } 117 118 inline ElementNode::ElementNode(ElementNode* l, int elision, ExpressionNode* node) 119 : m_next(0) 120 , m_elision(elision) 121 , m_node(node) 122 { 123 l->m_next = this; 124 } 125 126 inline ArrayNode::ArrayNode(const JSTokenLocation& location, int elision) 127 : ExpressionNode(location) 128 , m_element(0) 129 , m_elision(elision) 130 , m_optional(true) 131 { 132 } 133 134 inline ArrayNode::ArrayNode(const JSTokenLocation& location, ElementNode* element) 135 : ExpressionNode(location) 136 , m_element(element) 137 , m_elision(0) 138 , m_optional(false) 139 { 140 } 141 142 inline ArrayNode::ArrayNode(const JSTokenLocation& location, int elision, ElementNode* element) 143 : ExpressionNode(location) 144 , m_element(element) 145 , m_elision(elision) 146 , m_optional(true) 147 { 148 } 149 150 inline PropertyNode::PropertyNode(VM*, const Identifier& name, ExpressionNode* assign, Type type) 151 : m_name(&name) 152 , m_assign(assign) 153 , m_type(type) 154 { 155 } 156 157 inline PropertyNode::PropertyNode(VM* vm, double name, ExpressionNode* assign, Type type) 158 : m_name(&vm->parserArena->identifierArena().makeNumericIdentifier(vm, name)) 159 , m_assign(assign) 160 , m_type(type) 161 { 162 } 163 164 inline PropertyNode::PropertyNode(VM*, ExpressionNode* name, ExpressionNode* assign, Type type) 165 : m_name(0) 166 , m_expression(name) 167 , m_assign(assign) 168 , m_type(type) 169 { 170 } 171 172 inline PropertyListNode::PropertyListNode(const JSTokenLocation& location, PropertyNode* node) 173 : ExpressionNode(location) 174 , m_node(node) 175 , m_next(0) 176 { 177 } 178 179 inline PropertyListNode::PropertyListNode(const JSTokenLocation& location, PropertyNode* node, PropertyListNode* list) 180 : ExpressionNode(location) 181 , m_node(node) 182 , m_next(0) 183 { 184 list->m_next = this; 185 } 186 187 inline ObjectLiteralNode::ObjectLiteralNode(const JSTokenLocation& location) 188 : ExpressionNode(location) 189 , m_list(0) 190 { 191 } 192 193 inline ObjectLiteralNode::ObjectLiteralNode(const JSTokenLocation& location, PropertyListNode* list) 194 : ExpressionNode(location) 195 , m_list(list) 196 { 197 } 198 199 inline BracketAccessorNode::BracketAccessorNode(const JSTokenLocation& location, ExpressionNode* base, ExpressionNode* subscript, bool subscriptHasAssignments) 200 : ExpressionNode(location) 201 , m_base(base) 202 , m_subscript(subscript) 203 , m_subscriptHasAssignments(subscriptHasAssignments) 204 { 205 } 206 207 inline DotAccessorNode::DotAccessorNode(const JSTokenLocation& location, ExpressionNode* base, const Identifier& ident) 208 : ExpressionNode(location) 209 , m_base(base) 210 , m_ident(ident) 211 { 212 } 213 214 215 inline SpreadExpressionNode::SpreadExpressionNode(const JSTokenLocation& location, ExpressionNode* expression) 216 : ExpressionNode(location) 217 , m_expression(expression) 218 { 219 } 220 221 inline ArgumentListNode::ArgumentListNode(const JSTokenLocation& location, ExpressionNode* expr) 222 : ExpressionNode(location) 223 , m_next(0) 224 , m_expr(expr) 225 { 226 } 227 228 inline ArgumentListNode::ArgumentListNode(const JSTokenLocation& location, ArgumentListNode* listNode, ExpressionNode* expr) 229 : ExpressionNode(location) 230 , m_next(0) 231 , m_expr(expr) 232 { 233 listNode->m_next = this; 234 } 235 236 inline ArgumentsNode::ArgumentsNode() 237 : m_listNode(0) 238 { 239 } 240 241 inline ArgumentsNode::ArgumentsNode(ArgumentListNode* listNode) 242 : m_listNode(listNode) 243 { 244 } 245 246 inline NewExprNode::NewExprNode(const JSTokenLocation& location, ExpressionNode* expr) 247 : ExpressionNode(location) 248 , m_expr(expr) 249 , m_args(0) 250 { 251 } 252 253 inline NewExprNode::NewExprNode(const JSTokenLocation& location, ExpressionNode* expr, ArgumentsNode* args) 254 : ExpressionNode(location) 255 , m_expr(expr) 256 , m_args(args) 257 { 258 } 259 260 inline EvalFunctionCallNode::EvalFunctionCallNode(const JSTokenLocation& location, ArgumentsNode* args, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd) 261 : ExpressionNode(location) 262 , ThrowableExpressionData(divot, divotStart, divotEnd) 263 , m_args(args) 264 { 265 } 266 267 inline FunctionCallValueNode::FunctionCallValueNode(const JSTokenLocation& location, ExpressionNode* expr, ArgumentsNode* args, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd) 268 : ExpressionNode(location) 269 , ThrowableExpressionData(divot, divotStart, divotEnd) 270 , m_expr(expr) 271 , m_args(args) 272 { 273 ASSERT(divot.offset >= divotStart.offset); 274 } 275 276 inline FunctionCallResolveNode::FunctionCallResolveNode(const JSTokenLocation& location, const Identifier& ident, ArgumentsNode* args, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd) 277 : ExpressionNode(location) 278 , ThrowableExpressionData(divot, divotStart, divotEnd) 279 , m_ident(ident) 280 , m_args(args) 281 { 282 } 283 284 inline FunctionCallBracketNode::FunctionCallBracketNode(const JSTokenLocation& location, ExpressionNode* base, ExpressionNode* subscript, ArgumentsNode* args, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd) 285 : ExpressionNode(location) 286 , ThrowableSubExpressionData(divot, divotStart, divotEnd) 287 , m_base(base) 288 , m_subscript(subscript) 289 , m_args(args) 290 { 291 } 292 293 inline FunctionCallDotNode::FunctionCallDotNode(const JSTokenLocation& location, ExpressionNode* base, const Identifier& ident, ArgumentsNode* args, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd) 294 : ExpressionNode(location) 295 , ThrowableSubExpressionData(divot, divotStart, divotEnd) 296 , m_base(base) 297 , m_ident(ident) 298 , m_args(args) 299 { 300 } 301 302 inline CallFunctionCallDotNode::CallFunctionCallDotNode(const JSTokenLocation& location, ExpressionNode* base, const Identifier& ident, ArgumentsNode* args, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd) 303 : FunctionCallDotNode(location, base, ident, args, divot, divotStart, divotEnd) 304 { 305 } 306 307 inline ApplyFunctionCallDotNode::ApplyFunctionCallDotNode(const JSTokenLocation& location, ExpressionNode* base, const Identifier& ident, ArgumentsNode* args, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd) 308 : FunctionCallDotNode(location, base, ident, args, divot, divotStart, divotEnd) 309 { 310 } 311 312 inline PostfixNode::PostfixNode(const JSTokenLocation& location, ExpressionNode* expr, Operator oper, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd) 313 : PrefixNode(location, expr, oper, divot, divotStart, divotEnd) 314 { 315 } 316 317 inline DeleteResolveNode::DeleteResolveNode(const JSTokenLocation& location, const Identifier& ident, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd) 318 : ExpressionNode(location) 319 , ThrowableExpressionData(divot, divotStart, divotEnd) 320 , m_ident(ident) 321 { 322 } 323 324 inline DeleteBracketNode::DeleteBracketNode(const JSTokenLocation& location, ExpressionNode* base, ExpressionNode* subscript, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd) 325 : ExpressionNode(location) 326 , ThrowableExpressionData(divot, divotStart, divotEnd) 327 , m_base(base) 328 , m_subscript(subscript) 329 { 330 } 331 332 inline DeleteDotNode::DeleteDotNode(const JSTokenLocation& location, ExpressionNode* base, const Identifier& ident, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd) 333 : ExpressionNode(location) 334 , ThrowableExpressionData(divot, divotStart, divotEnd) 335 , m_base(base) 336 , m_ident(ident) 337 { 338 } 339 340 inline DeleteValueNode::DeleteValueNode(const JSTokenLocation& location, ExpressionNode* expr) 341 : ExpressionNode(location) 342 , m_expr(expr) 343 { 344 } 345 346 inline VoidNode::VoidNode(const JSTokenLocation& location, ExpressionNode* expr) 347 : ExpressionNode(location) 348 , m_expr(expr) 349 { 350 } 351 352 inline TypeOfResolveNode::TypeOfResolveNode(const JSTokenLocation& location, const Identifier& ident) 353 : ExpressionNode(location, ResultType::stringType()) 354 , m_ident(ident) 355 { 356 } 357 358 inline TypeOfValueNode::TypeOfValueNode(const JSTokenLocation& location, ExpressionNode* expr) 359 : ExpressionNode(location, ResultType::stringType()) 360 , m_expr(expr) 361 { 362 } 363 364 inline PrefixNode::PrefixNode(const JSTokenLocation& location, ExpressionNode* expr, Operator oper, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd) 365 : ExpressionNode(location) 366 , ThrowablePrefixedSubExpressionData(divot, divotStart, divotEnd) 367 , m_expr(expr) 368 , m_operator(oper) 369 { 370 } 371 372 inline UnaryOpNode::UnaryOpNode(const JSTokenLocation& location, ResultType type, ExpressionNode* expr, OpcodeID opcodeID) 373 : ExpressionNode(location, type) 374 , m_expr(expr) 375 , m_opcodeID(opcodeID) 376 { 377 } 378 379 inline UnaryPlusNode::UnaryPlusNode(const JSTokenLocation& location, ExpressionNode* expr) 380 : UnaryOpNode(location, ResultType::numberType(), expr, op_to_number) 381 { 382 } 383 384 inline NegateNode::NegateNode(const JSTokenLocation& location, ExpressionNode* expr) 385 : UnaryOpNode(location, ResultType::numberType(), expr, op_negate) 386 { 387 } 388 389 inline BitwiseNotNode::BitwiseNotNode(const JSTokenLocation& location, ExpressionNode* expr) 390 : ExpressionNode(location, ResultType::forBitOp()) 391 , m_expr(expr) 392 { 393 } 394 395 inline LogicalNotNode::LogicalNotNode(const JSTokenLocation& location, ExpressionNode* expr) 396 : UnaryOpNode(location, ResultType::booleanType(), expr, op_not) 397 { 398 } 399 400 inline BinaryOpNode::BinaryOpNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, OpcodeID opcodeID, bool rightHasAssignments) 401 : ExpressionNode(location) 402 , m_expr1(expr1) 403 , m_expr2(expr2) 404 , m_opcodeID(opcodeID) 405 , m_rightHasAssignments(rightHasAssignments) 406 { 407 } 408 409 inline BinaryOpNode::BinaryOpNode(const JSTokenLocation& location, ResultType type, ExpressionNode* expr1, ExpressionNode* expr2, OpcodeID opcodeID, bool rightHasAssignments) 410 : ExpressionNode(location, type) 411 , m_expr1(expr1) 412 , m_expr2(expr2) 413 , m_opcodeID(opcodeID) 414 , m_rightHasAssignments(rightHasAssignments) 415 { 416 } 417 418 inline MultNode::MultNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 419 : BinaryOpNode(location, ResultType::numberType(), expr1, expr2, op_mul, rightHasAssignments) 420 { 421 } 422 423 inline DivNode::DivNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 424 : BinaryOpNode(location, ResultType::numberType(), expr1, expr2, op_div, rightHasAssignments) 425 { 426 } 427 428 429 inline ModNode::ModNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 430 : BinaryOpNode(location, ResultType::numberType(), expr1, expr2, op_mod, rightHasAssignments) 431 { 432 } 433 434 inline AddNode::AddNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 435 : BinaryOpNode(location, ResultType::forAdd(expr1->resultDescriptor(), expr2->resultDescriptor()), expr1, expr2, op_add, rightHasAssignments) 436 { 437 } 438 439 inline SubNode::SubNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 440 : BinaryOpNode(location, ResultType::numberType(), expr1, expr2, op_sub, rightHasAssignments) 441 { 442 } 443 444 inline LeftShiftNode::LeftShiftNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 445 : BinaryOpNode(location, ResultType::forBitOp(), expr1, expr2, op_lshift, rightHasAssignments) 446 { 447 } 448 449 inline RightShiftNode::RightShiftNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 450 : BinaryOpNode(location, ResultType::forBitOp(), expr1, expr2, op_rshift, rightHasAssignments) 451 { 452 } 453 454 inline UnsignedRightShiftNode::UnsignedRightShiftNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 455 : BinaryOpNode(location, ResultType::numberType(), expr1, expr2, op_urshift, rightHasAssignments) 456 { 457 } 458 459 inline LessNode::LessNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 460 : BinaryOpNode(location, ResultType::booleanType(), expr1, expr2, op_less, rightHasAssignments) 461 { 462 } 463 464 inline GreaterNode::GreaterNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 465 : BinaryOpNode(location, ResultType::booleanType(), expr1, expr2, op_greater, rightHasAssignments) 466 { 467 } 468 469 inline LessEqNode::LessEqNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 470 : BinaryOpNode(location, ResultType::booleanType(), expr1, expr2, op_lesseq, rightHasAssignments) 471 { 472 } 473 474 inline GreaterEqNode::GreaterEqNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 475 : BinaryOpNode(location, ResultType::booleanType(), expr1, expr2, op_greatereq, rightHasAssignments) 476 { 477 } 478 479 inline ThrowableBinaryOpNode::ThrowableBinaryOpNode(const JSTokenLocation& location, ResultType type, ExpressionNode* expr1, ExpressionNode* expr2, OpcodeID opcodeID, bool rightHasAssignments) 480 : BinaryOpNode(location, type, expr1, expr2, opcodeID, rightHasAssignments) 481 { 482 } 483 484 inline ThrowableBinaryOpNode::ThrowableBinaryOpNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, OpcodeID opcodeID, bool rightHasAssignments) 485 : BinaryOpNode(location, expr1, expr2, opcodeID, rightHasAssignments) 486 { 487 } 488 489 inline InstanceOfNode::InstanceOfNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 490 : ThrowableBinaryOpNode(location, ResultType::booleanType(), expr1, expr2, op_instanceof, rightHasAssignments) 491 { 492 } 493 494 inline InNode::InNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 495 : ThrowableBinaryOpNode(location, expr1, expr2, op_in, rightHasAssignments) 496 { 497 } 498 499 inline EqualNode::EqualNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 500 : BinaryOpNode(location, ResultType::booleanType(), expr1, expr2, op_eq, rightHasAssignments) 501 { 502 } 503 504 inline NotEqualNode::NotEqualNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 505 : BinaryOpNode(location, ResultType::booleanType(), expr1, expr2, op_neq, rightHasAssignments) 506 { 507 } 508 509 inline StrictEqualNode::StrictEqualNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 510 : BinaryOpNode(location, ResultType::booleanType(), expr1, expr2, op_stricteq, rightHasAssignments) 511 { 512 } 513 514 inline NotStrictEqualNode::NotStrictEqualNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 515 : BinaryOpNode(location, ResultType::booleanType(), expr1, expr2, op_nstricteq, rightHasAssignments) 516 { 517 } 518 519 inline BitAndNode::BitAndNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 520 : BinaryOpNode(location, ResultType::forBitOp(), expr1, expr2, op_bitand, rightHasAssignments) 521 { 522 } 523 524 inline BitOrNode::BitOrNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 525 : BinaryOpNode(location, ResultType::forBitOp(), expr1, expr2, op_bitor, rightHasAssignments) 526 { 527 } 528 529 inline BitXOrNode::BitXOrNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 530 : BinaryOpNode(location, ResultType::forBitOp(), expr1, expr2, op_bitxor, rightHasAssignments) 531 { 532 } 533 534 inline LogicalOpNode::LogicalOpNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, LogicalOperator oper) 535 : ExpressionNode(location, ResultType::forLogicalOp(expr1->resultDescriptor(), expr2->resultDescriptor())) 536 , m_expr1(expr1) 537 , m_expr2(expr2) 538 , m_operator(oper) 539 { 540 } 541 542 inline ConditionalNode::ConditionalNode(const JSTokenLocation& location, ExpressionNode* logical, ExpressionNode* expr1, ExpressionNode* expr2) 543 : ExpressionNode(location) 544 , m_logical(logical) 545 , m_expr1(expr1) 546 , m_expr2(expr2) 547 { 548 } 549 550 inline ReadModifyResolveNode::ReadModifyResolveNode(const JSTokenLocation& location, const Identifier& ident, Operator oper, ExpressionNode* right, bool rightHasAssignments, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd) 551 : ExpressionNode(location) 552 , ThrowableExpressionData(divot, divotStart, divotEnd) 553 , m_ident(ident) 554 , m_right(right) 555 , m_operator(oper) 556 , m_rightHasAssignments(rightHasAssignments) 557 { 558 } 559 560 inline AssignResolveNode::AssignResolveNode(const JSTokenLocation& location, const Identifier& ident, ExpressionNode* right) 561 : ExpressionNode(location) 562 , m_ident(ident) 563 , m_right(right) 564 { 565 } 566 567 568 inline ReadModifyBracketNode::ReadModifyBracketNode(const JSTokenLocation& location, ExpressionNode* base, ExpressionNode* subscript, Operator oper, ExpressionNode* right, bool subscriptHasAssignments, bool rightHasAssignments, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd) 569 : ExpressionNode(location) 570 , ThrowableSubExpressionData(divot, divotStart, divotEnd) 571 , m_base(base) 572 , m_subscript(subscript) 573 , m_right(right) 574 , m_operator(oper) 575 , m_subscriptHasAssignments(subscriptHasAssignments) 576 , m_rightHasAssignments(rightHasAssignments) 577 { 578 } 579 580 inline AssignBracketNode::AssignBracketNode(const JSTokenLocation& location, ExpressionNode* base, ExpressionNode* subscript, ExpressionNode* right, bool subscriptHasAssignments, bool rightHasAssignments, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd) 581 : ExpressionNode(location) 582 , ThrowableExpressionData(divot, divotStart, divotEnd) 583 , m_base(base) 584 , m_subscript(subscript) 585 , m_right(right) 586 , m_subscriptHasAssignments(subscriptHasAssignments) 587 , m_rightHasAssignments(rightHasAssignments) 588 { 589 } 590 591 inline AssignDotNode::AssignDotNode(const JSTokenLocation& location, ExpressionNode* base, const Identifier& ident, ExpressionNode* right, bool rightHasAssignments, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd) 592 : ExpressionNode(location) 593 , ThrowableExpressionData(divot, divotStart, divotEnd) 594 , m_base(base) 595 , m_ident(ident) 596 , m_right(right) 597 , m_rightHasAssignments(rightHasAssignments) 598 { 599 } 600 601 inline ReadModifyDotNode::ReadModifyDotNode(const JSTokenLocation& location, ExpressionNode* base, const Identifier& ident, Operator oper, ExpressionNode* right, bool rightHasAssignments, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd) 602 : ExpressionNode(location) 603 , ThrowableSubExpressionData(divot, divotStart, divotEnd) 604 , m_base(base) 605 , m_ident(ident) 606 , m_right(right) 607 , m_operator(oper) 608 , m_rightHasAssignments(rightHasAssignments) 609 { 610 } 611 612 inline AssignErrorNode::AssignErrorNode(const JSTokenLocation& location, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd) 613 : ExpressionNode(location) 614 , ThrowableExpressionData(divot, divotStart, divotEnd) 615 { 616 } 617 618 inline CommaNode::CommaNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2) 619 : ExpressionNode(location) 620 { 621 ASSERT(expr1); 622 ASSERT(expr2); 623 m_expressions.append(expr1); 624 m_expressions.append(expr2); 625 } 626 627 inline ConstStatementNode::ConstStatementNode(const JSTokenLocation& location, ConstDeclNode* next) 628 : StatementNode(location) 629 , m_next(next) 630 { 631 } 632 633 inline SourceElements::SourceElements() 634 { 635 } 636 637 inline EmptyStatementNode::EmptyStatementNode(const JSTokenLocation& location) 638 : StatementNode(location) 639 { 640 } 641 642 inline DebuggerStatementNode::DebuggerStatementNode(const JSTokenLocation& location) 643 : StatementNode(location) 644 { 645 } 646 647 inline ExprStatementNode::ExprStatementNode(const JSTokenLocation& location, ExpressionNode* expr) 648 : StatementNode(location) 649 , m_expr(expr) 650 { 651 } 652 653 inline VarStatementNode::VarStatementNode(const JSTokenLocation& location, ExpressionNode* expr) 654 : StatementNode(location) 655 , m_expr(expr) 656 { 657 } 658 659 inline IfElseNode::IfElseNode(const JSTokenLocation& location, ExpressionNode* condition, StatementNode* ifBlock, StatementNode* elseBlock) 660 : StatementNode(location) 661 , m_condition(condition) 662 , m_ifBlock(ifBlock) 663 , m_elseBlock(elseBlock) 664 { 665 } 666 667 inline DoWhileNode::DoWhileNode(const JSTokenLocation& location, StatementNode* statement, ExpressionNode* expr) 668 : StatementNode(location) 669 , m_statement(statement) 670 , m_expr(expr) 671 { 672 } 673 674 inline WhileNode::WhileNode(const JSTokenLocation& location, ExpressionNode* expr, StatementNode* statement) 675 : StatementNode(location) 676 , m_expr(expr) 677 , m_statement(statement) 678 { 679 } 680 681 inline ForNode::ForNode(const JSTokenLocation& location, ExpressionNode* expr1, ExpressionNode* expr2, ExpressionNode* expr3, StatementNode* statement) 682 : StatementNode(location) 683 , m_expr1(expr1) 684 , m_expr2(expr2) 685 , m_expr3(expr3) 686 , m_statement(statement) 687 { 688 ASSERT(statement); 689 } 690 691 inline ContinueNode::ContinueNode(VM* vm, const JSTokenLocation& location) 692 : StatementNode(location) 693 , m_ident(vm->propertyNames->nullIdentifier) 694 { 695 } 696 697 inline ContinueNode::ContinueNode(const JSTokenLocation& location, const Identifier& ident) 698 : StatementNode(location) 699 , m_ident(ident) 700 { 701 } 702 703 inline BreakNode::BreakNode(VM* vm, const JSTokenLocation& location) 704 : StatementNode(location) 705 , m_ident(vm->propertyNames->nullIdentifier) 706 { 707 } 708 709 inline BreakNode::BreakNode(const JSTokenLocation& location, const Identifier& ident) 710 : StatementNode(location) 711 , m_ident(ident) 712 { 713 } 714 715 inline ReturnNode::ReturnNode(const JSTokenLocation& location, ExpressionNode* value) 716 : StatementNode(location) 717 , m_value(value) 718 { 719 } 720 721 inline WithNode::WithNode(const JSTokenLocation& location, ExpressionNode* expr, StatementNode* statement, const JSTextPosition& divot, uint32_t expressionLength) 722 : StatementNode(location) 723 , m_expr(expr) 724 , m_statement(statement) 725 , m_divot(divot) 726 , m_expressionLength(expressionLength) 727 { 728 } 729 730 inline LabelNode::LabelNode(const JSTokenLocation& location, const Identifier& name, StatementNode* statement) 731 : StatementNode(location) 732 , m_name(name) 733 , m_statement(statement) 734 { 735 } 736 737 inline ThrowNode::ThrowNode(const JSTokenLocation& location, ExpressionNode* expr) 738 : StatementNode(location) 739 , m_expr(expr) 740 { 741 } 742 743 inline TryNode::TryNode(const JSTokenLocation& location, StatementNode* tryBlock, const Identifier& exceptionIdent, StatementNode* catchBlock, StatementNode* finallyBlock) 744 : StatementNode(location) 745 , m_tryBlock(tryBlock) 746 , m_exceptionIdent(exceptionIdent) 747 , m_catchBlock(catchBlock) 748 , m_finallyBlock(finallyBlock) 749 { 750 } 751 752 inline ParameterNode::ParameterNode(PassRefPtr<DeconstructionPatternNode> pattern) 753 : m_pattern(pattern) 754 , m_next(0) 755 { 756 ASSERT(m_pattern); 757 } 758 759 inline ParameterNode::ParameterNode(ParameterNode* l, PassRefPtr<DeconstructionPatternNode> pattern) 760 : m_pattern(pattern) 761 , m_next(0) 762 { 763 l->m_next = this; 764 ASSERT(m_pattern); 765 ASSERT(l->m_pattern); 766 } 767 768 inline FuncExprNode::FuncExprNode(const JSTokenLocation& location, const Identifier& ident, FunctionBodyNode* body, const SourceCode& source, ParameterNode* parameter) 769 : ExpressionNode(location) 770 , m_body(body) 771 { 772 m_body->finishParsing(source, parameter, ident, FunctionExpression); 773 } 774 775 inline FuncDeclNode::FuncDeclNode(const JSTokenLocation& location, const Identifier& ident, FunctionBodyNode* body, const SourceCode& source, ParameterNode* parameter) 776 : StatementNode(location) 777 , m_body(body) 778 { 779 m_body->finishParsing(source, parameter, ident, FunctionDeclaration); 780 } 781 782 inline CaseClauseNode::CaseClauseNode(ExpressionNode* expr, SourceElements* statements) 783 : m_expr(expr) 784 , m_statements(statements) 785 { 786 } 787 788 inline ClauseListNode::ClauseListNode(CaseClauseNode* clause) 789 : m_clause(clause) 790 , m_next(0) 791 { 792 } 793 794 inline ClauseListNode::ClauseListNode(ClauseListNode* clauseList, CaseClauseNode* clause) 795 : m_clause(clause) 796 , m_next(0) 797 { 798 clauseList->m_next = this; 799 } 800 801 inline CaseBlockNode::CaseBlockNode(ClauseListNode* list1, CaseClauseNode* defaultClause, ClauseListNode* list2) 802 : m_list1(list1) 803 , m_defaultClause(defaultClause) 804 , m_list2(list2) 805 { 806 } 807 808 inline SwitchNode::SwitchNode(const JSTokenLocation& location, ExpressionNode* expr, CaseBlockNode* block) 809 : StatementNode(location) 810 , m_expr(expr) 811 , m_block(block) 812 { 813 } 814 815 inline ConstDeclNode::ConstDeclNode(const JSTokenLocation& location, const Identifier& ident, ExpressionNode* init) 816 : ExpressionNode(location) 817 , m_ident(ident) 818 , m_next(0) 819 , m_init(init) 820 { 821 } 822 823 inline BlockNode::BlockNode(const JSTokenLocation& location, SourceElements* statements) 824 : StatementNode(location) 825 , m_statements(statements) 826 { 827 } 828 829 inline EnumerationNode::EnumerationNode(const JSTokenLocation& location, ExpressionNode* l, ExpressionNode* expr, StatementNode* statement) 830 : StatementNode(location) 831 , m_lexpr(l) 832 , m_expr(expr) 833 , m_statement(statement) 834 { 835 ASSERT(l); 836 } 837 838 inline EnumerationNode::EnumerationNode(VM* vm, const JSTokenLocation& location, DeconstructionPatternNode* pattern, ExpressionNode* expr, StatementNode* statement) 839 : StatementNode(location) 840 , m_lexpr(new (vm) DeconstructingAssignmentNode(location, pattern, 0)) 841 , m_expr(expr) 842 , m_statement(statement) 843 { 844 ASSERT(pattern); 845 } 846 847 inline ForInNode::ForInNode(const JSTokenLocation& location, ExpressionNode* l, ExpressionNode* expr, StatementNode* statement) 848 : EnumerationNode(location, l, expr, statement) 849 { 850 } 851 852 inline ForInNode::ForInNode(VM* vm, const JSTokenLocation& location, DeconstructionPatternNode* pattern, ExpressionNode* expr, StatementNode* statement) 853 : EnumerationNode(vm, location, pattern, expr, statement) 854 { 855 } 856 857 inline ForOfNode::ForOfNode(const JSTokenLocation& location, ExpressionNode* l, ExpressionNode* expr, StatementNode* statement) 858 : EnumerationNode(location, l, expr, statement) 859 { 860 } 861 862 inline ForOfNode::ForOfNode(VM* vm, const JSTokenLocation& location, DeconstructionPatternNode* pattern, ExpressionNode* expr, StatementNode* statement) 863 : EnumerationNode(vm, location, pattern, expr, statement) 864 { 865 } 866 867 inline DeconstructionPatternNode::DeconstructionPatternNode(VM*) 868 { 869 } 870 871 inline ArrayPatternNode::ArrayPatternNode(VM* vm) 872 : DeconstructionPatternNode(vm) 873 { 874 } 875 876 inline PassRefPtr<ArrayPatternNode> ArrayPatternNode::create(VM* vm) 877 { 878 return adoptRef(new ArrayPatternNode(vm)); 879 } 880 881 inline ObjectPatternNode::ObjectPatternNode(VM* vm) 882 : DeconstructionPatternNode(vm) 883 { 884 } 885 886 inline PassRefPtr<ObjectPatternNode> ObjectPatternNode::create(VM* vm) 887 { 888 return adoptRef(new ObjectPatternNode(vm)); 889 } 890 891 inline PassRefPtr<BindingNode> BindingNode::create(VM* vm, const Identifier& boundProperty, const JSTextPosition& start, const JSTextPosition& end) 892 { 893 return adoptRef(new BindingNode(vm, boundProperty, start, end)); 894 } 895 896 inline BindingNode::BindingNode(VM* vm, const Identifier& boundProperty, const JSTextPosition& start, const JSTextPosition& end) 897 : DeconstructionPatternNode(vm) 898 , m_divotStart(start) 899 , m_divotEnd(end) 900 , m_boundProperty(boundProperty) 901 { 902 } 903 904 inline DeconstructingAssignmentNode::DeconstructingAssignmentNode(const JSTokenLocation& location, PassRefPtr<DeconstructionPatternNode> bindings, ExpressionNode* initializer) 905 : ExpressionNode(location) 906 , m_bindings(bindings) 907 , m_initializer(initializer) 908 { 909 } 910 911} // namespace JSC 912 913#endif // NodeConstructors_h 914