📄 prettyprinter.cc.svn-base
字号:
Print("JS-Object"); } else { Print("?UNKNOWN?"); } } else if (object->IsFixedArray()) { Print("FixedArray"); } else { Print("<unknown literal %p>", object); }}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(" }");}void PrettyPrinter::PrintCaseClause(CaseClause* clause) { if (clause->is_default()) { Print("default"); } else { Print("case "); Visit(clause->label()); } Print(": "); PrintStatements(clause->statements()); if (clause->statements()->length() > 0) Print(" ");}//-----------------------------------------------------------------------------class IndentedScope BASE_EMBEDDED { public: IndentedScope() { ast_printer_->inc_indent(); } explicit IndentedScope(const char* txt) { ast_printer_->PrintIndented(txt); ast_printer_->Print("\n"); ast_printer_->inc_indent(); } virtual ~IndentedScope() { ast_printer_->dec_indent(); } static void SetAstPrinter(AstPrinter* a) { ast_printer_ = a; } private: static AstPrinter* ast_printer_;};AstPrinter* IndentedScope::ast_printer_ = NULL;//-----------------------------------------------------------------------------int AstPrinter::indent_ = 0;AstPrinter::AstPrinter() { ASSERT(indent_ == 0); IndentedScope::SetAstPrinter(this);}AstPrinter::~AstPrinter() { ASSERT(indent_ == 0); IndentedScope::SetAstPrinter(NULL);}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; OS::SNPrintF(buf, "%s (mode = %s)", info, Variable::Mode2String(var->mode())); PrintLiteralIndented(buf.start(), value, true); }}void AstPrinter::PrintLabelsIndented(const char* info, ZoneStringList* labels) { if (labels != NULL && labels->length() > 0) { if (info == NULL) { PrintIndented("LABELS "); } else { PrintIndented(info); Print(" "); } PrintLabels(labels); Print("\n"); } else if (info != NULL) { PrintIndented(info); }}void AstPrinter::PrintIndentedVisit(const char* s, Node* node) { IndentedScope indent(s); Visit(node);}const char* AstPrinter::PrintProgram(FunctionLiteral* program) { Init(); { IndentedScope indent("FUNC"); PrintLiteralIndented("NAME", program->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("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("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::PrintCaseClause(CaseClause* clause) { if (clause->is_default()) { IndentedScope indent("DEFAULT"); PrintStatements(clause->statements()); } else { IndentedScope indent("CASE"); Visit(clause->label()); PrintStatements(clause->statements()); }}void AstPrinter::VisitBlock(Block* node) { const char* block_txt = node->is_initializer_block() ? "BLOCK INIT" : "BLOCK"; IndentedScope indent(block_txt); PrintStatements(node->statements());}void AstPrinter::VisitDeclaration(Declaration* node) { if (node->fun() == NULL) { // var or const declarations PrintLiteralWithModeIndented( Variable::Mode2String(node->mode()), node->proxy()->AsVariable(), node->proxy()->name()); } else { // function declarations PrintIndented("FUNCTION "); PrintLiteral(node->proxy()->name(), true); Print(" = function "); PrintLiteral(node->fun()->name(), false); Print("\n"); }}void AstPrinter::VisitExpressionStatement(ExpressionStatement* node) { Visit(node->expression());}void AstPrinter::VisitEmptyStatement(EmptyStatement* node) { PrintIndented("EMPTY\n");}void AstPrinter::VisitIfStatement(IfStatement* node) { PrintIndentedVisit("IF", node->condition()); PrintIndentedVisit("THEN", node->then_statement()); if (node->HasElseStatement()) { PrintIndentedVisit("ELSE", node->else_statement()); }}void AstPrinter::VisitContinueStatement(ContinueStatement* node) { PrintLabelsIndented("CONTINUE", node->target()->labels());}void AstPrinter::VisitBreakStatement(BreakStatement* node) { PrintLabelsIndented("BREAK", node->target()->labels());}void AstPrinter::VisitReturnStatement(ReturnStatement* node) { PrintIndentedVisit("RETURN", node->expression());}void AstPrinter::VisitWithEnterStatement(WithEnterStatement* node) { PrintIndentedVisit("WITH ENTER", node->expression());}void AstPrinter::VisitWithExitStatement(WithExitStatement* node) { PrintIndented("WITH EXIT\n");}void AstPrinter::VisitSwitchStatement(SwitchStatement* node) { IndentedScope indent("SWITCH"); PrintLabelsIndented(NULL, node->labels()); PrintIndentedVisit("TAG", node->tag()); for (int i = 0; i < node->cases()->length(); i++) { PrintCaseClause(node->cases()->at(i)); }}void AstPrinter::VisitLoopStatement(LoopStatement* node) { IndentedScope indent(node->OperatorString()); PrintLabelsIndented(NULL, node->labels()); if (node->init()) PrintIndentedVisit("INIT", node->init()); if (node->cond()) PrintIndentedVisit("COND", node->cond()); if (node->body()) PrintIndentedVisit("BODY", node->body()); if (node->next()) PrintIndentedVisit("NEXT", node->next());}void AstPrinter::VisitForInStatement(ForInStatement* node) { IndentedScope indent("FOR IN"); PrintIndentedVisit("FOR", node->each()); PrintIndentedVisit("IN", node->enumerable()); PrintIndentedVisit("BODY", node->body());}void AstPrinter::VisitTryCatch(TryCatch* node) { IndentedScope indent("TRY CATCH"); PrintIndentedVisit("TRY", node->try_block()); PrintIndentedVisit("CATCHVAR", node->catch_var()); PrintIndentedVisit("CATCH", node->catch_block());}void AstPrinter::VisitTryFinally(TryFinally* node) { IndentedScope indent("TRY FINALLY"); PrintIndentedVisit("TRY", node->try_block()); PrintIndentedVisit("FINALLY", node->finally_block());}void AstPrinter::VisitDebuggerStatement(DebuggerStatement* node) { IndentedScope indent("DEBUGGER");}void AstPrinter::VisitFunctionLiteral(FunctionLiteral* node) { IndentedScope indent("FUNC LITERAL"); PrintLiteralIndented("NAME", node->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::VisitFunctionBoilerplateLiteral( FunctionBoilerplateLiteral* node) { IndentedScope indent("FUNC LITERAL"); PrintLiteralIndented("BOILERPLATE", node->boilerplate(), true);}void AstPrinter::VisitConditional(Conditional* node) { IndentedScope indent("CONDITIONAL"); PrintIndentedVisit("?", node->condition()); PrintIndentedVisit("THEN", node->then_expression()); PrintIndentedVisit("ELSE", node->else_expression());}void AstPrinter::VisitLiteral(Literal* node) { PrintLiteralIndented("LITERAL", node->handle(), true);}void AstPrinter::VisitRegExpLiteral(RegExpLiteral* node) { IndentedScope indent("REGEXP LITERAL"); PrintLiteral(node->pattern(), false); Print(","); PrintLiteral(node->flags(), false);}void AstPrinter::VisitObjectLiteral(ObjectLiteral* node) { IndentedScope indent("OBJ LITERAL"); for (int i = 0; i < node->properties()->length(); i++) { const char* prop_kind = NULL; switch (node->properties()->at(i)->kind()) { case ObjectLiteral::Property::CONSTANT: prop_kind = "PROPERTY - CONSTANT"; break; case ObjectLiteral::Property::COMPUTED: prop_kind = "PROPERTY - COMPUTED"; break; case ObjectLiteral::Property::PROTOTYPE: prop_kind = "PROPERTY - PROTOTYPE"; break; case ObjectLiteral::Property::GETTER: prop_kind = "PROPERTY - GETTER"; break; case ObjectLiteral::Property::SETTER: prop_kind = "PROPERTY - SETTER"; break; default: UNREACHABLE(); break; } IndentedScope prop(prop_kind); PrintIndentedVisit("KEY", node->properties()->at(i)->key()); PrintIndentedVisit("VALUE", node->properties()->at(i)->value()); }}void AstPrinter::VisitArrayLiteral(ArrayLiteral* node) { IndentedScope indent("ARRAY LITERAL"); if (node->values()->length() > 0) { IndentedScope indent("VALUES"); for (int i = 0; i < node->values()->length(); i++) { Visit(node->values()->at(i)); } }}void AstPrinter::VisitSlot(Slot* node) { PrintIndented("SLOT "); switch (node->type()) { case Slot::PARAMETER: Print("parameter[%d]", node->index()); break; case Slot::LOCAL: Print("frame[%d]", node->index()); break; case Slot::CONTEXT: Print(".context[%d]", node->index()); break; case Slot::LOOKUP: Print(".context["); PrintLiteral(node->var()->name(), false); Print("]"); break; default: UNREACHABLE(); } Print("\n");}void AstPrinter::VisitVariableProxy(VariableProxy* node) { PrintLiteralWithModeIndented("VAR PROXY", node->AsVariable(), node->name()); Variable* var = node->var(); if (var != NULL && var->rewrite() != NULL) { IndentedScope indent; Visit(var->rewrite()); }}void AstPrinter::VisitAssignment(Assignment* node) { IndentedScope indent(Token::Name(node->op())); Visit(node->target()); Visit(node->value());}void AstPrinter::VisitThrow(Throw* node) { PrintIndentedVisit("THROW", node->exception());}void AstPrinter::VisitProperty(Property* node) { IndentedScope indent("PROPERTY"); Visit(node->obj()); Literal* literal = node->key()->AsLiteral(); if (literal != NULL && literal->handle()->IsSymbol()) { PrintLiteralIndented("LITERAL", literal->handle(), false); } else { PrintIndentedVisit("KEY", node->key()); }}void AstPrinter::VisitCall(Call* node) { IndentedScope indent("CALL"); Visit(node->expression()); PrintArguments(node->arguments());}void AstPrinter::VisitCallNew(CallNew* node) { IndentedScope indent("CALL NEW"); Visit(node->expression()); PrintArguments(node->arguments());}void AstPrinter::VisitCallRuntime(CallRuntime* node) { PrintLiteralIndented("CALL RUNTIME ", node->name(), false); IndentedScope indent; PrintArguments(node->arguments());}void AstPrinter::VisitUnaryOperation(UnaryOperation* node) { PrintIndentedVisit(Token::Name(node->op()), node->expression());}void AstPrinter::VisitCountOperation(CountOperation* node) { EmbeddedVector<char, 128> buf; OS::SNPrintF(buf, "%s %s", (node->is_prefix() ? "PRE" : "POST"), Token::Name(node->op())); PrintIndentedVisit(buf.start(), node->expression());}void AstPrinter::VisitBinaryOperation(BinaryOperation* node) { IndentedScope indent(Token::Name(node->op())); Visit(node->left()); Visit(node->right());}void AstPrinter::VisitCompareOperation(CompareOperation* node) { IndentedScope indent(Token::Name(node->op())); Visit(node->left()); Visit(node->right());}void AstPrinter::VisitThisFunction(ThisFunction* node) { IndentedScope indent("THIS-FUNCTION");}#endif // DEBUG} } // namespace v8::internal
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -