1 /* 2 * Copyright (C) 1999-2000 Harri Porten (porten@kde.org) 3 * Copyright (C) 2001 Peter Kelly (pmk@post.com) 4 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. 5 * Copyright (C) 2007 Cameron Zwarich (cwzwarich@uwaterloo.ca) 6 * Copyright (C) 2007 Maks Orlovich 7 * Copyright (C) 2007 Eric Seidel <eric@webkit.org> 8 * 9 * This library is free software; you can redistribute it and/or 10 * modify it under the terms of the GNU Library General Public 11 * License as published by the Free Software Foundation; either 12 * version 2 of the License, or (at your option) any later version. 13 * 14 * This library is distributed in the hope that it will be useful, 15 * but WITHOUT ANY WARRANTY; without even the implied warranty of 16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 17 * Library General Public License for more details. 18 * 19 * You should have received a copy of the GNU Library General Public License 20 * along with this library; see the file COPYING.LIB. If not, write to 21 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 22 * Boston, MA 02110-1301, USA. 23 * 24 */ 25 26 #ifndef Nodes_h 27 #define Nodes_h 28 29 #include "Error.h" 30 #include "JITCode.h" 31 #include "Opcode.h" 32 #include "ParserArena.h" 33 #include "ResultType.h" 34 #include "SourceCode.h" 35 #include "SymbolTable.h" 36 #include <wtf/MathExtras.h> 37 #include <wtf/OwnPtr.h> 38 39 namespace JSC { 40 41 class ArgumentListNode; 42 class CodeBlock; 43 class BytecodeGenerator; 44 class FuncDeclNode; 45 class EvalCodeBlock; 46 class JSFunction; 47 class ProgramCodeBlock; 48 class PropertyListNode; 49 class ReadModifyResolveNode; 50 class RegisterID; 51 class ScopeChainNode; 52 53 typedef unsigned CodeFeatures; 54 55 const CodeFeatures NoFeatures = 0; 56 const CodeFeatures EvalFeature = 1 << 0; 57 const CodeFeatures ClosureFeature = 1 << 1; 58 const CodeFeatures AssignFeature = 1 << 2; 59 const CodeFeatures ArgumentsFeature = 1 << 3; 60 const CodeFeatures WithFeature = 1 << 4; 61 const CodeFeatures CatchFeature = 1 << 5; 62 const CodeFeatures ThisFeature = 1 << 6; 63 const CodeFeatures AllFeatures = EvalFeature | ClosureFeature | AssignFeature | ArgumentsFeature | WithFeature | CatchFeature | ThisFeature; 64 65 enum Operator { 66 OpEqual, 67 OpPlusEq, 68 OpMinusEq, 69 OpMultEq, 70 OpDivEq, 71 OpPlusPlus, 72 OpMinusMinus, 73 OpAndEq, 74 OpXOrEq, 75 OpOrEq, 76 OpModEq, 77 OpLShift, 78 OpRShift, 79 OpURShift 80 }; 81 82 enum LogicalOperator { 83 OpLogicalAnd, 84 OpLogicalOr 85 }; 86 87 namespace DeclarationStacks { 88 enum VarAttrs { IsConstant = 1, HasInitializer = 2 }; 89 typedef Vector<std::pair<Identifier, unsigned> > VarStack; 90 typedef Vector<FuncDeclNode*> FunctionStack; 91 } 92 93 struct SwitchInfo { 94 enum SwitchType { SwitchNone, SwitchImmediate, SwitchCharacter, SwitchString }; 95 uint32_t bytecodeOffset; 96 SwitchType switchType; 97 }; 98 99 class ParserArenaDeletable { 100 protected: ParserArenaDeletable()101 ParserArenaDeletable() { } 102 103 public: ~ParserArenaDeletable()104 virtual ~ParserArenaDeletable() { } 105 106 // Objects created with this version of new are deleted when the arena is deleted. 107 void* operator new(size_t, JSGlobalData*); 108 109 // Objects created with this version of new are not deleted when the arena is deleted. 110 // Other arrangements must be made. 111 void* operator new(size_t); 112 113 void operator delete(void*); 114 }; 115 116 class ParserArenaRefCounted : public RefCountedCustomAllocated<ParserArenaRefCounted> { 117 protected: 118 ParserArenaRefCounted(JSGlobalData*); 119 120 public: ~ParserArenaRefCounted()121 virtual ~ParserArenaRefCounted() 122 { 123 ASSERT(deletionHasBegun()); 124 } 125 }; 126 127 class Node : public ParserArenaDeletable { 128 protected: 129 Node(JSGlobalData*); 130 131 public: 132 /* 133 Return value: The register holding the production's value. 134 dst: An optional parameter specifying the most efficient 135 destination at which to store the production's value. 136 The callee must honor dst. 137 138 dst provides for a crude form of copy propagation. For example, 139 140 x = 1 141 142 becomes 143 144 load r[x], 1 145 146 instead of 147 148 load r0, 1 149 mov r[x], r0 150 151 because the assignment node, "x =", passes r[x] as dst to the number 152 node, "1". 153 */ 154 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* dst = 0) = 0; 155 lineNo()156 int lineNo() const { return m_line; } 157 158 protected: 159 int m_line; 160 }; 161 162 class ExpressionNode : public Node { 163 public: 164 ExpressionNode(JSGlobalData*, ResultType = ResultType::unknownType()); 165 isNumber()166 virtual bool isNumber() const { return false; } isString()167 virtual bool isString() const { return false; } isNull()168 virtual bool isNull() const { return false; } isPure(BytecodeGenerator &)169 virtual bool isPure(BytecodeGenerator&) const { return false; } isLocation()170 virtual bool isLocation() const { return false; } isResolveNode()171 virtual bool isResolveNode() const { return false; } isBracketAccessorNode()172 virtual bool isBracketAccessorNode() const { return false; } isDotAccessorNode()173 virtual bool isDotAccessorNode() const { return false; } isFuncExprNode()174 virtual bool isFuncExprNode() const { return false; } isCommaNode()175 virtual bool isCommaNode() const { return false; } isSimpleArray()176 virtual bool isSimpleArray() const { return false; } isAdd()177 virtual bool isAdd() const { return false; } 178 stripUnaryPlus()179 virtual ExpressionNode* stripUnaryPlus() { return this; } 180 resultDescriptor()181 ResultType resultDescriptor() const { return m_resultType; } 182 183 // This needs to be in public in order to compile using GCC 3.x 184 typedef enum { EvalOperator, FunctionCall } CallerType; 185 186 private: 187 ResultType m_resultType; 188 }; 189 190 class StatementNode : public Node { 191 public: 192 StatementNode(JSGlobalData*); 193 194 void setLoc(int line0, int line1); firstLine()195 int firstLine() const { return lineNo(); } lastLine()196 int lastLine() const { return m_lastLine; } 197 isEmptyStatement()198 virtual bool isEmptyStatement() const { return false; } isReturnNode()199 virtual bool isReturnNode() const { return false; } isExprStatement()200 virtual bool isExprStatement() const { return false; } 201 isBlock()202 virtual bool isBlock() const { return false; } 203 204 private: 205 int m_lastLine; 206 }; 207 208 class NullNode : public ExpressionNode { 209 public: 210 NullNode(JSGlobalData*); 211 212 private: 213 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 214 isNull()215 virtual bool isNull() const { return true; } 216 }; 217 218 class BooleanNode : public ExpressionNode { 219 public: 220 BooleanNode(JSGlobalData*, bool value); 221 222 private: 223 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 224 isPure(BytecodeGenerator &)225 virtual bool isPure(BytecodeGenerator&) const { return true; } 226 227 bool m_value; 228 }; 229 230 class NumberNode : public ExpressionNode { 231 public: 232 NumberNode(JSGlobalData*, double v); 233 value()234 double value() const { return m_double; } setValue(double d)235 void setValue(double d) { m_double = d; } 236 237 private: 238 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 239 isNumber()240 virtual bool isNumber() const { return true; } isPure(BytecodeGenerator &)241 virtual bool isPure(BytecodeGenerator&) const { return true; } 242 243 double m_double; 244 }; 245 246 class StringNode : public ExpressionNode { 247 public: 248 StringNode(JSGlobalData*, const Identifier& v); 249 value()250 const Identifier& value() { return m_value; } isPure(BytecodeGenerator &)251 virtual bool isPure(BytecodeGenerator&) const { return true; } 252 253 private: 254 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 255 isString()256 virtual bool isString() const { return true; } 257 258 Identifier m_value; 259 }; 260 261 class ThrowableExpressionData { 262 public: ThrowableExpressionData()263 ThrowableExpressionData() 264 : m_divot(static_cast<uint32_t>(-1)) 265 , m_startOffset(static_cast<uint16_t>(-1)) 266 , m_endOffset(static_cast<uint16_t>(-1)) 267 { 268 } 269 ThrowableExpressionData(unsigned divot,unsigned startOffset,unsigned endOffset)270 ThrowableExpressionData(unsigned divot, unsigned startOffset, unsigned endOffset) 271 : m_divot(divot) 272 , m_startOffset(startOffset) 273 , m_endOffset(endOffset) 274 { 275 } 276 setExceptionSourceCode(unsigned divot,unsigned startOffset,unsigned endOffset)277 void setExceptionSourceCode(unsigned divot, unsigned startOffset, unsigned endOffset) 278 { 279 m_divot = divot; 280 m_startOffset = startOffset; 281 m_endOffset = endOffset; 282 } 283 divot()284 uint32_t divot() const { return m_divot; } startOffset()285 uint16_t startOffset() const { return m_startOffset; } endOffset()286 uint16_t endOffset() const { return m_endOffset; } 287 288 protected: 289 RegisterID* emitThrowError(BytecodeGenerator&, ErrorType, const char* msg); 290 RegisterID* emitThrowError(BytecodeGenerator&, ErrorType, const char* msg, const Identifier&); 291 292 private: 293 uint32_t m_divot; 294 uint16_t m_startOffset; 295 uint16_t m_endOffset; 296 }; 297 298 class ThrowableSubExpressionData : public ThrowableExpressionData { 299 public: ThrowableSubExpressionData()300 ThrowableSubExpressionData() 301 : ThrowableExpressionData() 302 , m_subexpressionDivotOffset(0) 303 , m_subexpressionEndOffset(0) 304 { 305 } 306 ThrowableSubExpressionData(unsigned divot,unsigned startOffset,unsigned endOffset)307 ThrowableSubExpressionData(unsigned divot, unsigned startOffset, unsigned endOffset) 308 : ThrowableExpressionData(divot, startOffset, endOffset) 309 , m_subexpressionDivotOffset(0) 310 , m_subexpressionEndOffset(0) 311 { 312 } 313 setSubexpressionInfo(uint32_t subexpressionDivot,uint16_t subexpressionOffset)314 void setSubexpressionInfo(uint32_t subexpressionDivot, uint16_t subexpressionOffset) 315 { 316 ASSERT(subexpressionDivot <= divot()); 317 if ((divot() - subexpressionDivot) & ~0xFFFF) // Overflow means we can't do this safely, so just point at the primary divot 318 return; 319 m_subexpressionDivotOffset = divot() - subexpressionDivot; 320 m_subexpressionEndOffset = subexpressionOffset; 321 } 322 323 protected: 324 uint16_t m_subexpressionDivotOffset; 325 uint16_t m_subexpressionEndOffset; 326 }; 327 328 class ThrowablePrefixedSubExpressionData : public ThrowableExpressionData { 329 public: ThrowablePrefixedSubExpressionData()330 ThrowablePrefixedSubExpressionData() 331 : ThrowableExpressionData() 332 , m_subexpressionDivotOffset(0) 333 , m_subexpressionStartOffset(0) 334 { 335 } 336 ThrowablePrefixedSubExpressionData(unsigned divot,unsigned startOffset,unsigned endOffset)337 ThrowablePrefixedSubExpressionData(unsigned divot, unsigned startOffset, unsigned endOffset) 338 : ThrowableExpressionData(divot, startOffset, endOffset) 339 , m_subexpressionDivotOffset(0) 340 , m_subexpressionStartOffset(0) 341 { 342 } 343 setSubexpressionInfo(uint32_t subexpressionDivot,uint16_t subexpressionOffset)344 void setSubexpressionInfo(uint32_t subexpressionDivot, uint16_t subexpressionOffset) 345 { 346 ASSERT(subexpressionDivot >= divot()); 347 if ((subexpressionDivot - divot()) & ~0xFFFF) // Overflow means we can't do this safely, so just point at the primary divot 348 return; 349 m_subexpressionDivotOffset = subexpressionDivot - divot(); 350 m_subexpressionStartOffset = subexpressionOffset; 351 } 352 353 protected: 354 uint16_t m_subexpressionDivotOffset; 355 uint16_t m_subexpressionStartOffset; 356 }; 357 358 class RegExpNode : public ExpressionNode, public ThrowableExpressionData { 359 public: 360 RegExpNode(JSGlobalData*, const UString& pattern, const UString& flags); 361 362 private: 363 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 364 365 UString m_pattern; 366 UString m_flags; 367 }; 368 369 class ThisNode : public ExpressionNode { 370 public: 371 ThisNode(JSGlobalData*); 372 373 private: 374 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 375 }; 376 377 class ResolveNode : public ExpressionNode { 378 public: 379 ResolveNode(JSGlobalData*, const Identifier&, int startOffset); 380 identifier()381 const Identifier& identifier() const { return m_ident; } 382 383 private: 384 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 385 386 virtual bool isPure(BytecodeGenerator&) const ; isLocation()387 virtual bool isLocation() const { return true; } isResolveNode()388 virtual bool isResolveNode() const { return true; } 389 390 Identifier m_ident; 391 int32_t m_startOffset; 392 }; 393 394 class ElementNode : public ParserArenaDeletable { 395 public: 396 ElementNode(JSGlobalData*, int elision, ExpressionNode*); 397 ElementNode(JSGlobalData*, ElementNode*, int elision, ExpressionNode*); 398 elision()399 int elision() const { return m_elision; } value()400 ExpressionNode* value() { return m_node; } next()401 ElementNode* next() { return m_next; } 402 403 private: 404 ElementNode* m_next; 405 int m_elision; 406 ExpressionNode* m_node; 407 }; 408 409 class ArrayNode : public ExpressionNode { 410 public: 411 ArrayNode(JSGlobalData*, int elision); 412 ArrayNode(JSGlobalData*, ElementNode*); 413 ArrayNode(JSGlobalData*, int elision, ElementNode*); 414 415 ArgumentListNode* toArgumentList(JSGlobalData*) const; 416 417 private: 418 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 419 420 virtual bool isSimpleArray() const ; 421 422 ElementNode* m_element; 423 int m_elision; 424 bool m_optional; 425 }; 426 427 class PropertyNode : public ParserArenaDeletable { 428 public: 429 enum Type { Constant, Getter, Setter }; 430 431 PropertyNode(JSGlobalData*, const Identifier& name, ExpressionNode* value, Type); 432 name()433 const Identifier& name() const { return m_name; } 434 435 private: 436 friend class PropertyListNode; 437 Identifier m_name; 438 ExpressionNode* m_assign; 439 Type m_type; 440 }; 441 442 class PropertyListNode : public Node { 443 public: 444 PropertyListNode(JSGlobalData*, PropertyNode*); 445 PropertyListNode(JSGlobalData*, PropertyNode*, PropertyListNode*); 446 447 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 448 449 private: 450 PropertyNode* m_node; 451 PropertyListNode* m_next; 452 }; 453 454 class ObjectLiteralNode : public ExpressionNode { 455 public: 456 ObjectLiteralNode(JSGlobalData*); 457 ObjectLiteralNode(JSGlobalData*, PropertyListNode*); 458 459 private: 460 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 461 462 PropertyListNode* m_list; 463 }; 464 465 class BracketAccessorNode : public ExpressionNode, public ThrowableExpressionData { 466 public: 467 BracketAccessorNode(JSGlobalData*, ExpressionNode* base, ExpressionNode* subscript, bool subscriptHasAssignments); 468 base()469 ExpressionNode* base() const { return m_base; } subscript()470 ExpressionNode* subscript() const { return m_subscript; } 471 472 private: 473 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 474 isLocation()475 virtual bool isLocation() const { return true; } isBracketAccessorNode()476 virtual bool isBracketAccessorNode() const { return true; } 477 478 ExpressionNode* m_base; 479 ExpressionNode* m_subscript; 480 bool m_subscriptHasAssignments; 481 }; 482 483 class DotAccessorNode : public ExpressionNode, public ThrowableExpressionData { 484 public: 485 DotAccessorNode(JSGlobalData*, ExpressionNode* base, const Identifier&); 486 base()487 ExpressionNode* base() const { return m_base; } identifier()488 const Identifier& identifier() const { return m_ident; } 489 490 private: 491 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 492 isLocation()493 virtual bool isLocation() const { return true; } isDotAccessorNode()494 virtual bool isDotAccessorNode() const { return true; } 495 496 ExpressionNode* m_base; 497 Identifier m_ident; 498 }; 499 500 class ArgumentListNode : public Node { 501 public: 502 ArgumentListNode(JSGlobalData*, ExpressionNode*); 503 ArgumentListNode(JSGlobalData*, ArgumentListNode*, ExpressionNode*); 504 505 ArgumentListNode* m_next; 506 ExpressionNode* m_expr; 507 508 private: 509 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 510 }; 511 512 class ArgumentsNode : public ParserArenaDeletable { 513 public: 514 ArgumentsNode(JSGlobalData*); 515 ArgumentsNode(JSGlobalData*, ArgumentListNode*); 516 517 ArgumentListNode* m_listNode; 518 }; 519 520 class NewExprNode : public ExpressionNode, public ThrowableExpressionData { 521 public: 522 NewExprNode(JSGlobalData*, ExpressionNode*); 523 NewExprNode(JSGlobalData*, ExpressionNode*, ArgumentsNode*); 524 525 private: 526 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 527 528 ExpressionNode* m_expr; 529 ArgumentsNode* m_args; 530 }; 531 532 class EvalFunctionCallNode : public ExpressionNode, public ThrowableExpressionData { 533 public: 534 EvalFunctionCallNode(JSGlobalData*, ArgumentsNode*, unsigned divot, unsigned startOffset, unsigned endOffset); 535 536 private: 537 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 538 539 ArgumentsNode* m_args; 540 }; 541 542 class FunctionCallValueNode : public ExpressionNode, public ThrowableExpressionData { 543 public: 544 FunctionCallValueNode(JSGlobalData*, ExpressionNode*, ArgumentsNode*, unsigned divot, unsigned startOffset, unsigned endOffset); 545 546 private: 547 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 548 549 ExpressionNode* m_expr; 550 ArgumentsNode* m_args; 551 }; 552 553 class FunctionCallResolveNode : public ExpressionNode, public ThrowableExpressionData { 554 public: 555 FunctionCallResolveNode(JSGlobalData*, const Identifier&, ArgumentsNode*, unsigned divot, unsigned startOffset, unsigned endOffset); 556 557 private: 558 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 559 560 Identifier m_ident; 561 ArgumentsNode* m_args; 562 size_t m_index; // Used by LocalVarFunctionCallNode. 563 size_t m_scopeDepth; // Used by ScopedVarFunctionCallNode and NonLocalVarFunctionCallNode 564 }; 565 566 class FunctionCallBracketNode : public ExpressionNode, public ThrowableSubExpressionData { 567 public: 568 FunctionCallBracketNode(JSGlobalData*, ExpressionNode* base, ExpressionNode* subscript, ArgumentsNode*, unsigned divot, unsigned startOffset, unsigned endOffset); 569 570 private: 571 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 572 573 ExpressionNode* m_base; 574 ExpressionNode* m_subscript; 575 ArgumentsNode* m_args; 576 }; 577 578 class FunctionCallDotNode : public ExpressionNode, public ThrowableSubExpressionData { 579 public: 580 FunctionCallDotNode(JSGlobalData*, ExpressionNode* base, const Identifier&, ArgumentsNode*, unsigned divot, unsigned startOffset, unsigned endOffset); 581 582 private: 583 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 584 585 protected: 586 ExpressionNode* m_base; 587 const Identifier m_ident; 588 ArgumentsNode* m_args; 589 }; 590 591 class CallFunctionCallDotNode : public FunctionCallDotNode { 592 public: 593 CallFunctionCallDotNode(JSGlobalData*, ExpressionNode* base, const Identifier&, ArgumentsNode*, unsigned divot, unsigned startOffset, unsigned endOffset); 594 595 private: 596 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 597 }; 598 599 class ApplyFunctionCallDotNode : public FunctionCallDotNode { 600 public: 601 ApplyFunctionCallDotNode(JSGlobalData*, ExpressionNode* base, const Identifier&, ArgumentsNode*, unsigned divot, unsigned startOffset, unsigned endOffset); 602 603 private: 604 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 605 }; 606 607 class PrePostResolveNode : public ExpressionNode, public ThrowableExpressionData { 608 public: 609 PrePostResolveNode(JSGlobalData*, const Identifier&, unsigned divot, unsigned startOffset, unsigned endOffset); 610 611 protected: 612 const Identifier m_ident; 613 }; 614 615 class PostfixResolveNode : public PrePostResolveNode { 616 public: 617 PostfixResolveNode(JSGlobalData*, const Identifier&, Operator, unsigned divot, unsigned startOffset, unsigned endOffset); 618 619 private: 620 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 621 622 Operator m_operator; 623 }; 624 625 class PostfixBracketNode : public ExpressionNode, public ThrowableSubExpressionData { 626 public: 627 PostfixBracketNode(JSGlobalData*, ExpressionNode* base, ExpressionNode* subscript, Operator, unsigned divot, unsigned startOffset, unsigned endOffset); 628 629 private: 630 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 631 632 ExpressionNode* m_base; 633 ExpressionNode* m_subscript; 634 Operator m_operator; 635 }; 636 637 class PostfixDotNode : public ExpressionNode, public ThrowableSubExpressionData { 638 public: 639 PostfixDotNode(JSGlobalData*, ExpressionNode* base, const Identifier&, Operator, unsigned divot, unsigned startOffset, unsigned endOffset); 640 641 private: 642 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 643 644 ExpressionNode* m_base; 645 Identifier m_ident; 646 Operator m_operator; 647 }; 648 649 class PostfixErrorNode : public ExpressionNode, public ThrowableSubExpressionData { 650 public: 651 PostfixErrorNode(JSGlobalData*, ExpressionNode*, Operator, unsigned divot, unsigned startOffset, unsigned endOffset); 652 653 private: 654 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 655 656 ExpressionNode* m_expr; 657 Operator m_operator; 658 }; 659 660 class DeleteResolveNode : public ExpressionNode, public ThrowableExpressionData { 661 public: 662 DeleteResolveNode(JSGlobalData*, const Identifier&, unsigned divot, unsigned startOffset, unsigned endOffset); 663 664 private: 665 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 666 667 Identifier m_ident; 668 }; 669 670 class DeleteBracketNode : public ExpressionNode, public ThrowableExpressionData { 671 public: 672 DeleteBracketNode(JSGlobalData*, ExpressionNode* base, ExpressionNode* subscript, unsigned divot, unsigned startOffset, unsigned endOffset); 673 674 private: 675 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 676 677 ExpressionNode* m_base; 678 ExpressionNode* m_subscript; 679 }; 680 681 class DeleteDotNode : public ExpressionNode, public ThrowableExpressionData { 682 public: 683 DeleteDotNode(JSGlobalData*, ExpressionNode* base, const Identifier&, unsigned divot, unsigned startOffset, unsigned endOffset); 684 685 private: 686 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 687 688 ExpressionNode* m_base; 689 Identifier m_ident; 690 }; 691 692 class DeleteValueNode : public ExpressionNode { 693 public: 694 DeleteValueNode(JSGlobalData*, ExpressionNode*); 695 696 private: 697 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 698 699 ExpressionNode* m_expr; 700 }; 701 702 class VoidNode : public ExpressionNode { 703 public: 704 VoidNode(JSGlobalData*, ExpressionNode*); 705 706 private: 707 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 708 709 ExpressionNode* m_expr; 710 }; 711 712 class TypeOfResolveNode : public ExpressionNode { 713 public: 714 TypeOfResolveNode(JSGlobalData*, const Identifier&); 715 identifier()716 const Identifier& identifier() const { return m_ident; } 717 718 private: 719 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 720 721 Identifier m_ident; 722 }; 723 724 class TypeOfValueNode : public ExpressionNode { 725 public: 726 TypeOfValueNode(JSGlobalData*, ExpressionNode*); 727 728 private: 729 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 730 731 ExpressionNode* m_expr; 732 }; 733 734 class PrefixResolveNode : public PrePostResolveNode { 735 public: 736 PrefixResolveNode(JSGlobalData*, const Identifier&, Operator, unsigned divot, unsigned startOffset, unsigned endOffset); 737 738 private: 739 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 740 741 Operator m_operator; 742 }; 743 744 class PrefixBracketNode : public ExpressionNode, public ThrowablePrefixedSubExpressionData { 745 public: 746 PrefixBracketNode(JSGlobalData*, ExpressionNode* base, ExpressionNode* subscript, Operator, unsigned divot, unsigned startOffset, unsigned endOffset); 747 748 private: 749 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 750 751 ExpressionNode* m_base; 752 ExpressionNode* m_subscript; 753 Operator m_operator; 754 }; 755 756 class PrefixDotNode : public ExpressionNode, public ThrowablePrefixedSubExpressionData { 757 public: 758 PrefixDotNode(JSGlobalData*, ExpressionNode* base, const Identifier&, Operator, unsigned divot, unsigned startOffset, unsigned endOffset); 759 760 private: 761 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 762 763 ExpressionNode* m_base; 764 Identifier m_ident; 765 Operator m_operator; 766 }; 767 768 class PrefixErrorNode : public ExpressionNode, public ThrowableExpressionData { 769 public: 770 PrefixErrorNode(JSGlobalData*, ExpressionNode*, Operator, unsigned divot, unsigned startOffset, unsigned endOffset); 771 772 private: 773 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 774 775 ExpressionNode* m_expr; 776 Operator m_operator; 777 }; 778 779 class UnaryOpNode : public ExpressionNode { 780 public: 781 UnaryOpNode(JSGlobalData*, ResultType, ExpressionNode*, OpcodeID); 782 783 protected: expr()784 ExpressionNode* expr() { return m_expr; } 785 786 private: 787 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 788 opcodeID()789 OpcodeID opcodeID() const { return m_opcodeID; } 790 791 ExpressionNode* m_expr; 792 OpcodeID m_opcodeID; 793 }; 794 795 class UnaryPlusNode : public UnaryOpNode { 796 public: 797 UnaryPlusNode(JSGlobalData*, ExpressionNode*); 798 799 private: stripUnaryPlus()800 virtual ExpressionNode* stripUnaryPlus() { return expr(); } 801 }; 802 803 class NegateNode : public UnaryOpNode { 804 public: 805 NegateNode(JSGlobalData*, ExpressionNode*); 806 }; 807 808 class BitwiseNotNode : public UnaryOpNode { 809 public: 810 BitwiseNotNode(JSGlobalData*, ExpressionNode*); 811 }; 812 813 class LogicalNotNode : public UnaryOpNode { 814 public: 815 LogicalNotNode(JSGlobalData*, ExpressionNode*); 816 }; 817 818 class BinaryOpNode : public ExpressionNode { 819 public: 820 BinaryOpNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, OpcodeID, bool rightHasAssignments); 821 BinaryOpNode(JSGlobalData*, ResultType, ExpressionNode* expr1, ExpressionNode* expr2, OpcodeID, bool rightHasAssignments); 822 823 RegisterID* emitStrcat(BytecodeGenerator& generator, RegisterID* dst, RegisterID* lhs = 0, ReadModifyResolveNode* emitExpressionInfoForMe = 0); 824 825 private: 826 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 827 828 protected: opcodeID()829 OpcodeID opcodeID() const { return m_opcodeID; } 830 831 protected: 832 ExpressionNode* m_expr1; 833 ExpressionNode* m_expr2; 834 private: 835 OpcodeID m_opcodeID; 836 protected: 837 bool m_rightHasAssignments; 838 }; 839 840 class ReverseBinaryOpNode : public BinaryOpNode { 841 public: 842 ReverseBinaryOpNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, OpcodeID, bool rightHasAssignments); 843 ReverseBinaryOpNode(JSGlobalData*, ResultType, ExpressionNode* expr1, ExpressionNode* expr2, OpcodeID, bool rightHasAssignments); 844 845 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 846 }; 847 848 class MultNode : public BinaryOpNode { 849 public: 850 MultNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments); 851 }; 852 853 class DivNode : public BinaryOpNode { 854 public: 855 DivNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments); 856 }; 857 858 class ModNode : public BinaryOpNode { 859 public: 860 ModNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments); 861 }; 862 863 class AddNode : public BinaryOpNode { 864 public: 865 AddNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments); 866 isAdd()867 virtual bool isAdd() const { return true; } 868 }; 869 870 class SubNode : public BinaryOpNode { 871 public: 872 SubNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments); 873 }; 874 875 class LeftShiftNode : public BinaryOpNode { 876 public: 877 LeftShiftNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments); 878 }; 879 880 class RightShiftNode : public BinaryOpNode { 881 public: 882 RightShiftNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments); 883 }; 884 885 class UnsignedRightShiftNode : public BinaryOpNode { 886 public: 887 UnsignedRightShiftNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments); 888 }; 889 890 class LessNode : public BinaryOpNode { 891 public: 892 LessNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments); 893 }; 894 895 class GreaterNode : public ReverseBinaryOpNode { 896 public: 897 GreaterNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments); 898 }; 899 900 class LessEqNode : public BinaryOpNode { 901 public: 902 LessEqNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments); 903 }; 904 905 class GreaterEqNode : public ReverseBinaryOpNode { 906 public: 907 GreaterEqNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments); 908 }; 909 910 class ThrowableBinaryOpNode : public BinaryOpNode, public ThrowableExpressionData { 911 public: 912 ThrowableBinaryOpNode(JSGlobalData*, ResultType, ExpressionNode* expr1, ExpressionNode* expr2, OpcodeID, bool rightHasAssignments); 913 ThrowableBinaryOpNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, OpcodeID, bool rightHasAssignments); 914 915 private: 916 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 917 }; 918 919 class InstanceOfNode : public ThrowableBinaryOpNode { 920 public: 921 InstanceOfNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments); 922 923 private: 924 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 925 }; 926 927 class InNode : public ThrowableBinaryOpNode { 928 public: 929 InNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments); 930 }; 931 932 class EqualNode : public BinaryOpNode { 933 public: 934 EqualNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments); 935 936 private: 937 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 938 }; 939 940 class NotEqualNode : public BinaryOpNode { 941 public: 942 NotEqualNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments); 943 }; 944 945 class StrictEqualNode : public BinaryOpNode { 946 public: 947 StrictEqualNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments); 948 949 private: 950 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 951 }; 952 953 class NotStrictEqualNode : public BinaryOpNode { 954 public: 955 NotStrictEqualNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments); 956 }; 957 958 class BitAndNode : public BinaryOpNode { 959 public: 960 BitAndNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments); 961 }; 962 963 class BitOrNode : public BinaryOpNode { 964 public: 965 BitOrNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments); 966 }; 967 968 class BitXOrNode : public BinaryOpNode { 969 public: 970 BitXOrNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments); 971 }; 972 973 // m_expr1 && m_expr2, m_expr1 || m_expr2 974 class LogicalOpNode : public ExpressionNode { 975 public: 976 LogicalOpNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, LogicalOperator); 977 978 private: 979 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 980 981 ExpressionNode* m_expr1; 982 ExpressionNode* m_expr2; 983 LogicalOperator m_operator; 984 }; 985 986 // The ternary operator, "m_logical ? m_expr1 : m_expr2" 987 class ConditionalNode : public ExpressionNode { 988 public: 989 ConditionalNode(JSGlobalData*, ExpressionNode* logical, ExpressionNode* expr1, ExpressionNode* expr2); 990 991 private: 992 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 993 994 ExpressionNode* m_logical; 995 ExpressionNode* m_expr1; 996 ExpressionNode* m_expr2; 997 }; 998 999 class ReadModifyResolveNode : public ExpressionNode, public ThrowableExpressionData { 1000 public: 1001 ReadModifyResolveNode(JSGlobalData*, const Identifier&, Operator, ExpressionNode* right, bool rightHasAssignments, unsigned divot, unsigned startOffset, unsigned endOffset); 1002 1003 private: 1004 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 1005 1006 Identifier m_ident; 1007 ExpressionNode* m_right; 1008 size_t m_index; // Used by ReadModifyLocalVarNode. 1009 Operator m_operator; 1010 bool m_rightHasAssignments; 1011 }; 1012 1013 class AssignResolveNode : public ExpressionNode, public ThrowableExpressionData { 1014 public: 1015 AssignResolveNode(JSGlobalData*, const Identifier&, ExpressionNode* right, bool rightHasAssignments); 1016 1017 private: 1018 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 1019 1020 Identifier m_ident; 1021 ExpressionNode* m_right; 1022 size_t m_index; // Used by ReadModifyLocalVarNode. 1023 bool m_rightHasAssignments; 1024 }; 1025 1026 class ReadModifyBracketNode : public ExpressionNode, public ThrowableSubExpressionData { 1027 public: 1028 ReadModifyBracketNode(JSGlobalData*, ExpressionNode* base, ExpressionNode* subscript, Operator, ExpressionNode* right, bool subscriptHasAssignments, bool rightHasAssignments, unsigned divot, unsigned startOffset, unsigned endOffset); 1029 1030 private: 1031 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 1032 1033 ExpressionNode* m_base; 1034 ExpressionNode* m_subscript; 1035 ExpressionNode* m_right; 1036 Operator m_operator : 30; 1037 bool m_subscriptHasAssignments : 1; 1038 bool m_rightHasAssignments : 1; 1039 }; 1040 1041 class AssignBracketNode : public ExpressionNode, public ThrowableExpressionData { 1042 public: 1043 AssignBracketNode(JSGlobalData*, ExpressionNode* base, ExpressionNode* subscript, ExpressionNode* right, bool subscriptHasAssignments, bool rightHasAssignments, unsigned divot, unsigned startOffset, unsigned endOffset); 1044 1045 private: 1046 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 1047 1048 ExpressionNode* m_base; 1049 ExpressionNode* m_subscript; 1050 ExpressionNode* m_right; 1051 bool m_subscriptHasAssignments : 1; 1052 bool m_rightHasAssignments : 1; 1053 }; 1054 1055 class AssignDotNode : public ExpressionNode, public ThrowableExpressionData { 1056 public: 1057 AssignDotNode(JSGlobalData*, ExpressionNode* base, const Identifier&, ExpressionNode* right, bool rightHasAssignments, unsigned divot, unsigned startOffset, unsigned endOffset); 1058 1059 private: 1060 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 1061 1062 ExpressionNode* m_base; 1063 Identifier m_ident; 1064 ExpressionNode* m_right; 1065 bool m_rightHasAssignments; 1066 }; 1067 1068 class ReadModifyDotNode : public ExpressionNode, public ThrowableSubExpressionData { 1069 public: 1070 ReadModifyDotNode(JSGlobalData*, ExpressionNode* base, const Identifier&, Operator, ExpressionNode* right, bool rightHasAssignments, unsigned divot, unsigned startOffset, unsigned endOffset); 1071 1072 private: 1073 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 1074 1075 ExpressionNode* m_base; 1076 Identifier m_ident; 1077 ExpressionNode* m_right; 1078 Operator m_operator : 31; 1079 bool m_rightHasAssignments : 1; 1080 }; 1081 1082 class AssignErrorNode : public ExpressionNode, public ThrowableExpressionData { 1083 public: 1084 AssignErrorNode(JSGlobalData*, ExpressionNode* left, Operator, ExpressionNode* right, unsigned divot, unsigned startOffset, unsigned endOffset); 1085 1086 private: 1087 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 1088 1089 ExpressionNode* m_left; 1090 Operator m_operator; 1091 ExpressionNode* m_right; 1092 }; 1093 1094 typedef Vector<ExpressionNode*, 8> ExpressionVector; 1095 1096 class CommaNode : public ExpressionNode { 1097 public: 1098 CommaNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2); 1099 append(ExpressionNode * expr)1100 void append(ExpressionNode* expr) { m_expressions.append(expr); } 1101 1102 private: isCommaNode()1103 virtual bool isCommaNode() const { return true; } 1104 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 1105 1106 ExpressionVector m_expressions; 1107 }; 1108 1109 class ConstDeclNode : public ExpressionNode { 1110 public: 1111 ConstDeclNode(JSGlobalData*, const Identifier&, ExpressionNode*); 1112 hasInitializer()1113 bool hasInitializer() const { return m_init; } ident()1114 const Identifier& ident() { return m_ident; } 1115 1116 private: 1117 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 1118 virtual RegisterID* emitCodeSingle(BytecodeGenerator&); 1119 1120 Identifier m_ident; 1121 1122 public: 1123 ConstDeclNode* m_next; 1124 1125 private: 1126 ExpressionNode* m_init; 1127 }; 1128 1129 class ConstStatementNode : public StatementNode { 1130 public: 1131 ConstStatementNode(JSGlobalData*, ConstDeclNode* next); 1132 1133 private: 1134 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 1135 1136 ConstDeclNode* m_next; 1137 }; 1138 1139 typedef Vector<StatementNode*> StatementVector; 1140 1141 class SourceElements : public ParserArenaDeletable { 1142 public: 1143 SourceElements(JSGlobalData*); 1144 1145 void append(StatementNode*); releaseContentsIntoVector(StatementVector & destination)1146 void releaseContentsIntoVector(StatementVector& destination) 1147 { 1148 ASSERT(destination.isEmpty()); 1149 m_statements.swap(destination); 1150 destination.shrinkToFit(); 1151 } 1152 1153 private: 1154 StatementVector m_statements; 1155 }; 1156 1157 class BlockNode : public StatementNode { 1158 public: 1159 BlockNode(JSGlobalData*, SourceElements* children); 1160 children()1161 StatementVector& children() { return m_children; } 1162 1163 private: 1164 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 1165 isBlock()1166 virtual bool isBlock() const { return true; } 1167 1168 StatementVector m_children; 1169 }; 1170 1171 class EmptyStatementNode : public StatementNode { 1172 public: 1173 EmptyStatementNode(JSGlobalData*); 1174 1175 private: 1176 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 1177 isEmptyStatement()1178 virtual bool isEmptyStatement() const { return true; } 1179 }; 1180 1181 class DebuggerStatementNode : public StatementNode { 1182 public: 1183 DebuggerStatementNode(JSGlobalData*); 1184 1185 private: 1186 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 1187 }; 1188 1189 class ExprStatementNode : public StatementNode { 1190 public: 1191 ExprStatementNode(JSGlobalData*, ExpressionNode*); 1192 expr()1193 ExpressionNode* expr() const { return m_expr; } 1194 1195 private: isExprStatement()1196 virtual bool isExprStatement() const { return true; } 1197 1198 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 1199 1200 ExpressionNode* m_expr; 1201 }; 1202 1203 class VarStatementNode : public StatementNode { 1204 public: 1205 VarStatementNode(JSGlobalData*, ExpressionNode*); 1206 1207 private: 1208 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 1209 1210 ExpressionNode* m_expr; 1211 }; 1212 1213 class IfNode : public StatementNode { 1214 public: 1215 IfNode(JSGlobalData*, ExpressionNode* condition, StatementNode* ifBlock); 1216 1217 protected: 1218 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 1219 1220 ExpressionNode* m_condition; 1221 StatementNode* m_ifBlock; 1222 }; 1223 1224 class IfElseNode : public IfNode { 1225 public: 1226 IfElseNode(JSGlobalData*, ExpressionNode* condition, StatementNode* ifBlock, StatementNode* elseBlock); 1227 1228 private: 1229 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 1230 1231 StatementNode* m_elseBlock; 1232 }; 1233 1234 class DoWhileNode : public StatementNode { 1235 public: 1236 DoWhileNode(JSGlobalData*, StatementNode* statement, ExpressionNode*); 1237 1238 private: 1239 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 1240 1241 StatementNode* m_statement; 1242 ExpressionNode* m_expr; 1243 }; 1244 1245 class WhileNode : public StatementNode { 1246 public: 1247 WhileNode(JSGlobalData*, ExpressionNode*, StatementNode* statement); 1248 1249 private: 1250 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 1251 1252 ExpressionNode* m_expr; 1253 StatementNode* m_statement; 1254 }; 1255 1256 class ForNode : public StatementNode { 1257 public: 1258 ForNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2, ExpressionNode* expr3, StatementNode* statement, bool expr1WasVarDecl); 1259 1260 private: 1261 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 1262 1263 ExpressionNode* m_expr1; 1264 ExpressionNode* m_expr2; 1265 ExpressionNode* m_expr3; 1266 StatementNode* m_statement; 1267 bool m_expr1WasVarDecl; 1268 }; 1269 1270 class ForInNode : public StatementNode, public ThrowableExpressionData { 1271 public: 1272 ForInNode(JSGlobalData*, ExpressionNode*, ExpressionNode*, StatementNode*); 1273 ForInNode(JSGlobalData*, const Identifier&, ExpressionNode*, ExpressionNode*, StatementNode*, int divot, int startOffset, int endOffset); 1274 1275 private: 1276 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 1277 1278 Identifier m_ident; 1279 ExpressionNode* m_init; 1280 ExpressionNode* m_lexpr; 1281 ExpressionNode* m_expr; 1282 StatementNode* m_statement; 1283 bool m_identIsVarDecl; 1284 }; 1285 1286 class ContinueNode : public StatementNode, public ThrowableExpressionData { 1287 public: 1288 ContinueNode(JSGlobalData*); 1289 ContinueNode(JSGlobalData*, const Identifier&); 1290 1291 private: 1292 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 1293 1294 Identifier m_ident; 1295 }; 1296 1297 class BreakNode : public StatementNode, public ThrowableExpressionData { 1298 public: 1299 BreakNode(JSGlobalData*); 1300 BreakNode(JSGlobalData*, const Identifier&); 1301 1302 private: 1303 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 1304 1305 Identifier m_ident; 1306 }; 1307 1308 class ReturnNode : public StatementNode, public ThrowableExpressionData { 1309 public: 1310 ReturnNode(JSGlobalData*, ExpressionNode* value); 1311 1312 private: 1313 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 1314 isReturnNode()1315 virtual bool isReturnNode() const { return true; } 1316 1317 ExpressionNode* m_value; 1318 }; 1319 1320 class WithNode : public StatementNode { 1321 public: 1322 WithNode(JSGlobalData*, ExpressionNode*, StatementNode*, uint32_t divot, uint32_t expressionLength); 1323 1324 private: 1325 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 1326 1327 ExpressionNode* m_expr; 1328 StatementNode* m_statement; 1329 uint32_t m_divot; 1330 uint32_t m_expressionLength; 1331 }; 1332 1333 class LabelNode : public StatementNode, public ThrowableExpressionData { 1334 public: 1335 LabelNode(JSGlobalData*, const Identifier& name, StatementNode*); 1336 1337 private: 1338 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 1339 1340 Identifier m_name; 1341 StatementNode* m_statement; 1342 }; 1343 1344 class ThrowNode : public StatementNode, public ThrowableExpressionData { 1345 public: 1346 ThrowNode(JSGlobalData*, ExpressionNode*); 1347 1348 private: 1349 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 1350 1351 ExpressionNode* m_expr; 1352 }; 1353 1354 class TryNode : public StatementNode { 1355 public: 1356 TryNode(JSGlobalData*, StatementNode* tryBlock, const Identifier& exceptionIdent, bool catchHasEval, StatementNode* catchBlock, StatementNode* finallyBlock); 1357 1358 private: 1359 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* dst = 0); 1360 1361 StatementNode* m_tryBlock; 1362 Identifier m_exceptionIdent; 1363 StatementNode* m_catchBlock; 1364 StatementNode* m_finallyBlock; 1365 bool m_catchHasEval; 1366 }; 1367 1368 class ParameterNode : public ParserArenaDeletable { 1369 public: 1370 ParameterNode(JSGlobalData*, const Identifier&); 1371 ParameterNode(JSGlobalData*, ParameterNode*, const Identifier&); 1372 ident()1373 const Identifier& ident() const { return m_ident; } nextParam()1374 ParameterNode* nextParam() const { return m_next; } 1375 1376 private: 1377 Identifier m_ident; 1378 ParameterNode* m_next; 1379 }; 1380 1381 struct ScopeNodeData : FastAllocBase { 1382 typedef DeclarationStacks::VarStack VarStack; 1383 typedef DeclarationStacks::FunctionStack FunctionStack; 1384 1385 ScopeNodeData(ParserArena&, SourceElements*, VarStack*, FunctionStack*, int numConstants); 1386 1387 ParserArena m_arena; 1388 VarStack m_varStack; 1389 FunctionStack m_functionStack; 1390 int m_numConstants; 1391 StatementVector m_children; 1392 1393 void markAggregate(MarkStack&); 1394 }; 1395 1396 class ScopeNode : public StatementNode, public ParserArenaRefCounted { 1397 public: 1398 typedef DeclarationStacks::VarStack VarStack; 1399 typedef DeclarationStacks::FunctionStack FunctionStack; 1400 1401 ScopeNode(JSGlobalData*); 1402 ScopeNode(JSGlobalData*, const SourceCode&, SourceElements*, VarStack*, FunctionStack*, CodeFeatures, int numConstants); 1403 adoptData(std::auto_ptr<ScopeNodeData> data)1404 void adoptData(std::auto_ptr<ScopeNodeData> data) 1405 { 1406 ASSERT(!data->m_arena.contains(this)); 1407 ASSERT(!m_data); 1408 m_data.adopt(data); 1409 } data()1410 ScopeNodeData* data() const { return m_data.get(); } destroyData()1411 void destroyData() { m_data.clear(); } 1412 source()1413 const SourceCode& source() const { return m_source; } sourceURL()1414 const UString& sourceURL() const { return m_source.provider()->url(); } sourceID()1415 intptr_t sourceID() const { return m_source.provider()->asID(); } 1416 setFeatures(CodeFeatures features)1417 void setFeatures(CodeFeatures features) { m_features = features; } features()1418 CodeFeatures features() { return m_features; } 1419 usesEval()1420 bool usesEval() const { return m_features & EvalFeature; } usesArguments()1421 bool usesArguments() const { return m_features & ArgumentsFeature; } setUsesArguments()1422 void setUsesArguments() { m_features |= ArgumentsFeature; } usesThis()1423 bool usesThis() const { return m_features & ThisFeature; } needsActivation()1424 bool needsActivation() const { return m_features & (EvalFeature | ClosureFeature | WithFeature | CatchFeature); } 1425 varStack()1426 VarStack& varStack() { ASSERT(m_data); return m_data->m_varStack; } functionStack()1427 FunctionStack& functionStack() { ASSERT(m_data); return m_data->m_functionStack; } 1428 children()1429 StatementVector& children() { ASSERT(m_data); return m_data->m_children; } 1430 neededConstants()1431 int neededConstants() 1432 { 1433 ASSERT(m_data); 1434 // We may need 2 more constants than the count given by the parser, 1435 // because of the various uses of jsUndefined() and jsNull(). 1436 return m_data->m_numConstants + 2; 1437 } 1438 markAggregate(MarkStack &)1439 virtual void markAggregate(MarkStack&) { } 1440 1441 #if ENABLE(JIT) generatedJITCode()1442 JITCode& generatedJITCode() 1443 { 1444 ASSERT(m_jitCode); 1445 return m_jitCode; 1446 } 1447 getExecutablePool()1448 ExecutablePool* getExecutablePool() 1449 { 1450 return m_jitCode.getExecutablePool(); 1451 } 1452 setJITCode(const JITCode jitCode)1453 void setJITCode(const JITCode jitCode) 1454 { 1455 m_jitCode = jitCode; 1456 } 1457 #endif 1458 1459 protected: setSource(const SourceCode & source)1460 void setSource(const SourceCode& source) { m_source = source; } 1461 1462 #if ENABLE(JIT) 1463 JITCode m_jitCode; 1464 #endif 1465 1466 private: 1467 OwnPtr<ScopeNodeData> m_data; 1468 CodeFeatures m_features; 1469 SourceCode m_source; 1470 }; 1471 1472 class ProgramNode : public ScopeNode { 1473 public: 1474 static PassRefPtr<ProgramNode> create(JSGlobalData*, SourceElements*, VarStack*, FunctionStack*, const SourceCode&, CodeFeatures, int numConstants); 1475 bytecode(ScopeChainNode * scopeChain)1476 ProgramCodeBlock& bytecode(ScopeChainNode* scopeChain) 1477 { 1478 if (!m_code) 1479 generateBytecode(scopeChain); 1480 return *m_code; 1481 } 1482 1483 #if ENABLE(JIT) jitCode(ScopeChainNode * scopeChain)1484 JITCode& jitCode(ScopeChainNode* scopeChain) 1485 { 1486 if (!m_jitCode) 1487 generateJITCode(scopeChain); 1488 return m_jitCode; 1489 } 1490 #endif 1491 1492 private: 1493 ProgramNode(JSGlobalData*, SourceElements*, VarStack*, FunctionStack*, const SourceCode&, CodeFeatures, int numConstants); 1494 1495 void generateBytecode(ScopeChainNode*); 1496 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 1497 1498 #if ENABLE(JIT) 1499 void generateJITCode(ScopeChainNode*); 1500 #endif 1501 1502 OwnPtr<ProgramCodeBlock> m_code; 1503 }; 1504 1505 class EvalNode : public ScopeNode { 1506 public: 1507 static PassRefPtr<EvalNode> create(JSGlobalData*, SourceElements*, VarStack*, FunctionStack*, const SourceCode&, CodeFeatures, int numConstants); 1508 bytecode(ScopeChainNode * scopeChain)1509 EvalCodeBlock& bytecode(ScopeChainNode* scopeChain) 1510 { 1511 if (!m_code) 1512 generateBytecode(scopeChain); 1513 return *m_code; 1514 } 1515 1516 EvalCodeBlock& bytecodeForExceptionInfoReparse(ScopeChainNode*, CodeBlock*); 1517 1518 virtual void markAggregate(MarkStack&); 1519 1520 #if ENABLE(JIT) jitCode(ScopeChainNode * scopeChain)1521 JITCode& jitCode(ScopeChainNode* scopeChain) 1522 { 1523 if (!m_jitCode) 1524 generateJITCode(scopeChain); 1525 return m_jitCode; 1526 } 1527 #endif 1528 1529 private: 1530 EvalNode(JSGlobalData*, SourceElements*, VarStack*, FunctionStack*, const SourceCode&, CodeFeatures, int numConstants); 1531 1532 void generateBytecode(ScopeChainNode*); 1533 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 1534 1535 #if ENABLE(JIT) 1536 void generateJITCode(ScopeChainNode*); 1537 #endif 1538 1539 OwnPtr<EvalCodeBlock> m_code; 1540 }; 1541 1542 class FunctionBodyNode : public ScopeNode { 1543 friend class JIT; 1544 public: 1545 #if ENABLE(JIT) 1546 static PassRefPtr<FunctionBodyNode> createNativeThunk(JSGlobalData*); 1547 #endif 1548 static FunctionBodyNode* create(JSGlobalData*); 1549 static PassRefPtr<FunctionBodyNode> create(JSGlobalData*, SourceElements*, VarStack*, FunctionStack*, const SourceCode&, CodeFeatures, int numConstants); 1550 virtual ~FunctionBodyNode(); 1551 parameters()1552 const Identifier* parameters() const { return m_parameters; } parameterCount()1553 size_t parameterCount() const { return m_parameterCount; } 1554 UString paramString() const ; 1555 Identifier* copyParameters(); 1556 1557 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 1558 isGenerated()1559 bool isGenerated() const 1560 { 1561 return m_code; 1562 } 1563 1564 bool isHostFunction() const; 1565 1566 virtual void markAggregate(MarkStack&); 1567 1568 void finishParsing(const SourceCode&, ParameterNode*); 1569 void finishParsing(Identifier* parameters, size_t parameterCount); 1570 toSourceString()1571 UString toSourceString() const { return source().toString(); } 1572 1573 CodeBlock& bytecodeForExceptionInfoReparse(ScopeChainNode*, CodeBlock*); 1574 #if ENABLE(JIT) jitCode(ScopeChainNode * scopeChain)1575 JITCode& jitCode(ScopeChainNode* scopeChain) 1576 { 1577 if (!m_jitCode) 1578 generateJITCode(scopeChain); 1579 return m_jitCode; 1580 } 1581 #endif 1582 bytecode(ScopeChainNode * scopeChain)1583 CodeBlock& bytecode(ScopeChainNode* scopeChain) 1584 { 1585 ASSERT(scopeChain); 1586 if (!m_code) 1587 generateBytecode(scopeChain); 1588 return *m_code; 1589 } 1590 generatedBytecode()1591 CodeBlock& generatedBytecode() 1592 { 1593 ASSERT(m_code); 1594 return *m_code; 1595 } 1596 1597 private: 1598 FunctionBodyNode(JSGlobalData*); 1599 FunctionBodyNode(JSGlobalData*, SourceElements*, VarStack*, FunctionStack*, const SourceCode&, CodeFeatures, int numConstants); 1600 1601 void generateBytecode(ScopeChainNode*); 1602 #if ENABLE(JIT) 1603 void generateJITCode(ScopeChainNode*); 1604 #endif 1605 Identifier* m_parameters; 1606 size_t m_parameterCount; 1607 OwnPtr<CodeBlock> m_code; 1608 }; 1609 1610 class FuncExprNode : public ExpressionNode, public ParserArenaRefCounted { 1611 public: 1612 FuncExprNode(JSGlobalData*, const Identifier&, FunctionBodyNode* body, const SourceCode& source, ParameterNode* parameter = 0); 1613 1614 JSFunction* makeFunction(ExecState*, ScopeChainNode*); 1615 body()1616 FunctionBodyNode* body() { return m_body.get(); } 1617 1618 private: 1619 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 1620 isFuncExprNode()1621 virtual bool isFuncExprNode() const { return true; } 1622 1623 Identifier m_ident; 1624 RefPtr<FunctionBodyNode> m_body; 1625 }; 1626 1627 class FuncDeclNode : public StatementNode, public ParserArenaRefCounted { 1628 public: 1629 FuncDeclNode(JSGlobalData*, const Identifier&, FunctionBodyNode*, const SourceCode&, ParameterNode* = 0); 1630 1631 JSFunction* makeFunction(ExecState*, ScopeChainNode*); 1632 1633 Identifier m_ident; 1634 body()1635 FunctionBodyNode* body() { return m_body.get(); } 1636 1637 private: 1638 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 1639 1640 RefPtr<FunctionBodyNode> m_body; 1641 }; 1642 1643 class CaseClauseNode : public ParserArenaDeletable { 1644 public: 1645 CaseClauseNode(JSGlobalData*, ExpressionNode*); 1646 CaseClauseNode(JSGlobalData*, ExpressionNode*, SourceElements*); 1647 expr()1648 ExpressionNode* expr() const { return m_expr; } children()1649 StatementVector& children() { return m_children; } 1650 1651 private: 1652 ExpressionNode* m_expr; 1653 StatementVector m_children; 1654 }; 1655 1656 class ClauseListNode : public ParserArenaDeletable { 1657 public: 1658 ClauseListNode(JSGlobalData*, CaseClauseNode*); 1659 ClauseListNode(JSGlobalData*, ClauseListNode*, CaseClauseNode*); 1660 getClause()1661 CaseClauseNode* getClause() const { return m_clause; } getNext()1662 ClauseListNode* getNext() const { return m_next; } 1663 1664 private: 1665 CaseClauseNode* m_clause; 1666 ClauseListNode* m_next; 1667 }; 1668 1669 class CaseBlockNode : public ParserArenaDeletable { 1670 public: 1671 CaseBlockNode(JSGlobalData*, ClauseListNode* list1, CaseClauseNode* defaultClause, ClauseListNode* list2); 1672 1673 RegisterID* emitBytecodeForBlock(BytecodeGenerator&, RegisterID* input, RegisterID* dst = 0); 1674 1675 private: 1676 SwitchInfo::SwitchType tryOptimizedSwitch(Vector<ExpressionNode*, 8>& literalVector, int32_t& min_num, int32_t& max_num); 1677 ClauseListNode* m_list1; 1678 CaseClauseNode* m_defaultClause; 1679 ClauseListNode* m_list2; 1680 }; 1681 1682 class SwitchNode : public StatementNode { 1683 public: 1684 SwitchNode(JSGlobalData*, ExpressionNode*, CaseBlockNode*); 1685 1686 private: 1687 virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); 1688 1689 ExpressionNode* m_expr; 1690 CaseBlockNode* m_block; 1691 }; 1692 1693 struct ElementList { 1694 ElementNode* head; 1695 ElementNode* tail; 1696 }; 1697 1698 struct PropertyList { 1699 PropertyListNode* head; 1700 PropertyListNode* tail; 1701 }; 1702 1703 struct ArgumentList { 1704 ArgumentListNode* head; 1705 ArgumentListNode* tail; 1706 }; 1707 1708 struct ConstDeclList { 1709 ConstDeclNode* head; 1710 ConstDeclNode* tail; 1711 }; 1712 1713 struct ParameterList { 1714 ParameterNode* head; 1715 ParameterNode* tail; 1716 }; 1717 1718 struct ClauseList { 1719 ClauseListNode* head; 1720 ClauseListNode* tail; 1721 }; 1722 1723 } // namespace JSC 1724 1725 #endif // Nodes_h 1726