1a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Copyright 2006-2008 the V8 project authors. All rights reserved.
2a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Redistribution and use in source and binary forms, with or without
3a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// modification, are permitted provided that the following conditions are
4a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// met:
5a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
6a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//     * Redistributions of source code must retain the above copyright
7a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       notice, this list of conditions and the following disclaimer.
8a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//     * Redistributions in binary form must reproduce the above
9a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       copyright notice, this list of conditions and the following
10a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       disclaimer in the documentation and/or other materials provided
11a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       with the distribution.
12a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//     * Neither the name of Google Inc. nor the names of its
13a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       contributors may be used to endorse or promote products derived
14a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       from this software without specific prior written permission.
15a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
16a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
28a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include <stdarg.h>
29a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
30a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include "v8.h"
31a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
32a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include "prettyprinter.h"
33a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include "scopes.h"
34a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include "platform.h"
35a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
36a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace v8 {
37a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace internal {
38a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
39a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifdef DEBUG
40a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
41a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockPrettyPrinter::PrettyPrinter() {
42a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  output_ = NULL;
43a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  size_ = 0;
44a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  pos_ = 0;
45a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
46a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
47a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
48a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockPrettyPrinter::~PrettyPrinter() {
49a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  DeleteArray(output_);
50a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
51a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
52a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
53a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid PrettyPrinter::VisitBlock(Block* node) {
54a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (!node->is_initializer_block()) Print("{ ");
55a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintStatements(node->statements());
56a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (node->statements()->length() > 0) Print(" ");
57a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (!node->is_initializer_block()) Print("}");
58a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
59a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
60a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
61a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid PrettyPrinter::VisitDeclaration(Declaration* node) {
62a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print("var ");
63a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintLiteral(node->proxy()->name(), false);
64a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (node->fun() != NULL) {
65a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Print(" = ");
66a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    PrintFunctionLiteral(node->fun());
67a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
68a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print(";");
69a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
70a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
71a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
72a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid PrettyPrinter::VisitExpressionStatement(ExpressionStatement* node) {
73a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Visit(node->expression());
74a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print(";");
75a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
76a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
77a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
78a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid PrettyPrinter::VisitEmptyStatement(EmptyStatement* node) {
79a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print(";");
80a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
81a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
82a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
83a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid PrettyPrinter::VisitIfStatement(IfStatement* node) {
84a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print("if (");
85a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Visit(node->condition());
86a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print(") ");
87a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Visit(node->then_statement());
88a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (node->HasElseStatement()) {
89a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Print(" else ");
90a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Visit(node->else_statement());
91a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
92a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
93a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
94a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
95a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid PrettyPrinter::VisitContinueStatement(ContinueStatement* node) {
96a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print("continue");
97a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ZoneStringList* labels = node->target()->labels();
98a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (labels != NULL) {
99a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Print(" ");
100a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    ASSERT(labels->length() > 0);  // guaranteed to have at least one entry
101a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    PrintLiteral(labels->at(0), false);  // any label from the list is fine
102a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
103a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print(";");
104a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
105a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
106a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
107a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid PrettyPrinter::VisitBreakStatement(BreakStatement* node) {
108a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print("break");
109a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ZoneStringList* labels = node->target()->labels();
110a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (labels != NULL) {
111a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Print(" ");
112a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    ASSERT(labels->length() > 0);  // guaranteed to have at least one entry
113a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    PrintLiteral(labels->at(0), false);  // any label from the list is fine
114a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
115a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print(";");
116a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
117a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
118a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
119a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid PrettyPrinter::VisitReturnStatement(ReturnStatement* node) {
120a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print("return ");
121a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Visit(node->expression());
122a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print(";");
123a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
124a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
125a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
126a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid PrettyPrinter::VisitWithEnterStatement(WithEnterStatement* node) {
127a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print("<enter with> (");
128a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Visit(node->expression());
129a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print(") ");
130a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
131a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
132a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
133a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid PrettyPrinter::VisitWithExitStatement(WithExitStatement* node) {
134a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print("<exit with>");
135a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
136a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
137a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
138a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid PrettyPrinter::VisitSwitchStatement(SwitchStatement* node) {
139a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintLabels(node->labels());
140a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print("switch (");
141a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Visit(node->tag());
142a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print(") { ");
143a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ZoneList<CaseClause*>* cases = node->cases();
144a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  for (int i = 0; i < cases->length(); i++)
145a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    PrintCaseClause(cases->at(i));
146a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print("}");
147a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
148a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
149a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1503ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid PrettyPrinter::VisitDoWhileStatement(DoWhileStatement* node) {
151a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintLabels(node->labels());
1523ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Print("do ");
1533ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(node->body());
1543ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Print(" while (");
1553ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(node->cond());
1563ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Print(");");
1573ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
158a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
159a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1603ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid PrettyPrinter::VisitWhileStatement(WhileStatement* node) {
1613ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  PrintLabels(node->labels());
1623ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Print("while (");
1633ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(node->cond());
1643ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Print(") ");
1653ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(node->body());
1663ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
1673ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
1683ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
1693ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid PrettyPrinter::VisitForStatement(ForStatement* node) {
1703ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  PrintLabels(node->labels());
1713ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Print("for (");
1723ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  if (node->init() != NULL) {
1733ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    Visit(node->init());
1743ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    Print(" ");
1753ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  } else {
1763ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    Print("; ");
1773ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  }
1783ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  if (node->cond() != NULL) Visit(node->cond());
1793ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Print("; ");
1803ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  if (node->next() != NULL) {
1813ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    Visit(node->next());  // prints extra ';', unfortunately
1823ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    // to fix: should use Expression for next
183a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1843ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Print(") ");
1853ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(node->body());
186a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
187a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
188a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
189a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid PrettyPrinter::VisitForInStatement(ForInStatement* node) {
190a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintLabels(node->labels());
191a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print("for (");
192a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Visit(node->each());
193a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print(" in ");
194a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Visit(node->enumerable());
195a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print(") ");
196a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Visit(node->body());
197a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
198a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
199a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2003ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid PrettyPrinter::VisitTryCatchStatement(TryCatchStatement* node) {
201a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print("try ");
202a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Visit(node->try_block());
203a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print(" catch (");
204a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Visit(node->catch_var());
205a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print(") ");
206a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Visit(node->catch_block());
207a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
208a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
209a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2103ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid PrettyPrinter::VisitTryFinallyStatement(TryFinallyStatement* node) {
211a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print("try ");
212a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Visit(node->try_block());
213a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print(" finally ");
214a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Visit(node->finally_block());
215a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
216a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
217a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
218a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid PrettyPrinter::VisitDebuggerStatement(DebuggerStatement* node) {
219a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print("debugger ");
220a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
221a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
222a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
223a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid PrettyPrinter::VisitFunctionLiteral(FunctionLiteral* node) {
224a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print("(");
225a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintFunctionLiteral(node);
226a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print(")");
227a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
228a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
229a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2306ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvoid PrettyPrinter::VisitSharedFunctionInfoLiteral(
2316ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    SharedFunctionInfoLiteral* node) {
232a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print("(");
2336ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  PrintLiteral(node->shared_function_info(), true);
234a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print(")");
235a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
236a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
237a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
238a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid PrettyPrinter::VisitConditional(Conditional* node) {
239a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Visit(node->condition());
240a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print(" ? ");
241a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Visit(node->then_expression());
242a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print(" : ");
243a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Visit(node->else_expression());
244a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
245a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
246a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
247a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid PrettyPrinter::VisitLiteral(Literal* node) {
248a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintLiteral(node->handle(), true);
249a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
250a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
251a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
252a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid PrettyPrinter::VisitRegExpLiteral(RegExpLiteral* node) {
253a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print(" RegExp(");
254a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintLiteral(node->pattern(), false);
255a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print(",");
256a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintLiteral(node->flags(), false);
257a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print(") ");
258a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
259a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
260a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
261a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid PrettyPrinter::VisitObjectLiteral(ObjectLiteral* node) {
262a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print("{ ");
263a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  for (int i = 0; i < node->properties()->length(); i++) {
264a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (i != 0) Print(",");
265a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    ObjectLiteral::Property* property = node->properties()->at(i);
266a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Print(" ");
267a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Visit(property->key());
268a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Print(": ");
269a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Visit(property->value());
270a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
271a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print(" }");
272a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
273a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
274a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
275a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid PrettyPrinter::VisitArrayLiteral(ArrayLiteral* node) {
276a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print("[ ");
277a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  for (int i = 0; i < node->values()->length(); i++) {
278a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (i != 0) Print(",");
279a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Visit(node->values()->at(i));
280a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
281a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print(" ]");
282a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
283a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
284a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
285a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid PrettyPrinter::VisitCatchExtensionObject(CatchExtensionObject* node) {
286a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print("{ ");
287a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Visit(node->key());
288a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print(": ");
289a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Visit(node->value());
290a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print(" }");
291a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
292a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
293a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
294a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid PrettyPrinter::VisitSlot(Slot* node) {
295a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  switch (node->type()) {
296a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case Slot::PARAMETER:
297a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      Print("parameter[%d]", node->index());
298a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
299a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case Slot::LOCAL:
3001e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      Print("local[%d]", node->index());
301a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
302a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case Slot::CONTEXT:
3031e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      Print("context[%d]", node->index());
304a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
305a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case Slot::LOOKUP:
3061e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      Print("lookup[");
307a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      PrintLiteral(node->var()->name(), false);
308a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      Print("]");
309a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
310a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    default:
311a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      UNREACHABLE();
312a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
313a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
314a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
315a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
316a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid PrettyPrinter::VisitVariableProxy(VariableProxy* node) {
317a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintLiteral(node->name(), false);
318a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
319a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
320a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
321a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid PrettyPrinter::VisitAssignment(Assignment* node) {
322a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Visit(node->target());
323a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print(" %s ", Token::String(node->op()));
324a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Visit(node->value());
325a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
326a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
327a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
328a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid PrettyPrinter::VisitThrow(Throw* node) {
329a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print("throw ");
330a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Visit(node->exception());
331a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
332a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
333a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
334a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid PrettyPrinter::VisitProperty(Property* node) {
335a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Expression* key = node->key();
336a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Literal* literal = key->AsLiteral();
337a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (literal != NULL && literal->handle()->IsSymbol()) {
338a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Print("(");
339a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Visit(node->obj());
340a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Print(").");
341a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    PrintLiteral(literal->handle(), false);
342a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
343a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Visit(node->obj());
344a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Print("[");
345a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Visit(key);
346a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Print("]");
347a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
348a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
349a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
350a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
351a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid PrettyPrinter::VisitCall(Call* node) {
352a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Visit(node->expression());
353a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintArguments(node->arguments());
354a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
355a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
356a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
357a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid PrettyPrinter::VisitCallNew(CallNew* node) {
358a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print("new (");
359a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Visit(node->expression());
360a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print(")");
361a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintArguments(node->arguments());
362a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
363a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
364a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
365a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid PrettyPrinter::VisitCallRuntime(CallRuntime* node) {
366a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print("%%");
367a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintLiteral(node->name(), false);
368a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintArguments(node->arguments());
369a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
370a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
371a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
372a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid PrettyPrinter::VisitUnaryOperation(UnaryOperation* node) {
373a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print("(%s", Token::String(node->op()));
374a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Visit(node->expression());
375a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print(")");
376a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
377a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
378a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
379a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid PrettyPrinter::VisitCountOperation(CountOperation* node) {
380a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print("(");
381a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (node->is_prefix()) Print("%s", Token::String(node->op()));
382a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Visit(node->expression());
383a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (node->is_postfix()) Print("%s", Token::String(node->op()));
384a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print(")");
385a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
386a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
387a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
388a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid PrettyPrinter::VisitBinaryOperation(BinaryOperation* node) {
389a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print("(");
390a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Visit(node->left());
391a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print("%s", Token::String(node->op()));
392a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Visit(node->right());
393a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print(")");
394a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
395a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
396a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
397a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid PrettyPrinter::VisitCompareOperation(CompareOperation* node) {
398a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print("(");
399a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Visit(node->left());
400a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print("%s", Token::String(node->op()));
401a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Visit(node->right());
402a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print(")");
403a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
404a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
405a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
40680d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsenvoid PrettyPrinter::VisitCompareToNull(CompareToNull* node) {
40780d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  Print("(");
40880d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  Visit(node->expression());
40980d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  Print("%s null)", Token::String(node->op()));
41080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen}
41180d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
41280d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
413a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid PrettyPrinter::VisitThisFunction(ThisFunction* node) {
414a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print("<this-function>");
415a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
416a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
417a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
418a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockconst char* PrettyPrinter::Print(AstNode* node) {
419a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Init();
420a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Visit(node);
421a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return output_;
422a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
423a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
424a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
425a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockconst char* PrettyPrinter::PrintExpression(FunctionLiteral* program) {
426a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Init();
427a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ExpressionStatement* statement =
428a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    program->body()->at(0)->AsExpressionStatement();
429a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Visit(statement->expression());
430a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return output_;
431a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
432a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
433a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
434a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockconst char* PrettyPrinter::PrintProgram(FunctionLiteral* program) {
435a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Init();
436a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintStatements(program->body());
437a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print("\n");
438a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return output_;
439a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
440a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
441a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
442a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid PrettyPrinter::PrintOut(AstNode* node) {
443a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrettyPrinter printer;
444a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintF("%s", printer.Print(node));
445a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
446a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
447a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
448a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid PrettyPrinter::Init() {
449a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (size_ == 0) {
450a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    ASSERT(output_ == NULL);
451a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    const int initial_size = 256;
452a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    output_ = NewArray<char>(initial_size);
453a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    size_ = initial_size;
454a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
455a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  output_[0] = '\0';
456a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  pos_ = 0;
457a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
458a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
459a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
460a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid PrettyPrinter::Print(const char* format, ...) {
461a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  for (;;) {
462a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    va_list arguments;
463a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    va_start(arguments, format);
464a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    int n = OS::VSNPrintF(Vector<char>(output_, size_) + pos_,
465a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                          format,
466a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                          arguments);
467a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    va_end(arguments);
468a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
469a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (n >= 0) {
470a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      // there was enough space - we are done
471a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      pos_ += n;
472a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      return;
473a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    } else {
474a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      // there was not enough space - allocate more and try again
475a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      const int slack = 32;
476a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      int new_size = size_ + (size_ >> 1) + slack;
477a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      char* new_output = NewArray<char>(new_size);
478a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      memcpy(new_output, output_, pos_);
479a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      DeleteArray(output_);
480a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      output_ = new_output;
481a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      size_ = new_size;
482a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
483a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
484a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
485a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
486a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
487a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid PrettyPrinter::PrintStatements(ZoneList<Statement*>* statements) {
488a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  for (int i = 0; i < statements->length(); i++) {
489a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (i != 0) Print(" ");
490a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Visit(statements->at(i));
491a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
492a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
493a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
494a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
495a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid PrettyPrinter::PrintLabels(ZoneStringList* labels) {
496a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (labels != NULL) {
497a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    for (int i = 0; i < labels->length(); i++) {
498a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      PrintLiteral(labels->at(i), false);
499a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      Print(": ");
500a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
501a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
502a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
503a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
504a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
505a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid PrettyPrinter::PrintArguments(ZoneList<Expression*>* arguments) {
506a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print("(");
507a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  for (int i = 0; i < arguments->length(); i++) {
508a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (i != 0) Print(", ");
509a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Visit(arguments->at(i));
510a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
511a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print(")");
512a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
513a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
514a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
515a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid PrettyPrinter::PrintLiteral(Handle<Object> value, bool quote) {
516a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Object* object = *value;
517a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (object->IsString()) {
518a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    String* string = String::cast(object);
519a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (quote) Print("\"");
520a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    for (int i = 0; i < string->length(); i++) {
521a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      Print("%c", string->Get(i));
522a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
523a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (quote) Print("\"");
52444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  } else if (object->IsNull()) {
525a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Print("null");
52644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  } else if (object->IsTrue()) {
527a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Print("true");
52844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  } else if (object->IsFalse()) {
529a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Print("false");
53044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  } else if (object->IsUndefined()) {
531a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Print("undefined");
532a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else if (object->IsNumber()) {
533a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Print("%g", object->Number());
534a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else if (object->IsJSObject()) {
535a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // regular expression
536a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (object->IsJSFunction()) {
537a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      Print("JS-Function");
538a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    } else if (object->IsJSArray()) {
539a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      Print("JS-array[%u]", JSArray::cast(object)->length());
540a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    } else if (object->IsJSObject()) {
541a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      Print("JS-Object");
542a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    } else {
543a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      Print("?UNKNOWN?");
544a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
545a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else if (object->IsFixedArray()) {
546a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Print("FixedArray");
547a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
548a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Print("<unknown literal %p>", object);
549a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
550a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
551a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
552a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
553a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid PrettyPrinter::PrintParameters(Scope* scope) {
554a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print("(");
555a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  for (int i = 0; i < scope->num_parameters(); i++) {
556a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (i  > 0) Print(", ");
557a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    PrintLiteral(scope->parameter(i)->name(), false);
558a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
559a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print(")");
560a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
561a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
562a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
563a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid PrettyPrinter::PrintDeclarations(ZoneList<Declaration*>* declarations) {
564a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  for (int i = 0; i < declarations->length(); i++) {
565a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (i > 0) Print(" ");
566a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Visit(declarations->at(i));
567a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
568a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
569a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
570a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
571a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid PrettyPrinter::PrintFunctionLiteral(FunctionLiteral* function) {
572a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print("function ");
573a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintLiteral(function->name(), false);
574a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintParameters(function->scope());
575a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print(" { ");
576a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintDeclarations(function->scope()->declarations());
577a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintStatements(function->body());
578a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print(" }");
579a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
580a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
581a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
582a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid PrettyPrinter::PrintCaseClause(CaseClause* clause) {
583a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (clause->is_default()) {
584a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Print("default");
585a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
586a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Print("case ");
587a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Visit(clause->label());
588a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
589a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print(": ");
590a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintStatements(clause->statements());
591a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (clause->statements()->length() > 0)
592a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Print(" ");
593a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
594a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
595a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
596a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//-----------------------------------------------------------------------------
597a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
598a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass IndentedScope BASE_EMBEDDED {
599a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public:
60044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  explicit IndentedScope(AstPrinter* printer) : ast_printer_(printer) {
601a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    ast_printer_->inc_indent();
602a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
603a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
60444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  IndentedScope(AstPrinter* printer, const char* txt, AstNode* node = NULL)
60544f0eee88ff00398ff7f715fab053374d808c90dSteve Block      : ast_printer_(printer) {
606a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    ast_printer_->PrintIndented(txt);
607a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    ast_printer_->Print("\n");
608a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    ast_printer_->inc_indent();
609a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
610a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
611a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  virtual ~IndentedScope() {
612a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    ast_printer_->dec_indent();
613a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
614a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
615a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private:
61644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  AstPrinter* ast_printer_;
617a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
618a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
619a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
620a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//-----------------------------------------------------------------------------
621a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
622a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
62344f0eee88ff00398ff7f715fab053374d808c90dSteve BlockAstPrinter::AstPrinter() : indent_(0) {
624a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
625a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
626a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
627a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockAstPrinter::~AstPrinter() {
628a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(indent_ == 0);
629a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
630a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
631a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
632a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::PrintIndented(const char* txt) {
633a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  for (int i = 0; i < indent_; i++) {
634a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Print(". ");
635a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
636a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print(txt);
637a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
638a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
639a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
640a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::PrintLiteralIndented(const char* info,
641a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                      Handle<Object> value,
642a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                      bool quote) {
643a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintIndented(info);
644a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print(" ");
645a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintLiteral(value, quote);
646a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print("\n");
647a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
648a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
649a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
650a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::PrintLiteralWithModeIndented(const char* info,
651a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                              Variable* var,
6528b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch                                              Handle<Object> value) {
653a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (var == NULL) {
654a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    PrintLiteralIndented(info, value, true);
655a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
656a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EmbeddedVector<char, 256> buf;
6574515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke    int pos = OS::SNPrintF(buf, "%s (mode = %s", info,
6584515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke                           Variable::Mode2String(var->mode()));
6594515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke    OS::SNPrintF(buf + pos, ")");
660a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    PrintLiteralIndented(buf.start(), value, true);
661a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
662a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
663a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
664a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
665a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::PrintLabelsIndented(const char* info, ZoneStringList* labels) {
666a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (labels != NULL && labels->length() > 0) {
667a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (info == NULL) {
668a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      PrintIndented("LABELS ");
669a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    } else {
670a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      PrintIndented(info);
671a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      Print(" ");
672a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
673a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    PrintLabels(labels);
674a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else if (info != NULL) {
675a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    PrintIndented(info);
676a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
677a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print("\n");
678a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
679a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
680a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
681a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::PrintIndentedVisit(const char* s, AstNode* node) {
68244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  IndentedScope indent(this, s, node);
683a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Visit(node);
684a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
685a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
686a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
687a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockconst char* AstPrinter::PrintProgram(FunctionLiteral* program) {
688a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Init();
68944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  { IndentedScope indent(this, "FUNC");
690a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    PrintLiteralIndented("NAME", program->name(), true);
691a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    PrintLiteralIndented("INFERRED NAME", program->inferred_name(), true);
692a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    PrintParameters(program->scope());
693a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    PrintDeclarations(program->scope()->declarations());
694a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    PrintStatements(program->body());
695a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
696a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return Output();
697a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
698a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
699a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
700a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::PrintDeclarations(ZoneList<Declaration*>* declarations) {
701a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (declarations->length() > 0) {
70244f0eee88ff00398ff7f715fab053374d808c90dSteve Block    IndentedScope indent(this, "DECLS");
703a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    for (int i = 0; i < declarations->length(); i++) {
704a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      Visit(declarations->at(i));
705a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
706a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
707a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
708a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
709a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
710a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::PrintParameters(Scope* scope) {
711a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (scope->num_parameters() > 0) {
71244f0eee88ff00398ff7f715fab053374d808c90dSteve Block    IndentedScope indent(this, "PARAMS");
713a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    for (int i = 0; i < scope->num_parameters(); i++) {
714a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      PrintLiteralWithModeIndented("VAR", scope->parameter(i),
7158b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch                                   scope->parameter(i)->name());
716a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
717a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
718a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
719a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
720a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
721a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::PrintStatements(ZoneList<Statement*>* statements) {
722a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  for (int i = 0; i < statements->length(); i++) {
723a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Visit(statements->at(i));
724a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
725a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
726a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
727a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
728a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::PrintArguments(ZoneList<Expression*>* arguments) {
729a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  for (int i = 0; i < arguments->length(); i++) {
730a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Visit(arguments->at(i));
731a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
732a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
733a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
734a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
735a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::PrintCaseClause(CaseClause* clause) {
736a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (clause->is_default()) {
73744f0eee88ff00398ff7f715fab053374d808c90dSteve Block    IndentedScope indent(this, "DEFAULT");
738a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    PrintStatements(clause->statements());
739a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
74044f0eee88ff00398ff7f715fab053374d808c90dSteve Block    IndentedScope indent(this, "CASE");
741a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Visit(clause->label());
742a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    PrintStatements(clause->statements());
743a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
744a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
745a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
746a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
747a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::VisitBlock(Block* node) {
748a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  const char* block_txt = node->is_initializer_block() ? "BLOCK INIT" : "BLOCK";
74944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  IndentedScope indent(this, block_txt);
750a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintStatements(node->statements());
751a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
752a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
753a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
754a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::VisitDeclaration(Declaration* node) {
755a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (node->fun() == NULL) {
756a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // var or const declarations
757a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    PrintLiteralWithModeIndented(Variable::Mode2String(node->mode()),
758a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                 node->proxy()->AsVariable(),
7598b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch                                 node->proxy()->name());
760a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
761a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // function declarations
762a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    PrintIndented("FUNCTION ");
763a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    PrintLiteral(node->proxy()->name(), true);
764a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Print(" = function ");
765a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    PrintLiteral(node->fun()->name(), false);
766a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Print("\n");
767a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
768a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
769a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
770a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
771a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::VisitExpressionStatement(ExpressionStatement* node) {
772a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Visit(node->expression());
773a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
774a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
775a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
776a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::VisitEmptyStatement(EmptyStatement* node) {
777a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintIndented("EMPTY\n");
778a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
779a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
780a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
781a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::VisitIfStatement(IfStatement* node) {
782a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintIndentedVisit("IF", node->condition());
783a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintIndentedVisit("THEN", node->then_statement());
784a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (node->HasElseStatement()) {
785a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    PrintIndentedVisit("ELSE", node->else_statement());
786a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
787a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
788a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
789a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
790a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::VisitContinueStatement(ContinueStatement* node) {
791a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintLabelsIndented("CONTINUE", node->target()->labels());
792a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
793a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
794a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
795a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::VisitBreakStatement(BreakStatement* node) {
796a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintLabelsIndented("BREAK", node->target()->labels());
797a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
798a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
799a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
800a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::VisitReturnStatement(ReturnStatement* node) {
801a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintIndentedVisit("RETURN", node->expression());
802a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
803a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
804a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
805a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::VisitWithEnterStatement(WithEnterStatement* node) {
806a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintIndentedVisit("WITH ENTER", node->expression());
807a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
808a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
809a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
810a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::VisitWithExitStatement(WithExitStatement* node) {
811a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintIndented("WITH EXIT\n");
812a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
813a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
814a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
815a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::VisitSwitchStatement(SwitchStatement* node) {
81644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  IndentedScope indent(this, "SWITCH");
817a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintLabelsIndented(NULL, node->labels());
818a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintIndentedVisit("TAG", node->tag());
819a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  for (int i = 0; i < node->cases()->length(); i++) {
820a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    PrintCaseClause(node->cases()->at(i));
821a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
822a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
823a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
824a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
8253ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid AstPrinter::VisitDoWhileStatement(DoWhileStatement* node) {
82644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  IndentedScope indent(this, "DO");
8273ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  PrintLabelsIndented(NULL, node->labels());
8283ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  PrintIndentedVisit("BODY", node->body());
8293ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  PrintIndentedVisit("COND", node->cond());
8303ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
8313ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
8323ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
8333ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid AstPrinter::VisitWhileStatement(WhileStatement* node) {
83444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  IndentedScope indent(this, "WHILE");
8353ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  PrintLabelsIndented(NULL, node->labels());
8363ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  PrintIndentedVisit("COND", node->cond());
8373ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  PrintIndentedVisit("BODY", node->body());
8383ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
8393ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
8403ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
8413ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid AstPrinter::VisitForStatement(ForStatement* node) {
84244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  IndentedScope indent(this, "FOR");
843a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintLabelsIndented(NULL, node->labels());
844a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (node->init()) PrintIndentedVisit("INIT", node->init());
845a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (node->cond()) PrintIndentedVisit("COND", node->cond());
8463ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  PrintIndentedVisit("BODY", node->body());
847a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (node->next()) PrintIndentedVisit("NEXT", node->next());
848a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
849a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
850a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
851a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::VisitForInStatement(ForInStatement* node) {
85244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  IndentedScope indent(this, "FOR IN");
853a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintIndentedVisit("FOR", node->each());
854a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintIndentedVisit("IN", node->enumerable());
855a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintIndentedVisit("BODY", node->body());
856a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
857a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
858a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
8593ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid AstPrinter::VisitTryCatchStatement(TryCatchStatement* node) {
86044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  IndentedScope indent(this, "TRY CATCH");
861a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintIndentedVisit("TRY", node->try_block());
862a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintIndentedVisit("CATCHVAR", node->catch_var());
863a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintIndentedVisit("CATCH", node->catch_block());
864a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
865a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
866a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
8673ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid AstPrinter::VisitTryFinallyStatement(TryFinallyStatement* node) {
86844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  IndentedScope indent(this, "TRY FINALLY");
869a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintIndentedVisit("TRY", node->try_block());
870a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintIndentedVisit("FINALLY", node->finally_block());
871a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
872a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
873a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
874a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::VisitDebuggerStatement(DebuggerStatement* node) {
87544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  IndentedScope indent(this, "DEBUGGER");
876a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
877a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
878a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
879a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::VisitFunctionLiteral(FunctionLiteral* node) {
88044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  IndentedScope indent(this, "FUNC LITERAL");
881a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintLiteralIndented("NAME", node->name(), false);
882a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintLiteralIndented("INFERRED NAME", node->inferred_name(), false);
883a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintParameters(node->scope());
884a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // We don't want to see the function literal in this case: it
885a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // will be printed via PrintProgram when the code for it is
886a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // generated.
887a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // PrintStatements(node->body());
888a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
889a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
890a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
8916ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvoid AstPrinter::VisitSharedFunctionInfoLiteral(
8926ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    SharedFunctionInfoLiteral* node) {
89344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  IndentedScope indent(this, "FUNC LITERAL");
8946ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  PrintLiteralIndented("SHARED INFO", node->shared_function_info(), true);
895a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
896a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
897a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
898a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::VisitConditional(Conditional* node) {
89944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  IndentedScope indent(this, "CONDITIONAL");
900a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintIndentedVisit("?", node->condition());
901a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintIndentedVisit("THEN", node->then_expression());
902a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintIndentedVisit("ELSE", node->else_expression());
903a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
904a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
905a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
906a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::VisitLiteral(Literal* node) {
907a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintLiteralIndented("LITERAL", node->handle(), true);
908a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
909a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
910a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
911a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::VisitRegExpLiteral(RegExpLiteral* node) {
91244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  IndentedScope indent(this, "REGEXP LITERAL");
913a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintLiteralIndented("PATTERN", node->pattern(), false);
914a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintLiteralIndented("FLAGS", node->flags(), false);
915a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
916a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
917a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
918a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::VisitObjectLiteral(ObjectLiteral* node) {
91944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  IndentedScope indent(this, "OBJ LITERAL");
920a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  for (int i = 0; i < node->properties()->length(); i++) {
921a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    const char* prop_kind = NULL;
922a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    switch (node->properties()->at(i)->kind()) {
923a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      case ObjectLiteral::Property::CONSTANT:
924a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        prop_kind = "PROPERTY - CONSTANT";
925a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        break;
926a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      case ObjectLiteral::Property::COMPUTED:
927a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        prop_kind = "PROPERTY - COMPUTED";
928a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        break;
929a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      case ObjectLiteral::Property::MATERIALIZED_LITERAL:
930a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        prop_kind = "PROPERTY - MATERIALIZED_LITERAL";
931a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        break;
932a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      case ObjectLiteral::Property::PROTOTYPE:
933a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        prop_kind = "PROPERTY - PROTOTYPE";
934a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        break;
935a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      case ObjectLiteral::Property::GETTER:
936a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        prop_kind = "PROPERTY - GETTER";
937a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        break;
938a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      case ObjectLiteral::Property::SETTER:
939a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        prop_kind = "PROPERTY - SETTER";
940a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        break;
941a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      default:
942a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        UNREACHABLE();
943a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
94444f0eee88ff00398ff7f715fab053374d808c90dSteve Block    IndentedScope prop(this, prop_kind);
945a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    PrintIndentedVisit("KEY", node->properties()->at(i)->key());
946a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    PrintIndentedVisit("VALUE", node->properties()->at(i)->value());
947a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
948a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
949a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
950a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
951a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::VisitArrayLiteral(ArrayLiteral* node) {
95244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  IndentedScope indent(this, "ARRAY LITERAL");
953a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (node->values()->length() > 0) {
95444f0eee88ff00398ff7f715fab053374d808c90dSteve Block    IndentedScope indent(this, "VALUES");
955a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    for (int i = 0; i < node->values()->length(); i++) {
956a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      Visit(node->values()->at(i));
957a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
958a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
959a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
960a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
961a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
962a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::VisitCatchExtensionObject(CatchExtensionObject* node) {
96344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  IndentedScope indent(this, "CatchExtensionObject");
964a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintIndentedVisit("KEY", node->key());
965a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintIndentedVisit("VALUE", node->value());
966a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
967a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
968a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
969a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::VisitSlot(Slot* node) {
970a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintIndented("SLOT ");
9711e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  PrettyPrinter::VisitSlot(node);
972a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print("\n");
973a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
974a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
975a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
976a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::VisitVariableProxy(VariableProxy* node) {
9778b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  PrintLiteralWithModeIndented("VAR PROXY", node->AsVariable(), node->name());
978a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Variable* var = node->var();
979a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (var != NULL && var->rewrite() != NULL) {
98044f0eee88ff00398ff7f715fab053374d808c90dSteve Block    IndentedScope indent(this);
981a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Visit(var->rewrite());
982a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
983a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
984a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
985a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
986a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::VisitAssignment(Assignment* node) {
98744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  IndentedScope indent(this, Token::Name(node->op()), node);
988a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Visit(node->target());
989a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Visit(node->value());
990a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
991a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
992a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
993a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::VisitThrow(Throw* node) {
994a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintIndentedVisit("THROW", node->exception());
995a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
996a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
997a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
998a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::VisitProperty(Property* node) {
99944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  IndentedScope indent(this, "PROPERTY", node);
1000a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Visit(node->obj());
1001a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Literal* literal = node->key()->AsLiteral();
1002a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (literal != NULL && literal->handle()->IsSymbol()) {
1003a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    PrintLiteralIndented("NAME", literal->handle(), false);
1004a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
1005a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    PrintIndentedVisit("KEY", node->key());
1006a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1007a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1008a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1009a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1010a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::VisitCall(Call* node) {
101144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  IndentedScope indent(this, "CALL");
1012a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Visit(node->expression());
1013a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintArguments(node->arguments());
1014a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1015a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1016a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1017a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::VisitCallNew(CallNew* node) {
101844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  IndentedScope indent(this, "CALL NEW");
1019a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Visit(node->expression());
1020a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintArguments(node->arguments());
1021a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1022a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1023a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1024a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::VisitCallRuntime(CallRuntime* node) {
1025a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintLiteralIndented("CALL RUNTIME ", node->name(), false);
102644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  IndentedScope indent(this);
1027a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintArguments(node->arguments());
1028a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1029a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1030a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1031a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::VisitUnaryOperation(UnaryOperation* node) {
1032a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintIndentedVisit(Token::Name(node->op()), node->expression());
1033a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1034a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1035a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1036a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::VisitCountOperation(CountOperation* node) {
1037a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EmbeddedVector<char, 128> buf;
10388b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  OS::SNPrintF(buf, "%s %s", (node->is_prefix() ? "PRE" : "POST"),
10398b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch               Token::Name(node->op()));
1040a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintIndentedVisit(buf.start(), node->expression());
1041a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1042a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1043a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1044a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::VisitBinaryOperation(BinaryOperation* node) {
104544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  IndentedScope indent(this, Token::Name(node->op()), node);
1046a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Visit(node->left());
1047a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Visit(node->right());
1048a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1049a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1050a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1051a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::VisitCompareOperation(CompareOperation* node) {
105244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  IndentedScope indent(this, Token::Name(node->op()), node);
1053a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Visit(node->left());
1054a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Visit(node->right());
1055a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1056a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1057a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
105880d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsenvoid AstPrinter::VisitCompareToNull(CompareToNull* node) {
105980d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  const char* name = node->is_strict()
106080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen      ? "COMPARE-TO-NULL-STRICT"
106180d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen      : "COMPARE-TO-NULL";
106244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  IndentedScope indent(this, name, node);
106380d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  Visit(node->expression());
106480d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen}
106580d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
106680d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
1067a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::VisitThisFunction(ThisFunction* node) {
106844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  IndentedScope indent(this, "THIS-FUNCTION");
1069a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1070a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1071a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
10723ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve BlockTagScope::TagScope(JsonAstBuilder* builder, const char* name)
10733ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    : builder_(builder), next_(builder->tag()), has_body_(false) {
10743ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  if (next_ != NULL) {
10753ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    next_->use();
10763ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    builder->Print(",\n");
10773ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  }
10783ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  builder->set_tag(this);
10793ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  builder->PrintIndented("[");
10803ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  builder->Print("\"%s\"", name);
10813ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  builder->increase_indent(JsonAstBuilder::kTagIndentSize);
10823ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
10833ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
10843ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
10853ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve BlockTagScope::~TagScope() {
10863ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  builder_->decrease_indent(JsonAstBuilder::kTagIndentSize);
10873ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  if (has_body_) {
10883ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    builder_->Print("\n");
10893ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    builder_->PrintIndented("]");
10903ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  } else {
10913ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    builder_->Print("]");
10923ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  }
10933ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  builder_->set_tag(next_);
10943ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
10953ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
10963ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
10973ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve BlockAttributesScope::AttributesScope(JsonAstBuilder* builder)
10983ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    : builder_(builder), attribute_count_(0) {
10993ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  builder->set_attributes(this);
11003ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  builder->tag()->use();
11013ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  builder->Print(",\n");
11023ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  builder->PrintIndented("{");
11033ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  builder->increase_indent(JsonAstBuilder::kAttributesIndentSize);
11043ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
11053ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
11063ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
11073ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve BlockAttributesScope::~AttributesScope() {
11083ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  builder_->decrease_indent(JsonAstBuilder::kAttributesIndentSize);
11093ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  if (attribute_count_ > 1) {
11103ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    builder_->Print("\n");
11113ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    builder_->PrintIndented("}");
11123ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  } else {
11133ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    builder_->Print("}");
11143ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  }
11153ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  builder_->set_attributes(NULL);
11163ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
11173ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
11183ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
11193ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockconst char* JsonAstBuilder::BuildProgram(FunctionLiteral* program) {
11203ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Init();
11213ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(program);
11223ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Print("\n");
11233ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  return Output();
11243ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
11253ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
11263ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
11273ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::AddAttributePrefix(const char* name) {
11283ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  if (attributes()->is_used()) {
11293ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    Print(",\n");
11303ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    PrintIndented("\"");
11313ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  } else {
11323ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    Print("\"");
11333ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  }
11343ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Print("%s\":", name);
11353ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  attributes()->use();
11363ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
11373ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
11383ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
11393ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::AddAttribute(const char* name, Handle<String> value) {
11403ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  SmartPointer<char> value_string = value->ToCString();
11413ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  AddAttributePrefix(name);
11423ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Print("\"%s\"", *value_string);
11433ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
11443ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
11453ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
11463ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::AddAttribute(const char* name, const char* value) {
11473ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  AddAttributePrefix(name);
11483ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Print("\"%s\"", value);
11493ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
11503ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
11513ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
11523ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::AddAttribute(const char* name, int value) {
11533ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  AddAttributePrefix(name);
11543ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Print("%d", value);
11553ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
11563ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
11573ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
11583ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::AddAttribute(const char* name, bool value) {
11593ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  AddAttributePrefix(name);
11603ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Print(value ? "true" : "false");
11613ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
11623ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
11633ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
11643ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitBlock(Block* stmt) {
11653ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "Block");
11663ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  VisitStatements(stmt->statements());
11673ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
11683ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
11693ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
11703ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitExpressionStatement(ExpressionStatement* stmt) {
11713ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "ExpressionStatement");
11723ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(stmt->expression());
11733ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
11743ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
11753ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
11763ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitEmptyStatement(EmptyStatement* stmt) {
11773ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "EmptyStatement");
11783ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
11793ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
11803ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
11813ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitIfStatement(IfStatement* stmt) {
11823ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "IfStatement");
11833ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(stmt->condition());
11843ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(stmt->then_statement());
11853ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(stmt->else_statement());
11863ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
11873ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
11883ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
11893ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitContinueStatement(ContinueStatement* stmt) {
11903ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "ContinueStatement");
11913ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
11923ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
11933ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
11943ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitBreakStatement(BreakStatement* stmt) {
11953ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "BreakStatement");
11963ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
11973ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
11983ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
11993ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitReturnStatement(ReturnStatement* stmt) {
12003ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "ReturnStatement");
12013ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(stmt->expression());
12023ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
12033ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
12043ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
12053ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitWithEnterStatement(WithEnterStatement* stmt) {
12063ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "WithEnterStatement");
12073ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(stmt->expression());
12083ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
12093ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
12103ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
12113ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitWithExitStatement(WithExitStatement* stmt) {
12123ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "WithExitStatement");
12133ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
12143ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
12153ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
12163ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitSwitchStatement(SwitchStatement* stmt) {
12173ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "SwitchStatement");
12183ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
12193ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
12203ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
12213ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitDoWhileStatement(DoWhileStatement* stmt) {
12223ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "DoWhileStatement");
12233ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(stmt->body());
12243ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(stmt->cond());
12253ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
12263ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
12273ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
12283ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitWhileStatement(WhileStatement* stmt) {
12293ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "WhileStatement");
12303ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(stmt->cond());
12313ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(stmt->body());
12323ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
12333ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
12343ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
12353ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitForStatement(ForStatement* stmt) {
12363ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "ForStatement");
12373ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  if (stmt->init() != NULL) Visit(stmt->init());
12383ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  if (stmt->cond() != NULL) Visit(stmt->cond());
12393ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(stmt->body());
12403ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  if (stmt->next() != NULL) Visit(stmt->next());
12413ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
12423ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
12433ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
12443ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitForInStatement(ForInStatement* stmt) {
12453ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "ForInStatement");
12463ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(stmt->each());
12473ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(stmt->enumerable());
12483ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(stmt->body());
12493ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
12503ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
12513ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
12523ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitTryCatchStatement(TryCatchStatement* stmt) {
12533ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "TryCatchStatement");
12543ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(stmt->try_block());
12553ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(stmt->catch_var());
12563ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(stmt->catch_block());
12573ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
12583ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
12593ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
12603ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitTryFinallyStatement(TryFinallyStatement* stmt) {
12613ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "TryFinallyStatement");
12623ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(stmt->try_block());
12633ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(stmt->finally_block());
12643ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
12653ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
12663ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
12673ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitDebuggerStatement(DebuggerStatement* stmt) {
12683ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "DebuggerStatement");
12693ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
12703ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
12713ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
12723ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitFunctionLiteral(FunctionLiteral* expr) {
12733ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "FunctionLiteral");
12743ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  {
12753ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    AttributesScope attributes(this);
12763ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    AddAttribute("name", expr->name());
12773ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  }
12783ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  VisitDeclarations(expr->scope()->declarations());
12793ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  VisitStatements(expr->body());
12803ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
12813ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
12823ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
12836ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvoid JsonAstBuilder::VisitSharedFunctionInfoLiteral(
12846ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    SharedFunctionInfoLiteral* expr) {
12856ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  TagScope tag(this, "SharedFunctionInfoLiteral");
12863ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
12873ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
12883ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
12893ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitConditional(Conditional* expr) {
12903ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "Conditional");
12913ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
12923ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
12933ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
12943ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitSlot(Slot* expr) {
12953ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "Slot");
12963ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  {
12973ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    AttributesScope attributes(this);
12983ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    switch (expr->type()) {
12993ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block      case Slot::PARAMETER:
13003ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block        AddAttribute("type", "PARAMETER");
13013ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block        break;
13023ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block      case Slot::LOCAL:
13033ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block        AddAttribute("type", "LOCAL");
13043ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block        break;
13053ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block      case Slot::CONTEXT:
13063ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block        AddAttribute("type", "CONTEXT");
13073ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block        break;
13083ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block      case Slot::LOOKUP:
13093ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block        AddAttribute("type", "LOOKUP");
13103ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block        break;
13113ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    }
13123ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    AddAttribute("index", expr->index());
13133ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  }
13143ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
13153ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
13163ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
13173ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitVariableProxy(VariableProxy* expr) {
13183ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  if (expr->var()->rewrite() == NULL) {
13193ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    TagScope tag(this, "VariableProxy");
13203ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    {
13213ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block      AttributesScope attributes(this);
13223ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block      AddAttribute("name", expr->name());
13233ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block      AddAttribute("mode", Variable::Mode2String(expr->var()->mode()));
13243ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    }
13253ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  } else {
13263ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    Visit(expr->var()->rewrite());
13273ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  }
13283ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
13293ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
13303ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
13313ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitLiteral(Literal* expr) {
13323ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "Literal");
13333ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  {
13343ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    AttributesScope attributes(this);
13353ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    Handle<Object> handle = expr->handle();
13363ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    if (handle->IsString()) {
13373ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block      AddAttribute("handle", Handle<String>(String::cast(*handle)));
13383ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    } else if (handle->IsSmi()) {
13393ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block      AddAttribute("handle", Smi::cast(*handle)->value());
13403ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    }
13413ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  }
13423ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
13433ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
13443ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
13453ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitRegExpLiteral(RegExpLiteral* expr) {
13463ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "RegExpLiteral");
13473ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
13483ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
13493ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
13503ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitObjectLiteral(ObjectLiteral* expr) {
13513ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "ObjectLiteral");
13523ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
13533ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
13543ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
13553ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitArrayLiteral(ArrayLiteral* expr) {
13563ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "ArrayLiteral");
13573ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
13583ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
13593ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
13603ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitCatchExtensionObject(CatchExtensionObject* expr) {
13613ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "CatchExtensionObject");
13623ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(expr->key());
13633ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(expr->value());
13643ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
13653ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
13663ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
13673ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitAssignment(Assignment* expr) {
13683ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "Assignment");
13693ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  {
13703ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    AttributesScope attributes(this);
13713ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    AddAttribute("op", Token::Name(expr->op()));
13723ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  }
13733ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(expr->target());
13743ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(expr->value());
13753ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
13763ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
13773ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
13783ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitThrow(Throw* expr) {
13793ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "Throw");
13803ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(expr->exception());
13813ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
13823ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
13833ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
13843ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitProperty(Property* expr) {
13853ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "Property");
13863ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  {
13873ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    AttributesScope attributes(this);
13883ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    AddAttribute("type", expr->is_synthetic() ? "SYNTHETIC" : "NORMAL");
13893ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  }
13903ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(expr->obj());
13913ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(expr->key());
13923ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
13933ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
13943ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
13953ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitCall(Call* expr) {
13963ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "Call");
13973ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(expr->expression());
13983ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  VisitExpressions(expr->arguments());
13993ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
14003ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
14013ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
14023ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitCallNew(CallNew* expr) {
14033ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "CallNew");
14043ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(expr->expression());
14053ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  VisitExpressions(expr->arguments());
14063ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
14073ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
14083ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
14093ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitCallRuntime(CallRuntime* expr) {
14103ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "CallRuntime");
14113ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  {
14123ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    AttributesScope attributes(this);
14133ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    AddAttribute("name", expr->name());
14143ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  }
14153ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  VisitExpressions(expr->arguments());
14163ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
14173ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
14183ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
14193ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitUnaryOperation(UnaryOperation* expr) {
14203ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "UnaryOperation");
14213ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  {
14223ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    AttributesScope attributes(this);
14233ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    AddAttribute("op", Token::Name(expr->op()));
14243ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  }
14253ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(expr->expression());
14263ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
14273ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
14283ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
14293ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitCountOperation(CountOperation* expr) {
14303ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "CountOperation");
14313ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  {
14323ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    AttributesScope attributes(this);
14333ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    AddAttribute("is_prefix", expr->is_prefix());
14343ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    AddAttribute("op", Token::Name(expr->op()));
14353ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  }
14363ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(expr->expression());
14373ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
14383ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
14393ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
14403ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitBinaryOperation(BinaryOperation* expr) {
14413ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "BinaryOperation");
14423ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  {
14433ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    AttributesScope attributes(this);
14443ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    AddAttribute("op", Token::Name(expr->op()));
14453ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  }
14463ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(expr->left());
14473ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(expr->right());
14483ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
14493ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
14503ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
14513ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitCompareOperation(CompareOperation* expr) {
14523ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "CompareOperation");
14533ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  {
14543ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    AttributesScope attributes(this);
14553ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    AddAttribute("op", Token::Name(expr->op()));
14563ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  }
14573ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(expr->left());
14583ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(expr->right());
14593ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
14603ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
14613ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
146280d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsenvoid JsonAstBuilder::VisitCompareToNull(CompareToNull* expr) {
146380d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  TagScope tag(this, "CompareToNull");
146480d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  {
146580d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    AttributesScope attributes(this);
146680d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    AddAttribute("is_strict", expr->is_strict());
146780d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  }
146880d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  Visit(expr->expression());
146980d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen}
147080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
147180d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
14723ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitThisFunction(ThisFunction* expr) {
14733ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "ThisFunction");
14743ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
14753ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
14763ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
14773ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitDeclaration(Declaration* decl) {
14783ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "Declaration");
14793ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  {
14803ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    AttributesScope attributes(this);
14813ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    AddAttribute("mode", Variable::Mode2String(decl->mode()));
14823ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  }
14833ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(decl->proxy());
14843ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  if (decl->fun() != NULL) Visit(decl->fun());
14853ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
14863ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
1487a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1488a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif  // DEBUG
1489a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1490a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} }  // namespace v8::internal
1491