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