Changeset 38247 in webkit for trunk/JavaScriptCore/parser/Nodes.h


Ignore:
Timestamp:
Nov 9, 2008, 5:04:30 PM (17 years ago)
Author:
Darin Adler
Message:

JavaScriptCore:

2008-11-09 Darin Adler <Darin Adler>

Reviewed by Sam Weinig and Maciej Stachowiak.
Includes some work done by Chris Brichford.

Test: fast/js/large-expressions.html

1) Code generation is recursive, so takes stack proportional to the complexity

of the source code expression. Fixed by setting an arbitrary recursion limit
of 10,000 nodes.

2) Destruction of the syntax tree was recursive. Fixed by introducing a

non-recursive mechanism for destroying the tree.

  • bytecompiler/CodeGenerator.cpp: (JSC::CodeGenerator::CodeGenerator): Initialize depth to 0. (JSC::CodeGenerator::emitThrowExpressionTooDeepException): Added. Emits the code to throw a "too deep" exception.
  • bytecompiler/CodeGenerator.h: (JSC::CodeGenerator::emitNode): Check depth and emit an exception if we exceed the maximum depth.
  • parser/Nodes.cpp: (JSC::NodeReleaser::releaseAllNodes): Added. To be called inside node destructors to avoid recursive calls to destructors for nodes inside this one. (JSC::NodeReleaser::release): Added. To be called inside releaseNodes functions. Also added releaseNodes functions and calls to releaseAllNodes inside destructors for each class derived from Node that has RefPtr to other nodes. (JSC::NodeReleaser::adopt): Added. Used by the release function. (JSC::NodeReleaser::adoptFunctionBodyNode): Added.
  • parser/Nodes.h: Added declarations of releaseNodes and destructors in all classes that needed it. Eliminated use of ListRefPtr and releaseNext, which are the two parts of an older solution to the non-recursive destruction problem that works only for lists, whereas the new solution works for other graphs. Changed ReverseBinaryOpNode to use BinaryOpNode as a base class to avoid some duplicated code.

LayoutTests:

2008-11-09 Alexey Proskuryakov <[email protected]>

Reviewed by Darin Adler.

