Changeset 38247 in webkit for trunk/JavaScriptCore/parser/Nodes.cpp
- Timestamp:
- Nov 9, 2008, 5:04:30 PM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
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)
Note:
See TracChangeset
for help on using the changeset viewer.