| 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/scopes.h" | 7 #include "src/scopes.h" |
| 8 | 8 |
| 9 #include "src/accessors.h" | 9 #include "src/accessors.h" |
| 10 #include "src/bootstrapper.h" | 10 #include "src/bootstrapper.h" |
| (...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 153 scope_type_ = scope_type; | 153 scope_type_ = scope_type; |
| 154 scope_name_ = ast_value_factory_->empty_string(); | 154 scope_name_ = ast_value_factory_->empty_string(); |
| 155 dynamics_ = NULL; | 155 dynamics_ = NULL; |
| 156 receiver_ = NULL; | 156 receiver_ = NULL; |
| 157 function_ = NULL; | 157 function_ = NULL; |
| 158 arguments_ = NULL; | 158 arguments_ = NULL; |
| 159 illegal_redecl_ = NULL; | 159 illegal_redecl_ = NULL; |
| 160 scope_inside_with_ = false; | 160 scope_inside_with_ = false; |
| 161 scope_contains_with_ = false; | 161 scope_contains_with_ = false; |
| 162 scope_calls_eval_ = false; | 162 scope_calls_eval_ = false; |
| 163 scope_uses_this_ = false; |
| 164 scope_uses_arguments_ = false; |
| 163 asm_module_ = false; | 165 asm_module_ = false; |
| 164 asm_function_ = outer_scope != NULL && outer_scope->asm_module_; | 166 asm_function_ = outer_scope != NULL && outer_scope->asm_module_; |
| 165 // Inherit the strict mode from the parent scope. | 167 // Inherit the strict mode from the parent scope. |
| 166 strict_mode_ = outer_scope != NULL ? outer_scope->strict_mode_ : SLOPPY; | 168 strict_mode_ = outer_scope != NULL ? outer_scope->strict_mode_ : SLOPPY; |
| 167 outer_scope_calls_sloppy_eval_ = false; | 169 outer_scope_calls_sloppy_eval_ = false; |
| 168 inner_scope_calls_eval_ = false; | 170 inner_scope_calls_eval_ = false; |
| 171 inner_scope_uses_this_ = false; |
| 172 inner_scope_uses_arguments_ = false; |
| 169 force_eager_compilation_ = false; | 173 force_eager_compilation_ = false; |
| 170 force_context_allocation_ = (outer_scope != NULL && !is_function_scope()) | 174 force_context_allocation_ = (outer_scope != NULL && !is_function_scope()) |
| 171 ? outer_scope->has_forced_context_allocation() : false; | 175 ? outer_scope->has_forced_context_allocation() : false; |
| 172 num_var_or_const_ = 0; | 176 num_var_or_const_ = 0; |
| 173 num_stack_slots_ = 0; | 177 num_stack_slots_ = 0; |
| 174 num_heap_slots_ = 0; | 178 num_heap_slots_ = 0; |
| 175 num_modules_ = 0; | 179 num_modules_ = 0; |
| 176 module_var_ = NULL, | 180 module_var_ = NULL, |
| 177 scope_info_ = scope_info; | 181 scope_info_ = scope_info; |
| 178 start_position_ = RelocInfo::kNoPosition; | 182 start_position_ = RelocInfo::kNoPosition; |
| (...skipping 593 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 772 #ifdef DEBUG | 776 #ifdef DEBUG |
| 773 static const char* Header(ScopeType scope_type) { | 777 static const char* Header(ScopeType scope_type) { |
| 774 switch (scope_type) { | 778 switch (scope_type) { |
| 775 case EVAL_SCOPE: return "eval"; | 779 case EVAL_SCOPE: return "eval"; |
| 776 case FUNCTION_SCOPE: return "function"; | 780 case FUNCTION_SCOPE: return "function"; |
| 777 case MODULE_SCOPE: return "module"; | 781 case MODULE_SCOPE: return "module"; |
| 778 case GLOBAL_SCOPE: return "global"; | 782 case GLOBAL_SCOPE: return "global"; |
| 779 case CATCH_SCOPE: return "catch"; | 783 case CATCH_SCOPE: return "catch"; |
| 780 case BLOCK_SCOPE: return "block"; | 784 case BLOCK_SCOPE: return "block"; |
| 781 case WITH_SCOPE: return "with"; | 785 case WITH_SCOPE: return "with"; |
| 786 case ARROW_SCOPE: return "arrow"; |
| 782 } | 787 } |
| 783 UNREACHABLE(); | 788 UNREACHABLE(); |
| 784 return NULL; | 789 return NULL; |
| 785 } | 790 } |
| 786 | 791 |
| 787 | 792 |
| 788 static void Indent(int n, const char* str) { | 793 static void Indent(int n, const char* str) { |
| 789 PrintF("%*s%s", n, "", str); | 794 PrintF("%*s%s", n, "", str); |
| 790 } | 795 } |
| 791 | 796 |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 878 // Scope info. | 883 // Scope info. |
| 879 if (HasTrivialOuterContext()) { | 884 if (HasTrivialOuterContext()) { |
| 880 Indent(n1, "// scope has trivial outer context\n"); | 885 Indent(n1, "// scope has trivial outer context\n"); |
| 881 } | 886 } |
| 882 if (strict_mode() == STRICT) { | 887 if (strict_mode() == STRICT) { |
| 883 Indent(n1, "// strict mode scope\n"); | 888 Indent(n1, "// strict mode scope\n"); |
| 884 } | 889 } |
| 885 if (scope_inside_with_) Indent(n1, "// scope inside 'with'\n"); | 890 if (scope_inside_with_) Indent(n1, "// scope inside 'with'\n"); |
| 886 if (scope_contains_with_) Indent(n1, "// scope contains 'with'\n"); | 891 if (scope_contains_with_) Indent(n1, "// scope contains 'with'\n"); |
| 887 if (scope_calls_eval_) Indent(n1, "// scope calls 'eval'\n"); | 892 if (scope_calls_eval_) Indent(n1, "// scope calls 'eval'\n"); |
| 893 if (scope_uses_this_) Indent(n1, "// scope uses 'this'\n"); |
| 894 if (scope_uses_arguments_) Indent(n1, "// scope uses 'arguments'\n"); |
| 895 if (inner_scope_uses_this_) Indent(n1, "// inner scope uses 'this'\n"); |
| 896 if (inner_scope_uses_arguments_) { |
| 897 Indent(n1, "// inner scope uses 'arguments'\n"); |
| 898 } |
| 888 if (outer_scope_calls_sloppy_eval_) { | 899 if (outer_scope_calls_sloppy_eval_) { |
| 889 Indent(n1, "// outer scope calls 'eval' in sloppy context\n"); | 900 Indent(n1, "// outer scope calls 'eval' in sloppy context\n"); |
| 890 } | 901 } |
| 891 if (inner_scope_calls_eval_) Indent(n1, "// inner scope calls 'eval'\n"); | 902 if (inner_scope_calls_eval_) Indent(n1, "// inner scope calls 'eval'\n"); |
| 892 if (num_stack_slots_ > 0) { Indent(n1, "// "); | 903 if (num_stack_slots_ > 0) { Indent(n1, "// "); |
| 893 PrintF("%d stack slots\n", num_stack_slots_); } | 904 PrintF("%d stack slots\n", num_stack_slots_); } |
| 894 if (num_heap_slots_ > 0) { Indent(n1, "// "); | 905 if (num_heap_slots_ > 0) { Indent(n1, "// "); |
| 895 PrintF("%d heap slots\n", num_heap_slots_); } | 906 PrintF("%d heap slots\n", num_heap_slots_); } |
| 896 | 907 |
| 897 // Print locals. | 908 // Print locals. |
| (...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1159 } | 1170 } |
| 1160 | 1171 |
| 1161 bool calls_sloppy_eval = | 1172 bool calls_sloppy_eval = |
| 1162 this->calls_sloppy_eval() || outer_scope_calls_sloppy_eval_; | 1173 this->calls_sloppy_eval() || outer_scope_calls_sloppy_eval_; |
| 1163 for (int i = 0; i < inner_scopes_.length(); i++) { | 1174 for (int i = 0; i < inner_scopes_.length(); i++) { |
| 1164 Scope* inner = inner_scopes_[i]; | 1175 Scope* inner = inner_scopes_[i]; |
| 1165 inner->PropagateScopeInfo(calls_sloppy_eval); | 1176 inner->PropagateScopeInfo(calls_sloppy_eval); |
| 1166 if (inner->scope_calls_eval_ || inner->inner_scope_calls_eval_) { | 1177 if (inner->scope_calls_eval_ || inner->inner_scope_calls_eval_) { |
| 1167 inner_scope_calls_eval_ = true; | 1178 inner_scope_calls_eval_ = true; |
| 1168 } | 1179 } |
| 1180 // If the inner scope is an arrow function, propagate the flags tracking |
| 1181 // usage of this/arguments, but do not propagate them out from normal |
| 1182 // functions. |
| 1183 if (!inner->is_function_scope() || inner->is_arrow_scope()) { |
| 1184 if (inner->scope_uses_this_ || inner->inner_scope_uses_this_) { |
| 1185 inner_scope_uses_this_ = true; |
| 1186 } |
| 1187 if (inner->scope_uses_arguments_ || inner->inner_scope_uses_arguments_) { |
| 1188 inner_scope_uses_arguments_ = true; |
| 1189 } |
| 1190 } |
| 1169 if (inner->force_eager_compilation_) { | 1191 if (inner->force_eager_compilation_) { |
| 1170 force_eager_compilation_ = true; | 1192 force_eager_compilation_ = true; |
| 1171 } | 1193 } |
| 1172 if (asm_module_ && inner->scope_type() == FUNCTION_SCOPE) { | 1194 if (asm_module_ && inner->scope_type() == FUNCTION_SCOPE) { |
| 1173 inner->asm_function_ = true; | 1195 inner->asm_function_ = true; |
| 1174 } | 1196 } |
| 1175 } | 1197 } |
| 1176 } | 1198 } |
| 1177 | 1199 |
| 1178 | 1200 |
| (...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1402 } | 1424 } |
| 1403 | 1425 |
| 1404 | 1426 |
| 1405 int Scope::ContextLocalCount() const { | 1427 int Scope::ContextLocalCount() const { |
| 1406 if (num_heap_slots() == 0) return 0; | 1428 if (num_heap_slots() == 0) return 0; |
| 1407 return num_heap_slots() - Context::MIN_CONTEXT_SLOTS - | 1429 return num_heap_slots() - Context::MIN_CONTEXT_SLOTS - |
| 1408 (function_ != NULL && function_->proxy()->var()->IsContextSlot() ? 1 : 0); | 1430 (function_ != NULL && function_->proxy()->var()->IsContextSlot() ? 1 : 0); |
| 1409 } | 1431 } |
| 1410 | 1432 |
| 1411 } } // namespace v8::internal | 1433 } } // namespace v8::internal |
| OLD | NEW |