Changeset 38247 in webkit for trunk/JavaScriptCore
- Timestamp:
- Nov 9, 2008, 5:04:30 PM (17 years ago)
- Location:
- trunk/JavaScriptCore
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/ChangeLog
r38238 r38247 1 2008-11-09 Darin Adler <[email protected]> 2 3 Reviewed by Sam Weinig and Maciej Stachowiak. 4 Includes some work done by Chris Brichford. 5 6 - fix https://bugs.webkit.org/show_bug.cgi?id=14886 7 Stack overflow due to deeply nested parse tree doing repeated string concatentation 8 9 Test: fast/js/large-expressions.html 10 11 1) Code generation is recursive, so takes stack proportional to the complexity 12 of the source code expression. Fixed by setting an arbitrary recursion limit 13 of 10,000 nodes. 14 15 2) Destruction of the syntax tree was recursive. Fixed by introducing a 16 non-recursive mechanism for destroying the tree. 17 18 * bytecompiler/CodeGenerator.cpp: 19 (JSC::CodeGenerator::CodeGenerator): Initialize depth to 0. 20 (JSC::CodeGenerator::emitThrowExpressionTooDeepException): Added. Emits the code 21 to throw a "too deep" exception. 22 * bytecompiler/CodeGenerator.h: 23 (JSC::CodeGenerator::emitNode): Check depth and emit an exception if we exceed 24 the maximum depth. 25 26 * parser/Nodes.cpp: 27 (JSC::NodeReleaser::releaseAllNodes): Added. To be called inside node destructors 28 to avoid recursive calls to destructors for nodes inside this one. 29 (JSC::NodeReleaser::release): Added. To be called inside releaseNodes functions. 30 Also added releaseNodes functions and calls to releaseAllNodes inside destructors 31 for each class derived from Node that has RefPtr to other nodes. 32 (JSC::NodeReleaser::adopt): Added. Used by the release function. 33 (JSC::NodeReleaser::adoptFunctionBodyNode): Added. 34 35 * parser/Nodes.h: Added declarations of releaseNodes and destructors in all classes 36 that needed it. Eliminated use of ListRefPtr and releaseNext, which are the two parts 37 of an older solution to the non-recursive destruction problem that works only for 38 lists, whereas the new solution works for other graphs. Changed ReverseBinaryOpNode 39 to use BinaryOpNode as a base class to avoid some duplicated code. 40 1 41 2008-11-08 Kevin Ollivier <[email protected]> 2 42 -
trunk/JavaScriptCore/bytecompiler/CodeGenerator.cpp
r38230 r38247 208 208 , m_globalData(&scopeChain.globalObject()->globalExec()->globalData()) 209 209 , m_lastOpcodeID(op_end) 210 , m_emitNodeDepth(0) 210 211 { 211 212 if (m_shouldEmitDebugHooks) … … 284 285 , m_globalData(&scopeChain.globalObject()->globalExec()->globalData()) 285 286 , m_lastOpcodeID(op_end) 287 , m_emitNodeDepth(0) 286 288 { 287 289 if (m_shouldEmitDebugHooks) … … 354 356 , m_globalData(&scopeChain.globalObject()->globalExec()->globalData()) 355 357 , m_lastOpcodeID(op_end) 358 , m_emitNodeDepth(0) 356 359 { 357 360 if (m_shouldEmitDebugHooks) … … 1677 1680 } 1678 1681 1682 RegisterID* CodeGenerator::emitThrowExpressionTooDeepException() 1683 { 1684 // It would be nice to do an even better job of identifying exactly where the expression is. 1685 // And we could make the caller pass the node pointer in, if there was some way of getting 1686 // that from an arbitrary node. However, calling emitExpressionInfo without any useful data 1687 // is still good enough to get us an accurate line number. 1688 emitExpressionInfo(0, 0, 0); 1689 RegisterID* exception = emitNewError(newTemporary(), SyntaxError, jsString(globalData(), "Expression too deep")); 1690 emitThrow(exception); 1691 return exception; 1692 } 1693 1679 1694 } // namespace JSC -
trunk/JavaScriptCore/bytecompiler/CodeGenerator.h
r38219 r38247 166 166 m_codeBlock->lineInfo.append(info); 167 167 } 168 return n->emitCode(*this, dst); 168 if (m_emitNodeDepth >= s_maxEmitNodeDepth) 169 return emitThrowExpressionTooDeepException(); 170 ++m_emitNodeDepth; 171 RegisterID* r = n->emitCode(*this, dst); 172 --m_emitNodeDepth; 173 return r; 169 174 } 170 175 … … 400 405 bool canOptimizeNonLocals() { return (m_codeType == FunctionCode) && !m_dynamicScopeDepth && !m_codeBlock->usesEval; } 401 406 407 RegisterID* emitThrowExpressionTooDeepException(); 408 402 409 bool m_shouldEmitDebugHooks; 403 410 bool m_shouldEmitProfileHooks; … … 445 452 static bool s_dumpsGeneratedCode; 446 453 #endif 454 455 unsigned m_emitNodeDepth; 456 457 static const unsigned s_maxEmitNodeDepth = 10000; 447 458 }; 448 459 -
trunk/JavaScriptCore/parser/Nodes.cpp
r38205 r38247 51 51 namespace JSC { 52 52 53 // ------------------------------ Node ----------------------------------------- 53 static void substitute(UString& string, const UString& substring) JSC_FAST_CALL; 54 55 // ------------------------------ NodeReleaser -------------------------------- 56 57 class NodeReleaser : Noncopyable { 58 public: 59 // Call this function inside the destructor of a class derived from Node. 60 // This will traverse the tree below this node, destroying all of those nodes, 61 // but without relying on recursion. 62 static void releaseAllNodes(ParserRefCounted* root); 63 64 // Call this on each node in a the releaseNodes virtual function. 65 // It gives the node to the NodeReleaser, which will then release the 66 // node later at the end of the releaseAllNodes process. 67 template <typename T> void release(RefPtr<T>& node) { if (node) adopt(node.release()); } 68 void release(RefPtr<FunctionBodyNode>& node) { if (node) adoptFunctionBodyNode(node); } 69 70 private: 71 NodeReleaser() { } 72 ~NodeReleaser() { } 73 74 void adopt(PassRefPtr<ParserRefCounted>); 75 void adoptFunctionBodyNode(RefPtr<FunctionBodyNode>&); 76 77 typedef Vector<RefPtr<ParserRefCounted> > NodeReleaseVector; 78 OwnPtr<NodeReleaseVector> m_vector; 79 }; 80 81 void NodeReleaser::releaseAllNodes(ParserRefCounted* root) 82 { 83 ASSERT(root); 84 NodeReleaser releaser; 85 root->releaseNodes(releaser); 86 if (!releaser.m_vector) 87 return; 88 // Note: The call to release.m_vector->size() is intentionally inside 89 // the loop, since calls to releaseNodes are expected to increase the size. 90 for (size_t i = 0; i < releaser.m_vector->size(); ++i) { 91 ParserRefCounted* node = (*releaser.m_vector)[i].get(); 92 if (node->hasOneRef()) 93 node->releaseNodes(releaser); 94 } 95 } 96 97 void NodeReleaser::adopt(PassRefPtr<ParserRefCounted> node) 98 { 99 ASSERT(node); 100 if (!node->hasOneRef()) 101 return; 102 if (!m_vector) 103 m_vector.set(new NodeReleaseVector); 104 m_vector->append(node); 105 } 106 107 void NodeReleaser::adoptFunctionBodyNode(RefPtr<FunctionBodyNode>& functionBodyNode) 108 { 109 // This sidesteps a problem where if you assign a PassRefPtr<FunctionBodyNode> 110 // to a PassRefPtr<Node> we leave the two reference counts (FunctionBodyNode 111 // and ParserRefCounted) unbalanced. It would be nice to fix this problem in 112 // a cleaner way -- perhaps we could remove the FunctionBodyNode reference 113 // count at some point. 114 RefPtr<Node> node = functionBodyNode; 115 functionBodyNode = 0; 116 adopt(node.release()); 117 } 118 119 // ------------------------------ ParserRefCounted ----------------------------------------- 54 120 55 121 #ifndef NDEBUG … … 74 140 parserRefCountedCounter.decrement(); 75 141 #endif 142 } 143 144 void ParserRefCounted::releaseNodes(NodeReleaser&) 145 { 76 146 } 77 147 … … 141 211 } 142 212 213 // ------------------------------ Node -------------------------------- 214 143 215 Node::Node(JSGlobalData* globalData) 144 216 : ParserRefCounted(globalData) … … 147 219 } 148 220 149 static void substitute(UString& string, const UString& substring) JSC_FAST_CALL; 221 // ------------------------------ ThrowableExpressionData -------------------------------- 222 150 223 static void substitute(UString& string, const UString& substring) 151 224 { … … 276 349 } 277 350 351 // ------------------------------ ElementNode ------------------------------------ 352 353 ElementNode::~ElementNode() 354 { 355 NodeReleaser::releaseAllNodes(this); 356 } 357 358 void ElementNode::releaseNodes(NodeReleaser& releaser) 359 { 360 releaser.release(m_next); 361 releaser.release(m_node); 362 } 363 278 364 // ------------------------------ ArrayNode ------------------------------------ 365 366 ArrayNode::~ArrayNode() 367 { 368 NodeReleaser::releaseAllNodes(this); 369 } 370 371 void ArrayNode::releaseNodes(NodeReleaser& releaser) 372 { 373 releaser.release(m_element); 374 } 279 375 280 376 RegisterID* ArrayNode::emitCode(CodeGenerator& generator, RegisterID* dst) … … 309 405 } 310 406 407 // ------------------------------ PropertyNode ---------------------------- 408 409 PropertyNode::~PropertyNode() 410 { 411 NodeReleaser::releaseAllNodes(this); 412 } 413 414 void PropertyNode::releaseNodes(NodeReleaser& releaser) 415 { 416 releaser.release(m_assign); 417 } 418 311 419 // ------------------------------ ObjectLiteralNode ---------------------------- 420 421 ObjectLiteralNode::~ObjectLiteralNode() 422 { 423 NodeReleaser::releaseAllNodes(this); 424 } 425 426 void ObjectLiteralNode::releaseNodes(NodeReleaser& releaser) 427 { 428 releaser.release(m_list); 429 } 312 430 313 431 RegisterID* ObjectLiteralNode::emitCode(CodeGenerator& generator, RegisterID* dst) … … 322 440 323 441 // ------------------------------ PropertyListNode ----------------------------- 442 443 PropertyListNode::~PropertyListNode() 444 { 445 NodeReleaser::releaseAllNodes(this); 446 } 447 448 void PropertyListNode::releaseNodes(NodeReleaser& releaser) 449 { 450 releaser.release(m_node); 451 releaser.release(m_next); 452 } 324 453 325 454 RegisterID* PropertyListNode::emitCode(CodeGenerator& generator, RegisterID* dst) … … 355 484 // ------------------------------ BracketAccessorNode -------------------------------- 356 485 486 BracketAccessorNode::~BracketAccessorNode() 487 { 488 NodeReleaser::releaseAllNodes(this); 489 } 490 491 void BracketAccessorNode::releaseNodes(NodeReleaser& releaser) 492 { 493 releaser.release(m_base); 494 releaser.release(m_subscript); 495 } 496 357 497 RegisterID* BracketAccessorNode::emitCode(CodeGenerator& generator, RegisterID* dst) 358 498 { … … 365 505 // ------------------------------ DotAccessorNode -------------------------------- 366 506 507 DotAccessorNode::~DotAccessorNode() 508 { 509 NodeReleaser::releaseAllNodes(this); 510 } 511 512 void DotAccessorNode::releaseNodes(NodeReleaser& releaser) 513 { 514 releaser.release(m_base); 515 } 516 367 517 RegisterID* DotAccessorNode::emitCode(CodeGenerator& generator, RegisterID* dst) 368 518 { … … 374 524 // ------------------------------ ArgumentListNode ----------------------------- 375 525 526 ArgumentListNode::~ArgumentListNode() 527 { 528 NodeReleaser::releaseAllNodes(this); 529 } 530 531 void ArgumentListNode::releaseNodes(NodeReleaser& releaser) 532 { 533 releaser.release(m_next); 534 releaser.release(m_expr); 535 } 536 376 537 RegisterID* ArgumentListNode::emitCode(CodeGenerator& generator, RegisterID* dst) 377 538 { … … 380 541 } 381 542 543 // ------------------------------ ArgumentsNode ----------------------------- 544 545 ArgumentsNode::~ArgumentsNode() 546 { 547 NodeReleaser::releaseAllNodes(this); 548 } 549 550 void ArgumentsNode::releaseNodes(NodeReleaser& releaser) 551 { 552 releaser.release(m_listNode); 553 } 554 382 555 // ------------------------------ NewExprNode ---------------------------------- 556 557 NewExprNode::~NewExprNode() 558 { 559 NodeReleaser::releaseAllNodes(this); 560 } 561 562 void NewExprNode::releaseNodes(NodeReleaser& releaser) 563 { 564 releaser.release(m_expr); 565 releaser.release(m_args); 566 } 383 567 384 568 RegisterID* NewExprNode::emitCode(CodeGenerator& generator, RegisterID* dst) … … 386 570 RefPtr<RegisterID> func = generator.emitNode(m_expr.get()); 387 571 return generator.emitConstruct(generator.finalDestination(dst), func.get(), m_args.get(), m_divot, m_startOffset, m_endOffset); 572 } 573 574 // ------------------------------ EvalFunctionCallNode ---------------------------------- 575 576 EvalFunctionCallNode::~EvalFunctionCallNode() 577 { 578 NodeReleaser::releaseAllNodes(this); 579 } 580 581 void EvalFunctionCallNode::releaseNodes(NodeReleaser& releaser) 582 { 583 releaser.release(m_args); 388 584 } 389 585 … … 396 592 } 397 593 594 // ------------------------------ FunctionCallValueNode ---------------------------------- 595 596 FunctionCallValueNode::~FunctionCallValueNode() 597 { 598 NodeReleaser::releaseAllNodes(this); 599 } 600 601 void FunctionCallValueNode::releaseNodes(NodeReleaser& releaser) 602 { 603 releaser.release(m_expr); 604 releaser.release(m_args); 605 } 606 398 607 RegisterID* FunctionCallValueNode::emitCode(CodeGenerator& generator, RegisterID* dst) 399 608 { 400 609 RefPtr<RegisterID> func = generator.emitNode(m_expr.get()); 401 610 return generator.emitCall(generator.finalDestination(dst), func.get(), 0, m_args.get(), m_divot, m_startOffset, m_endOffset); 611 } 612 613 // ------------------------------ FunctionCallResolveNode ---------------------------------- 614 615 FunctionCallResolveNode::~FunctionCallResolveNode() 616 { 617 NodeReleaser::releaseAllNodes(this); 618 } 619 620 void FunctionCallResolveNode::releaseNodes(NodeReleaser& releaser) 621 { 622 releaser.release(m_args); 402 623 } 403 624 … … 423 644 } 424 645 646 // ------------------------------ FunctionCallBracketNode ---------------------------------- 647 648 FunctionCallBracketNode::~FunctionCallBracketNode() 649 { 650 NodeReleaser::releaseAllNodes(this); 651 } 652 653 void FunctionCallBracketNode::releaseNodes(NodeReleaser& releaser) 654 { 655 releaser.release(m_base); 656 releaser.release(m_subscript); 657 releaser.release(m_args); 658 } 659 425 660 RegisterID* FunctionCallBracketNode::emitCode(CodeGenerator& generator, RegisterID* dst) 426 661 { … … 430 665 RefPtr<RegisterID> function = generator.emitGetByVal(generator.newTemporary(), base.get(), property); 431 666 return generator.emitCall(generator.finalDestination(dst, base.get()), function.get(), base.get(), m_args.get(), m_divot, m_startOffset, m_endOffset); 667 } 668 669 // ------------------------------ FunctionCallDotNode ---------------------------------- 670 671 FunctionCallDotNode::~FunctionCallDotNode() 672 { 673 NodeReleaser::releaseAllNodes(this); 674 } 675 676 void FunctionCallDotNode::releaseNodes(NodeReleaser& releaser) 677 { 678 releaser.release(m_base); 679 releaser.release(m_args); 432 680 } 433 681 … … 498 746 // ------------------------------ PostfixBracketNode ---------------------------------- 499 747 748 PostfixBracketNode::~PostfixBracketNode() 749 { 750 NodeReleaser::releaseAllNodes(this); 751 } 752 753 void PostfixBracketNode::releaseNodes(NodeReleaser& releaser) 754 { 755 releaser.release(m_base); 756 releaser.release(m_subscript); 757 } 758 500 759 RegisterID* PostfixBracketNode::emitCode(CodeGenerator& generator, RegisterID* dst) 501 760 { … … 522 781 // ------------------------------ PostfixDotNode ---------------------------------- 523 782 783 PostfixDotNode::~PostfixDotNode() 784 { 785 NodeReleaser::releaseAllNodes(this); 786 } 787 788 void PostfixDotNode::releaseNodes(NodeReleaser& releaser) 789 { 790 releaser.release(m_base); 791 } 792 524 793 RegisterID* PostfixDotNode::emitCode(CodeGenerator& generator, RegisterID* dst) 525 794 { … … 545 814 // ------------------------------ PostfixErrorNode ----------------------------------- 546 815 816 PostfixErrorNode::~PostfixErrorNode() 817 { 818 NodeReleaser::releaseAllNodes(this); 819 } 820 821 void PostfixErrorNode::releaseNodes(NodeReleaser& releaser) 822 { 823 releaser.release(m_expr); 824 } 825 547 826 RegisterID* PostfixErrorNode::emitCode(CodeGenerator& generator, RegisterID*) 548 827 { … … 564 843 // ------------------------------ DeleteBracketNode ----------------------------------- 565 844 845 DeleteBracketNode::~DeleteBracketNode() 846 { 847 NodeReleaser::releaseAllNodes(this); 848 } 849 850 void DeleteBracketNode::releaseNodes(NodeReleaser& releaser) 851 { 852 releaser.release(m_base); 853 releaser.release(m_subscript); 854 } 855 566 856 RegisterID* DeleteBracketNode::emitCode(CodeGenerator& generator, RegisterID* dst) 567 857 { … … 575 865 // ------------------------------ DeleteDotNode ----------------------------------- 576 866 867 DeleteDotNode::~DeleteDotNode() 868 { 869 NodeReleaser::releaseAllNodes(this); 870 } 871 872 void DeleteDotNode::releaseNodes(NodeReleaser& releaser) 873 { 874 releaser.release(m_base); 875 } 876 577 877 RegisterID* DeleteDotNode::emitCode(CodeGenerator& generator, RegisterID* dst) 578 878 { … … 585 885 // ------------------------------ DeleteValueNode ----------------------------------- 586 886 887 DeleteValueNode::~DeleteValueNode() 888 { 889 NodeReleaser::releaseAllNodes(this); 890 } 891 892 void DeleteValueNode::releaseNodes(NodeReleaser& releaser) 893 { 894 releaser.release(m_expr); 895 } 896 587 897 RegisterID* DeleteValueNode::emitCode(CodeGenerator& generator, RegisterID* dst) 588 898 { … … 594 904 595 905 // ------------------------------ VoidNode ------------------------------------- 906 907 VoidNode::~VoidNode() 908 { 909 NodeReleaser::releaseAllNodes(this); 910 } 911 912 void VoidNode::releaseNodes(NodeReleaser& releaser) 913 { 914 releaser.release(m_expr); 915 } 596 916 597 917 RegisterID* VoidNode::emitCode(CodeGenerator& generator, RegisterID* dst) … … 623 943 624 944 // ------------------------------ TypeOfValueNode ----------------------------------- 945 946 TypeOfValueNode::~TypeOfValueNode() 947 { 948 NodeReleaser::releaseAllNodes(this); 949 } 950 951 void TypeOfValueNode::releaseNodes(NodeReleaser& releaser) 952 { 953 releaser.release(m_expr); 954 } 625 955 626 956 RegisterID* TypeOfValueNode::emitCode(CodeGenerator& generator, RegisterID* dst) … … 669 999 670 1000 // ------------------------------ PrefixBracketNode ---------------------------------- 1001 1002 PrefixBracketNode::~PrefixBracketNode() 1003 { 1004 NodeReleaser::releaseAllNodes(this); 1005 } 1006 1007 void PrefixBracketNode::releaseNodes(NodeReleaser& releaser) 1008 { 1009 releaser.release(m_base); 1010 releaser.release(m_subscript); 1011 } 671 1012 672 1013 RegisterID* PrefixBracketNode::emitCode(CodeGenerator& generator, RegisterID* dst) … … 689 1030 // ------------------------------ PrefixDotNode ---------------------------------- 690 1031 1032 PrefixDotNode::~PrefixDotNode() 1033 { 1034 NodeReleaser::releaseAllNodes(this); 1035 } 1036 1037 void PrefixDotNode::releaseNodes(NodeReleaser& releaser) 1038 { 1039 releaser.release(m_base); 1040 } 1041 691 1042 RegisterID* PrefixDotNode::emitCode(CodeGenerator& generator, RegisterID* dst) 692 1043 { … … 707 1058 // ------------------------------ PrefixErrorNode ----------------------------------- 708 1059 1060 PrefixErrorNode::~PrefixErrorNode() 1061 { 1062 NodeReleaser::releaseAllNodes(this); 1063 } 1064 1065 void PrefixErrorNode::releaseNodes(NodeReleaser& releaser) 1066 { 1067 releaser.release(m_expr); 1068 } 1069 709 1070 RegisterID* PrefixErrorNode::emitCode(CodeGenerator& generator, RegisterID*) 710 1071 { … … 713 1074 714 1075 // ------------------------------ Unary Operation Nodes ----------------------------------- 1076 1077 UnaryOpNode::~UnaryOpNode() 1078 { 1079 NodeReleaser::releaseAllNodes(this); 1080 } 1081 1082 void UnaryOpNode::releaseNodes(NodeReleaser& releaser) 1083 { 1084 releaser.release(m_expr); 1085 } 715 1086 716 1087 RegisterID* UnaryOpNode::emitCode(CodeGenerator& generator, RegisterID* dst) … … 721 1092 722 1093 // ------------------------------ Binary Operation Nodes ----------------------------------- 1094 1095 BinaryOpNode::~BinaryOpNode() 1096 { 1097 NodeReleaser::releaseAllNodes(this); 1098 } 1099 1100 void BinaryOpNode::releaseNodes(NodeReleaser& releaser) 1101 { 1102 releaser.release(m_expr1); 1103 releaser.release(m_expr2); 1104 } 723 1105 724 1106 RegisterID* BinaryOpNode::emitCode(CodeGenerator& generator, RegisterID* dst) … … 783 1165 } 784 1166 785 // ------------------------------ Binary Logical Nodes ---------------------------- 1167 // ------------------------------ LogicalOpNode ---------------------------- 1168 1169 LogicalOpNode::~LogicalOpNode() 1170 { 1171 NodeReleaser::releaseAllNodes(this); 1172 } 1173 1174 void LogicalOpNode::releaseNodes(NodeReleaser& releaser) 1175 { 1176 releaser.release(m_expr1); 1177 releaser.release(m_expr2); 1178 } 786 1179 787 1180 RegisterID* LogicalOpNode::emitCode(CodeGenerator& generator, RegisterID* dst) … … 803 1196 // ------------------------------ ConditionalNode ------------------------------ 804 1197 1198 ConditionalNode::~ConditionalNode() 1199 { 1200 NodeReleaser::releaseAllNodes(this); 1201 } 1202 1203 void ConditionalNode::releaseNodes(NodeReleaser& releaser) 1204 { 1205 releaser.release(m_logical); 1206 releaser.release(m_expr1); 1207 releaser.release(m_expr2); 1208 } 1209 805 1210 RegisterID* ConditionalNode::emitCode(CodeGenerator& generator, RegisterID* dst) 806 1211 { … … 824 1229 825 1230 // ------------------------------ ReadModifyResolveNode ----------------------------------- 1231 1232 ReadModifyResolveNode::~ReadModifyResolveNode() 1233 { 1234 NodeReleaser::releaseAllNodes(this); 1235 } 1236 1237 void ReadModifyResolveNode::releaseNodes(NodeReleaser& releaser) 1238 { 1239 releaser.release(m_right); 1240 } 826 1241 827 1242 // FIXME: should this be moved to be a method on CodeGenerator? … … 915 1330 // ------------------------------ AssignResolveNode ----------------------------------- 916 1331 1332 AssignResolveNode::~AssignResolveNode() 1333 { 1334 NodeReleaser::releaseAllNodes(this); 1335 } 1336 1337 void AssignResolveNode::releaseNodes(NodeReleaser& releaser) 1338 { 1339 releaser.release(m_right); 1340 } 1341 917 1342 RegisterID* AssignResolveNode::emitCode(CodeGenerator& generator, RegisterID* dst) 918 1343 { … … 946 1371 // ------------------------------ AssignDotNode ----------------------------------- 947 1372 1373 AssignDotNode::~AssignDotNode() 1374 { 1375 NodeReleaser::releaseAllNodes(this); 1376 } 1377 1378 void AssignDotNode::releaseNodes(NodeReleaser& releaser) 1379 { 1380 releaser.release(m_base); 1381 releaser.release(m_right); 1382 } 1383 948 1384 RegisterID* AssignDotNode::emitCode(CodeGenerator& generator, RegisterID* dst) 949 1385 { … … 958 1394 // ------------------------------ ReadModifyDotNode ----------------------------------- 959 1395 1396 ReadModifyDotNode::~ReadModifyDotNode() 1397 { 1398 NodeReleaser::releaseAllNodes(this); 1399 } 1400 1401 void ReadModifyDotNode::releaseNodes(NodeReleaser& releaser) 1402 { 1403 releaser.release(m_base); 1404 releaser.release(m_right); 1405 } 1406 960 1407 RegisterID* ReadModifyDotNode::emitCode(CodeGenerator& generator, RegisterID* dst) 961 1408 { … … 973 1420 // ------------------------------ AssignErrorNode ----------------------------------- 974 1421 1422 AssignErrorNode::~AssignErrorNode() 1423 { 1424 NodeReleaser::releaseAllNodes(this); 1425 } 1426 1427 void AssignErrorNode::releaseNodes(NodeReleaser& releaser) 1428 { 1429 releaser.release(m_left); 1430 releaser.release(m_right); 1431 } 1432 975 1433 RegisterID* AssignErrorNode::emitCode(CodeGenerator& generator, RegisterID*) 976 1434 { … … 979 1437 980 1438 // ------------------------------ AssignBracketNode ----------------------------------- 1439 1440 AssignBracketNode::~AssignBracketNode() 1441 { 1442 NodeReleaser::releaseAllNodes(this); 1443 } 1444 1445 void AssignBracketNode::releaseNodes(NodeReleaser& releaser) 1446 { 1447 releaser.release(m_base); 1448 releaser.release(m_subscript); 1449 releaser.release(m_right); 1450 } 981 1451 982 1452 RegisterID* AssignBracketNode::emitCode(CodeGenerator& generator, RegisterID* dst) … … 992 1462 } 993 1463 1464 // ------------------------------ ReadModifyBracketNode ----------------------------------- 1465 1466 ReadModifyBracketNode::~ReadModifyBracketNode() 1467 { 1468 NodeReleaser::releaseAllNodes(this); 1469 } 1470 1471 void ReadModifyBracketNode::releaseNodes(NodeReleaser& releaser) 1472 { 1473 releaser.release(m_base); 1474 releaser.release(m_subscript); 1475 releaser.release(m_right); 1476 } 1477 994 1478 RegisterID* ReadModifyBracketNode::emitCode(CodeGenerator& generator, RegisterID* dst) 995 1479 { … … 1010 1494 // ------------------------------ CommaNode ------------------------------------ 1011 1495 1496 CommaNode::~CommaNode() 1497 { 1498 NodeReleaser::releaseAllNodes(this); 1499 } 1500 1501 void CommaNode::releaseNodes(NodeReleaser& releaser) 1502 { 1503 releaser.release(m_expr1); 1504 releaser.release(m_expr2); 1505 } 1506 1012 1507 RegisterID* CommaNode::emitCode(CodeGenerator& generator, RegisterID* dst) 1013 1508 { … … 1016 1511 } 1017 1512 1018 // ------------------------------ ConstDeclNode ---------------------------------- 1513 // ------------------------------ ConstDeclNode ------------------------------------ 1514 1515 ConstDeclNode::~ConstDeclNode() 1516 { 1517 NodeReleaser::releaseAllNodes(this); 1518 } 1519 1520 void ConstDeclNode::releaseNodes(NodeReleaser& releaser) 1521 { 1522 releaser.release(m_next); 1523 releaser.release(m_init); 1524 } 1019 1525 1020 1526 ConstDeclNode::ConstDeclNode(JSGlobalData* globalData, const Identifier& ident, ExpressionNode* init) … … 1052 1558 // ------------------------------ ConstStatementNode ----------------------------- 1053 1559 1560 ConstStatementNode::~ConstStatementNode() 1561 { 1562 NodeReleaser::releaseAllNodes(this); 1563 } 1564 1565 void ConstStatementNode::releaseNodes(NodeReleaser& releaser) 1566 { 1567 releaser.release(m_next); 1568 } 1569 1054 1570 RegisterID* ConstStatementNode::emitCode(CodeGenerator& generator, RegisterID*) 1055 1571 { … … 1083 1599 // ------------------------------ BlockNode ------------------------------------ 1084 1600 1601 BlockNode::~BlockNode() 1602 { 1603 NodeReleaser::releaseAllNodes(this); 1604 } 1605 1606 void BlockNode::releaseNodes(NodeReleaser& releaser) 1607 { 1608 size_t size = m_children.size(); 1609 for (size_t i = 0; i < size; ++i) 1610 releaser.release(m_children[i]); 1611 } 1612 1085 1613 BlockNode::BlockNode(JSGlobalData* globalData, SourceElements* children) 1086 1614 : StatementNode(globalData) … … 1120 1648 // ------------------------------ VarStatementNode ---------------------------- 1121 1649 1650 VarStatementNode::~VarStatementNode() 1651 { 1652 NodeReleaser::releaseAllNodes(this); 1653 } 1654 1655 void VarStatementNode::releaseNodes(NodeReleaser& releaser) 1656 { 1657 releaser.release(m_expr); 1658 } 1659 1122 1660 RegisterID* VarStatementNode::emitCode(CodeGenerator& generator, RegisterID*) 1123 1661 { … … 1128 1666 // ------------------------------ IfNode --------------------------------------- 1129 1667 1668 IfNode::~IfNode() 1669 { 1670 NodeReleaser::releaseAllNodes(this); 1671 } 1672 1673 void IfNode::releaseNodes(NodeReleaser& releaser) 1674 { 1675 releaser.release(m_condition); 1676 releaser.release(m_ifBlock); 1677 } 1678 1130 1679 RegisterID* IfNode::emitCode(CodeGenerator& generator, RegisterID* dst) 1131 1680 { … … 1141 1690 generator.emitLabel(afterThen.get()); 1142 1691 1143 // FIXME: This should return the last statement exec tuted so that it can be returned as a Completion1692 // FIXME: This should return the last statement executed so that it can be returned as a Completion. 1144 1693 return 0; 1694 } 1695 1696 // ------------------------------ IfElseNode --------------------------------------- 1697 1698 IfElseNode::~IfElseNode() 1699 { 1700 NodeReleaser::releaseAllNodes(this); 1701 } 1702 1703 void IfElseNode::releaseNodes(NodeReleaser& releaser) 1704 { 1705 releaser.release(m_elseBlock); 1706 IfNode::releaseNodes(releaser); 1145 1707 } 1146 1708 … … 1168 1730 generator.emitLabel(afterElse.get()); 1169 1731 1170 // FIXME: This should return the last statement exec tuted so that it can be returned as a Completion1732 // FIXME: This should return the last statement executed so that it can be returned as a Completion. 1171 1733 return 0; 1172 1734 } 1173 1735 1174 1736 // ------------------------------ DoWhileNode ---------------------------------- 1737 1738 DoWhileNode::~DoWhileNode() 1739 { 1740 NodeReleaser::releaseAllNodes(this); 1741 } 1742 1743 void DoWhileNode::releaseNodes(NodeReleaser& releaser) 1744 { 1745 releaser.release(m_statement); 1746 releaser.release(m_expr); 1747 } 1175 1748 1176 1749 RegisterID* DoWhileNode::emitCode(CodeGenerator& generator, RegisterID* dst) … … 1199 1772 // ------------------------------ WhileNode ------------------------------------ 1200 1773 1774 WhileNode::~WhileNode() 1775 { 1776 NodeReleaser::releaseAllNodes(this); 1777 } 1778 1779 void WhileNode::releaseNodes(NodeReleaser& releaser) 1780 { 1781 releaser.release(m_expr); 1782 releaser.release(m_statement); 1783 } 1784 1201 1785 RegisterID* WhileNode::emitCode(CodeGenerator& generator, RegisterID* dst) 1202 1786 { … … 1225 1809 1226 1810 // ------------------------------ ForNode -------------------------------------- 1811 1812 ForNode::~ForNode() 1813 { 1814 NodeReleaser::releaseAllNodes(this); 1815 } 1816 1817 void ForNode::releaseNodes(NodeReleaser& releaser) 1818 { 1819 releaser.release(m_expr1); 1820 releaser.release(m_expr2); 1821 releaser.release(m_expr3); 1822 releaser.release(m_statement); 1823 } 1227 1824 1228 1825 RegisterID* ForNode::emitCode(CodeGenerator& generator, RegisterID* dst) … … 1264 1861 1265 1862 // ------------------------------ ForInNode ------------------------------------ 1863 1864 ForInNode::~ForInNode() 1865 { 1866 NodeReleaser::releaseAllNodes(this); 1867 } 1868 1869 void ForInNode::releaseNodes(NodeReleaser& releaser) 1870 { 1871 releaser.release(m_init); 1872 releaser.release(m_lexpr); 1873 releaser.release(m_expr); 1874 releaser.release(m_statement); 1875 } 1266 1876 1267 1877 ForInNode::ForInNode(JSGlobalData* globalData, ExpressionNode* l, ExpressionNode* expr, StatementNode* statement) … … 1388 1998 // ------------------------------ ReturnNode ----------------------------------- 1389 1999 2000 ReturnNode::~ReturnNode() 2001 { 2002 NodeReleaser::releaseAllNodes(this); 2003 } 2004 2005 void ReturnNode::releaseNodes(NodeReleaser& releaser) 2006 { 2007 releaser.release(m_value); 2008 } 2009 1390 2010 RegisterID* ReturnNode::emitCode(CodeGenerator& generator, RegisterID* dst) 1391 2011 { … … 1407 2027 // ------------------------------ WithNode ------------------------------------- 1408 2028 2029 WithNode::~WithNode() 2030 { 2031 NodeReleaser::releaseAllNodes(this); 2032 } 2033 2034 void WithNode::releaseNodes(NodeReleaser& releaser) 2035 { 2036 releaser.release(m_expr); 2037 releaser.release(m_statement); 2038 } 2039 1409 2040 RegisterID* WithNode::emitCode(CodeGenerator& generator, RegisterID* dst) 1410 2041 { … … 1417 2048 } 1418 2049 2050 // ------------------------------ CaseClauseNode -------------------------------- 2051 2052 CaseClauseNode::~CaseClauseNode() 2053 { 2054 NodeReleaser::releaseAllNodes(this); 2055 } 2056 2057 void CaseClauseNode::releaseNodes(NodeReleaser& releaser) 2058 { 2059 releaser.release(m_expr); 2060 } 2061 2062 // ------------------------------ ClauseListNode -------------------------------- 2063 2064 ClauseListNode::~ClauseListNode() 2065 { 2066 NodeReleaser::releaseAllNodes(this); 2067 } 2068 2069 void ClauseListNode::releaseNodes(NodeReleaser& releaser) 2070 { 2071 releaser.release(m_clause); 2072 releaser.release(m_next); 2073 } 2074 1419 2075 // ------------------------------ CaseBlockNode -------------------------------- 2076 2077 CaseBlockNode::~CaseBlockNode() 2078 { 2079 NodeReleaser::releaseAllNodes(this); 2080 } 2081 2082 void CaseBlockNode::releaseNodes(NodeReleaser& releaser) 2083 { 2084 releaser.release(m_list1); 2085 releaser.release(m_defaultClause); 2086 releaser.release(m_list2); 2087 } 2088 1420 2089 enum SwitchKind { 1421 2090 SwitchUnset = 0, … … 1561 2230 // ------------------------------ SwitchNode ----------------------------------- 1562 2231 2232 SwitchNode::~SwitchNode() 2233 { 2234 NodeReleaser::releaseAllNodes(this); 2235 } 2236 2237 void SwitchNode::releaseNodes(NodeReleaser& releaser) 2238 { 2239 releaser.release(m_expr); 2240 releaser.release(m_block); 2241 } 2242 1563 2243 RegisterID* SwitchNode::emitCode(CodeGenerator& generator, RegisterID* dst) 1564 2244 { … … 1574 2254 // ------------------------------ LabelNode ------------------------------------ 1575 2255 2256 LabelNode::~LabelNode() 2257 { 2258 NodeReleaser::releaseAllNodes(this); 2259 } 2260 2261 void LabelNode::releaseNodes(NodeReleaser& releaser) 2262 { 2263 releaser.release(m_statement); 2264 } 2265 1576 2266 RegisterID* LabelNode::emitCode(CodeGenerator& generator, RegisterID* dst) 1577 2267 { … … 1587 2277 1588 2278 // ------------------------------ ThrowNode ------------------------------------ 2279 2280 ThrowNode::~ThrowNode() 2281 { 2282 NodeReleaser::releaseAllNodes(this); 2283 } 2284 2285 void ThrowNode::releaseNodes(NodeReleaser& releaser) 2286 { 2287 releaser.release(m_expr); 2288 } 1589 2289 1590 2290 RegisterID* ThrowNode::emitCode(CodeGenerator& generator, RegisterID* dst) … … 1599 2299 1600 2300 // ------------------------------ TryNode -------------------------------------- 2301 2302 TryNode::~TryNode() 2303 { 2304 NodeReleaser::releaseAllNodes(this); 2305 } 2306 2307 void TryNode::releaseNodes(NodeReleaser& releaser) 2308 { 2309 releaser.release(m_tryBlock); 2310 releaser.release(m_catchBlock); 2311 releaser.release(m_finallyBlock); 2312 } 1601 2313 1602 2314 RegisterID* TryNode::emitCode(CodeGenerator& generator, RegisterID* dst) … … 1658 2370 } 1659 2371 2372 // ------------------------------ ParameterNode ----------------------------- 2373 2374 ParameterNode::~ParameterNode() 2375 { 2376 NodeReleaser::releaseAllNodes(this); 2377 } 2378 2379 void ParameterNode::releaseNodes(NodeReleaser& releaser) 2380 { 2381 releaser.release(m_next); 2382 } 1660 2383 1661 2384 // ------------------------------ ScopeNode ----------------------------- … … 1737 2460 FunctionBodyNode::~FunctionBodyNode() 1738 2461 { 1739 if (m_parameters)1740 2462 ASSERT(!m_refCount); 2463 fastFree(m_parameters); 1741 2464 } 1742 2465 … … 1843 2566 // ------------------------------ FuncDeclNode --------------------------------- 1844 2567 2568 FuncDeclNode::~FuncDeclNode() 2569 { 2570 NodeReleaser::releaseAllNodes(this); 2571 } 2572 2573 void FuncDeclNode::releaseNodes(NodeReleaser& releaser) 2574 { 2575 releaser.release(m_parameter); 2576 releaser.release(m_body); 2577 } 2578 1845 2579 JSFunction* FuncDeclNode::makeFunction(ExecState* exec, ScopeChainNode* scopeChain) 1846 2580 { … … 1854 2588 1855 2589 // ------------------------------ FuncExprNode --------------------------------- 2590 2591 FuncExprNode::~FuncExprNode() 2592 { 2593 NodeReleaser::releaseAllNodes(this); 2594 } 2595 2596 void FuncExprNode::releaseNodes(NodeReleaser& releaser) 2597 { 2598 releaser.release(m_parameter); 2599 releaser.release(m_body); 2600 } 1856 2601 1857 2602 RegisterID* FuncExprNode::emitCode(CodeGenerator& generator, RegisterID* dst) -
trunk/JavaScriptCore/parser/Nodes.h
r38209 r38247 36 36 #include "SymbolTable.h" 37 37 #include "RegExp.h" 38 #include <wtf/ListRefPtr.h>39 38 #include <wtf/MathExtras.h> 40 39 #include <wtf/OwnPtr.h> … … 56 55 class EvalCodeBlock; 57 56 class JSFunction; 57 class NodeReleaser; 58 58 class ProgramCodeBlock; 59 59 class PropertyListNode; … … 136 136 137 137 public: 138 // Nonrecursive destruction. 139 virtual void releaseNodes(NodeReleaser&); 140 138 141 void ref() JSC_FAST_CALL; 139 142 void deref() JSC_FAST_CALL; … … 191 194 virtual Precedence precedence() const = 0; 192 195 virtual bool needsParensIfLeftmost() const { return false; } 193 196 194 197 protected: 195 198 int m_line; … … 478 481 Identifier m_ident; 479 482 int32_t m_startOffset; 480 481 483 }; 482 484 … … 498 500 } 499 501 502 virtual ~ElementNode(); 503 virtual void releaseNodes(NodeReleaser&); 504 500 505 virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; } 501 506 virtual void streamTo(SourceStream&) const JSC_FAST_CALL; … … 505 510 506 511 ElementNode* next() { return m_next.get(); } 507 PassRefPtr<ElementNode> releaseNext() JSC_FAST_CALL { return m_next.release(); } 508 509 private: 510 ListRefPtr<ElementNode> m_next; 512 513 private: 514 RefPtr<ElementNode> m_next; 511 515 int m_elision; 512 516 RefPtr<ExpressionNode> m_node; … … 537 541 { 538 542 } 543 544 virtual ~ArrayNode(); 545 virtual void releaseNodes(NodeReleaser&); 539 546 540 547 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; … … 561 568 } 562 569 570 virtual ~PropertyNode(); 571 virtual void releaseNodes(NodeReleaser&); 572 563 573 virtual void streamTo(SourceStream&) const JSC_FAST_CALL; 564 574 virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; } … … 588 598 } 589 599 600 virtual ~PropertyListNode(); 601 virtual void releaseNodes(NodeReleaser&); 602 590 603 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 591 604 virtual void streamTo(SourceStream&) const JSC_FAST_CALL; 592 605 virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; } 593 594 PassRefPtr<PropertyListNode> releaseNext() JSC_FAST_CALL { return m_next.release(); }595 606 596 607 private: 597 608 friend class ObjectLiteralNode; 598 609 RefPtr<PropertyNode> m_node; 599 ListRefPtr<PropertyListNode> m_next;610 RefPtr<PropertyListNode> m_next; 600 611 }; 601 612 … … 612 623 { 613 624 } 625 626 virtual ~ObjectLiteralNode(); 627 virtual void releaseNodes(NodeReleaser&); 614 628 615 629 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; … … 631 645 { 632 646 } 647 648 virtual ~BracketAccessorNode(); 649 virtual void releaseNodes(NodeReleaser&); 633 650 634 651 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; … … 657 674 } 658 675 676 virtual ~DotAccessorNode(); 677 virtual void releaseNodes(NodeReleaser&); 678 659 679 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 660 680 virtual void streamTo(SourceStream&) const JSC_FAST_CALL; … … 686 706 } 687 707 708 virtual ~ArgumentListNode(); 709 virtual void releaseNodes(NodeReleaser&); 710 688 711 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 689 712 virtual void streamTo(SourceStream&) const JSC_FAST_CALL; 690 713 virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; } 691 714 692 PassRefPtr<ArgumentListNode> releaseNext() JSC_FAST_CALL { return m_next.release(); } 693 694 ListRefPtr<ArgumentListNode> m_next; 715 RefPtr<ArgumentListNode> m_next; 695 716 RefPtr<ExpressionNode> m_expr; 696 717 }; … … 709 730 } 710 731 732 virtual ~ArgumentsNode(); 733 virtual void releaseNodes(NodeReleaser&); 734 711 735 virtual void streamTo(SourceStream&) const JSC_FAST_CALL; 712 736 virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; } … … 730 754 } 731 755 756 virtual ~NewExprNode(); 757 virtual void releaseNodes(NodeReleaser&); 758 732 759 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 733 760 … … 748 775 { 749 776 } 777 778 virtual ~EvalFunctionCallNode(); 779 virtual void releaseNodes(NodeReleaser&); 750 780 751 781 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; … … 767 797 } 768 798 799 virtual ~FunctionCallValueNode(); 800 virtual void releaseNodes(NodeReleaser&); 801 769 802 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 770 803 virtual void streamTo(SourceStream&) const JSC_FAST_CALL; … … 785 818 { 786 819 } 820 821 virtual ~FunctionCallResolveNode(); 822 virtual void releaseNodes(NodeReleaser&); 787 823 788 824 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; … … 809 845 } 810 846 847 virtual ~FunctionCallBracketNode(); 848 virtual void releaseNodes(NodeReleaser&); 849 811 850 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 812 851 virtual void streamTo(SourceStream&) const JSC_FAST_CALL; … … 830 869 } 831 870 871 virtual ~FunctionCallDotNode(); 872 virtual void releaseNodes(NodeReleaser&); 873 832 874 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 833 875 virtual void streamTo(SourceStream&) const JSC_FAST_CALL; … … 880 922 } 881 923 924 virtual ~PostfixBracketNode(); 925 virtual void releaseNodes(NodeReleaser&); 926 882 927 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 883 928 virtual void streamTo(SourceStream&) const JSC_FAST_CALL; … … 901 946 } 902 947 948 virtual ~PostfixDotNode(); 949 virtual void releaseNodes(NodeReleaser&); 950 903 951 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 904 952 virtual void streamTo(SourceStream&) const JSC_FAST_CALL; … … 921 969 } 922 970 971 virtual ~PostfixErrorNode(); 972 virtual void releaseNodes(NodeReleaser&); 973 923 974 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 924 975 virtual void streamTo(SourceStream&) const JSC_FAST_CALL; … … 958 1009 } 959 1010 1011 virtual ~DeleteBracketNode(); 1012 virtual void releaseNodes(NodeReleaser&); 1013 960 1014 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 961 1015 … … 978 1032 } 979 1033 1034 virtual ~DeleteDotNode(); 1035 virtual void releaseNodes(NodeReleaser&); 1036 980 1037 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 981 1038 … … 996 1053 } 997 1054 1055 virtual ~DeleteValueNode(); 1056 virtual void releaseNodes(NodeReleaser&); 1057 998 1058 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 999 1059 … … 1012 1072 { 1013 1073 } 1074 1075 virtual ~VoidNode(); 1076 virtual void releaseNodes(NodeReleaser&); 1014 1077 1015 1078 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; … … 1049 1112 { 1050 1113 } 1114 1115 virtual ~TypeOfValueNode(); 1116 virtual void releaseNodes(NodeReleaser&); 1051 1117 1052 1118 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; … … 1087 1153 } 1088 1154 1155 virtual ~PrefixBracketNode(); 1156 virtual void releaseNodes(NodeReleaser&); 1157 1089 1158 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 1090 1159 virtual void streamTo(SourceStream&) const JSC_FAST_CALL; … … 1108 1177 } 1109 1178 1179 virtual ~PrefixDotNode(); 1180 virtual void releaseNodes(NodeReleaser&); 1181 1110 1182 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 1111 1183 virtual void streamTo(SourceStream&) const JSC_FAST_CALL; … … 1128 1200 } 1129 1201 1202 virtual ~PrefixErrorNode(); 1203 virtual void releaseNodes(NodeReleaser&); 1204 1130 1205 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 1131 1206 virtual void streamTo(SourceStream&) const JSC_FAST_CALL; … … 1150 1225 { 1151 1226 } 1227 1228 virtual ~UnaryOpNode(); 1229 virtual void releaseNodes(NodeReleaser&); 1152 1230 1153 1231 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; … … 1226 1304 } 1227 1305 1306 virtual ~BinaryOpNode(); 1307 virtual void releaseNodes(NodeReleaser&); 1308 1228 1309 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 1229 1310 virtual OpcodeID opcode() const JSC_FAST_CALL = 0; … … 1235 1316 }; 1236 1317 1237 class ReverseBinaryOpNode : public ExpressionNode {1318 class ReverseBinaryOpNode : public BinaryOpNode { 1238 1319 public: 1239 1320 ReverseBinaryOpNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 1240 : ExpressionNode(globalData) 1241 , m_expr1(expr1) 1242 , m_expr2(expr2) 1243 , m_rightHasAssignments(rightHasAssignments) 1321 : BinaryOpNode(globalData, expr1, expr2, rightHasAssignments) 1244 1322 { 1245 1323 } 1246 1324 1247 1325 ReverseBinaryOpNode(JSGlobalData* globalData, ResultType type, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 1248 : ExpressionNode(globalData, type) 1249 , m_expr1(expr1) 1250 , m_expr2(expr2) 1251 , m_rightHasAssignments(rightHasAssignments) 1252 { 1253 } 1254 1255 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 1256 virtual OpcodeID opcode() const JSC_FAST_CALL = 0; 1257 1258 protected: 1259 RefPtr<ExpressionNode> m_expr1; 1260 RefPtr<ExpressionNode> m_expr2; 1261 bool m_rightHasAssignments; 1326 : BinaryOpNode(globalData, type, expr1, expr2, rightHasAssignments) 1327 { 1328 } 1329 1330 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 1262 1331 }; 1263 1332 … … 1544 1613 } 1545 1614 1615 virtual ~LogicalOpNode(); 1616 virtual void releaseNodes(NodeReleaser&); 1617 1546 1618 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 1547 1619 virtual void streamTo(SourceStream&) const JSC_FAST_CALL; … … 1566 1638 { 1567 1639 } 1640 1641 virtual ~ConditionalNode(); 1642 virtual void releaseNodes(NodeReleaser&); 1568 1643 1569 1644 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; … … 1589 1664 } 1590 1665 1666 virtual ~ReadModifyResolveNode(); 1667 virtual void releaseNodes(NodeReleaser&); 1668 1591 1669 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 1592 1670 … … 1611 1689 { 1612 1690 } 1691 1692 virtual ~AssignResolveNode(); 1693 virtual void releaseNodes(NodeReleaser&); 1613 1694 1614 1695 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; … … 1638 1719 } 1639 1720 1721 virtual ~ReadModifyBracketNode(); 1722 virtual void releaseNodes(NodeReleaser&); 1723 1640 1724 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 1641 1725 … … 1665 1749 } 1666 1750 1751 virtual ~AssignBracketNode(); 1752 virtual void releaseNodes(NodeReleaser&); 1753 1667 1754 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 1668 1755 … … 1689 1776 { 1690 1777 } 1778 1779 virtual ~AssignDotNode(); 1780 virtual void releaseNodes(NodeReleaser&); 1691 1781 1692 1782 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; … … 1714 1804 } 1715 1805 1806 virtual ~ReadModifyDotNode(); 1807 virtual void releaseNodes(NodeReleaser&); 1808 1716 1809 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 1717 1810 … … 1738 1831 } 1739 1832 1833 virtual ~AssignErrorNode(); 1834 virtual void releaseNodes(NodeReleaser&); 1835 1740 1836 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 1741 1837 virtual void streamTo(SourceStream&) const JSC_FAST_CALL; … … 1757 1853 } 1758 1854 1855 virtual ~CommaNode(); 1856 virtual void releaseNodes(NodeReleaser&); 1857 1759 1858 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 1760 1859 virtual void streamTo(SourceStream&) const JSC_FAST_CALL; … … 1779 1878 ConstDeclNode(JSGlobalData* globalData, const Identifier& ident, ExpressionNode* in) JSC_FAST_CALL; 1780 1879 1880 virtual ~ConstDeclNode(); 1881 virtual void releaseNodes(NodeReleaser&); 1882 1781 1883 virtual void streamTo(SourceStream&) const JSC_FAST_CALL; 1782 1884 virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; } 1783 PassRefPtr<ConstDeclNode> releaseNext() JSC_FAST_CALL { return m_next.release(); }1784 1885 1785 1886 Identifier m_ident; 1786 ListRefPtr<ConstDeclNode> m_next;1887 RefPtr<ConstDeclNode> m_next; 1787 1888 RefPtr<ExpressionNode> m_init; 1788 1889 … … 1799 1900 } 1800 1901 1902 virtual ~ConstStatementNode(); 1903 virtual void releaseNodes(NodeReleaser&); 1904 1801 1905 virtual void streamTo(SourceStream&) const JSC_FAST_CALL; 1802 1906 … … 1828 1932 BlockNode(JSGlobalData*, SourceElements* children) JSC_FAST_CALL; 1829 1933 1934 virtual ~BlockNode(); 1935 virtual void releaseNodes(NodeReleaser&); 1936 1830 1937 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 1831 1938 virtual void streamTo(SourceStream&) const JSC_FAST_CALL; … … 1834 1941 1835 1942 virtual bool isBlock() const JSC_FAST_CALL { return true; } 1943 1836 1944 protected: 1837 1945 StatementVector m_children; … … 1886 1994 } 1887 1995 1996 virtual ~VarStatementNode(); 1997 virtual void releaseNodes(NodeReleaser&); 1998 1888 1999 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 1889 2000 … … 1903 2014 } 1904 2015 2016 virtual ~IfNode(); 2017 virtual void releaseNodes(NodeReleaser&); 2018 1905 2019 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 1906 2020 virtual void streamTo(SourceStream&) const JSC_FAST_CALL; … … 1918 2032 { 1919 2033 } 2034 2035 virtual ~IfElseNode(); 2036 virtual void releaseNodes(NodeReleaser&); 1920 2037 1921 2038 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; … … 1935 2052 } 1936 2053 2054 virtual ~DoWhileNode(); 2055 virtual void releaseNodes(NodeReleaser&); 2056 1937 2057 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 1938 2058 virtual void streamTo(SourceStream&) const JSC_FAST_CALL; 1939 2059 1940 2060 virtual bool isLoop() const JSC_FAST_CALL { return true; } 2061 1941 2062 private: 1942 2063 RefPtr<StatementNode> m_statement; … … 1953 2074 } 1954 2075 2076 virtual ~WhileNode(); 2077 virtual void releaseNodes(NodeReleaser&); 2078 1955 2079 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 1956 2080 virtual void streamTo(SourceStream&) const JSC_FAST_CALL; 1957 2081 1958 2082 virtual bool isLoop() const JSC_FAST_CALL { return true; } 2083 1959 2084 private: 1960 2085 RefPtr<ExpressionNode> m_expr; … … 1975 2100 } 1976 2101 2102 virtual ~ForNode(); 2103 virtual void releaseNodes(NodeReleaser&); 2104 1977 2105 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 1978 2106 virtual void streamTo(SourceStream&) const JSC_FAST_CALL; 1979 2107 1980 2108 virtual bool isLoop() const JSC_FAST_CALL { return true; } 2109 1981 2110 private: 1982 2111 RefPtr<ExpressionNode> m_expr1; … … 1992 2121 ForInNode(JSGlobalData*, const Identifier&, ExpressionNode*, ExpressionNode*, StatementNode*, int divot, int startOffset, int endOffset) JSC_FAST_CALL; 1993 2122 2123 virtual ~ForInNode(); 2124 virtual void releaseNodes(NodeReleaser&); 2125 1994 2126 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 1995 2127 virtual void streamTo(SourceStream&) const JSC_FAST_CALL; 1996 2128 1997 2129 virtual bool isLoop() const JSC_FAST_CALL { return true; } 2130 1998 2131 private: 1999 2132 Identifier m_ident; … … 2053 2186 } 2054 2187 2188 virtual ~ReturnNode(); 2189 virtual void releaseNodes(NodeReleaser&); 2190 2055 2191 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 2056 2192 virtual void streamTo(SourceStream&) const JSC_FAST_CALL; … … 2072 2208 } 2073 2209 2210 virtual ~WithNode(); 2211 virtual void releaseNodes(NodeReleaser&); 2212 2074 2213 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 2075 2214 virtual void streamTo(SourceStream&) const JSC_FAST_CALL; … … 2091 2230 } 2092 2231 2232 virtual ~LabelNode(); 2233 virtual void releaseNodes(NodeReleaser&); 2234 2093 2235 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 2094 2236 virtual void streamTo(SourceStream&) const JSC_FAST_CALL; … … 2106 2248 { 2107 2249 } 2250 2251 virtual ~ThrowNode(); 2252 virtual void releaseNodes(NodeReleaser&); 2108 2253 2109 2254 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; … … 2125 2270 } 2126 2271 2272 virtual ~TryNode(); 2273 virtual void releaseNodes(NodeReleaser&); 2274 2127 2275 virtual void streamTo(SourceStream&) const JSC_FAST_CALL; 2128 2276 … … 2151 2299 } 2152 2300 2301 virtual ~ParameterNode(); 2302 virtual void releaseNodes(NodeReleaser&); 2303 2153 2304 Identifier ident() JSC_FAST_CALL { return m_ident; } 2154 2305 ParameterNode *nextParam() JSC_FAST_CALL { return m_next.get(); } 2155 2306 virtual void streamTo(SourceStream&) const JSC_FAST_CALL; 2156 PassRefPtr<ParameterNode> releaseNext() JSC_FAST_CALL { return m_next.release(); }2157 2307 virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; } 2158 2308 … … 2161 2311 friend class FuncExprNode; 2162 2312 Identifier m_ident; 2163 ListRefPtr<ParameterNode> m_next;2313 RefPtr<ParameterNode> m_next; 2164 2314 }; 2165 2315 … … 2325 2475 } 2326 2476 2477 virtual ~FuncExprNode(); 2478 virtual void releaseNodes(NodeReleaser&); 2479 2327 2480 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 2328 2481 JSFunction* makeFunction(ExecState*, ScopeChainNode*) JSC_FAST_CALL; … … 2352 2505 } 2353 2506 2507 virtual ~FuncDeclNode(); 2508 virtual void releaseNodes(NodeReleaser&); 2509 2354 2510 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 2355 2511 … … 2382 2538 } 2383 2539 2540 virtual ~CaseClauseNode(); 2541 virtual void releaseNodes(NodeReleaser&); 2542 2384 2543 virtual void streamTo(SourceStream&) const JSC_FAST_CALL; 2385 2544 virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; } … … 2408 2567 } 2409 2568 2569 virtual ~ClauseListNode(); 2570 virtual void releaseNodes(NodeReleaser&); 2571 2410 2572 CaseClauseNode* getClause() const JSC_FAST_CALL { return m_clause.get(); } 2411 2573 ClauseListNode* getNext() const JSC_FAST_CALL { return m_next.get(); } 2412 2574 virtual void streamTo(SourceStream&) const JSC_FAST_CALL; 2413 PassRefPtr<ClauseListNode> releaseNext() JSC_FAST_CALL { return m_next.release(); }2414 2575 virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; } 2415 2576 … … 2417 2578 friend class CaseBlockNode; 2418 2579 RefPtr<CaseClauseNode> m_clause; 2419 ListRefPtr<ClauseListNode> m_next;2580 RefPtr<ClauseListNode> m_next; 2420 2581 }; 2421 2582 … … 2430 2591 } 2431 2592 2593 virtual ~CaseBlockNode(); 2594 virtual void releaseNodes(NodeReleaser&); 2595 2432 2596 RegisterID* emitCodeForBlock(CodeGenerator&, RegisterID* input, RegisterID* dst = 0) JSC_FAST_CALL; 2433 2597 … … 2451 2615 } 2452 2616 2617 virtual ~SwitchNode(); 2618 virtual void releaseNodes(NodeReleaser&); 2619 2453 2620 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; 2454 2621
Note:
See TracChangeset
for help on using the changeset viewer.