https://bugs.webkit.org/show_bug.cgi?id=22104
Javascript URL percent encoding/decoding broken by some characters

  • fast/loader/javascript-url-encoding-2-expected.txt:
  • fast/loader/javascript-url-encoding-2.html:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/parser/Nodes.h

    r38209 r38247  
    3636#include "SymbolTable.h"
    3737#include "RegExp.h"
    38 #include <wtf/ListRefPtr.h>
    3938#include <wtf/MathExtras.h>
    4039#include <wtf/OwnPtr.h>
     
    5655    class EvalCodeBlock;
    5756    class JSFunction;
     57    class NodeReleaser;
    5858    class ProgramCodeBlock;
    5959    class PropertyListNode;
     
    136136
    137137    public:
     138        // Nonrecursive destruction.
     139        virtual void releaseNodes(NodeReleaser&);
     140
    138141        void ref() JSC_FAST_CALL;
    139142        void deref() JSC_FAST_CALL;
     
    191194        virtual Precedence precedence() const = 0;
    192195        virtual bool needsParensIfLeftmost() const { return false; }
    193        
     196
    194197    protected:
    195198        int m_line;
     
    478481        Identifier m_ident;
    479482        int32_t m_startOffset;
    480        
    481483    };
    482484
     
    498500        }
    499501
     502        virtual ~ElementNode();
     503        virtual void releaseNodes(NodeReleaser&);
     504
    500505        virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; }
    501506        virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
     
    505510
    506511        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;
    511515        int m_elision;
    512516        RefPtr<ExpressionNode> m_node;
     
    537541        {
    538542        }
     543
     544        virtual ~ArrayNode();
     545        virtual void releaseNodes(NodeReleaser&);
    539546
    540547        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
     
    561568        }
    562569
     570        virtual ~PropertyNode();
     571        virtual void releaseNodes(NodeReleaser&);
     572
    563573        virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
    564574        virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; }
     
    588598        }
    589599
     600        virtual ~PropertyListNode();
     601        virtual void releaseNodes(NodeReleaser&);
     602
    590603        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
    591604        virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
    592605        virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; }
    593 
    594         PassRefPtr<PropertyListNode> releaseNext() JSC_FAST_CALL { return m_next.release(); }
    595606
    596607    private:
    597608        friend class ObjectLiteralNode;
    598609        RefPtr<PropertyNode> m_node;
    599         ListRefPtr<PropertyListNode> m_next;
     610        RefPtr<PropertyListNode> m_next;
    600611    };
    601612
     
    612623        {
    613624        }
     625
     626        virtual ~ObjectLiteralNode();
     627        virtual void releaseNodes(NodeReleaser&);
    614628
    615629        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
     
    631645        {
    632646        }
     647
     648        virtual ~BracketAccessorNode();
     649        virtual void releaseNodes(NodeReleaser&);
    633650
    634651        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
     
    657674        }
    658675
     676        virtual ~DotAccessorNode();
     677        virtual void releaseNodes(NodeReleaser&);
     678
    659679        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
    660680        virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
     
    686706        }
    687707
     708        virtual ~ArgumentListNode();
     709        virtual void releaseNodes(NodeReleaser&);
     710
    688711        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
    689712        virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
    690713        virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; }
    691714
    692         PassRefPtr<ArgumentListNode> releaseNext() JSC_FAST_CALL { return m_next.release(); }
    693 
    694         ListRefPtr<ArgumentListNode> m_next;
     715        RefPtr<ArgumentListNode> m_next;
    695716        RefPtr<ExpressionNode> m_expr;
    696717    };
     
    709730        }
    710731
     732        virtual ~ArgumentsNode();
     733        virtual void releaseNodes(NodeReleaser&);
     734
    711735        virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
    712736        virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; }
     
    730754        }
    731755
     756        virtual ~NewExprNode();
     757        virtual void releaseNodes(NodeReleaser&);
     758
    732759        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
    733760
     
    748775        {
    749776        }
     777
     778        virtual ~EvalFunctionCallNode();
     779        virtual void releaseNodes(NodeReleaser&);
    750780
    751781        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
     
    767797        }
    768798
     799        virtual ~FunctionCallValueNode();
     800        virtual void releaseNodes(NodeReleaser&);
     801
    769802        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
    770803        virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
     
    785818        {
    786819        }
     820
     821        virtual ~FunctionCallResolveNode();
     822        virtual void releaseNodes(NodeReleaser&);
    787823
    788824        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
     
    809845        }
    810846
     847        virtual ~FunctionCallBracketNode();
     848        virtual void releaseNodes(NodeReleaser&);
     849
    811850        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
    812851        virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
     
    830869        }
    831870
     871        virtual ~FunctionCallDotNode();
     872        virtual void releaseNodes(NodeReleaser&);
     873
    832874        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
    833875        virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
     
    880922        }
    881923
     924        virtual ~PostfixBracketNode();
     925        virtual void releaseNodes(NodeReleaser&);
     926
    882927        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
    883928        virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
     
    901946        }
    902947
     948        virtual ~PostfixDotNode();
     949        virtual void releaseNodes(NodeReleaser&);
     950
    903951        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
    904952        virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
     
    921969        }
    922970
     971        virtual ~PostfixErrorNode();
     972        virtual void releaseNodes(NodeReleaser&);
     973
    923974        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
    924975        virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
     
    9581009        }
    9591010
     1011        virtual ~DeleteBracketNode();
     1012        virtual void releaseNodes(NodeReleaser&);
     1013
    9601014        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
    9611015
     
    9781032        }
    9791033
     1034        virtual ~DeleteDotNode();
     1035        virtual void releaseNodes(NodeReleaser&);
     1036
    9801037        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
    9811038
     
    9961053        }
    9971054
     1055        virtual ~DeleteValueNode();
     1056        virtual void releaseNodes(NodeReleaser&);
     1057
    9981058        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
    9991059
     
    10121072        {
    10131073        }
     1074
     1075        virtual ~VoidNode();
     1076        virtual void releaseNodes(NodeReleaser&);
    10141077
    10151078        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
     
    10491112        {
    10501113        }
     1114
     1115        virtual ~TypeOfValueNode();
     1116        virtual void releaseNodes(NodeReleaser&);
    10511117
    10521118        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
     
    10871153        }
    10881154
     1155        virtual ~PrefixBracketNode();
     1156        virtual void releaseNodes(NodeReleaser&);
     1157
    10891158        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
    10901159        virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
     
    11081177        }
    11091178
     1179        virtual ~PrefixDotNode();
     1180        virtual void releaseNodes(NodeReleaser&);
     1181
    11101182        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
    11111183        virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
     
    11281200        }
    11291201
     1202        virtual ~PrefixErrorNode();
     1203        virtual void releaseNodes(NodeReleaser&);
     1204
    11301205        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
    11311206        virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
     
    11501225        {
    11511226        }
     1227
     1228        virtual ~UnaryOpNode();
     1229        virtual void releaseNodes(NodeReleaser&);
    11521230
    11531231        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
     
    12261304        }
    12271305
     1306        virtual ~BinaryOpNode();
     1307        virtual void releaseNodes(NodeReleaser&);
     1308
    12281309        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
    12291310        virtual OpcodeID opcode() const JSC_FAST_CALL = 0;
     
    12351316    };
    12361317
    1237     class ReverseBinaryOpNode : public ExpressionNode {
     1318    class ReverseBinaryOpNode : public BinaryOpNode {
    12381319    public:
    12391320        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)
    12441322        {
    12451323        }
    12461324
    12471325        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;
    12621331    };
    12631332
     
    15441613        }
    15451614
     1615        virtual ~LogicalOpNode();
     1616        virtual void releaseNodes(NodeReleaser&);
     1617
    15461618        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
    15471619        virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
     
    15661638        {
    15671639        }
     1640
     1641        virtual ~ConditionalNode();
     1642        virtual void releaseNodes(NodeReleaser&);
    15681643
    15691644        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
     
    15891664        }
    15901665
     1666        virtual ~ReadModifyResolveNode();
     1667        virtual void releaseNodes(NodeReleaser&);
     1668
    15911669        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
    15921670
     
    16111689        {
    16121690        }
     1691
     1692        virtual ~AssignResolveNode();
     1693        virtual void releaseNodes(NodeReleaser&);
    16131694
    16141695        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
     
    16381719        }
    16391720
     1721        virtual ~ReadModifyBracketNode();
     1722        virtual void releaseNodes(NodeReleaser&);
     1723
    16401724        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
    16411725
     
    16651749        }
    16661750
     1751        virtual ~AssignBracketNode();
     1752        virtual void releaseNodes(NodeReleaser&);
     1753
    16671754        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
    16681755
     
    16891776        {
    16901777        }
     1778
     1779        virtual ~AssignDotNode();
     1780        virtual void releaseNodes(NodeReleaser&);
    16911781
    16921782        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
     
    17141804        }
    17151805
     1806        virtual ~ReadModifyDotNode();
     1807        virtual void releaseNodes(NodeReleaser&);
     1808
    17161809        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
    17171810
     
    17381831        }
    17391832
     1833        virtual ~AssignErrorNode();
     1834        virtual void releaseNodes(NodeReleaser&);
     1835
    17401836        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
    17411837        virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
     
    17571853        }
    17581854
     1855        virtual ~CommaNode();
     1856        virtual void releaseNodes(NodeReleaser&);
     1857
    17591858        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
    17601859        virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
     
    17791878        ConstDeclNode(JSGlobalData* globalData, const Identifier& ident, ExpressionNode* in) JSC_FAST_CALL;
    17801879
     1880        virtual ~ConstDeclNode();
     1881        virtual void releaseNodes(NodeReleaser&);
     1882
    17811883        virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
    17821884        virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; }
    1783         PassRefPtr<ConstDeclNode> releaseNext() JSC_FAST_CALL { return m_next.release(); }
    17841885
    17851886        Identifier m_ident;
    1786         ListRefPtr<ConstDeclNode> m_next;
     1887        RefPtr<ConstDeclNode> m_next;
    17871888        RefPtr<ExpressionNode> m_init;
    17881889       
     
    17991900        }
    18001901
     1902        virtual ~ConstStatementNode();
     1903        virtual void releaseNodes(NodeReleaser&);
     1904
    18011905        virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
    18021906       
     
    18281932        BlockNode(JSGlobalData*, SourceElements* children) JSC_FAST_CALL;
    18291933
     1934        virtual ~BlockNode();
     1935        virtual void releaseNodes(NodeReleaser&);
     1936
    18301937        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
    18311938        virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
     
    18341941
    18351942        virtual bool isBlock() const JSC_FAST_CALL { return true; }
     1943
    18361944    protected:
    18371945        StatementVector m_children;
     
    18861994        }
    18871995       
     1996        virtual ~VarStatementNode();
     1997        virtual void releaseNodes(NodeReleaser&);
     1998
    18881999        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
    18892000
     
    19032014        }
    19042015
     2016        virtual ~IfNode();
     2017        virtual void releaseNodes(NodeReleaser&);
     2018
    19052019        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
    19062020        virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
     
    19182032        {
    19192033        }
     2034
     2035        virtual ~IfElseNode();
     2036        virtual void releaseNodes(NodeReleaser&);
    19202037
    19212038        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
     
    19352052        }
    19362053
     2054        virtual ~DoWhileNode();
     2055        virtual void releaseNodes(NodeReleaser&);
     2056
    19372057        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
    19382058        virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
    19392059
    19402060        virtual bool isLoop() const JSC_FAST_CALL { return true; }
     2061
    19412062    private:
    19422063        RefPtr<StatementNode> m_statement;
     
    19532074        }
    19542075
     2076        virtual ~WhileNode();
     2077        virtual void releaseNodes(NodeReleaser&);
     2078
    19552079        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
    19562080        virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
    19572081
    19582082        virtual bool isLoop() const JSC_FAST_CALL { return true; }
     2083
    19592084    private:
    19602085        RefPtr<ExpressionNode> m_expr;
     
    19752100        }
    19762101
     2102        virtual ~ForNode();
     2103        virtual void releaseNodes(NodeReleaser&);
     2104
    19772105        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
    19782106        virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
    19792107
    19802108        virtual bool isLoop() const JSC_FAST_CALL { return true; }
     2109
    19812110    private:
    19822111        RefPtr<ExpressionNode> m_expr1;
     
    19922121        ForInNode(JSGlobalData*, const Identifier&, ExpressionNode*, ExpressionNode*, StatementNode*, int divot, int startOffset, int endOffset) JSC_FAST_CALL;
    19932122       
     2123        virtual ~ForInNode();
     2124        virtual void releaseNodes(NodeReleaser&);
     2125
    19942126        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
    19952127        virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
    19962128
    19972129        virtual bool isLoop() const JSC_FAST_CALL { return true; }
     2130
    19982131    private:
    19992132        Identifier m_ident;
     
    20532186        }
    20542187
     2188        virtual ~ReturnNode();
     2189        virtual void releaseNodes(NodeReleaser&);
     2190
    20552191        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
    20562192        virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
     
    20722208        }
    20732209
     2210        virtual ~WithNode();
     2211        virtual void releaseNodes(NodeReleaser&);
     2212
    20742213        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
    20752214        virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
     
    20912230        }
    20922231
     2232        virtual ~LabelNode();
     2233        virtual void releaseNodes(NodeReleaser&);
     2234
    20932235        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
    20942236        virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
     
    21062248        {
    21072249        }
     2250
     2251        virtual ~ThrowNode();
     2252        virtual void releaseNodes(NodeReleaser&);
    21082253
    21092254        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
     
    21252270        }
    21262271
     2272        virtual ~TryNode();
     2273        virtual void releaseNodes(NodeReleaser&);
     2274
    21272275        virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
    21282276
     
    21512299        }
    21522300
     2301        virtual ~ParameterNode();
     2302        virtual void releaseNodes(NodeReleaser&);
     2303
    21532304        Identifier ident() JSC_FAST_CALL { return m_ident; }
    21542305        ParameterNode *nextParam() JSC_FAST_CALL { return m_next.get(); }
    21552306        virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
    2156         PassRefPtr<ParameterNode> releaseNext() JSC_FAST_CALL { return m_next.release(); }
    21572307        virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; }
    21582308
     
    21612311        friend class FuncExprNode;
    21622312        Identifier m_ident;
    2163         ListRefPtr<ParameterNode> m_next;
     2313        RefPtr<ParameterNode> m_next;
    21642314    };
    21652315
     
    23252475        }
    23262476
     2477        virtual ~FuncExprNode();
     2478        virtual void releaseNodes(NodeReleaser&);
     2479
    23272480        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
    23282481        JSFunction* makeFunction(ExecState*, ScopeChainNode*) JSC_FAST_CALL;
     
    23522505        }
    23532506
     2507        virtual ~FuncDeclNode();
     2508        virtual void releaseNodes(NodeReleaser&);
     2509
    23542510        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
    23552511
     
    23822538        }
    23832539
     2540        virtual ~CaseClauseNode();
     2541        virtual void releaseNodes(NodeReleaser&);
     2542
    23842543        virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
    23852544        virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; }
     
    24082567        }
    24092568
     2569        virtual ~ClauseListNode();
     2570        virtual void releaseNodes(NodeReleaser&);
     2571
    24102572        CaseClauseNode* getClause() const JSC_FAST_CALL { return m_clause.get(); }
    24112573        ClauseListNode* getNext() const JSC_FAST_CALL { return m_next.get(); }
    24122574        virtual void streamTo(SourceStream&) const JSC_FAST_CALL;
    2413         PassRefPtr<ClauseListNode> releaseNext() JSC_FAST_CALL { return m_next.release(); }
    24142575        virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; }
    24152576
     
    24172578        friend class CaseBlockNode;
    24182579        RefPtr<CaseClauseNode> m_clause;
    2419         ListRefPtr<ClauseListNode> m_next;
     2580        RefPtr<ClauseListNode> m_next;
    24202581    };
    24212582
     
    24302591        }
    24312592
     2593        virtual ~CaseBlockNode();
     2594        virtual void releaseNodes(NodeReleaser&);
     2595
    24322596        RegisterID* emitCodeForBlock(CodeGenerator&, RegisterID* input, RegisterID* dst = 0) JSC_FAST_CALL;
    24332597
     
    24512615        }
    24522616
     2617        virtual ~SwitchNode();
     2618        virtual void releaseNodes(NodeReleaser&);
     2619
    24532620        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL;
    24542621
Note: See TracChangeset for help on using the changeset viewer.