blob: 3a1eca7c6b1759b55312fddd5b92b9f609050409 [file] [log] [blame]
yangguo@chromium.org78d1ad42012-02-09 13:53:47 +00001// Copyright 2012 the V8 project authors. All rights reserved.
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002// 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#include <stdarg.h>
29
30#include "v8.h"
31
32#include "prettyprinter.h"
33#include "scopes.h"
34#include "platform.h"
35
kasperl@chromium.org71affb52009-05-26 05:44:31 +000036namespace v8 {
37namespace internal {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000038
39#ifdef DEBUG
40
41PrettyPrinter::PrettyPrinter() {
42 output_ = NULL;
43 size_ = 0;
44 pos_ = 0;
yangguo@chromium.orga6bbcc82012-12-21 12:35:02 +000045 InitializeAstVisitor();
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000046}
47
48
49PrettyPrinter::~PrettyPrinter() {
50 DeleteArray(output_);
51}
52
53
54void PrettyPrinter::VisitBlock(Block* node) {
55 if (!node->is_initializer_block()) Print("{ ");
56 PrintStatements(node->statements());
57 if (node->statements()->length() > 0) Print(" ");
58 if (!node->is_initializer_block()) Print("}");
59}
60
61
yangguo@chromium.org78d1ad42012-02-09 13:53:47 +000062void PrettyPrinter::VisitVariableDeclaration(VariableDeclaration* node) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000063 Print("var ");
64 PrintLiteral(node->proxy()->name(), false);
ulan@chromium.org812308e2012-02-29 15:58:45 +000065 Print(";");
66}
67
68
69void PrettyPrinter::VisitFunctionDeclaration(FunctionDeclaration* node) {
70 Print("function ");
71 PrintLiteral(node->proxy()->name(), false);
72 Print(" = ");
73 PrintFunctionLiteral(node->fun());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000074 Print(";");
75}
76
77
yangguo@chromium.org78d1ad42012-02-09 13:53:47 +000078void PrettyPrinter::VisitModuleDeclaration(ModuleDeclaration* node) {
79 Print("module ");
80 PrintLiteral(node->proxy()->name(), false);
81 Print(" = ");
82 Visit(node->module());
83 Print(";");
84}
85
86
ulan@chromium.org812308e2012-02-29 15:58:45 +000087void PrettyPrinter::VisitImportDeclaration(ImportDeclaration* node) {
88 Print("import ");
89 PrintLiteral(node->proxy()->name(), false);
90 Print(" from ");
91 Visit(node->module());
92 Print(";");
93}
94
95
96void PrettyPrinter::VisitExportDeclaration(ExportDeclaration* node) {
97 Print("export ");
98 PrintLiteral(node->proxy()->name(), false);
99 Print(";");
100}
101
102
yangguo@chromium.org78d1ad42012-02-09 13:53:47 +0000103void PrettyPrinter::VisitModuleLiteral(ModuleLiteral* node) {
104 VisitBlock(node->body());
105}
106
107
108void PrettyPrinter::VisitModuleVariable(ModuleVariable* node) {
jkummerow@chromium.orgf7a58842012-02-21 10:08:21 +0000109 Visit(node->proxy());
yangguo@chromium.org78d1ad42012-02-09 13:53:47 +0000110}
111
112
113void PrettyPrinter::VisitModulePath(ModulePath* node) {
114 Visit(node->module());
115 Print(".");
116 PrintLiteral(node->name(), false);
117}
118
119
120void PrettyPrinter::VisitModuleUrl(ModuleUrl* node) {
121 Print("at ");
122 PrintLiteral(node->url(), true);
123}
124
125
ulan@chromium.org8e8d8822012-11-23 14:36:46 +0000126void PrettyPrinter::VisitModuleStatement(ModuleStatement* node) {
127 Print("module ");
128 PrintLiteral(node->proxy()->name(), false);
129 Print(" ");
130 Visit(node->body());
131}
132
133
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000134void PrettyPrinter::VisitExpressionStatement(ExpressionStatement* node) {
135 Visit(node->expression());
136 Print(";");
137}
138
139
140void PrettyPrinter::VisitEmptyStatement(EmptyStatement* node) {
141 Print(";");
142}
143
144
145void PrettyPrinter::VisitIfStatement(IfStatement* node) {
146 Print("if (");
147 Visit(node->condition());
148 Print(") ");
149 Visit(node->then_statement());
150 if (node->HasElseStatement()) {
151 Print(" else ");
152 Visit(node->else_statement());
153 }
154}
155
156
157void PrettyPrinter::VisitContinueStatement(ContinueStatement* node) {
158 Print("continue");
159 ZoneStringList* labels = node->target()->labels();
160 if (labels != NULL) {
161 Print(" ");
162 ASSERT(labels->length() > 0); // guaranteed to have at least one entry
163 PrintLiteral(labels->at(0), false); // any label from the list is fine
164 }
165 Print(";");
166}
167
168
169void PrettyPrinter::VisitBreakStatement(BreakStatement* node) {
170 Print("break");
171 ZoneStringList* labels = node->target()->labels();
172 if (labels != NULL) {
173 Print(" ");
174 ASSERT(labels->length() > 0); // guaranteed to have at least one entry
175 PrintLiteral(labels->at(0), false); // any label from the list is fine
176 }
177 Print(";");
178}
179
180
181void PrettyPrinter::VisitReturnStatement(ReturnStatement* node) {
182 Print("return ");
183 Visit(node->expression());
184 Print(";");
185}
186
187
whesse@chromium.org4acdc2c2011-08-15 13:01:23 +0000188void PrettyPrinter::VisitWithStatement(WithStatement* node) {
189 Print("with (");
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000190 Visit(node->expression());
191 Print(") ");
whesse@chromium.org4acdc2c2011-08-15 13:01:23 +0000192 Visit(node->statement());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000193}
194
195
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000196void PrettyPrinter::VisitSwitchStatement(SwitchStatement* node) {
197 PrintLabels(node->labels());
198 Print("switch (");
199 Visit(node->tag());
200 Print(") { ");
201 ZoneList<CaseClause*>* cases = node->cases();
202 for (int i = 0; i < cases->length(); i++)
203 PrintCaseClause(cases->at(i));
204 Print("}");
205}
206
207
christian.plesner.hansen@gmail.com9d58c2b2009-10-16 11:48:38 +0000208void PrettyPrinter::VisitDoWhileStatement(DoWhileStatement* node) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000209 PrintLabels(node->labels());
christian.plesner.hansen@gmail.com9d58c2b2009-10-16 11:48:38 +0000210 Print("do ");
211 Visit(node->body());
212 Print(" while (");
213 Visit(node->cond());
214 Print(");");
215}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000216
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000217
christian.plesner.hansen@gmail.com9d58c2b2009-10-16 11:48:38 +0000218void PrettyPrinter::VisitWhileStatement(WhileStatement* node) {
219 PrintLabels(node->labels());
220 Print("while (");
221 Visit(node->cond());
222 Print(") ");
223 Visit(node->body());
224}
225
226
227void PrettyPrinter::VisitForStatement(ForStatement* node) {
228 PrintLabels(node->labels());
229 Print("for (");
230 if (node->init() != NULL) {
231 Visit(node->init());
232 Print(" ");
233 } else {
234 Print("; ");
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000235 }
christian.plesner.hansen@gmail.com9d58c2b2009-10-16 11:48:38 +0000236 if (node->cond() != NULL) Visit(node->cond());
237 Print("; ");
238 if (node->next() != NULL) {
239 Visit(node->next()); // prints extra ';', unfortunately
240 // to fix: should use Expression for next
241 }
242 Print(") ");
243 Visit(node->body());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000244}
245
246
247void PrettyPrinter::VisitForInStatement(ForInStatement* node) {
248 PrintLabels(node->labels());
249 Print("for (");
250 Visit(node->each());
251 Print(" in ");
252 Visit(node->enumerable());
253 Print(") ");
254 Visit(node->body());
255}
256
257
christian.plesner.hansen@gmail.com9d58c2b2009-10-16 11:48:38 +0000258void PrettyPrinter::VisitTryCatchStatement(TryCatchStatement* node) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000259 Print("try ");
260 Visit(node->try_block());
261 Print(" catch (");
svenpanne@chromium.org6d786c92011-06-15 10:58:27 +0000262 const bool quote = false;
ricow@chromium.org4f693d62011-07-04 14:01:31 +0000263 PrintLiteral(node->variable()->name(), quote);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000264 Print(") ");
265 Visit(node->catch_block());
266}
267
268
christian.plesner.hansen@gmail.com9d58c2b2009-10-16 11:48:38 +0000269void PrettyPrinter::VisitTryFinallyStatement(TryFinallyStatement* node) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000270 Print("try ");
271 Visit(node->try_block());
272 Print(" finally ");
273 Visit(node->finally_block());
274}
275
276
277void PrettyPrinter::VisitDebuggerStatement(DebuggerStatement* node) {
278 Print("debugger ");
279}
280
281
282void PrettyPrinter::VisitFunctionLiteral(FunctionLiteral* node) {
283 Print("(");
284 PrintFunctionLiteral(node);
285 Print(")");
286}
287
288
kmillikin@chromium.org5d8f0e62010-03-24 08:21:20 +0000289void PrettyPrinter::VisitSharedFunctionInfoLiteral(
290 SharedFunctionInfoLiteral* node) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000291 Print("(");
kmillikin@chromium.org5d8f0e62010-03-24 08:21:20 +0000292 PrintLiteral(node->shared_function_info(), true);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000293 Print(")");
294}
295
296
297void PrettyPrinter::VisitConditional(Conditional* node) {
298 Visit(node->condition());
299 Print(" ? ");
300 Visit(node->then_expression());
301 Print(" : ");
302 Visit(node->else_expression());
303}
304
305
306void PrettyPrinter::VisitLiteral(Literal* node) {
307 PrintLiteral(node->handle(), true);
308}
309
310
311void PrettyPrinter::VisitRegExpLiteral(RegExpLiteral* node) {
312 Print(" RegExp(");
313 PrintLiteral(node->pattern(), false);
314 Print(",");
315 PrintLiteral(node->flags(), false);
316 Print(") ");
317}
318
319
320void PrettyPrinter::VisitObjectLiteral(ObjectLiteral* node) {
321 Print("{ ");
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000322 for (int i = 0; i < node->properties()->length(); i++) {
323 if (i != 0) Print(",");
324 ObjectLiteral::Property* property = node->properties()->at(i);
325 Print(" ");
326 Visit(property->key());
327 Print(": ");
328 Visit(property->value());
329 }
330 Print(" }");
331}
332
333
334void PrettyPrinter::VisitArrayLiteral(ArrayLiteral* node) {
335 Print("[ ");
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000336 for (int i = 0; i < node->values()->length(); i++) {
337 if (i != 0) Print(",");
338 Visit(node->values()->at(i));
339 }
340 Print(" ]");
341}
342
343
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000344void PrettyPrinter::VisitVariableProxy(VariableProxy* node) {
345 PrintLiteral(node->name(), false);
346}
347
348
349void PrettyPrinter::VisitAssignment(Assignment* node) {
350 Visit(node->target());
351 Print(" %s ", Token::String(node->op()));
352 Visit(node->value());
353}
354
355
mstarzinger@chromium.orgf705b502013-04-04 11:38:09 +0000356void PrettyPrinter::VisitYield(Yield* node) {
357 Print("yield ");
358 Visit(node->expression());
359}
360
361
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000362void PrettyPrinter::VisitThrow(Throw* node) {
363 Print("throw ");
364 Visit(node->exception());
365}
366
367
368void PrettyPrinter::VisitProperty(Property* node) {
369 Expression* key = node->key();
370 Literal* literal = key->AsLiteral();
yangguo@chromium.org4a9f6552013-03-04 14:46:33 +0000371 if (literal != NULL && literal->handle()->IsInternalizedString()) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000372 Print("(");
373 Visit(node->obj());
374 Print(").");
375 PrintLiteral(literal->handle(), false);
376 } else {
377 Visit(node->obj());
378 Print("[");
379 Visit(key);
380 Print("]");
381 }
382}
383
384
385void PrettyPrinter::VisitCall(Call* node) {
386 Visit(node->expression());
387 PrintArguments(node->arguments());
388}
389
390
391void PrettyPrinter::VisitCallNew(CallNew* node) {
392 Print("new (");
393 Visit(node->expression());
394 Print(")");
395 PrintArguments(node->arguments());
396}
397
398
399void PrettyPrinter::VisitCallRuntime(CallRuntime* node) {
400 Print("%%");
401 PrintLiteral(node->name(), false);
402 PrintArguments(node->arguments());
403}
404
405
406void PrettyPrinter::VisitUnaryOperation(UnaryOperation* node) {
danno@chromium.org40cb8782011-05-25 07:58:50 +0000407 Token::Value op = node->op();
408 bool needsSpace =
409 op == Token::DELETE || op == Token::TYPEOF || op == Token::VOID;
410 Print("(%s%s", Token::String(op), needsSpace ? " " : "");
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000411 Visit(node->expression());
412 Print(")");
413}
414
415
416void PrettyPrinter::VisitCountOperation(CountOperation* node) {
417 Print("(");
418 if (node->is_prefix()) Print("%s", Token::String(node->op()));
419 Visit(node->expression());
420 if (node->is_postfix()) Print("%s", Token::String(node->op()));
421 Print(")");
422}
423
424
425void PrettyPrinter::VisitBinaryOperation(BinaryOperation* node) {
426 Print("(");
427 Visit(node->left());
danno@chromium.org40cb8782011-05-25 07:58:50 +0000428 Print(" %s ", Token::String(node->op()));
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000429 Visit(node->right());
430 Print(")");
431}
432
433
434void PrettyPrinter::VisitCompareOperation(CompareOperation* node) {
435 Print("(");
436 Visit(node->left());
danno@chromium.org40cb8782011-05-25 07:58:50 +0000437 Print(" %s ", Token::String(node->op()));
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000438 Visit(node->right());
439 Print(")");
440}
441
442
443void PrettyPrinter::VisitThisFunction(ThisFunction* node) {
444 Print("<this-function>");
445}
446
447
sgjesse@chromium.org0b6db592009-07-30 14:48:31 +0000448const char* PrettyPrinter::Print(AstNode* node) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000449 Init();
450 Visit(node);
451 return output_;
452}
453
454
455const char* PrettyPrinter::PrintExpression(FunctionLiteral* program) {
456 Init();
457 ExpressionStatement* statement =
458 program->body()->at(0)->AsExpressionStatement();
459 Visit(statement->expression());
460 return output_;
461}
462
463
464const char* PrettyPrinter::PrintProgram(FunctionLiteral* program) {
465 Init();
466 PrintStatements(program->body());
467 Print("\n");
468 return output_;
469}
470
471
sgjesse@chromium.org0b6db592009-07-30 14:48:31 +0000472void PrettyPrinter::PrintOut(AstNode* node) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000473 PrettyPrinter printer;
474 PrintF("%s", printer.Print(node));
475}
476
477
478void PrettyPrinter::Init() {
479 if (size_ == 0) {
480 ASSERT(output_ == NULL);
481 const int initial_size = 256;
482 output_ = NewArray<char>(initial_size);
483 size_ = initial_size;
484 }
485 output_[0] = '\0';
486 pos_ = 0;
487}
488
489
490void PrettyPrinter::Print(const char* format, ...) {
491 for (;;) {
492 va_list arguments;
493 va_start(arguments, format);
kasperl@chromium.orgb9123622008-09-17 14:05:56 +0000494 int n = OS::VSNPrintF(Vector<char>(output_, size_) + pos_,
495 format,
496 arguments);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000497 va_end(arguments);
498
mads.s.ager@gmail.com769cc962008-08-06 10:02:49 +0000499 if (n >= 0) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000500 // there was enough space - we are done
501 pos_ += n;
502 return;
503 } else {
504 // there was not enough space - allocate more and try again
505 const int slack = 32;
506 int new_size = size_ + (size_ >> 1) + slack;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000507 char* new_output = NewArray<char>(new_size);
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +0000508 OS::MemCopy(new_output, output_, pos_);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000509 DeleteArray(output_);
510 output_ = new_output;
511 size_ = new_size;
512 }
513 }
514}
515
516
517void PrettyPrinter::PrintStatements(ZoneList<Statement*>* statements) {
ricow@chromium.org7ad65222011-12-19 12:13:11 +0000518 if (statements == NULL) return;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000519 for (int i = 0; i < statements->length(); i++) {
520 if (i != 0) Print(" ");
521 Visit(statements->at(i));
522 }
523}
524
525
526void PrettyPrinter::PrintLabels(ZoneStringList* labels) {
527 if (labels != NULL) {
528 for (int i = 0; i < labels->length(); i++) {
529 PrintLiteral(labels->at(i), false);
530 Print(": ");
531 }
532 }
533}
534
535
536void PrettyPrinter::PrintArguments(ZoneList<Expression*>* arguments) {
537 Print("(");
538 for (int i = 0; i < arguments->length(); i++) {
539 if (i != 0) Print(", ");
540 Visit(arguments->at(i));
541 }
542 Print(")");
543}
544
545
546void PrettyPrinter::PrintLiteral(Handle<Object> value, bool quote) {
547 Object* object = *value;
548 if (object->IsString()) {
549 String* string = String::cast(object);
550 if (quote) Print("\"");
ager@chromium.orgbb29dc92009-03-24 13:25:23 +0000551 for (int i = 0; i < string->length(); i++) {
552 Print("%c", string->Get(i));
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000553 }
554 if (quote) Print("\"");
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +0000555 } else if (object->IsNull()) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000556 Print("null");
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +0000557 } else if (object->IsTrue()) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000558 Print("true");
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +0000559 } else if (object->IsFalse()) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000560 Print("false");
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +0000561 } else if (object->IsUndefined()) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000562 Print("undefined");
563 } else if (object->IsNumber()) {
564 Print("%g", object->Number());
565 } else if (object->IsJSObject()) {
566 // regular expression
567 if (object->IsJSFunction()) {
568 Print("JS-Function");
569 } else if (object->IsJSArray()) {
570 Print("JS-array[%u]", JSArray::cast(object)->length());
571 } else if (object->IsJSObject()) {
572 Print("JS-Object");
573 } else {
574 Print("?UNKNOWN?");
575 }
576 } else if (object->IsFixedArray()) {
577 Print("FixedArray");
578 } else {
579 Print("<unknown literal %p>", object);
580 }
581}
582
583
584void PrettyPrinter::PrintParameters(Scope* scope) {
585 Print("(");
586 for (int i = 0; i < scope->num_parameters(); i++) {
587 if (i > 0) Print(", ");
588 PrintLiteral(scope->parameter(i)->name(), false);
589 }
590 Print(")");
591}
592
593
594void PrettyPrinter::PrintDeclarations(ZoneList<Declaration*>* declarations) {
595 for (int i = 0; i < declarations->length(); i++) {
596 if (i > 0) Print(" ");
597 Visit(declarations->at(i));
598 }
599}
600
601
602void PrettyPrinter::PrintFunctionLiteral(FunctionLiteral* function) {
603 Print("function ");
604 PrintLiteral(function->name(), false);
605 PrintParameters(function->scope());
606 Print(" { ");
607 PrintDeclarations(function->scope()->declarations());
608 PrintStatements(function->body());
609 Print(" }");
610}
611
612
613void PrettyPrinter::PrintCaseClause(CaseClause* clause) {
614 if (clause->is_default()) {
615 Print("default");
616 } else {
617 Print("case ");
618 Visit(clause->label());
619 }
620 Print(": ");
621 PrintStatements(clause->statements());
622 if (clause->statements()->length() > 0)
623 Print(" ");
624}
625
626
627//-----------------------------------------------------------------------------
628
629class IndentedScope BASE_EMBEDDED {
630 public:
ulan@chromium.org57ff8812013-05-10 08:16:55 +0000631 IndentedScope(AstPrinter* printer, const char* txt)
fschneider@chromium.org7979bbb2011-03-28 10:47:03 +0000632 : ast_printer_(printer) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000633 ast_printer_->PrintIndented(txt);
634 ast_printer_->Print("\n");
635 ast_printer_->inc_indent();
636 }
637
638 virtual ~IndentedScope() {
639 ast_printer_->dec_indent();
640 }
641
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000642 private:
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +0000643 AstPrinter* ast_printer_;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000644};
645
646
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000647//-----------------------------------------------------------------------------
648
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000649
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +0000650AstPrinter::AstPrinter() : indent_(0) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000651}
652
653
654AstPrinter::~AstPrinter() {
655 ASSERT(indent_ == 0);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000656}
657
658
659void AstPrinter::PrintIndented(const char* txt) {
660 for (int i = 0; i < indent_; i++) {
kasperl@chromium.org2d18d102009-04-15 13:27:32 +0000661 Print(". ");
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000662 }
663 Print(txt);
664}
665
666
667void AstPrinter::PrintLiteralIndented(const char* info,
668 Handle<Object> value,
669 bool quote) {
670 PrintIndented(info);
671 Print(" ");
672 PrintLiteral(value, quote);
673 Print("\n");
674}
675
676
677void AstPrinter::PrintLiteralWithModeIndented(const char* info,
678 Variable* var,
karlklose@chromium.org44bc7082011-04-11 12:33:05 +0000679 Handle<Object> value) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000680 if (var == NULL) {
681 PrintLiteralIndented(info, value, true);
682 } else {
kasperl@chromium.orgb9123622008-09-17 14:05:56 +0000683 EmbeddedVector<char, 256> buf;
sgjesse@chromium.orgb302e562010-02-03 11:26:59 +0000684 int pos = OS::SNPrintF(buf, "%s (mode = %s", info,
685 Variable::Mode2String(var->mode()));
sgjesse@chromium.orgb302e562010-02-03 11:26:59 +0000686 OS::SNPrintF(buf + pos, ")");
kasperl@chromium.orgb9123622008-09-17 14:05:56 +0000687 PrintLiteralIndented(buf.start(), value, true);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000688 }
689}
690
691
ulan@chromium.org57ff8812013-05-10 08:16:55 +0000692void AstPrinter::PrintLabelsIndented(ZoneStringList* labels) {
693 if (labels == NULL || labels->length() == 0) return;
694 PrintIndented("LABELS ");
695 PrintLabels(labels);
696 Print("\n");
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000697}
698
699
sgjesse@chromium.org0b6db592009-07-30 14:48:31 +0000700void AstPrinter::PrintIndentedVisit(const char* s, AstNode* node) {
ulan@chromium.org57ff8812013-05-10 08:16:55 +0000701 IndentedScope indent(this, s);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000702 Visit(node);
703}
704
705
706const char* AstPrinter::PrintProgram(FunctionLiteral* program) {
707 Init();
fschneider@chromium.org7979bbb2011-03-28 10:47:03 +0000708 { IndentedScope indent(this, "FUNC");
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000709 PrintLiteralIndented("NAME", program->name(), true);
kasperl@chromium.orgd1e3e722009-04-14 13:38:25 +0000710 PrintLiteralIndented("INFERRED NAME", program->inferred_name(), true);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000711 PrintParameters(program->scope());
712 PrintDeclarations(program->scope()->declarations());
713 PrintStatements(program->body());
714 }
715 return Output();
716}
717
718
719void AstPrinter::PrintDeclarations(ZoneList<Declaration*>* declarations) {
720 if (declarations->length() > 0) {
fschneider@chromium.org7979bbb2011-03-28 10:47:03 +0000721 IndentedScope indent(this, "DECLS");
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000722 for (int i = 0; i < declarations->length(); i++) {
723 Visit(declarations->at(i));
724 }
725 }
726}
727
728
729void AstPrinter::PrintParameters(Scope* scope) {
730 if (scope->num_parameters() > 0) {
fschneider@chromium.org7979bbb2011-03-28 10:47:03 +0000731 IndentedScope indent(this, "PARAMS");
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000732 for (int i = 0; i < scope->num_parameters(); i++) {
kasperl@chromium.org2d18d102009-04-15 13:27:32 +0000733 PrintLiteralWithModeIndented("VAR", scope->parameter(i),
karlklose@chromium.org44bc7082011-04-11 12:33:05 +0000734 scope->parameter(i)->name());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000735 }
736 }
737}
738
739
740void AstPrinter::PrintStatements(ZoneList<Statement*>* statements) {
741 for (int i = 0; i < statements->length(); i++) {
742 Visit(statements->at(i));
743 }
744}
745
746
747void AstPrinter::PrintArguments(ZoneList<Expression*>* arguments) {
748 for (int i = 0; i < arguments->length(); i++) {
749 Visit(arguments->at(i));
750 }
751}
752
753
754void AstPrinter::PrintCaseClause(CaseClause* clause) {
755 if (clause->is_default()) {
fschneider@chromium.org7979bbb2011-03-28 10:47:03 +0000756 IndentedScope indent(this, "DEFAULT");
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000757 PrintStatements(clause->statements());
758 } else {
fschneider@chromium.org7979bbb2011-03-28 10:47:03 +0000759 IndentedScope indent(this, "CASE");
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000760 Visit(clause->label());
761 PrintStatements(clause->statements());
762 }
763}
764
765
766void AstPrinter::VisitBlock(Block* node) {
767 const char* block_txt = node->is_initializer_block() ? "BLOCK INIT" : "BLOCK";
fschneider@chromium.org7979bbb2011-03-28 10:47:03 +0000768 IndentedScope indent(this, block_txt);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000769 PrintStatements(node->statements());
770}
771
772
ulan@chromium.org57ff8812013-05-10 08:16:55 +0000773// TODO(svenpanne) Start with IndentedScope.
yangguo@chromium.org78d1ad42012-02-09 13:53:47 +0000774void AstPrinter::VisitVariableDeclaration(VariableDeclaration* node) {
ulan@chromium.org812308e2012-02-29 15:58:45 +0000775 PrintLiteralWithModeIndented(Variable::Mode2String(node->mode()),
776 node->proxy()->var(),
777 node->proxy()->name());
778}
779
780
ulan@chromium.org57ff8812013-05-10 08:16:55 +0000781// TODO(svenpanne) Start with IndentedScope.
ulan@chromium.org812308e2012-02-29 15:58:45 +0000782void AstPrinter::VisitFunctionDeclaration(FunctionDeclaration* node) {
783 PrintIndented("FUNCTION ");
784 PrintLiteral(node->proxy()->name(), true);
785 Print(" = function ");
786 PrintLiteral(node->fun()->name(), false);
787 Print("\n");
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000788}
789
790
yangguo@chromium.org78d1ad42012-02-09 13:53:47 +0000791void AstPrinter::VisitModuleDeclaration(ModuleDeclaration* node) {
792 IndentedScope indent(this, "MODULE");
793 PrintLiteralIndented("NAME", node->proxy()->name(), true);
794 Visit(node->module());
795}
796
797
ulan@chromium.org812308e2012-02-29 15:58:45 +0000798void AstPrinter::VisitImportDeclaration(ImportDeclaration* node) {
799 IndentedScope indent(this, "IMPORT");
800 PrintLiteralIndented("NAME", node->proxy()->name(), true);
801 Visit(node->module());
802}
803
804
805void AstPrinter::VisitExportDeclaration(ExportDeclaration* node) {
806 IndentedScope indent(this, "EXPORT ");
807 PrintLiteral(node->proxy()->name(), true);
808}
809
810
yangguo@chromium.org78d1ad42012-02-09 13:53:47 +0000811void AstPrinter::VisitModuleLiteral(ModuleLiteral* node) {
ulan@chromium.org57ff8812013-05-10 08:16:55 +0000812 IndentedScope indent(this, "MODULE LITERAL");
yangguo@chromium.org78d1ad42012-02-09 13:53:47 +0000813 VisitBlock(node->body());
814}
815
816
817void AstPrinter::VisitModuleVariable(ModuleVariable* node) {
ulan@chromium.org57ff8812013-05-10 08:16:55 +0000818 IndentedScope indent(this, "MODULE VARIABLE");
jkummerow@chromium.orgf7a58842012-02-21 10:08:21 +0000819 Visit(node->proxy());
yangguo@chromium.org78d1ad42012-02-09 13:53:47 +0000820}
821
822
823void AstPrinter::VisitModulePath(ModulePath* node) {
ulan@chromium.org57ff8812013-05-10 08:16:55 +0000824 IndentedScope indent(this, "MODULE PATH");
825 PrintIndentedVisit("MODULE PATH PARENT", node->module());
826 PrintLiteralIndented("NAME", node->name(), true);
yangguo@chromium.org78d1ad42012-02-09 13:53:47 +0000827}
828
829
830void AstPrinter::VisitModuleUrl(ModuleUrl* node) {
831 PrintLiteralIndented("URL", node->url(), true);
832}
833
834
ulan@chromium.org8e8d8822012-11-23 14:36:46 +0000835void AstPrinter::VisitModuleStatement(ModuleStatement* node) {
ulan@chromium.org57ff8812013-05-10 08:16:55 +0000836 IndentedScope indent(this, "MODULE STATEMENT");
ulan@chromium.org8e8d8822012-11-23 14:36:46 +0000837 PrintLiteralIndented("NAME", node->proxy()->name(), true);
838 PrintStatements(node->body()->statements());
839}
840
841
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000842void AstPrinter::VisitExpressionStatement(ExpressionStatement* node) {
ulan@chromium.org57ff8812013-05-10 08:16:55 +0000843 IndentedScope indent(this, "EXPRESSION STATEMENT");
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000844 Visit(node->expression());
845}
846
847
848void AstPrinter::VisitEmptyStatement(EmptyStatement* node) {
ulan@chromium.org57ff8812013-05-10 08:16:55 +0000849 IndentedScope indent(this, "EMPTY");
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000850}
851
852
853void AstPrinter::VisitIfStatement(IfStatement* node) {
ulan@chromium.org57ff8812013-05-10 08:16:55 +0000854 IndentedScope indent(this, "IF");
855 PrintIndentedVisit("CONDITION", node->condition());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000856 PrintIndentedVisit("THEN", node->then_statement());
857 if (node->HasElseStatement()) {
858 PrintIndentedVisit("ELSE", node->else_statement());
859 }
860}
861
862
863void AstPrinter::VisitContinueStatement(ContinueStatement* node) {
ulan@chromium.org57ff8812013-05-10 08:16:55 +0000864 IndentedScope indent(this, "CONTINUE");
865 PrintLabelsIndented(node->target()->labels());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000866}
867
868
869void AstPrinter::VisitBreakStatement(BreakStatement* node) {
ulan@chromium.org57ff8812013-05-10 08:16:55 +0000870 IndentedScope indent(this, "BREAK");
871 PrintLabelsIndented(node->target()->labels());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000872}
873
874
875void AstPrinter::VisitReturnStatement(ReturnStatement* node) {
ulan@chromium.org57ff8812013-05-10 08:16:55 +0000876 IndentedScope indent(this, "RETURN");
877 Visit(node->expression());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000878}
879
880
whesse@chromium.org4acdc2c2011-08-15 13:01:23 +0000881void AstPrinter::VisitWithStatement(WithStatement* node) {
882 IndentedScope indent(this, "WITH");
883 PrintIndentedVisit("OBJECT", node->expression());
884 PrintIndentedVisit("BODY", node->statement());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000885}
886
887
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000888void AstPrinter::VisitSwitchStatement(SwitchStatement* node) {
fschneider@chromium.org7979bbb2011-03-28 10:47:03 +0000889 IndentedScope indent(this, "SWITCH");
ulan@chromium.org57ff8812013-05-10 08:16:55 +0000890 PrintLabelsIndented(node->labels());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000891 PrintIndentedVisit("TAG", node->tag());
892 for (int i = 0; i < node->cases()->length(); i++) {
893 PrintCaseClause(node->cases()->at(i));
894 }
895}
896
897
christian.plesner.hansen@gmail.com9d58c2b2009-10-16 11:48:38 +0000898void AstPrinter::VisitDoWhileStatement(DoWhileStatement* node) {
fschneider@chromium.org7979bbb2011-03-28 10:47:03 +0000899 IndentedScope indent(this, "DO");
ulan@chromium.org57ff8812013-05-10 08:16:55 +0000900 PrintLabelsIndented(node->labels());
christian.plesner.hansen@gmail.com9d58c2b2009-10-16 11:48:38 +0000901 PrintIndentedVisit("BODY", node->body());
902 PrintIndentedVisit("COND", node->cond());
903}
904
905
906void AstPrinter::VisitWhileStatement(WhileStatement* node) {
fschneider@chromium.org7979bbb2011-03-28 10:47:03 +0000907 IndentedScope indent(this, "WHILE");
ulan@chromium.org57ff8812013-05-10 08:16:55 +0000908 PrintLabelsIndented(node->labels());
christian.plesner.hansen@gmail.com9d58c2b2009-10-16 11:48:38 +0000909 PrintIndentedVisit("COND", node->cond());
910 PrintIndentedVisit("BODY", node->body());
911}
912
913
914void AstPrinter::VisitForStatement(ForStatement* node) {
fschneider@chromium.org7979bbb2011-03-28 10:47:03 +0000915 IndentedScope indent(this, "FOR");
ulan@chromium.org57ff8812013-05-10 08:16:55 +0000916 PrintLabelsIndented(node->labels());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000917 if (node->init()) PrintIndentedVisit("INIT", node->init());
918 if (node->cond()) PrintIndentedVisit("COND", node->cond());
christian.plesner.hansen@gmail.com9d58c2b2009-10-16 11:48:38 +0000919 PrintIndentedVisit("BODY", node->body());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000920 if (node->next()) PrintIndentedVisit("NEXT", node->next());
921}
922
923
924void AstPrinter::VisitForInStatement(ForInStatement* node) {
fschneider@chromium.org7979bbb2011-03-28 10:47:03 +0000925 IndentedScope indent(this, "FOR IN");
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000926 PrintIndentedVisit("FOR", node->each());
927 PrintIndentedVisit("IN", node->enumerable());
928 PrintIndentedVisit("BODY", node->body());
929}
930
931
christian.plesner.hansen@gmail.com9d58c2b2009-10-16 11:48:38 +0000932void AstPrinter::VisitTryCatchStatement(TryCatchStatement* node) {
fschneider@chromium.org7979bbb2011-03-28 10:47:03 +0000933 IndentedScope indent(this, "TRY CATCH");
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000934 PrintIndentedVisit("TRY", node->try_block());
ricow@chromium.org4f693d62011-07-04 14:01:31 +0000935 PrintLiteralWithModeIndented("CATCHVAR",
936 node->variable(),
937 node->variable()->name());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000938 PrintIndentedVisit("CATCH", node->catch_block());
939}
940
941
christian.plesner.hansen@gmail.com9d58c2b2009-10-16 11:48:38 +0000942void AstPrinter::VisitTryFinallyStatement(TryFinallyStatement* node) {
fschneider@chromium.org7979bbb2011-03-28 10:47:03 +0000943 IndentedScope indent(this, "TRY FINALLY");
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000944 PrintIndentedVisit("TRY", node->try_block());
945 PrintIndentedVisit("FINALLY", node->finally_block());
946}
947
948
949void AstPrinter::VisitDebuggerStatement(DebuggerStatement* node) {
fschneider@chromium.org7979bbb2011-03-28 10:47:03 +0000950 IndentedScope indent(this, "DEBUGGER");
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000951}
952
953
954void AstPrinter::VisitFunctionLiteral(FunctionLiteral* node) {
fschneider@chromium.org7979bbb2011-03-28 10:47:03 +0000955 IndentedScope indent(this, "FUNC LITERAL");
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000956 PrintLiteralIndented("NAME", node->name(), false);
kasperl@chromium.orgd1e3e722009-04-14 13:38:25 +0000957 PrintLiteralIndented("INFERRED NAME", node->inferred_name(), false);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000958 PrintParameters(node->scope());
959 // We don't want to see the function literal in this case: it
960 // will be printed via PrintProgram when the code for it is
961 // generated.
962 // PrintStatements(node->body());
963}
964
965
kmillikin@chromium.org5d8f0e62010-03-24 08:21:20 +0000966void AstPrinter::VisitSharedFunctionInfoLiteral(
967 SharedFunctionInfoLiteral* node) {
fschneider@chromium.org7979bbb2011-03-28 10:47:03 +0000968 IndentedScope indent(this, "FUNC LITERAL");
kmillikin@chromium.org5d8f0e62010-03-24 08:21:20 +0000969 PrintLiteralIndented("SHARED INFO", node->shared_function_info(), true);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000970}
971
972
973void AstPrinter::VisitConditional(Conditional* node) {
fschneider@chromium.org7979bbb2011-03-28 10:47:03 +0000974 IndentedScope indent(this, "CONDITIONAL");
ulan@chromium.org57ff8812013-05-10 08:16:55 +0000975 PrintIndentedVisit("CONDITION", node->condition());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000976 PrintIndentedVisit("THEN", node->then_expression());
977 PrintIndentedVisit("ELSE", node->else_expression());
978}
979
980
ulan@chromium.org57ff8812013-05-10 08:16:55 +0000981// TODO(svenpanne) Start with IndentedScope.
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000982void AstPrinter::VisitLiteral(Literal* node) {
983 PrintLiteralIndented("LITERAL", node->handle(), true);
984}
985
986
987void AstPrinter::VisitRegExpLiteral(RegExpLiteral* node) {
fschneider@chromium.org7979bbb2011-03-28 10:47:03 +0000988 IndentedScope indent(this, "REGEXP LITERAL");
ager@chromium.orge2902be2009-06-08 12:21:35 +0000989 PrintLiteralIndented("PATTERN", node->pattern(), false);
990 PrintLiteralIndented("FLAGS", node->flags(), false);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000991}
992
993
994void AstPrinter::VisitObjectLiteral(ObjectLiteral* node) {
fschneider@chromium.org7979bbb2011-03-28 10:47:03 +0000995 IndentedScope indent(this, "OBJ LITERAL");
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000996 for (int i = 0; i < node->properties()->length(); i++) {
997 const char* prop_kind = NULL;
998 switch (node->properties()->at(i)->kind()) {
999 case ObjectLiteral::Property::CONSTANT:
1000 prop_kind = "PROPERTY - CONSTANT";
1001 break;
1002 case ObjectLiteral::Property::COMPUTED:
1003 prop_kind = "PROPERTY - COMPUTED";
1004 break;
sgjesse@chromium.org0b6db592009-07-30 14:48:31 +00001005 case ObjectLiteral::Property::MATERIALIZED_LITERAL:
1006 prop_kind = "PROPERTY - MATERIALIZED_LITERAL";
1007 break;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001008 case ObjectLiteral::Property::PROTOTYPE:
1009 prop_kind = "PROPERTY - PROTOTYPE";
1010 break;
1011 case ObjectLiteral::Property::GETTER:
1012 prop_kind = "PROPERTY - GETTER";
1013 break;
1014 case ObjectLiteral::Property::SETTER:
1015 prop_kind = "PROPERTY - SETTER";
1016 break;
1017 default:
1018 UNREACHABLE();
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001019 }
fschneider@chromium.org7979bbb2011-03-28 10:47:03 +00001020 IndentedScope prop(this, prop_kind);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001021 PrintIndentedVisit("KEY", node->properties()->at(i)->key());
1022 PrintIndentedVisit("VALUE", node->properties()->at(i)->value());
1023 }
1024}
1025
1026
1027void AstPrinter::VisitArrayLiteral(ArrayLiteral* node) {
fschneider@chromium.org7979bbb2011-03-28 10:47:03 +00001028 IndentedScope indent(this, "ARRAY LITERAL");
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001029 if (node->values()->length() > 0) {
fschneider@chromium.org7979bbb2011-03-28 10:47:03 +00001030 IndentedScope indent(this, "VALUES");
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001031 for (int i = 0; i < node->values()->length(); i++) {
1032 Visit(node->values()->at(i));
1033 }
1034 }
1035}
1036
1037
ulan@chromium.org57ff8812013-05-10 08:16:55 +00001038// TODO(svenpanne) Start with IndentedScope.
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001039void AstPrinter::VisitVariableProxy(VariableProxy* node) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001040 Variable* var = node->var();
kmillikin@chromium.org83e16822011-09-13 08:21:47 +00001041 EmbeddedVector<char, 128> buf;
1042 int pos = OS::SNPrintF(buf, "VAR PROXY");
1043 switch (var->location()) {
1044 case Variable::UNALLOCATED:
1045 break;
1046 case Variable::PARAMETER:
1047 OS::SNPrintF(buf + pos, " parameter[%d]", var->index());
1048 break;
1049 case Variable::LOCAL:
1050 OS::SNPrintF(buf + pos, " local[%d]", var->index());
1051 break;
1052 case Variable::CONTEXT:
1053 OS::SNPrintF(buf + pos, " context[%d]", var->index());
1054 break;
1055 case Variable::LOOKUP:
1056 OS::SNPrintF(buf + pos, " lookup");
1057 break;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001058 }
kmillikin@chromium.org83e16822011-09-13 08:21:47 +00001059 PrintLiteralWithModeIndented(buf.start(), var, node->name());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001060}
1061
1062
1063void AstPrinter::VisitAssignment(Assignment* node) {
ulan@chromium.org57ff8812013-05-10 08:16:55 +00001064 IndentedScope indent(this, Token::Name(node->op()));
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001065 Visit(node->target());
1066 Visit(node->value());
1067}
1068
1069
mstarzinger@chromium.orgf705b502013-04-04 11:38:09 +00001070void AstPrinter::VisitYield(Yield* node) {
ulan@chromium.org57ff8812013-05-10 08:16:55 +00001071 IndentedScope indent(this, "YIELD");
1072 Visit(node->expression());
mstarzinger@chromium.orgf705b502013-04-04 11:38:09 +00001073}
1074
1075
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001076void AstPrinter::VisitThrow(Throw* node) {
ulan@chromium.org57ff8812013-05-10 08:16:55 +00001077 IndentedScope indent(this, "THROW");
1078 Visit(node->exception());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001079}
1080
1081
1082void AstPrinter::VisitProperty(Property* node) {
ulan@chromium.org57ff8812013-05-10 08:16:55 +00001083 IndentedScope indent(this, "PROPERTY");
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001084 Visit(node->obj());
1085 Literal* literal = node->key()->AsLiteral();
yangguo@chromium.org4a9f6552013-03-04 14:46:33 +00001086 if (literal != NULL && literal->handle()->IsInternalizedString()) {
kasperl@chromium.org2d18d102009-04-15 13:27:32 +00001087 PrintLiteralIndented("NAME", literal->handle(), false);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001088 } else {
1089 PrintIndentedVisit("KEY", node->key());
1090 }
1091}
1092
1093
1094void AstPrinter::VisitCall(Call* node) {
fschneider@chromium.org7979bbb2011-03-28 10:47:03 +00001095 IndentedScope indent(this, "CALL");
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001096 Visit(node->expression());
1097 PrintArguments(node->arguments());
1098}
1099
1100
1101void AstPrinter::VisitCallNew(CallNew* node) {
fschneider@chromium.org7979bbb2011-03-28 10:47:03 +00001102 IndentedScope indent(this, "CALL NEW");
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001103 Visit(node->expression());
1104 PrintArguments(node->arguments());
1105}
1106
1107
1108void AstPrinter::VisitCallRuntime(CallRuntime* node) {
ulan@chromium.org57ff8812013-05-10 08:16:55 +00001109 IndentedScope indent(this, "CALL RUNTIME");
1110 PrintLiteralIndented("NAME", node->name(), false);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001111 PrintArguments(node->arguments());
1112}
1113
1114
1115void AstPrinter::VisitUnaryOperation(UnaryOperation* node) {
ulan@chromium.org57ff8812013-05-10 08:16:55 +00001116 IndentedScope indent(this, Token::Name(node->op()));
1117 Visit(node->expression());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001118}
1119
1120
1121void AstPrinter::VisitCountOperation(CountOperation* node) {
kasperl@chromium.orgb9123622008-09-17 14:05:56 +00001122 EmbeddedVector<char, 128> buf;
karlklose@chromium.org44bc7082011-04-11 12:33:05 +00001123 OS::SNPrintF(buf, "%s %s", (node->is_prefix() ? "PRE" : "POST"),
1124 Token::Name(node->op()));
ulan@chromium.org57ff8812013-05-10 08:16:55 +00001125 IndentedScope indent(this, buf.start());
1126 Visit(node->expression());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001127}
1128
1129
1130void AstPrinter::VisitBinaryOperation(BinaryOperation* node) {
ulan@chromium.org57ff8812013-05-10 08:16:55 +00001131 IndentedScope indent(this, Token::Name(node->op()));
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001132 Visit(node->left());
1133 Visit(node->right());
1134}
1135
1136
1137void AstPrinter::VisitCompareOperation(CompareOperation* node) {
ulan@chromium.org57ff8812013-05-10 08:16:55 +00001138 IndentedScope indent(this, Token::Name(node->op()));
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001139 Visit(node->left());
1140 Visit(node->right());
1141}
1142
1143
1144void AstPrinter::VisitThisFunction(ThisFunction* node) {
fschneider@chromium.org7979bbb2011-03-28 10:47:03 +00001145 IndentedScope indent(this, "THIS-FUNCTION");
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001146}
1147
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001148#endif // DEBUG
1149
1150} } // namespace v8::internal