v8  3.14.5(node0.10.28)
V8 is Google's open source JavaScript engine
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
prettyprinter.h
Go to the documentation of this file.
1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are
4 // met:
5 //
6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided
11 // with the distribution.
12 // * Neither the name of Google Inc. nor the names of its
13 // contributors may be used to endorse or promote products derived
14 // from this software without specific prior written permission.
15 //
16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 
28 #ifndef V8_PRETTYPRINTER_H_
29 #define V8_PRETTYPRINTER_H_
30 
31 #include "allocation.h"
32 #include "ast.h"
33 
34 namespace v8 {
35 namespace internal {
36 
37 #ifdef DEBUG
38 
39 class PrettyPrinter: public AstVisitor {
40  public:
41  PrettyPrinter();
42  virtual ~PrettyPrinter();
43 
44  // The following routines print a node into a string.
45  // The result string is alive as long as the PrettyPrinter is alive.
46  const char* Print(AstNode* node);
47  const char* PrintExpression(FunctionLiteral* program);
48  const char* PrintProgram(FunctionLiteral* program);
49 
50  void Print(const char* format, ...);
51 
52  // Print a node to stdout.
53  static void PrintOut(AstNode* node);
54 
55  // Individual nodes
56 #define DECLARE_VISIT(type) virtual void Visit##type(type* node);
58 #undef DECLARE_VISIT
59 
60  private:
61  char* output_; // output string buffer
62  int size_; // output_ size
63  int pos_; // current printing position
64 
65  protected:
66  void Init();
67  const char* Output() const { return output_; }
68 
69  virtual void PrintStatements(ZoneList<Statement*>* statements);
70  void PrintLabels(ZoneStringList* labels);
71  virtual void PrintArguments(ZoneList<Expression*>* arguments);
72  void PrintLiteral(Handle<Object> value, bool quote);
73  void PrintParameters(Scope* scope);
74  void PrintDeclarations(ZoneList<Declaration*>* declarations);
75  void PrintFunctionLiteral(FunctionLiteral* function);
76  void PrintCaseClause(CaseClause* clause);
77 };
78 
79 
80 // Prints the AST structure
81 class AstPrinter: public PrettyPrinter {
82  public:
83  AstPrinter();
84  virtual ~AstPrinter();
85 
86  const char* PrintProgram(FunctionLiteral* program);
87 
88  // Individual nodes
89 #define DECLARE_VISIT(type) virtual void Visit##type(type* node);
91 #undef DECLARE_VISIT
92 
93  private:
94  friend class IndentedScope;
95  void PrintIndented(const char* txt);
96  void PrintIndentedVisit(const char* s, AstNode* node);
97 
98  void PrintStatements(ZoneList<Statement*>* statements);
99  void PrintDeclarations(ZoneList<Declaration*>* declarations);
100  void PrintParameters(Scope* scope);
101  void PrintArguments(ZoneList<Expression*>* arguments);
102  void PrintCaseClause(CaseClause* clause);
103  void PrintLiteralIndented(const char* info, Handle<Object> value, bool quote);
104  void PrintLiteralWithModeIndented(const char* info,
105  Variable* var,
106  Handle<Object> value);
107  void PrintLabelsIndented(const char* info, ZoneStringList* labels);
108 
109  void inc_indent() { indent_++; }
110  void dec_indent() { indent_--; }
111 
112  int indent_;
113 };
114 
115 #endif // DEBUG
116 
117 } } // namespace v8::internal
118 
119 #endif // V8_PRETTYPRINTER_H_
#define DECLARE_VISIT(type)
Definition: full-codegen.h:594
v8::Handle< v8::Value > Print(const v8::Arguments &args)
#define AST_NODE_LIST(V)
Definition: ast.h:115
ZoneList< Handle< String > > ZoneStringList
Definition: ast.h:155