178d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org// Copyright 2012 the V8 project authors. All rights reserved. 23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// Use of this source code is governed by a BSD-style license that can be 33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// found in the LICENSE file. 443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#ifndef V8_PRETTYPRINTER_H_ 643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define V8_PRETTYPRINTER_H_ 743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 8196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/allocation.h" 9196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/ast.h" 1043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace v8 { 1271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace internal { 1343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#ifdef DEBUG 1543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 16a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgclass PrettyPrinter: public AstVisitor { 1743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 186d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org explicit PrettyPrinter(Zone* zone); 1943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen virtual ~PrettyPrinter(); 2043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // The following routines print a node into a string. 2243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // The result string is alive as long as the PrettyPrinter is alive. 230b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org const char* Print(AstNode* node); 2443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen const char* PrintExpression(FunctionLiteral* program); 2543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen const char* PrintProgram(FunctionLiteral* program); 2643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 279d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com void Print(const char* format, ...); 289d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com 2943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Print a node to stdout. 306d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org static void PrintOut(Zone* zone, AstNode* node); 3143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Individual nodes 339d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com#define DECLARE_VISIT(type) virtual void Visit##type(type* node); 349d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com AST_NODE_LIST(DECLARE_VISIT) 359d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com#undef DECLARE_VISIT 3643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 3843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen char* output_; // output string buffer 3943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int size_; // output_ size 4043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int pos_; // current printing position 4143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 4243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen protected: 4343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void Init(); 4443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen const char* Output() const { return output_; } 4543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 4643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen virtual void PrintStatements(ZoneList<Statement*>* statements); 4708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org void PrintLabels(ZoneList<const AstRawString*>* labels); 4843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen virtual void PrintArguments(ZoneList<Expression*>* arguments); 4943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void PrintLiteral(Handle<Object> value, bool quote); 5008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org void PrintLiteral(const AstRawString* value, bool quote); 5143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void PrintParameters(Scope* scope); 5243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void PrintDeclarations(ZoneList<Declaration*>* declarations); 5343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void PrintFunctionLiteral(FunctionLiteral* function); 5443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void PrintCaseClause(CaseClause* clause); 55a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org void PrintObjectLiteralProperty(ObjectLiteralProperty* property); 56a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org 57a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org DEFINE_AST_VISITOR_SUBCLASS_MEMBERS(); 5843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 5943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 6043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 6143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Prints the AST structure 6243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass AstPrinter: public PrettyPrinter { 6343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 646d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org explicit AstPrinter(Zone* zone); 6543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen virtual ~AstPrinter(); 6643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 6743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen const char* PrintProgram(FunctionLiteral* program); 6843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 6943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Individual nodes 709d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com#define DECLARE_VISIT(type) virtual void Visit##type(type* node); 719d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com AST_NODE_LIST(DECLARE_VISIT) 729d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com#undef DECLARE_VISIT 73a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 7443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 7543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen friend class IndentedScope; 7643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void PrintIndented(const char* txt); 770b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org void PrintIndentedVisit(const char* s, AstNode* node); 7843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 7943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void PrintStatements(ZoneList<Statement*>* statements); 8043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void PrintDeclarations(ZoneList<Declaration*>* declarations); 8143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void PrintParameters(Scope* scope); 8243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void PrintArguments(ZoneList<Expression*>* arguments); 8343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void PrintCaseClause(CaseClause* clause); 8443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void PrintLiteralIndented(const char* info, Handle<Object> value, bool quote); 8543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void PrintLiteralWithModeIndented(const char* info, 8643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Variable* var, 8744bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org Handle<Object> value); 8808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org void PrintLabelsIndented(ZoneList<const AstRawString*>* labels); 8943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 9043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void inc_indent() { indent_++; } 9143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void dec_indent() { indent_--; } 9243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 93ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org int indent_; 9443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 9543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 9643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#endif // DEBUG 9743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 9843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} } // namespace v8::internal 9943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 10043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#endif // V8_PRETTYPRINTER_H_ 101