Index: src/prettyprinter.cc |
diff --git a/src/prettyprinter.cc b/src/prettyprinter.cc |
deleted file mode 100644 |
index bcb8cb3ddeb805cc11da9cdfccbf550b328cdb55..0000000000000000000000000000000000000000 |
--- a/src/prettyprinter.cc |
+++ /dev/null |
@@ -1,1665 +0,0 @@ |
-// Copyright 2012 the V8 project authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "src/prettyprinter.h" |
- |
-#include <stdarg.h> |
- |
-#include "src/ast-value-factory.h" |
-#include "src/base/platform/platform.h" |
-#include "src/scopes.h" |
- |
-namespace v8 { |
-namespace internal { |
- |
-CallPrinter::CallPrinter(Isolate* isolate) { |
- output_ = NULL; |
- size_ = 0; |
- pos_ = 0; |
- position_ = 0; |
- found_ = false; |
- done_ = false; |
- InitializeAstVisitor(isolate); |
-} |
- |
- |
-CallPrinter::~CallPrinter() { DeleteArray(output_); } |
- |
- |
-const char* CallPrinter::Print(FunctionLiteral* program, int position) { |
- Init(); |
- position_ = position; |
- Find(program); |
- return output_; |
-} |
- |
- |
-void CallPrinter::Find(AstNode* node, bool print) { |
- if (done_) return; |
- if (found_) { |
- if (print) { |
- int start = pos_; |
- Visit(node); |
- if (start != pos_) return; |
- } |
- Print("(intermediate value)"); |
- } else { |
- Visit(node); |
- } |
-} |
- |
- |
-void CallPrinter::Init() { |
- if (size_ == 0) { |
- DCHECK(output_ == NULL); |
- const int initial_size = 256; |
- output_ = NewArray<char>(initial_size); |
- size_ = initial_size; |
- } |
- output_[0] = '\0'; |
- pos_ = 0; |
-} |
- |
- |
-void CallPrinter::Print(const char* format, ...) { |
- if (!found_ || done_) return; |
- for (;;) { |
- va_list arguments; |
- va_start(arguments, format); |
- int n = VSNPrintF(Vector<char>(output_, size_) + pos_, format, arguments); |
- va_end(arguments); |
- |
- if (n >= 0) { |
- // there was enough space - we are done |
- pos_ += n; |
- return; |
- } else { |
- // there was not enough space - allocate more and try again |
- const int slack = 32; |
- int new_size = size_ + (size_ >> 1) + slack; |
- char* new_output = NewArray<char>(new_size); |
- MemCopy(new_output, output_, pos_); |
- DeleteArray(output_); |
- output_ = new_output; |
- size_ = new_size; |
- } |
- } |
-} |
- |
- |
-void CallPrinter::VisitBlock(Block* node) { |
- FindStatements(node->statements()); |
-} |
- |
- |
-void CallPrinter::VisitVariableDeclaration(VariableDeclaration* node) {} |
- |
- |
-void CallPrinter::VisitFunctionDeclaration(FunctionDeclaration* node) {} |
- |
- |
-void CallPrinter::VisitImportDeclaration(ImportDeclaration* node) { |
-} |
- |
- |
-void CallPrinter::VisitExportDeclaration(ExportDeclaration* node) {} |
- |
- |
-void CallPrinter::VisitExpressionStatement(ExpressionStatement* node) { |
- Find(node->expression()); |
-} |
- |
- |
-void CallPrinter::VisitEmptyStatement(EmptyStatement* node) {} |
- |
- |
-void CallPrinter::VisitSloppyBlockFunctionStatement( |
- SloppyBlockFunctionStatement* node) { |
- Find(node->statement()); |
-} |
- |
- |
-void CallPrinter::VisitIfStatement(IfStatement* node) { |
- Find(node->condition()); |
- Find(node->then_statement()); |
- if (node->HasElseStatement()) { |
- Find(node->else_statement()); |
- } |
-} |
- |
- |
-void CallPrinter::VisitContinueStatement(ContinueStatement* node) {} |
- |
- |
-void CallPrinter::VisitBreakStatement(BreakStatement* node) {} |
- |
- |
-void CallPrinter::VisitReturnStatement(ReturnStatement* node) { |
- Find(node->expression()); |
-} |
- |
- |
-void CallPrinter::VisitWithStatement(WithStatement* node) { |
- Find(node->expression()); |
- Find(node->statement()); |
-} |
- |
- |
-void CallPrinter::VisitSwitchStatement(SwitchStatement* node) { |
- Find(node->tag()); |
- ZoneList<CaseClause*>* cases = node->cases(); |
- for (int i = 0; i < cases->length(); i++) Find(cases->at(i)); |
-} |
- |
- |
-void CallPrinter::VisitCaseClause(CaseClause* clause) { |
- if (!clause->is_default()) { |
- Find(clause->label()); |
- } |
- FindStatements(clause->statements()); |
-} |
- |
- |
-void CallPrinter::VisitDoWhileStatement(DoWhileStatement* node) { |
- Find(node->body()); |
- Find(node->cond()); |
-} |
- |
- |
-void CallPrinter::VisitWhileStatement(WhileStatement* node) { |
- Find(node->cond()); |
- Find(node->body()); |
-} |
- |
- |
-void CallPrinter::VisitForStatement(ForStatement* node) { |
- if (node->init() != NULL) { |
- Find(node->init()); |
- } |
- if (node->cond() != NULL) Find(node->cond()); |
- if (node->next() != NULL) Find(node->next()); |
- Find(node->body()); |
-} |
- |
- |
-void CallPrinter::VisitForInStatement(ForInStatement* node) { |
- Find(node->each()); |
- Find(node->enumerable()); |
- Find(node->body()); |
-} |
- |
- |
-void CallPrinter::VisitForOfStatement(ForOfStatement* node) { |
- Find(node->each()); |
- Find(node->iterable()); |
- Find(node->body()); |
-} |
- |
- |
-void CallPrinter::VisitTryCatchStatement(TryCatchStatement* node) { |
- Find(node->try_block()); |
- Find(node->catch_block()); |
-} |
- |
- |
-void CallPrinter::VisitTryFinallyStatement(TryFinallyStatement* node) { |
- Find(node->try_block()); |
- Find(node->finally_block()); |
-} |
- |
- |
-void CallPrinter::VisitDebuggerStatement(DebuggerStatement* node) {} |
- |
- |
-void CallPrinter::VisitFunctionLiteral(FunctionLiteral* node) { |
- FindStatements(node->body()); |
-} |
- |
- |
-void CallPrinter::VisitClassLiteral(ClassLiteral* node) { |
- if (node->extends()) Find(node->extends()); |
- for (int i = 0; i < node->properties()->length(); i++) { |
- Find(node->properties()->at(i)->value()); |
- } |
-} |
- |
- |
-void CallPrinter::VisitNativeFunctionLiteral(NativeFunctionLiteral* node) {} |
- |
- |
-void CallPrinter::VisitDoExpression(DoExpression* node) { Find(node->block()); } |
- |
- |
-void CallPrinter::VisitConditional(Conditional* node) { |
- Find(node->condition()); |
- Find(node->then_expression()); |
- Find(node->else_expression()); |
-} |
- |
- |
-void CallPrinter::VisitLiteral(Literal* node) { |
- PrintLiteral(node->value(), true); |
-} |
- |
- |
-void CallPrinter::VisitRegExpLiteral(RegExpLiteral* node) { |
- Print("/"); |
- PrintLiteral(node->pattern(), false); |
- Print("/"); |
- if (node->flags() & RegExp::kGlobal) Print("g"); |
- if (node->flags() & RegExp::kIgnoreCase) Print("i"); |
- if (node->flags() & RegExp::kMultiline) Print("m"); |
- if (node->flags() & RegExp::kUnicode) Print("u"); |
- if (node->flags() & RegExp::kSticky) Print("y"); |
-} |
- |
- |
-void CallPrinter::VisitObjectLiteral(ObjectLiteral* node) { |
- for (int i = 0; i < node->properties()->length(); i++) { |
- Find(node->properties()->at(i)->value()); |
- } |
-} |
- |
- |
-void CallPrinter::VisitArrayLiteral(ArrayLiteral* node) { |
- Print("["); |
- for (int i = 0; i < node->values()->length(); i++) { |
- if (i != 0) Print(","); |
- Find(node->values()->at(i), true); |
- } |
- Print("]"); |
-} |
- |
- |
-void CallPrinter::VisitVariableProxy(VariableProxy* node) { |
- PrintLiteral(node->name(), false); |
-} |
- |
- |
-void CallPrinter::VisitAssignment(Assignment* node) { |
- Find(node->target()); |
- Find(node->value()); |
-} |
- |
- |
-void CallPrinter::VisitYield(Yield* node) { Find(node->expression()); } |
- |
- |
-void CallPrinter::VisitThrow(Throw* node) { Find(node->exception()); } |
- |
- |
-void CallPrinter::VisitProperty(Property* node) { |
- Expression* key = node->key(); |
- Literal* literal = key->AsLiteral(); |
- if (literal != NULL && literal->value()->IsInternalizedString()) { |
- Find(node->obj(), true); |
- Print("."); |
- PrintLiteral(literal->value(), false); |
- } else { |
- Find(node->obj(), true); |
- Print("["); |
- Find(key, true); |
- Print("]"); |
- } |
-} |
- |
- |
-void CallPrinter::VisitCall(Call* node) { |
- bool was_found = !found_ && node->position() == position_; |
- if (was_found) found_ = true; |
- Find(node->expression(), true); |
- if (!was_found) Print("(...)"); |
- FindArguments(node->arguments()); |
- if (was_found) done_ = true; |
-} |
- |
- |
-void CallPrinter::VisitCallNew(CallNew* node) { |
- bool was_found = !found_ && node->position() == position_; |
- if (was_found) found_ = true; |
- Find(node->expression(), was_found); |
- FindArguments(node->arguments()); |
- if (was_found) done_ = true; |
-} |
- |
- |
-void CallPrinter::VisitCallRuntime(CallRuntime* node) { |
- if (!node->is_jsruntime() && |
- node->function() == |
- Runtime::FunctionForId(Runtime::kInlineDefaultConstructorCallSuper)) { |
- found_ = true; |
- Print("super"); |
- done_ = true; |
- return; |
- } |
- FindArguments(node->arguments()); |
-} |
- |
- |
-void CallPrinter::VisitUnaryOperation(UnaryOperation* node) { |
- Token::Value op = node->op(); |
- bool needsSpace = |
- op == Token::DELETE || op == Token::TYPEOF || op == Token::VOID; |
- Print("(%s%s", Token::String(op), needsSpace ? " " : ""); |
- Find(node->expression(), true); |
- Print(")"); |
-} |
- |
- |
-void CallPrinter::VisitCountOperation(CountOperation* node) { |
- Print("("); |
- if (node->is_prefix()) Print("%s", Token::String(node->op())); |
- Find(node->expression(), true); |
- if (node->is_postfix()) Print("%s", Token::String(node->op())); |
- Print(")"); |
-} |
- |
- |
-void CallPrinter::VisitBinaryOperation(BinaryOperation* node) { |
- Print("("); |
- Find(node->left(), true); |
- Print(" %s ", Token::String(node->op())); |
- Find(node->right(), true); |
- Print(")"); |
-} |
- |
- |
-void CallPrinter::VisitCompareOperation(CompareOperation* node) { |
- Print("("); |
- Find(node->left(), true); |
- Print(" %s ", Token::String(node->op())); |
- Find(node->right(), true); |
- Print(")"); |
-} |
- |
- |
-void CallPrinter::VisitSpread(Spread* node) { |
- Print("(..."); |
- Find(node->expression(), true); |
- Print(")"); |
-} |
- |
- |
-void CallPrinter::VisitEmptyParentheses(EmptyParentheses* node) { |
- UNREACHABLE(); |
-} |
- |
- |
-void CallPrinter::VisitThisFunction(ThisFunction* node) {} |
- |
- |
-void CallPrinter::VisitSuperPropertyReference(SuperPropertyReference* node) {} |
- |
- |
-void CallPrinter::VisitSuperCallReference(SuperCallReference* node) { |
- Print("super"); |
-} |
- |
- |
-void CallPrinter::FindStatements(ZoneList<Statement*>* statements) { |
- if (statements == NULL) return; |
- for (int i = 0; i < statements->length(); i++) { |
- Find(statements->at(i)); |
- } |
-} |
- |
- |
-void CallPrinter::FindArguments(ZoneList<Expression*>* arguments) { |
- if (found_) return; |
- for (int i = 0; i < arguments->length(); i++) { |
- Find(arguments->at(i)); |
- } |
-} |
- |
- |
-void CallPrinter::PrintLiteral(Handle<Object> value, bool quote) { |
- Object* object = *value; |
- if (object->IsString()) { |
- String* string = String::cast(object); |
- if (quote) Print("\""); |
- for (int i = 0; i < string->length(); i++) { |
- Print("%c", string->Get(i)); |
- } |
- if (quote) Print("\""); |
- } else if (object->IsNull()) { |
- Print("null"); |
- } else if (object->IsTrue()) { |
- Print("true"); |
- } else if (object->IsFalse()) { |
- Print("false"); |
- } else if (object->IsUndefined()) { |
- Print("undefined"); |
- } else if (object->IsNumber()) { |
- Print("%g", object->Number()); |
- } |
-} |
- |
- |
-void CallPrinter::PrintLiteral(const AstRawString* value, bool quote) { |
- PrintLiteral(value->string(), quote); |
-} |
- |
- |
-//----------------------------------------------------------------------------- |
- |
- |
-#ifdef DEBUG |
- |
-// A helper for ast nodes that use FeedbackVectorSlots. |
-static int FormatSlotNode(Vector<char>* buf, Expression* node, |
- const char* node_name, FeedbackVectorSlot slot) { |
- int pos = SNPrintF(*buf, "%s", node_name); |
- if (!slot.IsInvalid()) { |
- pos = SNPrintF(*buf + pos, " Slot(%d)", slot.ToInt()); |
- } |
- return pos; |
-} |
- |
- |
-PrettyPrinter::PrettyPrinter(Isolate* isolate) { |
- output_ = NULL; |
- size_ = 0; |
- pos_ = 0; |
- InitializeAstVisitor(isolate); |
-} |
- |
- |
-PrettyPrinter::~PrettyPrinter() { |
- DeleteArray(output_); |
-} |
- |
- |
-void PrettyPrinter::VisitBlock(Block* node) { |
- if (!node->ignore_completion_value()) Print("{ "); |
- PrintStatements(node->statements()); |
- if (node->statements()->length() > 0) Print(" "); |
- if (!node->ignore_completion_value()) Print("}"); |
-} |
- |
- |
-void PrettyPrinter::VisitVariableDeclaration(VariableDeclaration* node) { |
- Print("var "); |
- PrintLiteral(node->proxy()->name(), false); |
- Print(";"); |
-} |
- |
- |
-void PrettyPrinter::VisitFunctionDeclaration(FunctionDeclaration* node) { |
- Print("function "); |
- PrintLiteral(node->proxy()->name(), false); |
- Print(" = "); |
- PrintFunctionLiteral(node->fun()); |
- Print(";"); |
-} |
- |
- |
-void PrettyPrinter::VisitImportDeclaration(ImportDeclaration* node) { |
- Print("import "); |
- PrintLiteral(node->proxy()->name(), false); |
- Print(" from "); |
- PrintLiteral(node->module_specifier()->string(), true); |
- Print(";"); |
-} |
- |
- |
-void PrettyPrinter::VisitExportDeclaration(ExportDeclaration* node) { |
- Print("export "); |
- PrintLiteral(node->proxy()->name(), false); |
- Print(";"); |
-} |
- |
- |
-void PrettyPrinter::VisitExpressionStatement(ExpressionStatement* node) { |
- Visit(node->expression()); |
- Print(";"); |
-} |
- |
- |
-void PrettyPrinter::VisitEmptyStatement(EmptyStatement* node) { |
- Print(";"); |
-} |
- |
- |
-void PrettyPrinter::VisitSloppyBlockFunctionStatement( |
- SloppyBlockFunctionStatement* node) { |
- Visit(node->statement()); |
-} |
- |
- |
-void PrettyPrinter::VisitIfStatement(IfStatement* node) { |
- Print("if ("); |
- Visit(node->condition()); |
- Print(") "); |
- Visit(node->then_statement()); |
- if (node->HasElseStatement()) { |
- Print(" else "); |
- Visit(node->else_statement()); |
- } |
-} |
- |
- |
-void PrettyPrinter::VisitContinueStatement(ContinueStatement* node) { |
- Print("continue"); |
- ZoneList<const AstRawString*>* labels = node->target()->labels(); |
- if (labels != NULL) { |
- Print(" "); |
- DCHECK(labels->length() > 0); // guaranteed to have at least one entry |
- PrintLiteral(labels->at(0), false); // any label from the list is fine |
- } |
- Print(";"); |
-} |
- |
- |
-void PrettyPrinter::VisitBreakStatement(BreakStatement* node) { |
- Print("break"); |
- ZoneList<const AstRawString*>* labels = node->target()->labels(); |
- if (labels != NULL) { |
- Print(" "); |
- DCHECK(labels->length() > 0); // guaranteed to have at least one entry |
- PrintLiteral(labels->at(0), false); // any label from the list is fine |
- } |
- Print(";"); |
-} |
- |
- |
-void PrettyPrinter::VisitReturnStatement(ReturnStatement* node) { |
- Print("return "); |
- Visit(node->expression()); |
- Print(";"); |
-} |
- |
- |
-void PrettyPrinter::VisitWithStatement(WithStatement* node) { |
- Print("with ("); |
- Visit(node->expression()); |
- Print(") "); |
- Visit(node->statement()); |
-} |
- |
- |
-void PrettyPrinter::VisitSwitchStatement(SwitchStatement* node) { |
- PrintLabels(node->labels()); |
- Print("switch ("); |
- Visit(node->tag()); |
- Print(") { "); |
- ZoneList<CaseClause*>* cases = node->cases(); |
- for (int i = 0; i < cases->length(); i++) |
- Visit(cases->at(i)); |
- Print("}"); |
-} |
- |
- |
-void PrettyPrinter::VisitCaseClause(CaseClause* clause) { |
- if (clause->is_default()) { |
- Print("default"); |
- } else { |
- Print("case "); |
- Visit(clause->label()); |
- } |
- Print(": "); |
- PrintStatements(clause->statements()); |
- if (clause->statements()->length() > 0) |
- Print(" "); |
-} |
- |
- |
-void PrettyPrinter::VisitDoWhileStatement(DoWhileStatement* node) { |
- PrintLabels(node->labels()); |
- Print("do "); |
- Visit(node->body()); |
- Print(" while ("); |
- Visit(node->cond()); |
- Print(");"); |
-} |
- |
- |
-void PrettyPrinter::VisitWhileStatement(WhileStatement* node) { |
- PrintLabels(node->labels()); |
- Print("while ("); |
- Visit(node->cond()); |
- Print(") "); |
- Visit(node->body()); |
-} |
- |
- |
-void PrettyPrinter::VisitForStatement(ForStatement* node) { |
- PrintLabels(node->labels()); |
- Print("for ("); |
- if (node->init() != NULL) { |
- Visit(node->init()); |
- Print(" "); |
- } else { |
- Print("; "); |
- } |
- if (node->cond() != NULL) Visit(node->cond()); |
- Print("; "); |
- if (node->next() != NULL) { |
- Visit(node->next()); // prints extra ';', unfortunately |
- // to fix: should use Expression for next |
- } |
- Print(") "); |
- Visit(node->body()); |
-} |
- |
- |
-void PrettyPrinter::VisitForInStatement(ForInStatement* node) { |
- PrintLabels(node->labels()); |
- Print("for ("); |
- Visit(node->each()); |
- Print(" in "); |
- Visit(node->enumerable()); |
- Print(") "); |
- Visit(node->body()); |
-} |
- |
- |
-void PrettyPrinter::VisitForOfStatement(ForOfStatement* node) { |
- PrintLabels(node->labels()); |
- Print("for ("); |
- Visit(node->each()); |
- Print(" of "); |
- Visit(node->iterable()); |
- Print(") "); |
- Visit(node->body()); |
-} |
- |
- |
-void PrettyPrinter::VisitTryCatchStatement(TryCatchStatement* node) { |
- Print("try "); |
- Visit(node->try_block()); |
- Print(" catch ("); |
- const bool quote = false; |
- PrintLiteral(node->variable()->name(), quote); |
- Print(") "); |
- Visit(node->catch_block()); |
-} |
- |
- |
-void PrettyPrinter::VisitTryFinallyStatement(TryFinallyStatement* node) { |
- Print("try "); |
- Visit(node->try_block()); |
- Print(" finally "); |
- Visit(node->finally_block()); |
-} |
- |
- |
-void PrettyPrinter::VisitDebuggerStatement(DebuggerStatement* node) { |
- Print("debugger "); |
-} |
- |
- |
-void PrettyPrinter::VisitFunctionLiteral(FunctionLiteral* node) { |
- Print("("); |
- PrintFunctionLiteral(node); |
- Print(")"); |
-} |
- |
- |
-void PrettyPrinter::VisitClassLiteral(ClassLiteral* node) { |
- Print("(class "); |
- PrintLiteral(node->name(), false); |
- if (node->extends()) { |
- Print(" extends "); |
- Visit(node->extends()); |
- } |
- Print(" { "); |
- for (int i = 0; i < node->properties()->length(); i++) { |
- PrintObjectLiteralProperty(node->properties()->at(i)); |
- } |
- Print(" })"); |
-} |
- |
- |
-void PrettyPrinter::VisitNativeFunctionLiteral(NativeFunctionLiteral* node) { |
- Print("("); |
- PrintLiteral(node->name(), false); |
- Print(")"); |
-} |
- |
- |
-void PrettyPrinter::VisitDoExpression(DoExpression* node) { |
- Print("(do {"); |
- PrintStatements(node->block()->statements()); |
- Print("})"); |
-} |
- |
- |
-void PrettyPrinter::VisitConditional(Conditional* node) { |
- Visit(node->condition()); |
- Print(" ? "); |
- Visit(node->then_expression()); |
- Print(" : "); |
- Visit(node->else_expression()); |
-} |
- |
- |
-void PrettyPrinter::VisitLiteral(Literal* node) { |
- PrintLiteral(node->value(), true); |
-} |
- |
- |
-void PrettyPrinter::VisitRegExpLiteral(RegExpLiteral* node) { |
- Print(" RegExp("); |
- PrintLiteral(node->pattern(), false); |
- Print(","); |
- if (node->flags() & RegExp::kGlobal) Print("g"); |
- if (node->flags() & RegExp::kIgnoreCase) Print("i"); |
- if (node->flags() & RegExp::kMultiline) Print("m"); |
- if (node->flags() & RegExp::kUnicode) Print("u"); |
- if (node->flags() & RegExp::kSticky) Print("y"); |
- Print(") "); |
-} |
- |
- |
-void PrettyPrinter::VisitObjectLiteral(ObjectLiteral* node) { |
- Print("{ "); |
- for (int i = 0; i < node->properties()->length(); i++) { |
- if (i != 0) Print(","); |
- PrintObjectLiteralProperty(node->properties()->at(i)); |
- } |
- Print(" }"); |
-} |
- |
- |
-void PrettyPrinter::PrintObjectLiteralProperty( |
- ObjectLiteralProperty* property) { |
- // TODO(arv): Better printing of methods etc. |
- Print(" "); |
- Visit(property->key()); |
- Print(": "); |
- Visit(property->value()); |
-} |
- |
- |
-void PrettyPrinter::VisitArrayLiteral(ArrayLiteral* node) { |
- Print("[ "); |
- Print(" literal_index = %d", node->literal_index()); |
- for (int i = 0; i < node->values()->length(); i++) { |
- if (i != 0) Print(","); |
- Visit(node->values()->at(i)); |
- } |
- Print(" ]"); |
-} |
- |
- |
-void PrettyPrinter::VisitVariableProxy(VariableProxy* node) { |
- PrintLiteral(node->name(), false); |
-} |
- |
- |
-void PrettyPrinter::VisitAssignment(Assignment* node) { |
- Visit(node->target()); |
- Print(" %s ", Token::String(node->op())); |
- Visit(node->value()); |
-} |
- |
- |
-void PrettyPrinter::VisitYield(Yield* node) { |
- Print("yield "); |
- Visit(node->expression()); |
-} |
- |
- |
-void PrettyPrinter::VisitThrow(Throw* node) { |
- Print("throw "); |
- Visit(node->exception()); |
-} |
- |
- |
-void PrettyPrinter::VisitProperty(Property* node) { |
- Expression* key = node->key(); |
- Literal* literal = key->AsLiteral(); |
- if (literal != NULL && literal->value()->IsInternalizedString()) { |
- Print("("); |
- Visit(node->obj()); |
- Print(")."); |
- PrintLiteral(literal->value(), false); |
- } else { |
- Visit(node->obj()); |
- Print("["); |
- Visit(key); |
- Print("]"); |
- } |
-} |
- |
- |
-void PrettyPrinter::VisitCall(Call* node) { |
- Visit(node->expression()); |
- PrintArguments(node->arguments()); |
-} |
- |
- |
-void PrettyPrinter::VisitCallNew(CallNew* node) { |
- Print("new ("); |
- Visit(node->expression()); |
- Print(")"); |
- PrintArguments(node->arguments()); |
-} |
- |
- |
-void PrettyPrinter::VisitCallRuntime(CallRuntime* node) { |
- Print("%%%s\n", node->debug_name()); |
- PrintArguments(node->arguments()); |
-} |
- |
- |
-void PrettyPrinter::VisitUnaryOperation(UnaryOperation* node) { |
- Token::Value op = node->op(); |
- bool needsSpace = |
- op == Token::DELETE || op == Token::TYPEOF || op == Token::VOID; |
- Print("(%s%s", Token::String(op), needsSpace ? " " : ""); |
- Visit(node->expression()); |
- Print(")"); |
-} |
- |
- |
-void PrettyPrinter::VisitCountOperation(CountOperation* node) { |
- Print("("); |
- if (node->is_prefix()) Print("%s", Token::String(node->op())); |
- Visit(node->expression()); |
- if (node->is_postfix()) Print("%s", Token::String(node->op())); |
- Print(")"); |
-} |
- |
- |
-void PrettyPrinter::VisitBinaryOperation(BinaryOperation* node) { |
- Print("("); |
- Visit(node->left()); |
- Print(" %s ", Token::String(node->op())); |
- Visit(node->right()); |
- Print(")"); |
-} |
- |
- |
-void PrettyPrinter::VisitCompareOperation(CompareOperation* node) { |
- Print("("); |
- Visit(node->left()); |
- Print(" %s ", Token::String(node->op())); |
- Visit(node->right()); |
- Print(")"); |
-} |
- |
- |
-void PrettyPrinter::VisitSpread(Spread* node) { |
- Print("(..."); |
- Visit(node->expression()); |
- Print(")"); |
-} |
- |
- |
-void PrettyPrinter::VisitEmptyParentheses(EmptyParentheses* node) { |
- Print("()"); |
-} |
- |
- |
-void PrettyPrinter::VisitThisFunction(ThisFunction* node) { |
- Print("<this-function>"); |
-} |
- |
- |
-void PrettyPrinter::VisitSuperPropertyReference(SuperPropertyReference* node) { |
- Print("<super-property-reference>"); |
-} |
- |
- |
-void PrettyPrinter::VisitSuperCallReference(SuperCallReference* node) { |
- Print("<super-call-reference>"); |
-} |
- |
- |
-const char* PrettyPrinter::Print(AstNode* node) { |
- Init(); |
- Visit(node); |
- return output_; |
-} |
- |
- |
-const char* PrettyPrinter::PrintExpression(FunctionLiteral* program) { |
- Init(); |
- ExpressionStatement* statement = |
- program->body()->at(0)->AsExpressionStatement(); |
- Visit(statement->expression()); |
- return output_; |
-} |
- |
- |
-const char* PrettyPrinter::PrintProgram(FunctionLiteral* program) { |
- Init(); |
- PrintStatements(program->body()); |
- Print("\n"); |
- return output_; |
-} |
- |
- |
-void PrettyPrinter::PrintOut(Isolate* isolate, AstNode* node) { |
- PrettyPrinter printer(isolate); |
- PrintF("%s\n", printer.Print(node)); |
-} |
- |
- |
-void PrettyPrinter::Init() { |
- if (size_ == 0) { |
- DCHECK(output_ == NULL); |
- const int initial_size = 256; |
- output_ = NewArray<char>(initial_size); |
- size_ = initial_size; |
- } |
- output_[0] = '\0'; |
- pos_ = 0; |
-} |
- |
- |
-void PrettyPrinter::Print(const char* format, ...) { |
- for (;;) { |
- va_list arguments; |
- va_start(arguments, format); |
- int n = VSNPrintF(Vector<char>(output_, size_) + pos_, |
- format, |
- arguments); |
- va_end(arguments); |
- |
- if (n >= 0) { |
- // there was enough space - we are done |
- pos_ += n; |
- return; |
- } else { |
- // there was not enough space - allocate more and try again |
- const int slack = 32; |
- int new_size = size_ + (size_ >> 1) + slack; |
- char* new_output = NewArray<char>(new_size); |
- MemCopy(new_output, output_, pos_); |
- DeleteArray(output_); |
- output_ = new_output; |
- size_ = new_size; |
- } |
- } |
-} |
- |
- |
-void PrettyPrinter::PrintStatements(ZoneList<Statement*>* statements) { |
- if (statements == NULL) return; |
- for (int i = 0; i < statements->length(); i++) { |
- if (i != 0) Print(" "); |
- Visit(statements->at(i)); |
- } |
-} |
- |
- |
-void PrettyPrinter::PrintLabels(ZoneList<const AstRawString*>* labels) { |
- if (labels != NULL) { |
- for (int i = 0; i < labels->length(); i++) { |
- PrintLiteral(labels->at(i), false); |
- Print(": "); |
- } |
- } |
-} |
- |
- |
-void PrettyPrinter::PrintArguments(ZoneList<Expression*>* arguments) { |
- Print("("); |
- for (int i = 0; i < arguments->length(); i++) { |
- if (i != 0) Print(", "); |
- Visit(arguments->at(i)); |
- } |
- Print(")"); |
-} |
- |
- |
-void PrettyPrinter::PrintLiteral(Handle<Object> value, bool quote) { |
- Object* object = *value; |
- if (object->IsString()) { |
- String* string = String::cast(object); |
- if (quote) Print("\""); |
- for (int i = 0; i < string->length(); i++) { |
- Print("%c", string->Get(i)); |
- } |
- if (quote) Print("\""); |
- } else if (object->IsNull()) { |
- Print("null"); |
- } else if (object->IsTrue()) { |
- Print("true"); |
- } else if (object->IsFalse()) { |
- Print("false"); |
- } else if (object->IsUndefined()) { |
- Print("undefined"); |
- } else if (object->IsNumber()) { |
- Print("%g", object->Number()); |
- } else if (object->IsJSObject()) { |
- // regular expression |
- if (object->IsJSFunction()) { |
- Print("JS-Function"); |
- } else if (object->IsJSArray()) { |
- Print("JS-array[%u]", JSArray::cast(object)->length()); |
- } else if (object->IsJSObject()) { |
- Print("JS-Object"); |
- } else { |
- Print("?UNKNOWN?"); |
- } |
- } else if (object->IsFixedArray()) { |
- Print("FixedArray"); |
- } else { |
- Print("<unknown literal %p>", object); |
- } |
-} |
- |
- |
-void PrettyPrinter::PrintLiteral(const AstRawString* value, bool quote) { |
- PrintLiteral(value->string(), quote); |
-} |
- |
- |
-void PrettyPrinter::PrintParameters(Scope* scope) { |
- Print("("); |
- for (int i = 0; i < scope->num_parameters(); i++) { |
- if (i > 0) Print(", "); |
- PrintLiteral(scope->parameter(i)->name(), false); |
- } |
- Print(")"); |
-} |
- |
- |
-void PrettyPrinter::PrintDeclarations(ZoneList<Declaration*>* declarations) { |
- for (int i = 0; i < declarations->length(); i++) { |
- if (i > 0) Print(" "); |
- Visit(declarations->at(i)); |
- } |
-} |
- |
- |
-void PrettyPrinter::PrintFunctionLiteral(FunctionLiteral* function) { |
- Print("function "); |
- PrintLiteral(function->name(), false); |
- PrintParameters(function->scope()); |
- Print(" { "); |
- PrintDeclarations(function->scope()->declarations()); |
- PrintStatements(function->body()); |
- Print(" }"); |
-} |
- |
- |
-//----------------------------------------------------------------------------- |
- |
-class IndentedScope BASE_EMBEDDED { |
- public: |
- IndentedScope(AstPrinter* printer, const char* txt) |
- : ast_printer_(printer) { |
- ast_printer_->PrintIndented(txt); |
- ast_printer_->Print("\n"); |
- ast_printer_->inc_indent(); |
- } |
- |
- IndentedScope(AstPrinter* printer, const char* txt, int pos) |
- : ast_printer_(printer) { |
- ast_printer_->PrintIndented(txt); |
- ast_printer_->Print(" at %d\n", pos); |
- ast_printer_->inc_indent(); |
- } |
- |
- virtual ~IndentedScope() { |
- ast_printer_->dec_indent(); |
- } |
- |
- private: |
- AstPrinter* ast_printer_; |
-}; |
- |
- |
-//----------------------------------------------------------------------------- |
- |
- |
-AstPrinter::AstPrinter(Isolate* isolate) : PrettyPrinter(isolate), indent_(0) {} |
- |
- |
-AstPrinter::~AstPrinter() { |
- DCHECK(indent_ == 0); |
-} |
- |
- |
-void AstPrinter::PrintIndented(const char* txt) { |
- for (int i = 0; i < indent_; i++) { |
- Print(". "); |
- } |
- Print(txt); |
-} |
- |
- |
-void AstPrinter::PrintLiteralIndented(const char* info, |
- Handle<Object> value, |
- bool quote) { |
- PrintIndented(info); |
- Print(" "); |
- PrintLiteral(value, quote); |
- Print("\n"); |
-} |
- |
- |
-void AstPrinter::PrintLiteralWithModeIndented(const char* info, |
- Variable* var, |
- Handle<Object> value) { |
- if (var == NULL) { |
- PrintLiteralIndented(info, value, true); |
- } else { |
- EmbeddedVector<char, 256> buf; |
- int pos = SNPrintF(buf, "%s (mode = %s", info, |
- Variable::Mode2String(var->mode())); |
- SNPrintF(buf + pos, ")"); |
- PrintLiteralIndented(buf.start(), value, true); |
- } |
-} |
- |
- |
-void AstPrinter::PrintLabelsIndented(ZoneList<const AstRawString*>* labels) { |
- if (labels == NULL || labels->length() == 0) return; |
- PrintIndented("LABELS "); |
- PrintLabels(labels); |
- Print("\n"); |
-} |
- |
- |
-void AstPrinter::PrintIndentedVisit(const char* s, AstNode* node) { |
- IndentedScope indent(this, s, node->position()); |
- Visit(node); |
-} |
- |
- |
-const char* AstPrinter::PrintProgram(FunctionLiteral* program) { |
- Init(); |
- { IndentedScope indent(this, "FUNC", program->position()); |
- PrintLiteralIndented("NAME", program->name(), true); |
- PrintLiteralIndented("INFERRED NAME", program->inferred_name(), true); |
- PrintParameters(program->scope()); |
- PrintDeclarations(program->scope()->declarations()); |
- PrintStatements(program->body()); |
- } |
- return Output(); |
-} |
- |
- |
-void AstPrinter::PrintDeclarations(ZoneList<Declaration*>* declarations) { |
- if (declarations->length() > 0) { |
- IndentedScope indent(this, "DECLS"); |
- for (int i = 0; i < declarations->length(); i++) { |
- Visit(declarations->at(i)); |
- } |
- } |
-} |
- |
- |
-void AstPrinter::PrintParameters(Scope* scope) { |
- if (scope->num_parameters() > 0) { |
- IndentedScope indent(this, "PARAMS"); |
- for (int i = 0; i < scope->num_parameters(); i++) { |
- PrintLiteralWithModeIndented("VAR", scope->parameter(i), |
- scope->parameter(i)->name()); |
- } |
- } |
-} |
- |
- |
-void AstPrinter::PrintStatements(ZoneList<Statement*>* statements) { |
- for (int i = 0; i < statements->length(); i++) { |
- Visit(statements->at(i)); |
- } |
-} |
- |
- |
-void AstPrinter::PrintArguments(ZoneList<Expression*>* arguments) { |
- for (int i = 0; i < arguments->length(); i++) { |
- Visit(arguments->at(i)); |
- } |
-} |
- |
- |
-void AstPrinter::VisitBlock(Block* node) { |
- const char* block_txt = |
- node->ignore_completion_value() ? "BLOCK NOCOMPLETIONS" : "BLOCK"; |
- IndentedScope indent(this, block_txt, node->position()); |
- PrintStatements(node->statements()); |
-} |
- |
- |
-// TODO(svenpanne) Start with IndentedScope. |
-void AstPrinter::VisitVariableDeclaration(VariableDeclaration* node) { |
- PrintLiteralWithModeIndented(Variable::Mode2String(node->mode()), |
- node->proxy()->var(), |
- node->proxy()->name()); |
-} |
- |
- |
-// TODO(svenpanne) Start with IndentedScope. |
-void AstPrinter::VisitFunctionDeclaration(FunctionDeclaration* node) { |
- PrintIndented("FUNCTION "); |
- PrintLiteral(node->proxy()->name(), true); |
- Print(" = function "); |
- PrintLiteral(node->fun()->name(), false); |
- Print("\n"); |
-} |
- |
- |
-void AstPrinter::VisitImportDeclaration(ImportDeclaration* node) { |
- IndentedScope indent(this, "IMPORT", node->position()); |
- PrintLiteralIndented("NAME", node->proxy()->name(), true); |
- PrintLiteralIndented("FROM", node->module_specifier()->string(), true); |
-} |
- |
- |
-void AstPrinter::VisitExportDeclaration(ExportDeclaration* node) { |
- IndentedScope indent(this, "EXPORT", node->position()); |
- PrintLiteral(node->proxy()->name(), true); |
-} |
- |
- |
-void AstPrinter::VisitExpressionStatement(ExpressionStatement* node) { |
- IndentedScope indent(this, "EXPRESSION STATEMENT", node->position()); |
- Visit(node->expression()); |
-} |
- |
- |
-void AstPrinter::VisitEmptyStatement(EmptyStatement* node) { |
- IndentedScope indent(this, "EMPTY", node->position()); |
-} |
- |
- |
-void AstPrinter::VisitSloppyBlockFunctionStatement( |
- SloppyBlockFunctionStatement* node) { |
- Visit(node->statement()); |
-} |
- |
- |
-void AstPrinter::VisitIfStatement(IfStatement* node) { |
- IndentedScope indent(this, "IF", node->position()); |
- PrintIndentedVisit("CONDITION", node->condition()); |
- PrintIndentedVisit("THEN", node->then_statement()); |
- if (node->HasElseStatement()) { |
- PrintIndentedVisit("ELSE", node->else_statement()); |
- } |
-} |
- |
- |
-void AstPrinter::VisitContinueStatement(ContinueStatement* node) { |
- IndentedScope indent(this, "CONTINUE", node->position()); |
- PrintLabelsIndented(node->target()->labels()); |
-} |
- |
- |
-void AstPrinter::VisitBreakStatement(BreakStatement* node) { |
- IndentedScope indent(this, "BREAK", node->position()); |
- PrintLabelsIndented(node->target()->labels()); |
-} |
- |
- |
-void AstPrinter::VisitReturnStatement(ReturnStatement* node) { |
- IndentedScope indent(this, "RETURN", node->position()); |
- Visit(node->expression()); |
-} |
- |
- |
-void AstPrinter::VisitWithStatement(WithStatement* node) { |
- IndentedScope indent(this, "WITH", node->position()); |
- PrintIndentedVisit("OBJECT", node->expression()); |
- PrintIndentedVisit("BODY", node->statement()); |
-} |
- |
- |
-void AstPrinter::VisitSwitchStatement(SwitchStatement* node) { |
- IndentedScope indent(this, "SWITCH", node->position()); |
- PrintLabelsIndented(node->labels()); |
- PrintIndentedVisit("TAG", node->tag()); |
- for (int i = 0; i < node->cases()->length(); i++) { |
- Visit(node->cases()->at(i)); |
- } |
-} |
- |
- |
-void AstPrinter::VisitCaseClause(CaseClause* clause) { |
- if (clause->is_default()) { |
- IndentedScope indent(this, "DEFAULT", clause->position()); |
- PrintStatements(clause->statements()); |
- } else { |
- IndentedScope indent(this, "CASE", clause->position()); |
- Visit(clause->label()); |
- PrintStatements(clause->statements()); |
- } |
-} |
- |
- |
-void AstPrinter::VisitDoWhileStatement(DoWhileStatement* node) { |
- IndentedScope indent(this, "DO", node->position()); |
- PrintLabelsIndented(node->labels()); |
- PrintIndentedVisit("BODY", node->body()); |
- PrintIndentedVisit("COND", node->cond()); |
-} |
- |
- |
-void AstPrinter::VisitWhileStatement(WhileStatement* node) { |
- IndentedScope indent(this, "WHILE", node->position()); |
- PrintLabelsIndented(node->labels()); |
- PrintIndentedVisit("COND", node->cond()); |
- PrintIndentedVisit("BODY", node->body()); |
-} |
- |
- |
-void AstPrinter::VisitForStatement(ForStatement* node) { |
- IndentedScope indent(this, "FOR", node->position()); |
- PrintLabelsIndented(node->labels()); |
- if (node->init()) PrintIndentedVisit("INIT", node->init()); |
- if (node->cond()) PrintIndentedVisit("COND", node->cond()); |
- PrintIndentedVisit("BODY", node->body()); |
- if (node->next()) PrintIndentedVisit("NEXT", node->next()); |
-} |
- |
- |
-void AstPrinter::VisitForInStatement(ForInStatement* node) { |
- IndentedScope indent(this, "FOR IN", node->position()); |
- PrintIndentedVisit("FOR", node->each()); |
- PrintIndentedVisit("IN", node->enumerable()); |
- PrintIndentedVisit("BODY", node->body()); |
-} |
- |
- |
-void AstPrinter::VisitForOfStatement(ForOfStatement* node) { |
- IndentedScope indent(this, "FOR OF", node->position()); |
- PrintIndentedVisit("FOR", node->each()); |
- PrintIndentedVisit("OF", node->iterable()); |
- PrintIndentedVisit("BODY", node->body()); |
-} |
- |
- |
-void AstPrinter::VisitTryCatchStatement(TryCatchStatement* node) { |
- IndentedScope indent(this, "TRY CATCH", node->position()); |
- PrintIndentedVisit("TRY", node->try_block()); |
- PrintLiteralWithModeIndented("CATCHVAR", |
- node->variable(), |
- node->variable()->name()); |
- PrintIndentedVisit("CATCH", node->catch_block()); |
-} |
- |
- |
-void AstPrinter::VisitTryFinallyStatement(TryFinallyStatement* node) { |
- IndentedScope indent(this, "TRY FINALLY", node->position()); |
- PrintIndentedVisit("TRY", node->try_block()); |
- PrintIndentedVisit("FINALLY", node->finally_block()); |
-} |
- |
- |
-void AstPrinter::VisitDebuggerStatement(DebuggerStatement* node) { |
- IndentedScope indent(this, "DEBUGGER", node->position()); |
-} |
- |
- |
-void AstPrinter::VisitFunctionLiteral(FunctionLiteral* node) { |
- IndentedScope indent(this, "FUNC LITERAL", node->position()); |
- PrintLiteralIndented("NAME", node->name(), false); |
- PrintLiteralIndented("INFERRED NAME", node->inferred_name(), false); |
- PrintParameters(node->scope()); |
- // We don't want to see the function literal in this case: it |
- // will be printed via PrintProgram when the code for it is |
- // generated. |
- // PrintStatements(node->body()); |
-} |
- |
- |
-void AstPrinter::VisitClassLiteral(ClassLiteral* node) { |
- IndentedScope indent(this, "CLASS LITERAL", node->position()); |
- if (node->raw_name() != nullptr) { |
- PrintLiteralIndented("NAME", node->name(), false); |
- } |
- if (node->extends() != nullptr) { |
- PrintIndentedVisit("EXTENDS", node->extends()); |
- } |
- PrintProperties(node->properties()); |
-} |
- |
- |
-void AstPrinter::PrintProperties( |
- ZoneList<ObjectLiteral::Property*>* properties) { |
- for (int i = 0; i < properties->length(); i++) { |
- ObjectLiteral::Property* property = properties->at(i); |
- const char* prop_kind = nullptr; |
- switch (property->kind()) { |
- case ObjectLiteral::Property::CONSTANT: |
- prop_kind = "CONSTANT"; |
- break; |
- case ObjectLiteral::Property::COMPUTED: |
- prop_kind = "COMPUTED"; |
- break; |
- case ObjectLiteral::Property::MATERIALIZED_LITERAL: |
- prop_kind = "MATERIALIZED_LITERAL"; |
- break; |
- case ObjectLiteral::Property::PROTOTYPE: |
- prop_kind = "PROTOTYPE"; |
- break; |
- case ObjectLiteral::Property::GETTER: |
- prop_kind = "GETTER"; |
- break; |
- case ObjectLiteral::Property::SETTER: |
- prop_kind = "SETTER"; |
- break; |
- } |
- EmbeddedVector<char, 128> buf; |
- SNPrintF(buf, "PROPERTY%s - %s", property->is_static() ? " - STATIC" : "", |
- prop_kind); |
- IndentedScope prop(this, buf.start()); |
- PrintIndentedVisit("KEY", properties->at(i)->key()); |
- PrintIndentedVisit("VALUE", properties->at(i)->value()); |
- } |
-} |
- |
- |
-void AstPrinter::VisitNativeFunctionLiteral(NativeFunctionLiteral* node) { |
- IndentedScope indent(this, "NATIVE FUNC LITERAL", node->position()); |
- PrintLiteralIndented("NAME", node->name(), false); |
-} |
- |
- |
-void AstPrinter::VisitDoExpression(DoExpression* node) { |
- IndentedScope indent(this, "DO EXPRESSION", node->position()); |
- PrintStatements(node->block()->statements()); |
-} |
- |
- |
-void AstPrinter::VisitConditional(Conditional* node) { |
- IndentedScope indent(this, "CONDITIONAL", node->position()); |
- PrintIndentedVisit("CONDITION", node->condition()); |
- PrintIndentedVisit("THEN", node->then_expression()); |
- PrintIndentedVisit("ELSE", node->else_expression()); |
-} |
- |
- |
-// TODO(svenpanne) Start with IndentedScope. |
-void AstPrinter::VisitLiteral(Literal* node) { |
- PrintLiteralIndented("LITERAL", node->value(), true); |
-} |
- |
- |
-void AstPrinter::VisitRegExpLiteral(RegExpLiteral* node) { |
- IndentedScope indent(this, "REGEXP LITERAL", node->position()); |
- EmbeddedVector<char, 128> buf; |
- SNPrintF(buf, "literal_index = %d\n", node->literal_index()); |
- PrintIndented(buf.start()); |
- PrintLiteralIndented("PATTERN", node->pattern(), false); |
- int i = 0; |
- if (node->flags() & RegExp::kGlobal) buf[i++] = 'g'; |
- if (node->flags() & RegExp::kIgnoreCase) buf[i++] = 'i'; |
- if (node->flags() & RegExp::kMultiline) buf[i++] = 'm'; |
- if (node->flags() & RegExp::kUnicode) buf[i++] = 'u'; |
- if (node->flags() & RegExp::kSticky) buf[i++] = 'y'; |
- buf[i] = '\0'; |
- PrintIndented("FLAGS "); |
- Print(buf.start()); |
- Print("\n"); |
-} |
- |
- |
-void AstPrinter::VisitObjectLiteral(ObjectLiteral* node) { |
- IndentedScope indent(this, "OBJ LITERAL", node->position()); |
- EmbeddedVector<char, 128> buf; |
- SNPrintF(buf, "literal_index = %d\n", node->literal_index()); |
- PrintIndented(buf.start()); |
- PrintProperties(node->properties()); |
-} |
- |
- |
-void AstPrinter::VisitArrayLiteral(ArrayLiteral* node) { |
- IndentedScope indent(this, "ARRAY LITERAL", node->position()); |
- |
- EmbeddedVector<char, 128> buf; |
- SNPrintF(buf, "literal_index = %d\n", node->literal_index()); |
- PrintIndented(buf.start()); |
- if (node->values()->length() > 0) { |
- IndentedScope indent(this, "VALUES", node->position()); |
- for (int i = 0; i < node->values()->length(); i++) { |
- Visit(node->values()->at(i)); |
- } |
- } |
-} |
- |
- |
-void AstPrinter::VisitVariableProxy(VariableProxy* node) { |
- Variable* var = node->var(); |
- EmbeddedVector<char, 128> buf; |
- int pos = |
- FormatSlotNode(&buf, node, "VAR PROXY", node->VariableFeedbackSlot()); |
- |
- switch (var->location()) { |
- case VariableLocation::UNALLOCATED: |
- break; |
- case VariableLocation::PARAMETER: |
- SNPrintF(buf + pos, " parameter[%d]", var->index()); |
- break; |
- case VariableLocation::LOCAL: |
- SNPrintF(buf + pos, " local[%d]", var->index()); |
- break; |
- case VariableLocation::CONTEXT: |
- SNPrintF(buf + pos, " context[%d]", var->index()); |
- break; |
- case VariableLocation::GLOBAL: |
- SNPrintF(buf + pos, " global[%d]", var->index()); |
- break; |
- case VariableLocation::LOOKUP: |
- SNPrintF(buf + pos, " lookup"); |
- break; |
- } |
- PrintLiteralWithModeIndented(buf.start(), var, node->name()); |
-} |
- |
- |
-void AstPrinter::VisitAssignment(Assignment* node) { |
- IndentedScope indent(this, Token::Name(node->op()), node->position()); |
- Visit(node->target()); |
- Visit(node->value()); |
-} |
- |
- |
-void AstPrinter::VisitYield(Yield* node) { |
- IndentedScope indent(this, "YIELD", node->position()); |
- Visit(node->expression()); |
-} |
- |
- |
-void AstPrinter::VisitThrow(Throw* node) { |
- IndentedScope indent(this, "THROW", node->position()); |
- Visit(node->exception()); |
-} |
- |
- |
-void AstPrinter::VisitProperty(Property* node) { |
- EmbeddedVector<char, 128> buf; |
- FormatSlotNode(&buf, node, "PROPERTY", node->PropertyFeedbackSlot()); |
- IndentedScope indent(this, buf.start(), node->position()); |
- |
- Visit(node->obj()); |
- Literal* literal = node->key()->AsLiteral(); |
- if (literal != NULL && literal->value()->IsInternalizedString()) { |
- PrintLiteralIndented("NAME", literal->value(), false); |
- } else { |
- PrintIndentedVisit("KEY", node->key()); |
- } |
-} |
- |
- |
-void AstPrinter::VisitCall(Call* node) { |
- EmbeddedVector<char, 128> buf; |
- FormatSlotNode(&buf, node, "CALL", node->CallFeedbackICSlot()); |
- IndentedScope indent(this, buf.start()); |
- |
- Visit(node->expression()); |
- PrintArguments(node->arguments()); |
-} |
- |
- |
-void AstPrinter::VisitCallNew(CallNew* node) { |
- IndentedScope indent(this, "CALL NEW", node->position()); |
- Visit(node->expression()); |
- PrintArguments(node->arguments()); |
-} |
- |
- |
-void AstPrinter::VisitCallRuntime(CallRuntime* node) { |
- EmbeddedVector<char, 128> buf; |
- SNPrintF(buf, "CALL RUNTIME %s", node->debug_name()); |
- IndentedScope indent(this, buf.start(), node->position()); |
- PrintArguments(node->arguments()); |
-} |
- |
- |
-void AstPrinter::VisitUnaryOperation(UnaryOperation* node) { |
- IndentedScope indent(this, Token::Name(node->op()), node->position()); |
- Visit(node->expression()); |
-} |
- |
- |
-void AstPrinter::VisitCountOperation(CountOperation* node) { |
- EmbeddedVector<char, 128> buf; |
- SNPrintF(buf, "%s %s", (node->is_prefix() ? "PRE" : "POST"), |
- Token::Name(node->op())); |
- IndentedScope indent(this, buf.start(), node->position()); |
- Visit(node->expression()); |
-} |
- |
- |
-void AstPrinter::VisitBinaryOperation(BinaryOperation* node) { |
- IndentedScope indent(this, Token::Name(node->op()), node->position()); |
- Visit(node->left()); |
- Visit(node->right()); |
-} |
- |
- |
-void AstPrinter::VisitCompareOperation(CompareOperation* node) { |
- IndentedScope indent(this, Token::Name(node->op()), node->position()); |
- Visit(node->left()); |
- Visit(node->right()); |
-} |
- |
- |
-void AstPrinter::VisitSpread(Spread* node) { |
- IndentedScope indent(this, "...", node->position()); |
- Visit(node->expression()); |
-} |
- |
- |
-void AstPrinter::VisitEmptyParentheses(EmptyParentheses* node) { |
- IndentedScope indent(this, "()", node->position()); |
-} |
- |
- |
-void AstPrinter::VisitThisFunction(ThisFunction* node) { |
- IndentedScope indent(this, "THIS-FUNCTION", node->position()); |
-} |
- |
- |
-void AstPrinter::VisitSuperPropertyReference(SuperPropertyReference* node) { |
- IndentedScope indent(this, "SUPER-PROPERTY-REFERENCE", node->position()); |
-} |
- |
- |
-void AstPrinter::VisitSuperCallReference(SuperCallReference* node) { |
- IndentedScope indent(this, "SUPER-CALL-REFERENCE", node->position()); |
-} |
- |
- |
-#endif // DEBUG |
- |
-} // namespace internal |
-} // namespace v8 |