⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 prettyprinter.cc.svn-base

📁 Google浏览器V8内核代码
💻 SVN-BASE
📖 第 1 页 / 共 2 页
字号:
      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 + -