1 // Copyright 2012 the V8 project authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef V8_PRETTYPRINTER_H_ 6 #define V8_PRETTYPRINTER_H_ 7 8 #include "src/allocation.h" 9 #include "src/ast.h" 10 11 namespace v8 { 12 namespace internal { 13 14 #ifdef DEBUG 15 16 class PrettyPrinter: public AstVisitor { 17 public: 18 explicit PrettyPrinter(Zone* zone); 19 virtual ~PrettyPrinter(); 20 21 // The following routines print a node into a string. 22 // The result string is alive as long as the PrettyPrinter is alive. 23 const char* Print(AstNode* node); 24 const char* PrintExpression(FunctionLiteral* program); 25 const char* PrintProgram(FunctionLiteral* program); 26 27 void Print(const char* format, ...); 28 29 // Print a node to stdout. 30 static void PrintOut(Zone* zone, AstNode* node); 31 32 // Individual nodes 33 #define DECLARE_VISIT(type) virtual void Visit##type(type* node); 34 AST_NODE_LIST(DECLARE_VISIT) 35 #undef DECLARE_VISIT 36 37 private: 38 char* output_; // output string buffer 39 int size_; // output_ size 40 int pos_; // current printing position 41 42 protected: 43 void Init(); Output()44 const char* Output() const { return output_; } 45 46 virtual void PrintStatements(ZoneList<Statement*>* statements); 47 void PrintLabels(ZoneStringList* labels); 48 virtual void PrintArguments(ZoneList<Expression*>* arguments); 49 void PrintLiteral(Handle<Object> value, bool quote); 50 void PrintParameters(Scope* scope); 51 void PrintDeclarations(ZoneList<Declaration*>* declarations); 52 void PrintFunctionLiteral(FunctionLiteral* function); 53 void PrintCaseClause(CaseClause* clause); 54 55 DEFINE_AST_VISITOR_SUBCLASS_MEMBERS(); 56 }; 57 58 59 // Prints the AST structure 60 class AstPrinter: public PrettyPrinter { 61 public: 62 explicit AstPrinter(Zone* zone); 63 virtual ~AstPrinter(); 64 65 const char* PrintProgram(FunctionLiteral* program); 66 67 // Individual nodes 68 #define DECLARE_VISIT(type) virtual void Visit##type(type* node); 69 AST_NODE_LIST(DECLARE_VISIT) 70 #undef DECLARE_VISIT 71 72 private: 73 friend class IndentedScope; 74 void PrintIndented(const char* txt); 75 void PrintIndentedVisit(const char* s, AstNode* node); 76 77 void PrintStatements(ZoneList<Statement*>* statements); 78 void PrintDeclarations(ZoneList<Declaration*>* declarations); 79 void PrintParameters(Scope* scope); 80 void PrintArguments(ZoneList<Expression*>* arguments); 81 void PrintCaseClause(CaseClause* clause); 82 void PrintLiteralIndented(const char* info, Handle<Object> value, bool quote); 83 void PrintLiteralWithModeIndented(const char* info, 84 Variable* var, 85 Handle<Object> value); 86 void PrintLabelsIndented(ZoneStringList* labels); 87 inc_indent()88 void inc_indent() { indent_++; } dec_indent()89 void dec_indent() { indent_--; } 90 91 int indent_; 92 }; 93 94 #endif // DEBUG 95 96 } } // namespace v8::internal 97 98 #endif // V8_PRETTYPRINTER_H_ 99