prettyprinter.cc revision 44f0eee88ff00398ff7f715fab053374d808c90d
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
37980d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsenvoid PrettyPrinter::VisitIncrementOperation(IncrementOperation* node) {
38080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  UNREACHABLE();
38180d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen}
38280d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
38380d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
384a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid PrettyPrinter::VisitCountOperation(CountOperation* node) {
385a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print("(");
386a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (node->is_prefix()) Print("%s", Token::String(node->op()));
387a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Visit(node->expression());
388a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (node->is_postfix()) Print("%s", Token::String(node->op()));
389a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print(")");
390a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
391a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
392a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
393a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid PrettyPrinter::VisitBinaryOperation(BinaryOperation* node) {
394a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print("(");
395a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Visit(node->left());
396a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print("%s", Token::String(node->op()));
397a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Visit(node->right());
398a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print(")");
399a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
400a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
401a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
402a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid PrettyPrinter::VisitCompareOperation(CompareOperation* node) {
403a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print("(");
404a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Visit(node->left());
405a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print("%s", Token::String(node->op()));
406a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Visit(node->right());
407a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print(")");
408a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
409a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
410a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
41180d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsenvoid PrettyPrinter::VisitCompareToNull(CompareToNull* node) {
41280d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  Print("(");
41380d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  Visit(node->expression());
41480d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  Print("%s null)", Token::String(node->op()));
41580d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen}
41680d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
41780d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
418a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid PrettyPrinter::VisitThisFunction(ThisFunction* node) {
419a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print("<this-function>");
420a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
421a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
422a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
423a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockconst char* PrettyPrinter::Print(AstNode* node) {
424a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Init();
425a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Visit(node);
426a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return output_;
427a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
428a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
429a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
430a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockconst char* PrettyPrinter::PrintExpression(FunctionLiteral* program) {
431a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Init();
432a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ExpressionStatement* statement =
433a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    program->body()->at(0)->AsExpressionStatement();
434a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Visit(statement->expression());
435a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return output_;
436a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
437a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
438a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
439a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockconst char* PrettyPrinter::PrintProgram(FunctionLiteral* program) {
440a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Init();
441a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintStatements(program->body());
442a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print("\n");
443a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return output_;
444a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
445a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
446a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
447a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid PrettyPrinter::PrintOut(AstNode* node) {
448a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrettyPrinter printer;
449a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintF("%s", printer.Print(node));
450a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
451a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
452a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
453a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid PrettyPrinter::Init() {
454a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (size_ == 0) {
455a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    ASSERT(output_ == NULL);
456a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    const int initial_size = 256;
457a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    output_ = NewArray<char>(initial_size);
458a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    size_ = initial_size;
459a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
460a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  output_[0] = '\0';
461a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  pos_ = 0;
462a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
463a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
464a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
465a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid PrettyPrinter::Print(const char* format, ...) {
466a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  for (;;) {
467a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    va_list arguments;
468a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    va_start(arguments, format);
469a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    int n = OS::VSNPrintF(Vector<char>(output_, size_) + pos_,
470a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                          format,
471a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                          arguments);
472a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    va_end(arguments);
473a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
474a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (n >= 0) {
475a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      // there was enough space - we are done
476a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      pos_ += n;
477a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      return;
478a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    } else {
479a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      // there was not enough space - allocate more and try again
480a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      const int slack = 32;
481a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      int new_size = size_ + (size_ >> 1) + slack;
482a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      char* new_output = NewArray<char>(new_size);
483a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      memcpy(new_output, output_, pos_);
484a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      DeleteArray(output_);
485a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      output_ = new_output;
486a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      size_ = new_size;
487a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
488a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
489a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
490a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
491a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
492a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid PrettyPrinter::PrintStatements(ZoneList<Statement*>* statements) {
493a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  for (int i = 0; i < statements->length(); i++) {
494a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (i != 0) Print(" ");
495a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Visit(statements->at(i));
496a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
497a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
498a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
499a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
500a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid PrettyPrinter::PrintLabels(ZoneStringList* labels) {
501a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (labels != NULL) {
502a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    for (int i = 0; i < labels->length(); i++) {
503a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      PrintLiteral(labels->at(i), false);
504a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      Print(": ");
505a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
506a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
507a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
508a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
509a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
510a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid PrettyPrinter::PrintArguments(ZoneList<Expression*>* arguments) {
511a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print("(");
512a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  for (int i = 0; i < arguments->length(); i++) {
513a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (i != 0) Print(", ");
514a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Visit(arguments->at(i));
515a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
516a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print(")");
517a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
518a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
519a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
520a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid PrettyPrinter::PrintLiteral(Handle<Object> value, bool quote) {
521a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Object* object = *value;
522a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (object->IsString()) {
523a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    String* string = String::cast(object);
524a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (quote) Print("\"");
525a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    for (int i = 0; i < string->length(); i++) {
526a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      Print("%c", string->Get(i));
527a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
528a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (quote) Print("\"");
52944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  } else if (object->IsNull()) {
530a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Print("null");
53144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  } else if (object->IsTrue()) {
532a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Print("true");
53344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  } else if (object->IsFalse()) {
534a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Print("false");
53544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  } else if (object->IsUndefined()) {
536a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Print("undefined");
537a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else if (object->IsNumber()) {
538a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Print("%g", object->Number());
539a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else if (object->IsJSObject()) {
540a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // regular expression
541a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (object->IsJSFunction()) {
542a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      Print("JS-Function");
543a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    } else if (object->IsJSArray()) {
544a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      Print("JS-array[%u]", JSArray::cast(object)->length());
545a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    } else if (object->IsJSObject()) {
546a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      Print("JS-Object");
547a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    } else {
548a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      Print("?UNKNOWN?");
549a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
550a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else if (object->IsFixedArray()) {
551a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Print("FixedArray");
552a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
553a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Print("<unknown literal %p>", object);
554a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
555a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
556a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
557a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
558a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid PrettyPrinter::PrintParameters(Scope* scope) {
559a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print("(");
560a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  for (int i = 0; i < scope->num_parameters(); i++) {
561a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (i  > 0) Print(", ");
562a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    PrintLiteral(scope->parameter(i)->name(), false);
563a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
564a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print(")");
565a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
566a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
567a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
568a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid PrettyPrinter::PrintDeclarations(ZoneList<Declaration*>* declarations) {
569a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  for (int i = 0; i < declarations->length(); i++) {
570a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (i > 0) Print(" ");
571a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Visit(declarations->at(i));
572a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
573a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
574a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
575a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
576a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid PrettyPrinter::PrintFunctionLiteral(FunctionLiteral* function) {
577a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print("function ");
578a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintLiteral(function->name(), false);
579a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintParameters(function->scope());
580a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print(" { ");
581a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintDeclarations(function->scope()->declarations());
582a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintStatements(function->body());
583a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print(" }");
584a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
585a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
586a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
587a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid PrettyPrinter::PrintCaseClause(CaseClause* clause) {
588a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (clause->is_default()) {
589a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Print("default");
590a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
591a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Print("case ");
592a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Visit(clause->label());
593a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
594a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print(": ");
595a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintStatements(clause->statements());
596a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (clause->statements()->length() > 0)
597a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Print(" ");
598a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
599a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
600a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
601a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//-----------------------------------------------------------------------------
602a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
603a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass IndentedScope BASE_EMBEDDED {
604a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public:
60544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  explicit IndentedScope(AstPrinter* printer) : ast_printer_(printer) {
606a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    ast_printer_->inc_indent();
607a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
608a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
60944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  IndentedScope(AstPrinter* printer, const char* txt, AstNode* node = NULL)
61044f0eee88ff00398ff7f715fab053374d808c90dSteve Block      : ast_printer_(printer) {
611a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    ast_printer_->PrintIndented(txt);
6124515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke    if (node != NULL && node->AsExpression() != NULL) {
6134515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke      Expression* expr = node->AsExpression();
6144515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke      bool printed_first = false;
6154515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke      if ((expr->type() != NULL) && (expr->type()->IsKnown())) {
6164515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke        ast_printer_->Print(" (type = ");
6174515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke        ast_printer_->Print(StaticType::Type2String(expr->type()));
6184515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke        printed_first = true;
6194515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke      }
6204515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke      if (printed_first) ast_printer_->Print(")");
621a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
622a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    ast_printer_->Print("\n");
623a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    ast_printer_->inc_indent();
624a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
625a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
626a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  virtual ~IndentedScope() {
627a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    ast_printer_->dec_indent();
628a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
629a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
630a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private:
63144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  AstPrinter* ast_printer_;
632a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
633a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
634a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
635a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//-----------------------------------------------------------------------------
636a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
637a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
63844f0eee88ff00398ff7f715fab053374d808c90dSteve BlockAstPrinter::AstPrinter() : indent_(0) {
639a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
640a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
641a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
642a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockAstPrinter::~AstPrinter() {
643a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(indent_ == 0);
644a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
645a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
646a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
647a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::PrintIndented(const char* txt) {
648a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  for (int i = 0; i < indent_; i++) {
649a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Print(". ");
650a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
651a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print(txt);
652a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
653a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
654a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
655a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::PrintLiteralIndented(const char* info,
656a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                      Handle<Object> value,
657a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                      bool quote) {
658a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintIndented(info);
659a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print(" ");
660a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintLiteral(value, quote);
661a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print("\n");
662a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
663a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
664a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
665a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::PrintLiteralWithModeIndented(const char* info,
666a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                              Variable* var,
667a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                              Handle<Object> value,
66880d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen                                              StaticType* type) {
669a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (var == NULL) {
670a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    PrintLiteralIndented(info, value, true);
671a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
672a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    EmbeddedVector<char, 256> buf;
6734515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke    int pos = OS::SNPrintF(buf, "%s (mode = %s", info,
6744515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke                           Variable::Mode2String(var->mode()));
675a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (type->IsKnown()) {
6764515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke      pos += OS::SNPrintF(buf + pos, ", type = %s",
6774515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke                          StaticType::Type2String(type));
6784515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke    }
6794515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke    OS::SNPrintF(buf + pos, ")");
680a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    PrintLiteralIndented(buf.start(), value, true);
681a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
682a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
683a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
684a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
685a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::PrintLabelsIndented(const char* info, ZoneStringList* labels) {
686a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (labels != NULL && labels->length() > 0) {
687a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (info == NULL) {
688a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      PrintIndented("LABELS ");
689a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    } else {
690a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      PrintIndented(info);
691a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      Print(" ");
692a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
693a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    PrintLabels(labels);
694a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else if (info != NULL) {
695a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    PrintIndented(info);
696a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
697a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print("\n");
698a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
699a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
700a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
701a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::PrintIndentedVisit(const char* s, AstNode* node) {
70244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  IndentedScope indent(this, s, node);
703a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Visit(node);
704a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
705a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
706a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
707a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockconst char* AstPrinter::PrintProgram(FunctionLiteral* program) {
708a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Init();
70944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  { IndentedScope indent(this, "FUNC");
710a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    PrintLiteralIndented("NAME", program->name(), true);
711a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    PrintLiteralIndented("INFERRED NAME", program->inferred_name(), true);
712a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    PrintParameters(program->scope());
713a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    PrintDeclarations(program->scope()->declarations());
714a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    PrintStatements(program->body());
715a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
716a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return Output();
717a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
718a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
719a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
720a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::PrintDeclarations(ZoneList<Declaration*>* declarations) {
721a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (declarations->length() > 0) {
72244f0eee88ff00398ff7f715fab053374d808c90dSteve Block    IndentedScope indent(this, "DECLS");
723a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    for (int i = 0; i < declarations->length(); i++) {
724a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      Visit(declarations->at(i));
725a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
726a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
727a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
728a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
729a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
730a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::PrintParameters(Scope* scope) {
731a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (scope->num_parameters() > 0) {
73244f0eee88ff00398ff7f715fab053374d808c90dSteve Block    IndentedScope indent(this, "PARAMS");
733a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    for (int i = 0; i < scope->num_parameters(); i++) {
734a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      PrintLiteralWithModeIndented("VAR", scope->parameter(i),
735a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                   scope->parameter(i)->name(),
73680d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen                                   scope->parameter(i)->type());
737a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
738a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
739a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
740a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
741a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
742a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::PrintStatements(ZoneList<Statement*>* statements) {
743a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  for (int i = 0; i < statements->length(); i++) {
744a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Visit(statements->at(i));
745a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
746a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
747a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
748a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
749a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::PrintArguments(ZoneList<Expression*>* arguments) {
750a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  for (int i = 0; i < arguments->length(); i++) {
751a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Visit(arguments->at(i));
752a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
753a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
754a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
755a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
756a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::PrintCaseClause(CaseClause* clause) {
757a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (clause->is_default()) {
75844f0eee88ff00398ff7f715fab053374d808c90dSteve Block    IndentedScope indent(this, "DEFAULT");
759a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    PrintStatements(clause->statements());
760a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
76144f0eee88ff00398ff7f715fab053374d808c90dSteve Block    IndentedScope indent(this, "CASE");
762a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Visit(clause->label());
763a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    PrintStatements(clause->statements());
764a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
765a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
766a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
767a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
768a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::VisitBlock(Block* node) {
769a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  const char* block_txt = node->is_initializer_block() ? "BLOCK INIT" : "BLOCK";
77044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  IndentedScope indent(this, block_txt);
771a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintStatements(node->statements());
772a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
773a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
774a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
775a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::VisitDeclaration(Declaration* node) {
776a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (node->fun() == NULL) {
777a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // var or const declarations
778a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    PrintLiteralWithModeIndented(Variable::Mode2String(node->mode()),
779a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                 node->proxy()->AsVariable(),
780a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                 node->proxy()->name(),
78180d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen                                 node->proxy()->AsVariable()->type());
782a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
783a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // function declarations
784a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    PrintIndented("FUNCTION ");
785a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    PrintLiteral(node->proxy()->name(), true);
786a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Print(" = function ");
787a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    PrintLiteral(node->fun()->name(), false);
788a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Print("\n");
789a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
790a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
791a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
792a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
793a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::VisitExpressionStatement(ExpressionStatement* node) {
794a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Visit(node->expression());
795a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
796a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
797a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
798a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::VisitEmptyStatement(EmptyStatement* node) {
799a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintIndented("EMPTY\n");
800a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
801a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
802a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
803a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::VisitIfStatement(IfStatement* node) {
804a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintIndentedVisit("IF", node->condition());
805a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintIndentedVisit("THEN", node->then_statement());
806a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (node->HasElseStatement()) {
807a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    PrintIndentedVisit("ELSE", node->else_statement());
808a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
809a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
810a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
811a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
812a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::VisitContinueStatement(ContinueStatement* node) {
813a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintLabelsIndented("CONTINUE", node->target()->labels());
814a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
815a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
816a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
817a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::VisitBreakStatement(BreakStatement* node) {
818a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintLabelsIndented("BREAK", node->target()->labels());
819a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
820a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
821a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
822a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::VisitReturnStatement(ReturnStatement* node) {
823a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintIndentedVisit("RETURN", node->expression());
824a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
825a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
826a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
827a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::VisitWithEnterStatement(WithEnterStatement* node) {
828a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintIndentedVisit("WITH ENTER", node->expression());
829a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
830a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
831a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
832a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::VisitWithExitStatement(WithExitStatement* node) {
833a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintIndented("WITH EXIT\n");
834a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
835a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
836a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
837a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::VisitSwitchStatement(SwitchStatement* node) {
83844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  IndentedScope indent(this, "SWITCH");
839a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintLabelsIndented(NULL, node->labels());
840a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintIndentedVisit("TAG", node->tag());
841a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  for (int i = 0; i < node->cases()->length(); i++) {
842a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    PrintCaseClause(node->cases()->at(i));
843a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
844a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
845a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
846a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
8473ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid AstPrinter::VisitDoWhileStatement(DoWhileStatement* node) {
84844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  IndentedScope indent(this, "DO");
8493ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  PrintLabelsIndented(NULL, node->labels());
8503ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  PrintIndentedVisit("BODY", node->body());
8513ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  PrintIndentedVisit("COND", node->cond());
8523ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
8533ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
8543ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
8553ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid AstPrinter::VisitWhileStatement(WhileStatement* node) {
85644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  IndentedScope indent(this, "WHILE");
8573ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  PrintLabelsIndented(NULL, node->labels());
8583ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  PrintIndentedVisit("COND", node->cond());
8593ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  PrintIndentedVisit("BODY", node->body());
8603ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
8613ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
8623ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
8633ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid AstPrinter::VisitForStatement(ForStatement* node) {
86444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  IndentedScope indent(this, "FOR");
865a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintLabelsIndented(NULL, node->labels());
866a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (node->init()) PrintIndentedVisit("INIT", node->init());
867a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (node->cond()) PrintIndentedVisit("COND", node->cond());
8683ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  PrintIndentedVisit("BODY", node->body());
869a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (node->next()) PrintIndentedVisit("NEXT", node->next());
870a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
871a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
872a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
873a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::VisitForInStatement(ForInStatement* node) {
87444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  IndentedScope indent(this, "FOR IN");
875a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintIndentedVisit("FOR", node->each());
876a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintIndentedVisit("IN", node->enumerable());
877a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintIndentedVisit("BODY", node->body());
878a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
879a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
880a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
8813ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid AstPrinter::VisitTryCatchStatement(TryCatchStatement* node) {
88244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  IndentedScope indent(this, "TRY CATCH");
883a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintIndentedVisit("TRY", node->try_block());
884a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintIndentedVisit("CATCHVAR", node->catch_var());
885a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintIndentedVisit("CATCH", node->catch_block());
886a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
887a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
888a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
8893ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid AstPrinter::VisitTryFinallyStatement(TryFinallyStatement* node) {
89044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  IndentedScope indent(this, "TRY FINALLY");
891a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintIndentedVisit("TRY", node->try_block());
892a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintIndentedVisit("FINALLY", node->finally_block());
893a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
894a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
895a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
896a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::VisitDebuggerStatement(DebuggerStatement* node) {
89744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  IndentedScope indent(this, "DEBUGGER");
898a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
899a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
900a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
901a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::VisitFunctionLiteral(FunctionLiteral* node) {
90244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  IndentedScope indent(this, "FUNC LITERAL");
903a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintLiteralIndented("NAME", node->name(), false);
904a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintLiteralIndented("INFERRED NAME", node->inferred_name(), false);
905a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintParameters(node->scope());
906a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // We don't want to see the function literal in this case: it
907a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // will be printed via PrintProgram when the code for it is
908a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // generated.
909a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // PrintStatements(node->body());
910a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
911a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
912a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
9136ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvoid AstPrinter::VisitSharedFunctionInfoLiteral(
9146ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    SharedFunctionInfoLiteral* node) {
91544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  IndentedScope indent(this, "FUNC LITERAL");
9166ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  PrintLiteralIndented("SHARED INFO", node->shared_function_info(), true);
917a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
918a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
919a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
920a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::VisitConditional(Conditional* node) {
92144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  IndentedScope indent(this, "CONDITIONAL");
922a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintIndentedVisit("?", node->condition());
923a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintIndentedVisit("THEN", node->then_expression());
924a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintIndentedVisit("ELSE", node->else_expression());
925a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
926a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
927a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
928a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::VisitLiteral(Literal* node) {
929a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintLiteralIndented("LITERAL", node->handle(), true);
930a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
931a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
932a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
933a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::VisitRegExpLiteral(RegExpLiteral* node) {
93444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  IndentedScope indent(this, "REGEXP LITERAL");
935a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintLiteralIndented("PATTERN", node->pattern(), false);
936a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintLiteralIndented("FLAGS", node->flags(), false);
937a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
938a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
939a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
940a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::VisitObjectLiteral(ObjectLiteral* node) {
94144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  IndentedScope indent(this, "OBJ LITERAL");
942a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  for (int i = 0; i < node->properties()->length(); i++) {
943a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    const char* prop_kind = NULL;
944a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    switch (node->properties()->at(i)->kind()) {
945a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      case ObjectLiteral::Property::CONSTANT:
946a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        prop_kind = "PROPERTY - CONSTANT";
947a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        break;
948a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      case ObjectLiteral::Property::COMPUTED:
949a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        prop_kind = "PROPERTY - COMPUTED";
950a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        break;
951a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      case ObjectLiteral::Property::MATERIALIZED_LITERAL:
952a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        prop_kind = "PROPERTY - MATERIALIZED_LITERAL";
953a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        break;
954a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      case ObjectLiteral::Property::PROTOTYPE:
955a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        prop_kind = "PROPERTY - PROTOTYPE";
956a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        break;
957a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      case ObjectLiteral::Property::GETTER:
958a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        prop_kind = "PROPERTY - GETTER";
959a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        break;
960a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      case ObjectLiteral::Property::SETTER:
961a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        prop_kind = "PROPERTY - SETTER";
962a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        break;
963a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      default:
964a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        UNREACHABLE();
965a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
96644f0eee88ff00398ff7f715fab053374d808c90dSteve Block    IndentedScope prop(this, prop_kind);
967a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    PrintIndentedVisit("KEY", node->properties()->at(i)->key());
968a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    PrintIndentedVisit("VALUE", node->properties()->at(i)->value());
969a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
970a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
971a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
972a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
973a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::VisitArrayLiteral(ArrayLiteral* node) {
97444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  IndentedScope indent(this, "ARRAY LITERAL");
975a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (node->values()->length() > 0) {
97644f0eee88ff00398ff7f715fab053374d808c90dSteve Block    IndentedScope indent(this, "VALUES");
977a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    for (int i = 0; i < node->values()->length(); i++) {
978a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      Visit(node->values()->at(i));
979a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
980a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
981a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
982a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
983a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
984a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::VisitCatchExtensionObject(CatchExtensionObject* node) {
98544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  IndentedScope indent(this, "CatchExtensionObject");
986a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintIndentedVisit("KEY", node->key());
987a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintIndentedVisit("VALUE", node->value());
988a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
989a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
990a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
991a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::VisitSlot(Slot* node) {
992a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintIndented("SLOT ");
9931e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  PrettyPrinter::VisitSlot(node);
994a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Print("\n");
995a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
996a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
997a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
998a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::VisitVariableProxy(VariableProxy* node) {
999a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintLiteralWithModeIndented("VAR PROXY", node->AsVariable(), node->name(),
100080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen                               node->type());
1001a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Variable* var = node->var();
1002a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (var != NULL && var->rewrite() != NULL) {
100344f0eee88ff00398ff7f715fab053374d808c90dSteve Block    IndentedScope indent(this);
1004a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Visit(var->rewrite());
1005a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1006a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1007a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1008a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1009a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::VisitAssignment(Assignment* node) {
101044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  IndentedScope indent(this, Token::Name(node->op()), node);
1011a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Visit(node->target());
1012a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Visit(node->value());
1013a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1014a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1015a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1016a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::VisitThrow(Throw* node) {
1017a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintIndentedVisit("THROW", node->exception());
1018a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1019a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1020a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1021a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::VisitProperty(Property* node) {
102244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  IndentedScope indent(this, "PROPERTY", node);
1023a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Visit(node->obj());
1024a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Literal* literal = node->key()->AsLiteral();
1025a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (literal != NULL && literal->handle()->IsSymbol()) {
1026a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    PrintLiteralIndented("NAME", literal->handle(), false);
1027a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
1028a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    PrintIndentedVisit("KEY", node->key());
1029a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1030a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1031a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1032a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1033a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::VisitCall(Call* node) {
103444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  IndentedScope indent(this, "CALL");
1035a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Visit(node->expression());
1036a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintArguments(node->arguments());
1037a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1038a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1039a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1040a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::VisitCallNew(CallNew* node) {
104144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  IndentedScope indent(this, "CALL NEW");
1042a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Visit(node->expression());
1043a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintArguments(node->arguments());
1044a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1045a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1046a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1047a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::VisitCallRuntime(CallRuntime* node) {
1048a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintLiteralIndented("CALL RUNTIME ", node->name(), false);
104944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  IndentedScope indent(this);
1050a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintArguments(node->arguments());
1051a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1052a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1053a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1054a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::VisitUnaryOperation(UnaryOperation* node) {
1055a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintIndentedVisit(Token::Name(node->op()), node->expression());
1056a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1057a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1058a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
105980d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsenvoid AstPrinter::VisitIncrementOperation(IncrementOperation* node) {
106080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  UNREACHABLE();
106180d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen}
106280d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
106380d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
1064a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::VisitCountOperation(CountOperation* node) {
1065a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  EmbeddedVector<char, 128> buf;
1066a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (node->type()->IsKnown()) {
1067a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    OS::SNPrintF(buf, "%s %s (type = %s)",
1068a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                 (node->is_prefix() ? "PRE" : "POST"),
1069a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                 Token::Name(node->op()),
1070e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke                 StaticType::Type2String(node->type()));
1071a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
1072a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    OS::SNPrintF(buf, "%s %s", (node->is_prefix() ? "PRE" : "POST"),
1073a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                 Token::Name(node->op()));
1074a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1075a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PrintIndentedVisit(buf.start(), node->expression());
1076a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1077a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1078a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1079a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::VisitBinaryOperation(BinaryOperation* node) {
108044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  IndentedScope indent(this, Token::Name(node->op()), node);
1081a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Visit(node->left());
1082a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Visit(node->right());
1083a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1084a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1085a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1086a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::VisitCompareOperation(CompareOperation* node) {
108744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  IndentedScope indent(this, Token::Name(node->op()), node);
1088a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Visit(node->left());
1089a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Visit(node->right());
1090a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1091a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1092a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
109380d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsenvoid AstPrinter::VisitCompareToNull(CompareToNull* node) {
109480d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  const char* name = node->is_strict()
109580d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen      ? "COMPARE-TO-NULL-STRICT"
109680d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen      : "COMPARE-TO-NULL";
109744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  IndentedScope indent(this, name, node);
109880d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  Visit(node->expression());
109980d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen}
110080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
110180d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
1102a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AstPrinter::VisitThisFunction(ThisFunction* node) {
110344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  IndentedScope indent(this, "THIS-FUNCTION");
1104a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1105a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1106a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
11073ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve BlockTagScope::TagScope(JsonAstBuilder* builder, const char* name)
11083ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    : builder_(builder), next_(builder->tag()), has_body_(false) {
11093ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  if (next_ != NULL) {
11103ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    next_->use();
11113ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    builder->Print(",\n");
11123ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  }
11133ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  builder->set_tag(this);
11143ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  builder->PrintIndented("[");
11153ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  builder->Print("\"%s\"", name);
11163ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  builder->increase_indent(JsonAstBuilder::kTagIndentSize);
11173ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
11183ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
11193ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
11203ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve BlockTagScope::~TagScope() {
11213ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  builder_->decrease_indent(JsonAstBuilder::kTagIndentSize);
11223ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  if (has_body_) {
11233ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    builder_->Print("\n");
11243ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    builder_->PrintIndented("]");
11253ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  } else {
11263ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    builder_->Print("]");
11273ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  }
11283ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  builder_->set_tag(next_);
11293ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
11303ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
11313ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
11323ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve BlockAttributesScope::AttributesScope(JsonAstBuilder* builder)
11333ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    : builder_(builder), attribute_count_(0) {
11343ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  builder->set_attributes(this);
11353ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  builder->tag()->use();
11363ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  builder->Print(",\n");
11373ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  builder->PrintIndented("{");
11383ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  builder->increase_indent(JsonAstBuilder::kAttributesIndentSize);
11393ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
11403ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
11413ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
11423ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve BlockAttributesScope::~AttributesScope() {
11433ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  builder_->decrease_indent(JsonAstBuilder::kAttributesIndentSize);
11443ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  if (attribute_count_ > 1) {
11453ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    builder_->Print("\n");
11463ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    builder_->PrintIndented("}");
11473ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  } else {
11483ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    builder_->Print("}");
11493ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  }
11503ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  builder_->set_attributes(NULL);
11513ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
11523ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
11533ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
11543ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockconst char* JsonAstBuilder::BuildProgram(FunctionLiteral* program) {
11553ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Init();
11563ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(program);
11573ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Print("\n");
11583ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  return Output();
11593ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
11603ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
11613ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
11623ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::AddAttributePrefix(const char* name) {
11633ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  if (attributes()->is_used()) {
11643ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    Print(",\n");
11653ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    PrintIndented("\"");
11663ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  } else {
11673ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    Print("\"");
11683ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  }
11693ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Print("%s\":", name);
11703ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  attributes()->use();
11713ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
11723ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
11733ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
11743ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::AddAttribute(const char* name, Handle<String> value) {
11753ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  SmartPointer<char> value_string = value->ToCString();
11763ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  AddAttributePrefix(name);
11773ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Print("\"%s\"", *value_string);
11783ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
11793ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
11803ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
11813ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::AddAttribute(const char* name, const char* value) {
11823ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  AddAttributePrefix(name);
11833ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Print("\"%s\"", value);
11843ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
11853ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
11863ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
11873ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::AddAttribute(const char* name, int value) {
11883ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  AddAttributePrefix(name);
11893ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Print("%d", value);
11903ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
11913ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
11923ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
11933ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::AddAttribute(const char* name, bool value) {
11943ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  AddAttributePrefix(name);
11953ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Print(value ? "true" : "false");
11963ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
11973ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
11983ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
11993ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitBlock(Block* stmt) {
12003ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "Block");
12013ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  VisitStatements(stmt->statements());
12023ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
12033ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
12043ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
12053ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitExpressionStatement(ExpressionStatement* stmt) {
12063ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "ExpressionStatement");
12073ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(stmt->expression());
12083ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
12093ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
12103ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
12113ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitEmptyStatement(EmptyStatement* stmt) {
12123ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "EmptyStatement");
12133ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
12143ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
12153ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
12163ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitIfStatement(IfStatement* stmt) {
12173ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "IfStatement");
12183ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(stmt->condition());
12193ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(stmt->then_statement());
12203ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(stmt->else_statement());
12213ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
12223ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
12233ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
12243ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitContinueStatement(ContinueStatement* stmt) {
12253ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "ContinueStatement");
12263ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
12273ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
12283ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
12293ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitBreakStatement(BreakStatement* stmt) {
12303ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "BreakStatement");
12313ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
12323ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
12333ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
12343ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitReturnStatement(ReturnStatement* stmt) {
12353ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "ReturnStatement");
12363ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(stmt->expression());
12373ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
12383ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
12393ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
12403ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitWithEnterStatement(WithEnterStatement* stmt) {
12413ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "WithEnterStatement");
12423ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(stmt->expression());
12433ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
12443ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
12453ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
12463ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitWithExitStatement(WithExitStatement* stmt) {
12473ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "WithExitStatement");
12483ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
12493ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
12503ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
12513ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitSwitchStatement(SwitchStatement* stmt) {
12523ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "SwitchStatement");
12533ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
12543ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
12553ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
12563ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitDoWhileStatement(DoWhileStatement* stmt) {
12573ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "DoWhileStatement");
12583ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(stmt->body());
12593ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(stmt->cond());
12603ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
12613ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
12623ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
12633ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitWhileStatement(WhileStatement* stmt) {
12643ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "WhileStatement");
12653ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(stmt->cond());
12663ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(stmt->body());
12673ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
12683ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
12693ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
12703ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitForStatement(ForStatement* stmt) {
12713ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "ForStatement");
12723ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  if (stmt->init() != NULL) Visit(stmt->init());
12733ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  if (stmt->cond() != NULL) Visit(stmt->cond());
12743ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(stmt->body());
12753ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  if (stmt->next() != NULL) Visit(stmt->next());
12763ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
12773ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
12783ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
12793ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitForInStatement(ForInStatement* stmt) {
12803ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "ForInStatement");
12813ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(stmt->each());
12823ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(stmt->enumerable());
12833ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(stmt->body());
12843ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
12853ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
12863ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
12873ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitTryCatchStatement(TryCatchStatement* stmt) {
12883ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "TryCatchStatement");
12893ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(stmt->try_block());
12903ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(stmt->catch_var());
12913ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(stmt->catch_block());
12923ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
12933ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
12943ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
12953ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitTryFinallyStatement(TryFinallyStatement* stmt) {
12963ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "TryFinallyStatement");
12973ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(stmt->try_block());
12983ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(stmt->finally_block());
12993ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
13003ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
13013ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
13023ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitDebuggerStatement(DebuggerStatement* stmt) {
13033ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "DebuggerStatement");
13043ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
13053ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
13063ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
13073ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitFunctionLiteral(FunctionLiteral* expr) {
13083ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "FunctionLiteral");
13093ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  {
13103ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    AttributesScope attributes(this);
13113ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    AddAttribute("name", expr->name());
13123ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  }
13133ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  VisitDeclarations(expr->scope()->declarations());
13143ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  VisitStatements(expr->body());
13153ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
13163ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
13173ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
13186ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvoid JsonAstBuilder::VisitSharedFunctionInfoLiteral(
13196ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    SharedFunctionInfoLiteral* expr) {
13206ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  TagScope tag(this, "SharedFunctionInfoLiteral");
13213ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
13223ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
13233ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
13243ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitConditional(Conditional* expr) {
13253ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "Conditional");
13263ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
13273ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
13283ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
13293ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitSlot(Slot* expr) {
13303ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "Slot");
13313ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  {
13323ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    AttributesScope attributes(this);
13333ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    switch (expr->type()) {
13343ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block      case Slot::PARAMETER:
13353ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block        AddAttribute("type", "PARAMETER");
13363ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block        break;
13373ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block      case Slot::LOCAL:
13383ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block        AddAttribute("type", "LOCAL");
13393ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block        break;
13403ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block      case Slot::CONTEXT:
13413ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block        AddAttribute("type", "CONTEXT");
13423ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block        break;
13433ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block      case Slot::LOOKUP:
13443ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block        AddAttribute("type", "LOOKUP");
13453ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block        break;
13463ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    }
13473ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    AddAttribute("index", expr->index());
13483ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  }
13493ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
13503ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
13513ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
13523ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitVariableProxy(VariableProxy* expr) {
13533ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  if (expr->var()->rewrite() == NULL) {
13543ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    TagScope tag(this, "VariableProxy");
13553ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    {
13563ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block      AttributesScope attributes(this);
13573ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block      AddAttribute("name", expr->name());
13583ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block      AddAttribute("mode", Variable::Mode2String(expr->var()->mode()));
13593ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    }
13603ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  } else {
13613ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    Visit(expr->var()->rewrite());
13623ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  }
13633ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
13643ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
13653ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
13663ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitLiteral(Literal* expr) {
13673ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "Literal");
13683ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  {
13693ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    AttributesScope attributes(this);
13703ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    Handle<Object> handle = expr->handle();
13713ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    if (handle->IsString()) {
13723ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block      AddAttribute("handle", Handle<String>(String::cast(*handle)));
13733ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    } else if (handle->IsSmi()) {
13743ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block      AddAttribute("handle", Smi::cast(*handle)->value());
13753ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    }
13763ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  }
13773ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
13783ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
13793ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
13803ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitRegExpLiteral(RegExpLiteral* expr) {
13813ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "RegExpLiteral");
13823ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
13833ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
13843ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
13853ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitObjectLiteral(ObjectLiteral* expr) {
13863ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "ObjectLiteral");
13873ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
13883ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
13893ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
13903ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitArrayLiteral(ArrayLiteral* expr) {
13913ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "ArrayLiteral");
13923ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
13933ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
13943ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
13953ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitCatchExtensionObject(CatchExtensionObject* expr) {
13963ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "CatchExtensionObject");
13973ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(expr->key());
13983ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(expr->value());
13993ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
14003ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
14013ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
14023ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitAssignment(Assignment* expr) {
14033ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "Assignment");
14043ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  {
14053ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    AttributesScope attributes(this);
14063ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    AddAttribute("op", Token::Name(expr->op()));
14073ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  }
14083ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(expr->target());
14093ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(expr->value());
14103ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
14113ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
14123ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
14133ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitThrow(Throw* expr) {
14143ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "Throw");
14153ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(expr->exception());
14163ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
14173ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
14183ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
14193ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitProperty(Property* expr) {
14203ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "Property");
14213ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  {
14223ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    AttributesScope attributes(this);
14233ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    AddAttribute("type", expr->is_synthetic() ? "SYNTHETIC" : "NORMAL");
14243ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  }
14253ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(expr->obj());
14263ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(expr->key());
14273ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
14283ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
14293ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
14303ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitCall(Call* expr) {
14313ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "Call");
14323ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(expr->expression());
14333ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  VisitExpressions(expr->arguments());
14343ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
14353ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
14363ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
14373ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitCallNew(CallNew* expr) {
14383ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "CallNew");
14393ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(expr->expression());
14403ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  VisitExpressions(expr->arguments());
14413ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
14423ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
14433ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
14443ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitCallRuntime(CallRuntime* expr) {
14453ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "CallRuntime");
14463ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  {
14473ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    AttributesScope attributes(this);
14483ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    AddAttribute("name", expr->name());
14493ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  }
14503ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  VisitExpressions(expr->arguments());
14513ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
14523ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
14533ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
14543ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitUnaryOperation(UnaryOperation* expr) {
14553ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "UnaryOperation");
14563ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  {
14573ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    AttributesScope attributes(this);
14583ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    AddAttribute("op", Token::Name(expr->op()));
14593ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  }
14603ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(expr->expression());
14613ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
14623ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
14633ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
146480d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsenvoid JsonAstBuilder::VisitIncrementOperation(IncrementOperation* expr) {
146580d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  UNREACHABLE();
146680d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen}
146780d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
146880d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
14693ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitCountOperation(CountOperation* expr) {
14703ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "CountOperation");
14713ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  {
14723ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    AttributesScope attributes(this);
14733ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    AddAttribute("is_prefix", expr->is_prefix());
14743ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    AddAttribute("op", Token::Name(expr->op()));
14753ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  }
14763ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(expr->expression());
14773ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
14783ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
14793ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
14803ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitBinaryOperation(BinaryOperation* expr) {
14813ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "BinaryOperation");
14823ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  {
14833ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    AttributesScope attributes(this);
14843ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    AddAttribute("op", Token::Name(expr->op()));
14853ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  }
14863ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(expr->left());
14873ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(expr->right());
14883ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
14893ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
14903ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
14913ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitCompareOperation(CompareOperation* expr) {
14923ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "CompareOperation");
14933ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  {
14943ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    AttributesScope attributes(this);
14953ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    AddAttribute("op", Token::Name(expr->op()));
14963ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  }
14973ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(expr->left());
14983ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(expr->right());
14993ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
15003ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
15013ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
150280d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsenvoid JsonAstBuilder::VisitCompareToNull(CompareToNull* expr) {
150380d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  TagScope tag(this, "CompareToNull");
150480d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  {
150580d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    AttributesScope attributes(this);
150680d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    AddAttribute("is_strict", expr->is_strict());
150780d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  }
150880d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  Visit(expr->expression());
150980d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen}
151080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
151180d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
15123ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitThisFunction(ThisFunction* expr) {
15133ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "ThisFunction");
15143ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
15153ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
15163ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
15173ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid JsonAstBuilder::VisitDeclaration(Declaration* decl) {
15183ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  TagScope tag(this, "Declaration");
15193ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  {
15203ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    AttributesScope attributes(this);
15213ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    AddAttribute("mode", Variable::Mode2String(decl->mode()));
15223ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  }
15233ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Visit(decl->proxy());
15243ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  if (decl->fun() != NULL) Visit(decl->fun());
15253ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
15263ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
1527a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1528a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif  // DEBUG
1529a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1530a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} }  // namespace v8::internal
1531