| OLD | NEW |
| 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "vm/ast_printer.h" | 5 #include "vm/ast_printer.h" |
| 6 | 6 |
| 7 #include "vm/handles.h" | 7 #include "vm/handles.h" |
| 8 #include "vm/object.h" | 8 #include "vm/object.h" |
| 9 #include "vm/os.h" | 9 #include "vm/os.h" |
| 10 #include "vm/parser.h" | 10 #include "vm/parser.h" |
| (...skipping 392 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 403 | 403 |
| 404 | 404 |
| 405 void AstPrinter::PrintNode(AstNode* node) { | 405 void AstPrinter::PrintNode(AstNode* node) { |
| 406 ASSERT(node != NULL); | 406 ASSERT(node != NULL); |
| 407 AstPrinter ast_printer; | 407 AstPrinter ast_printer; |
| 408 node->Visit(&ast_printer); | 408 node->Visit(&ast_printer); |
| 409 OS::Print("\n"); | 409 OS::Print("\n"); |
| 410 } | 410 } |
| 411 | 411 |
| 412 | 412 |
| 413 static void IndentN(int count) { |
| 414 for (int i = 0; i < count; i++) { |
| 415 OS::Print(" "); |
| 416 } |
| 417 } |
| 418 |
| 419 |
| 413 void AstPrinter::PrintLocalScopeVariable(const LocalScope* scope, | 420 void AstPrinter::PrintLocalScopeVariable(const LocalScope* scope, |
| 414 LocalVariable* var) { | 421 LocalVariable* var, |
| 422 int indent) { |
| 415 ASSERT(scope != NULL); | 423 ASSERT(scope != NULL); |
| 416 ASSERT(var != NULL); | 424 ASSERT(var != NULL); |
| 425 IndentN(indent); |
| 417 OS::Print("(%s%s '%s'", | 426 OS::Print("(%s%s '%s'", |
| 418 var->is_final() ? "final " : "", | 427 var->is_final() ? "final " : "", |
| 419 String::Handle(var->type().Name()).ToCString(), | 428 String::Handle(var->type().Name()).ToCString(), |
| 420 var->name().ToCString()); | 429 var->name().ToCString()); |
| 421 if (var->owner() != scope) { | 430 if (var->owner() != scope) { |
| 422 OS::Print(" alias"); | 431 OS::Print(" alias"); |
| 423 } | 432 } |
| 424 if (var->HasIndex()) { | 433 if (var->HasIndex()) { |
| 425 OS::Print(" @%d", var->index()); | 434 OS::Print(" @%d", var->index()); |
| 426 if (var->is_captured()) { | 435 if (var->is_captured()) { |
| 427 OS::Print(" ctx %d", var->owner()->context_level()); | 436 OS::Print(" ctx %d", var->owner()->context_level()); |
| 428 } | 437 } |
| 429 } else if (var->owner()->function_level() != 0) { | 438 } else if (var->owner()->function_level() != 0) { |
| 430 OS::Print(" lev %d", var->owner()->function_level()); | 439 OS::Print(" lev %d", var->owner()->function_level()); |
| 431 } | 440 } |
| 432 OS::Print(" valid %" Pd "-%" Pd ")", | 441 OS::Print(" valid %" Pd "-%" Pd ")\n", |
| 433 var->token_pos(), | 442 var->token_pos(), |
| 434 scope->end_token_pos()); | 443 scope->end_token_pos()); |
| 435 } | 444 } |
| 436 | 445 |
| 437 | 446 |
| 438 void AstPrinter::PrintLocalScope(const LocalScope* scope, | 447 void AstPrinter::PrintLocalScope(const LocalScope* scope, |
| 439 int start_index) { | 448 int start_index, |
| 449 int indent) { |
| 440 ASSERT(scope != NULL); | 450 ASSERT(scope != NULL); |
| 441 for (int i = start_index; i < scope->num_variables(); i++) { | 451 for (int i = start_index; i < scope->num_variables(); i++) { |
| 442 LocalVariable* var = scope->VariableAt(i); | 452 LocalVariable* var = scope->VariableAt(i); |
| 443 PrintLocalScopeVariable(scope, var); | 453 PrintLocalScopeVariable(scope, var, indent); |
| 444 } | 454 } |
| 445 const LocalScope* child = scope->child(); | 455 const LocalScope* child = scope->child(); |
| 446 while (child != NULL) { | 456 while (child != NULL) { |
| 457 IndentN(indent); |
| 447 OS::Print("{scope %p ", child); | 458 OS::Print("{scope %p ", child); |
| 448 if (child->HasContextLevel()) { | 459 if (child->HasContextLevel()) { |
| 449 OS::Print("ctx %d numctxvar %d ", | 460 OS::Print("ctx %d numctxvar %d ", |
| 450 child->context_level(), | 461 child->context_level(), |
| 451 child->num_context_variables()); | 462 child->num_context_variables()); |
| 452 } | 463 } |
| 453 OS::Print("llev %d ", child->loop_level()); | 464 OS::Print("llev %d\n", child->loop_level()); |
| 454 PrintLocalScope(child, 0); | 465 PrintLocalScope(child, 0, indent + kScopeIndent); |
| 455 OS::Print("}"); | 466 IndentN(indent); |
| 467 OS::Print("}\n"); |
| 456 child = child->sibling(); | 468 child = child->sibling(); |
| 457 } | 469 } |
| 458 } | 470 } |
| 459 | 471 |
| 460 | 472 |
| 461 void AstPrinter::PrintFunctionScope(const ParsedFunction& parsed_function) { | 473 void AstPrinter::PrintFunctionScope(const ParsedFunction& parsed_function) { |
| 462 HANDLESCOPE(Isolate::Current()); | 474 HANDLESCOPE(Isolate::Current()); |
| 463 const Function& function = parsed_function.function(); | 475 const Function& function = parsed_function.function(); |
| 464 const Array& default_parameter_values = | 476 const Array& default_parameter_values = |
| 465 parsed_function.default_parameter_values(); | 477 parsed_function.default_parameter_values(); |
| 466 SequenceNode* node_sequence = parsed_function.node_sequence(); | 478 SequenceNode* node_sequence = parsed_function.node_sequence(); |
| 467 ASSERT(node_sequence != NULL); | 479 ASSERT(node_sequence != NULL); |
| 468 const LocalScope* scope = node_sequence->scope(); | 480 const LocalScope* scope = node_sequence->scope(); |
| 469 ASSERT(scope != NULL); | 481 ASSERT(scope != NULL); |
| 470 const char* function_name = function.ToFullyQualifiedCString(); | 482 const char* function_name = function.ToFullyQualifiedCString(); |
| 471 OS::Print("Scope for function '%s' {scope %p ", function_name, scope); | 483 OS::Print("Scope for function '%s'\n{scope %p ", function_name, scope); |
| 472 if (scope->HasContextLevel()) { | 484 if (scope->HasContextLevel()) { |
| 473 OS::Print("ctx %d numctxvar %d ", | 485 OS::Print("ctx %d numctxvar %d ", |
| 474 scope->context_level(), | 486 scope->context_level(), |
| 475 scope->num_context_variables()); | 487 scope->num_context_variables()); |
| 476 } | 488 } |
| 477 OS::Print("llev %d ", scope->loop_level()); | 489 OS::Print("llev %d\n", scope->loop_level()); |
| 478 const int num_fixed_params = function.num_fixed_parameters(); | 490 const int num_fixed_params = function.num_fixed_parameters(); |
| 479 const int num_params = num_fixed_params + function.NumOptionalParameters(); | 491 const int num_params = num_fixed_params + function.NumOptionalParameters(); |
| 480 // Parameters must be listed first and must all appear in the top scope. | 492 // Parameters must be listed first and must all appear in the top scope. |
| 481 ASSERT(num_params <= scope->num_variables()); | 493 ASSERT(num_params <= scope->num_variables()); |
| 482 int pos = 0; // Current position of variable in scope. | 494 int pos = 0; // Current position of variable in scope. |
| 495 int indent = kScopeIndent; |
| 483 while (pos < num_params) { | 496 while (pos < num_params) { |
| 484 LocalVariable* param = scope->VariableAt(pos); | 497 LocalVariable* param = scope->VariableAt(pos); |
| 485 ASSERT(param->owner() == scope); // No aliases should precede parameters. | 498 ASSERT(param->owner() == scope); // No aliases should precede parameters. |
| 499 IndentN(indent); |
| 486 OS::Print("(param %s%s '%s'", | 500 OS::Print("(param %s%s '%s'", |
| 487 param->is_final() ? "final " : "", | 501 param->is_final() ? "final " : "", |
| 488 String::Handle(param->type().Name()).ToCString(), | 502 String::Handle(param->type().Name()).ToCString(), |
| 489 param->name().ToCString()); | 503 param->name().ToCString()); |
| 490 // Print the default value if the parameter is optional. | 504 // Print the default value if the parameter is optional. |
| 491 if (pos >= num_fixed_params && pos < num_params) { | 505 if (pos >= num_fixed_params && pos < num_params) { |
| 492 const Object& default_parameter_value = Object::Handle( | 506 const Object& default_parameter_value = Object::Handle( |
| 493 default_parameter_values.At(pos - num_fixed_params)); | 507 default_parameter_values.At(pos - num_fixed_params)); |
| 494 OS::Print(" =%s", default_parameter_value.ToCString()); | 508 OS::Print(" =%s", default_parameter_value.ToCString()); |
| 495 } | 509 } |
| 496 if (param->HasIndex()) { | 510 if (param->HasIndex()) { |
| 497 OS::Print(" @%d", param->index()); | 511 OS::Print(" @%d", param->index()); |
| 498 if (param->is_captured()) { | 512 if (param->is_captured()) { |
| 499 OS::Print(" ctx %d", param->owner()->context_level()); | 513 OS::Print(" ctx %d", param->owner()->context_level()); |
| 500 } | 514 } |
| 501 } | 515 } |
| 502 OS::Print(" valid %" Pd "-%" Pd ")", | 516 OS::Print(" valid %" Pd "-%" Pd ")\n", |
| 503 param->token_pos(), | 517 param->token_pos(), |
| 504 scope->end_token_pos()); | 518 scope->end_token_pos()); |
| 505 pos++; | 519 pos++; |
| 506 } | 520 } |
| 507 // Visit remaining non-parameter variables and children scopes. | 521 // Visit remaining non-parameter variables and children scopes. |
| 508 PrintLocalScope(scope, pos); | 522 PrintLocalScope(scope, pos, indent); |
| 509 OS::Print("}\n"); | 523 OS::Print("}\n"); |
| 510 } | 524 } |
| 511 | 525 |
| 512 | 526 |
| 513 void AstPrinter::PrintFunctionNodes(const ParsedFunction& parsed_function) { | 527 void AstPrinter::PrintFunctionNodes(const ParsedFunction& parsed_function) { |
| 514 HANDLESCOPE(Isolate::Current()); | 528 HANDLESCOPE(Isolate::Current()); |
| 515 SequenceNode* node_sequence = parsed_function.node_sequence(); | 529 SequenceNode* node_sequence = parsed_function.node_sequence(); |
| 516 ASSERT(node_sequence != NULL); | 530 ASSERT(node_sequence != NULL); |
| 517 AstPrinter ast_printer; | 531 AstPrinter ast_printer; |
| 518 const char* function_name = | 532 const char* function_name = |
| 519 parsed_function.function().ToFullyQualifiedCString(); | 533 parsed_function.function().ToFullyQualifiedCString(); |
| 520 OS::Print("Ast for function '%s' {\n", function_name); | 534 OS::Print("Ast for function '%s' {\n", function_name); |
| 521 node_sequence->Visit(&ast_printer); | 535 node_sequence->Visit(&ast_printer); |
| 522 OS::Print("}\n"); | 536 OS::Print("}\n"); |
| 523 } | 537 } |
| 524 | 538 |
| 525 } // namespace dart | 539 } // namespace dart |
| OLD | NEW |