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