OLD | NEW |
| (Empty) |
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 class CallPrinter : public AstVisitor { | |
15 public: | |
16 explicit CallPrinter(Isolate* isolate); | |
17 virtual ~CallPrinter(); | |
18 | |
19 // The following routine prints the node with position |position| into a | |
20 // string. The result string is alive as long as the CallPrinter is alive. | |
21 const char* Print(FunctionLiteral* program, int position); | |
22 | |
23 void Print(const char* format, ...); | |
24 | |
25 void Find(AstNode* node, bool print = false); | |
26 | |
27 // Individual nodes | |
28 #define DECLARE_VISIT(type) void Visit##type(type* node) override; | |
29 AST_NODE_LIST(DECLARE_VISIT) | |
30 #undef DECLARE_VISIT | |
31 | |
32 private: | |
33 void Init(); | |
34 char* output_; // output string buffer | |
35 int size_; // output_ size | |
36 int pos_; // current printing position | |
37 int position_; // position of ast node to print | |
38 bool found_; | |
39 bool done_; | |
40 | |
41 DEFINE_AST_VISITOR_SUBCLASS_MEMBERS(); | |
42 | |
43 protected: | |
44 void PrintLiteral(Handle<Object> value, bool quote); | |
45 void PrintLiteral(const AstRawString* value, bool quote); | |
46 void FindStatements(ZoneList<Statement*>* statements); | |
47 void FindArguments(ZoneList<Expression*>* arguments); | |
48 }; | |
49 | |
50 | |
51 #ifdef DEBUG | |
52 | |
53 class PrettyPrinter: public AstVisitor { | |
54 public: | |
55 explicit PrettyPrinter(Isolate* isolate); | |
56 virtual ~PrettyPrinter(); | |
57 | |
58 // The following routines print a node into a string. | |
59 // The result string is alive as long as the PrettyPrinter is alive. | |
60 const char* Print(AstNode* node); | |
61 const char* PrintExpression(FunctionLiteral* program); | |
62 const char* PrintProgram(FunctionLiteral* program); | |
63 | |
64 void Print(const char* format, ...); | |
65 | |
66 // Print a node to stdout. | |
67 static void PrintOut(Isolate* isolate, AstNode* node); | |
68 | |
69 // Individual nodes | |
70 #define DECLARE_VISIT(type) void Visit##type(type* node) override; | |
71 AST_NODE_LIST(DECLARE_VISIT) | |
72 #undef DECLARE_VISIT | |
73 | |
74 private: | |
75 char* output_; // output string buffer | |
76 int size_; // output_ size | |
77 int pos_; // current printing position | |
78 | |
79 protected: | |
80 void Init(); | |
81 const char* Output() const { return output_; } | |
82 | |
83 virtual void PrintStatements(ZoneList<Statement*>* statements); | |
84 void PrintLabels(ZoneList<const AstRawString*>* labels); | |
85 virtual void PrintArguments(ZoneList<Expression*>* arguments); | |
86 void PrintLiteral(Handle<Object> value, bool quote); | |
87 void PrintLiteral(const AstRawString* value, bool quote); | |
88 void PrintParameters(Scope* scope); | |
89 void PrintDeclarations(ZoneList<Declaration*>* declarations); | |
90 void PrintFunctionLiteral(FunctionLiteral* function); | |
91 void PrintCaseClause(CaseClause* clause); | |
92 void PrintObjectLiteralProperty(ObjectLiteralProperty* property); | |
93 | |
94 DEFINE_AST_VISITOR_SUBCLASS_MEMBERS(); | |
95 }; | |
96 | |
97 | |
98 // Prints the AST structure | |
99 class AstPrinter: public PrettyPrinter { | |
100 public: | |
101 explicit AstPrinter(Isolate* isolate); | |
102 virtual ~AstPrinter(); | |
103 | |
104 const char* PrintProgram(FunctionLiteral* program); | |
105 | |
106 // Individual nodes | |
107 #define DECLARE_VISIT(type) virtual void Visit##type(type* node); | |
108 AST_NODE_LIST(DECLARE_VISIT) | |
109 #undef DECLARE_VISIT | |
110 | |
111 private: | |
112 friend class IndentedScope; | |
113 void PrintIndented(const char* txt); | |
114 void PrintIndentedVisit(const char* s, AstNode* node); | |
115 | |
116 void PrintStatements(ZoneList<Statement*>* statements); | |
117 void PrintDeclarations(ZoneList<Declaration*>* declarations); | |
118 void PrintParameters(Scope* scope); | |
119 void PrintArguments(ZoneList<Expression*>* arguments); | |
120 void PrintCaseClause(CaseClause* clause); | |
121 void PrintLiteralIndented(const char* info, Handle<Object> value, bool quote); | |
122 void PrintLiteralWithModeIndented(const char* info, | |
123 Variable* var, | |
124 Handle<Object> value); | |
125 void PrintLabelsIndented(ZoneList<const AstRawString*>* labels); | |
126 void PrintProperties(ZoneList<ObjectLiteral::Property*>* properties); | |
127 | |
128 void inc_indent() { indent_++; } | |
129 void dec_indent() { indent_--; } | |
130 | |
131 int indent_; | |
132 }; | |
133 | |
134 #endif // DEBUG | |
135 | |
136 } // namespace internal | |
137 } // namespace v8 | |
138 | |
139 #endif // V8_PRETTYPRINTER_H_ | |
OLD | NEW |