JavaScriptCore:
[WebKit-https.git] / JavaScriptCore / kjs / nodes.h
index c909298080ba5f59ebf33ade80eab927812318de..c3ecf7fa7e9a8489d13ea82f9d9e276d46dc00e3 100644 (file)
@@ -734,22 +734,6 @@ namespace KJS {
     RefPtr<Node> expr2;
   };
 
-  class StatListNode : public StatementNode {
-  public:
-    // list pointer is tail of a circular list, cracked in the CaseClauseNode ctor
-    StatListNode(StatementNode *s);
-    StatListNode(StatListNode *l, StatementNode *s);
-    virtual Completion execute(ExecState*);
-    virtual void processVarDecls(ExecState*);
-    virtual void streamTo(SourceStream&) const;
-    PassRefPtr<StatListNode> releaseNext() { return next.release(); }
-    virtual void breakCycle();
-  private:
-    friend class CaseClauseNode;
-    RefPtr<StatementNode> statement;
-    ListRefPtr<StatListNode> next;
-  };
-
   class AssignExprNode : public Node {
   public:
     AssignExprNode(Node *e) : expr(e) {}
@@ -933,63 +917,6 @@ namespace KJS {
     RefPtr<StatementNode> statement;
   };
 
-  class CaseClauseNode : public Node {
-  public:
-    CaseClauseNode(Node *e) : expr(e) { }
-    CaseClauseNode(Node *e, StatListNode *l)
-      : expr(e), next(l->next.release()) { Parser::removeNodeCycle(next.get()); }
-    JSValue* evaluate(ExecState*);
-    Completion evalStatements(ExecState*);
-    virtual void processVarDecls(ExecState*);
-    virtual void streamTo(SourceStream&) const;
-  private:
-    RefPtr<Node> expr;
-    RefPtr<StatListNode> next;
-  };
-
-  class ClauseListNode : public Node {
-  public:
-    // list pointer is tail of a circular list, cracked in the CaseBlockNode ctor
-    ClauseListNode(CaseClauseNode *c) : clause(c), next(this) { Parser::noteNodeCycle(this); }
-    ClauseListNode(ClauseListNode *n, CaseClauseNode *c)
-      : clause(c), next(n->next) { n->next = this; }
-    JSValue* evaluate(ExecState*);
-    CaseClauseNode *getClause() const { return clause.get(); }
-    ClauseListNode *getNext() const { return next.get(); }
-    virtual void processVarDecls(ExecState*);
-    virtual void streamTo(SourceStream&) const;
-    PassRefPtr<ClauseListNode> releaseNext() { return next.release(); }
-    virtual void breakCycle();
-  private:
-    friend class CaseBlockNode;
-    RefPtr<CaseClauseNode> clause;
-    ListRefPtr<ClauseListNode> next;
-  };
-
-  class CaseBlockNode : public Node {
-  public:
-    CaseBlockNode(ClauseListNode *l1, CaseClauseNode *d, ClauseListNode *l2);
-    JSValue* evaluate(ExecState*);
-    Completion evalBlock(ExecState *exec, JSValue *input);
-    virtual void processVarDecls(ExecState*);
-    virtual void streamTo(SourceStream&) const;
-  private:
-    RefPtr<ClauseListNode> list1;
-    RefPtr<CaseClauseNode> def;
-    RefPtr<ClauseListNode> list2;
-  };
-
-  class SwitchNode : public StatementNode {
-  public:
-    SwitchNode(Node *e, CaseBlockNode *b) : expr(e), block(b) { }
-    virtual Completion execute(ExecState*);
-    virtual void processVarDecls(ExecState*);
-    virtual void streamTo(SourceStream&) const;
-  private:
-    RefPtr<Node> expr;
-    RefPtr<CaseBlockNode> block;
-  };
-
   class LabelNode : public StatementNode {
   public:
     LabelNode(const Identifier &l, StatementNode *s) : label(l), statement(s) { }
@@ -1087,7 +1014,7 @@ namespace KJS {
   // A linked list of source element nodes
   class SourceElementsNode : public StatementNode {
   public:
-      static int count;
+    static int count;
     // list pointer is tail of a circular list, cracked in the BlockNode (or subclass) ctor
     SourceElementsNode(StatementNode*);
     SourceElementsNode(SourceElementsNode *s1, StatementNode *s2);
@@ -1100,10 +1027,72 @@ namespace KJS {
     virtual void breakCycle();
   private:
     friend class BlockNode;
+    friend class CaseClauseNode;
     RefPtr<StatementNode> node;
     ListRefPtr<SourceElementsNode> next;
   };
 
+  class CaseClauseNode : public Node {
+  public:
+      CaseClauseNode(Node *e) : expr(e) { }
+      CaseClauseNode(Node *e, SourceElementsNode *s)
+      : expr(e), source(s->next.release()) { Parser::removeNodeCycle(source.get()); }
+      JSValue* evaluate(ExecState*);
+      Completion evalStatements(ExecState*);
+      void processFuncDecl(ExecState*);
+      virtual void processVarDecls(ExecState*);
+      virtual void streamTo(SourceStream&) const;
+  private:
+      RefPtr<Node> expr;
+      RefPtr<SourceElementsNode> source;
+  };
+  
+  class ClauseListNode : public Node {
+  public:
+      // list pointer is tail of a circular list, cracked in the CaseBlockNode ctor
+      ClauseListNode(CaseClauseNode *c) : clause(c), next(this) { Parser::noteNodeCycle(this); }
+      ClauseListNode(ClauseListNode *n, CaseClauseNode *c)
+      : clause(c), next(n->next) { n->next = this; }
+      JSValue* evaluate(ExecState*);
+      CaseClauseNode *getClause() const { return clause.get(); }
+      ClauseListNode *getNext() const { return next.get(); }
+      virtual void processVarDecls(ExecState*);
+      void processFuncDecl(ExecState*);
+      virtual void streamTo(SourceStream&) const;
+      PassRefPtr<ClauseListNode> releaseNext() { return next.release(); }
+      virtual void breakCycle();
+  private:
+      friend class CaseBlockNode;
+      RefPtr<CaseClauseNode> clause;
+      ListRefPtr<ClauseListNode> next;
+  };
+  
+  class CaseBlockNode : public Node {
+  public:
+      CaseBlockNode(ClauseListNode *l1, CaseClauseNode *d, ClauseListNode *l2);
+      JSValue* evaluate(ExecState*);
+      Completion evalBlock(ExecState *exec, JSValue *input);
+      virtual void processVarDecls(ExecState*);
+      void processFuncDecl(ExecState*);
+      virtual void streamTo(SourceStream&) const;
+  private:
+      RefPtr<ClauseListNode> list1;
+      RefPtr<CaseClauseNode> def;
+      RefPtr<ClauseListNode> list2;
+  };
+  
+  class SwitchNode : public StatementNode {
+  public:
+      SwitchNode(Node *e, CaseBlockNode *b) : expr(e), block(b) { }
+      virtual Completion execute(ExecState*);
+      virtual void processVarDecls(ExecState*);
+      virtual void processFuncDecl(ExecState*);
+      virtual void streamTo(SourceStream&) const;
+  private:
+      RefPtr<Node> expr;
+      RefPtr<CaseBlockNode> block;
+  };
+  
   class ProgramNode : public FunctionBodyNode {
   public:
     ProgramNode(SourceElementsNode *s);