OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #include "src/accessors.h" | 7 #include "src/accessors.h" |
8 #include "src/bootstrapper.h" | 8 #include "src/bootstrapper.h" |
9 #include "src/messages.h" | 9 #include "src/messages.h" |
10 #include "src/parser.h" | 10 #include "src/parser.h" |
(...skipping 447 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
458 if (var != NULL) return var; | 458 if (var != NULL) return var; |
459 } | 459 } |
460 return NULL; | 460 return NULL; |
461 } | 461 } |
462 | 462 |
463 | 463 |
464 Variable* Scope::DeclareParameter(const AstRawString* name, VariableMode mode, | 464 Variable* Scope::DeclareParameter(const AstRawString* name, VariableMode mode, |
465 bool is_rest, bool* is_duplicate) { | 465 bool is_rest, bool* is_duplicate) { |
466 DCHECK(!already_resolved()); | 466 DCHECK(!already_resolved()); |
467 DCHECK(is_function_scope()); | 467 DCHECK(is_function_scope()); |
468 | |
469 Variable* var; | 468 Variable* var; |
470 if (!name->IsEmpty()) { | 469 if (mode == TEMPORARY) { |
| 470 var = NewTemporary(name); |
| 471 } else { |
471 var = variables_.Declare(this, name, mode, Variable::NORMAL, | 472 var = variables_.Declare(this, name, mode, Variable::NORMAL, |
472 kCreatedInitialized); | 473 kCreatedInitialized); |
473 // TODO(wingo): Avoid O(n^2) check. | 474 // TODO(wingo): Avoid O(n^2) check. |
474 *is_duplicate = IsDeclaredParameter(name); | 475 *is_duplicate = IsDeclaredParameter(name); |
475 } else { | |
476 var = new (zone()) | |
477 Variable(this, name, TEMPORARY, Variable::NORMAL, kCreatedInitialized); | |
478 } | 476 } |
479 if (is_rest) { | 477 if (is_rest) { |
480 DCHECK_NULL(rest_parameter_); | 478 DCHECK_NULL(rest_parameter_); |
481 rest_parameter_ = var; | 479 rest_parameter_ = var; |
482 rest_index_ = num_parameters(); | 480 rest_index_ = num_parameters(); |
483 } | 481 } |
484 params_.Add(var, zone()); | 482 params_.Add(var, zone()); |
485 return var; | 483 return var; |
486 } | 484 } |
487 | 485 |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
613 DCHECK(context_globals != NULL); | 611 DCHECK(context_globals != NULL); |
614 | 612 |
615 // Collect temporaries which are always allocated on the stack, unless the | 613 // Collect temporaries which are always allocated on the stack, unless the |
616 // context as a whole has forced context allocation. | 614 // context as a whole has forced context allocation. |
617 for (int i = 0; i < temps_.length(); i++) { | 615 for (int i = 0; i < temps_.length(); i++) { |
618 Variable* var = temps_[i]; | 616 Variable* var = temps_[i]; |
619 if (var->is_used()) { | 617 if (var->is_used()) { |
620 if (var->IsContextSlot()) { | 618 if (var->IsContextSlot()) { |
621 DCHECK(has_forced_context_allocation()); | 619 DCHECK(has_forced_context_allocation()); |
622 context_locals->Add(var, zone()); | 620 context_locals->Add(var, zone()); |
| 621 } else if (var->IsStackLocal()) { |
| 622 stack_locals->Add(var, zone()); |
623 } else { | 623 } else { |
624 DCHECK(var->IsStackLocal()); | 624 DCHECK(var->IsParameter()); |
625 stack_locals->Add(var, zone()); | |
626 } | 625 } |
627 } | 626 } |
628 } | 627 } |
629 | 628 |
630 // Collect declared local variables. | 629 // Collect declared local variables. |
631 ZoneList<VarAndOrder> vars(variables_.occupancy(), zone()); | 630 ZoneList<VarAndOrder> vars(variables_.occupancy(), zone()); |
632 for (VariableMap::Entry* p = variables_.Start(); | 631 for (VariableMap::Entry* p = variables_.Start(); |
633 p != NULL; | 632 p != NULL; |
634 p = variables_.Next(p)) { | 633 p = variables_.Next(p)) { |
635 Variable* var = reinterpret_cast<Variable*>(p->value); | 634 Variable* var = reinterpret_cast<Variable*>(p->value); |
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
855 PrintF("lookup"); | 854 PrintF("lookup"); |
856 break; | 855 break; |
857 } | 856 } |
858 } | 857 } |
859 | 858 |
860 | 859 |
861 static void PrintVar(int indent, Variable* var) { | 860 static void PrintVar(int indent, Variable* var) { |
862 if (var->is_used() || !var->IsUnallocated()) { | 861 if (var->is_used() || !var->IsUnallocated()) { |
863 Indent(indent, Variable::Mode2String(var->mode())); | 862 Indent(indent, Variable::Mode2String(var->mode())); |
864 PrintF(" "); | 863 PrintF(" "); |
865 PrintName(var->raw_name()); | 864 if (var->raw_name()->IsEmpty()) |
| 865 PrintF(".%p", var); |
| 866 else |
| 867 PrintName(var->raw_name()); |
866 PrintF("; // "); | 868 PrintF("; // "); |
867 PrintLocation(var); | 869 PrintLocation(var); |
868 bool comma = !var->IsUnallocated(); | 870 bool comma = !var->IsUnallocated(); |
869 if (var->has_forced_context_allocation()) { | 871 if (var->has_forced_context_allocation()) { |
870 if (comma) PrintF(", "); | 872 if (comma) PrintF(", "); |
871 PrintF("forced context allocation"); | 873 PrintF("forced context allocation"); |
872 comma = true; | 874 comma = true; |
873 } | 875 } |
874 if (var->maybe_assigned() == kMaybeAssigned) { | 876 if (var->maybe_assigned() == kMaybeAssigned) { |
875 if (comma) PrintF(", "); | 877 if (comma) PrintF(", "); |
(...skipping 25 matching lines...) Expand all Loading... |
901 if (!scope_name_->IsEmpty()) { | 903 if (!scope_name_->IsEmpty()) { |
902 PrintF(" "); | 904 PrintF(" "); |
903 PrintName(scope_name_); | 905 PrintName(scope_name_); |
904 } | 906 } |
905 | 907 |
906 // Print parameters, if any. | 908 // Print parameters, if any. |
907 if (is_function_scope()) { | 909 if (is_function_scope()) { |
908 PrintF(" ("); | 910 PrintF(" ("); |
909 for (int i = 0; i < params_.length(); i++) { | 911 for (int i = 0; i < params_.length(); i++) { |
910 if (i > 0) PrintF(", "); | 912 if (i > 0) PrintF(", "); |
911 PrintName(params_[i]->raw_name()); | 913 const AstRawString* name = params_[i]->raw_name(); |
| 914 if (name->IsEmpty()) |
| 915 PrintF(".%p", params_[i]); |
| 916 else |
| 917 PrintName(name); |
912 } | 918 } |
913 PrintF(")"); | 919 PrintF(")"); |
914 } | 920 } |
915 | 921 |
916 PrintF(" { // (%d, %d)\n", start_position(), end_position()); | 922 PrintF(" { // (%d, %d)\n", start_position(), end_position()); |
917 | 923 |
918 // Function name, if any (named function literals, only). | 924 // Function name, if any (named function literals, only). |
919 if (function_ != NULL) { | 925 if (function_ != NULL) { |
920 Indent(n1, "// (local) function name: "); | 926 Indent(n1, "// (local) function name: "); |
921 PrintName(function_->proxy()->raw_name()); | 927 PrintName(function_->proxy()->raw_name()); |
(...skipping 677 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1599 function_ != NULL && function_->proxy()->var()->IsContextSlot(); | 1605 function_ != NULL && function_->proxy()->var()->IsContextSlot(); |
1600 return num_heap_slots() - Context::MIN_CONTEXT_SLOTS - num_global_slots() - | 1606 return num_heap_slots() - Context::MIN_CONTEXT_SLOTS - num_global_slots() - |
1601 (is_function_var_in_context ? 1 : 0); | 1607 (is_function_var_in_context ? 1 : 0); |
1602 } | 1608 } |
1603 | 1609 |
1604 | 1610 |
1605 int Scope::ContextGlobalCount() const { return num_global_slots(); } | 1611 int Scope::ContextGlobalCount() const { return num_global_slots(); } |
1606 | 1612 |
1607 } // namespace internal | 1613 } // namespace internal |
1608 } // namespace v8 | 1614 } // namespace v8 |
OLD | NEW |