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 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
150 receiver_ = NULL; | 150 receiver_ = NULL; |
151 new_target_ = nullptr; | 151 new_target_ = nullptr; |
152 function_ = NULL; | 152 function_ = NULL; |
153 arguments_ = NULL; | 153 arguments_ = NULL; |
154 illegal_redecl_ = NULL; | 154 illegal_redecl_ = NULL; |
155 scope_inside_with_ = false; | 155 scope_inside_with_ = false; |
156 scope_contains_with_ = false; | 156 scope_contains_with_ = false; |
157 scope_calls_eval_ = false; | 157 scope_calls_eval_ = false; |
158 scope_uses_arguments_ = false; | 158 scope_uses_arguments_ = false; |
159 scope_uses_super_property_ = false; | 159 scope_uses_super_property_ = false; |
160 scope_uses_super_constructor_call_ = false; | |
161 scope_uses_this_ = false; | 160 scope_uses_this_ = false; |
162 asm_module_ = false; | 161 asm_module_ = false; |
163 asm_function_ = outer_scope != NULL && outer_scope->asm_module_; | 162 asm_function_ = outer_scope != NULL && outer_scope->asm_module_; |
164 // Inherit the language mode from the parent scope. | 163 // Inherit the language mode from the parent scope. |
165 language_mode_ = outer_scope != NULL ? outer_scope->language_mode_ : SLOPPY; | 164 language_mode_ = outer_scope != NULL ? outer_scope->language_mode_ : SLOPPY; |
166 outer_scope_calls_sloppy_eval_ = false; | 165 outer_scope_calls_sloppy_eval_ = false; |
167 inner_scope_calls_eval_ = false; | 166 inner_scope_calls_eval_ = false; |
168 inner_scope_uses_arguments_ = false; | 167 inner_scope_uses_arguments_ = false; |
169 inner_scope_uses_this_ = false; | 168 inner_scope_uses_this_ = false; |
170 inner_scope_uses_super_property_ = false; | 169 inner_scope_uses_super_property_ = false; |
171 inner_scope_uses_super_constructor_call_ = false; | |
172 force_eager_compilation_ = false; | 170 force_eager_compilation_ = false; |
173 force_context_allocation_ = (outer_scope != NULL && !is_function_scope()) | 171 force_context_allocation_ = (outer_scope != NULL && !is_function_scope()) |
174 ? outer_scope->has_forced_context_allocation() : false; | 172 ? outer_scope->has_forced_context_allocation() : false; |
175 num_var_or_const_ = 0; | 173 num_var_or_const_ = 0; |
176 num_stack_slots_ = 0; | 174 num_stack_slots_ = 0; |
177 num_heap_slots_ = 0; | 175 num_heap_slots_ = 0; |
178 num_modules_ = 0; | 176 num_modules_ = 0; |
179 module_var_ = NULL, | 177 module_var_ = NULL, |
180 rest_parameter_ = NULL; | 178 rest_parameter_ = NULL; |
181 rest_index_ = -1; | 179 rest_index_ = -1; |
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
364 } | 362 } |
365 | 363 |
366 // Move unresolved variables | 364 // Move unresolved variables |
367 for (int i = 0; i < unresolved_.length(); i++) { | 365 for (int i = 0; i < unresolved_.length(); i++) { |
368 outer_scope()->unresolved_.Add(unresolved_[i], zone()); | 366 outer_scope()->unresolved_.Add(unresolved_[i], zone()); |
369 } | 367 } |
370 | 368 |
371 // Propagate usage flags to outer scope. | 369 // Propagate usage flags to outer scope. |
372 if (uses_arguments()) outer_scope_->RecordArgumentsUsage(); | 370 if (uses_arguments()) outer_scope_->RecordArgumentsUsage(); |
373 if (uses_super_property()) outer_scope_->RecordSuperPropertyUsage(); | 371 if (uses_super_property()) outer_scope_->RecordSuperPropertyUsage(); |
374 if (uses_super_constructor_call()) { | |
375 outer_scope_->RecordSuperConstructorCallUsage(); | |
376 } | |
377 if (uses_this()) outer_scope_->RecordThisUsage(); | 372 if (uses_this()) outer_scope_->RecordThisUsage(); |
378 | 373 |
379 return NULL; | 374 return NULL; |
380 } | 375 } |
381 | 376 |
382 | 377 |
383 Variable* Scope::LookupLocal(const AstRawString* name) { | 378 Variable* Scope::LookupLocal(const AstRawString* name) { |
384 Variable* result = variables_.Lookup(name); | 379 Variable* result = variables_.Lookup(name); |
385 if (result != NULL || scope_info_.is_null()) { | 380 if (result != NULL || scope_info_.is_null()) { |
386 return result; | 381 return result; |
(...skipping 509 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
896 Indent(n1, "// strong mode scope\n"); | 891 Indent(n1, "// strong mode scope\n"); |
897 } else if (is_strict(language_mode())) { | 892 } else if (is_strict(language_mode())) { |
898 Indent(n1, "// strict mode scope\n"); | 893 Indent(n1, "// strict mode scope\n"); |
899 } | 894 } |
900 if (scope_inside_with_) Indent(n1, "// scope inside 'with'\n"); | 895 if (scope_inside_with_) Indent(n1, "// scope inside 'with'\n"); |
901 if (scope_contains_with_) Indent(n1, "// scope contains 'with'\n"); | 896 if (scope_contains_with_) Indent(n1, "// scope contains 'with'\n"); |
902 if (scope_calls_eval_) Indent(n1, "// scope calls 'eval'\n"); | 897 if (scope_calls_eval_) Indent(n1, "// scope calls 'eval'\n"); |
903 if (scope_uses_arguments_) Indent(n1, "// scope uses 'arguments'\n"); | 898 if (scope_uses_arguments_) Indent(n1, "// scope uses 'arguments'\n"); |
904 if (scope_uses_super_property_) | 899 if (scope_uses_super_property_) |
905 Indent(n1, "// scope uses 'super' property\n"); | 900 Indent(n1, "// scope uses 'super' property\n"); |
906 if (scope_uses_super_constructor_call_) | |
907 Indent(n1, "// scope uses 'super' constructor\n"); | |
908 if (scope_uses_this_) Indent(n1, "// scope uses 'this'\n"); | 901 if (scope_uses_this_) Indent(n1, "// scope uses 'this'\n"); |
909 if (inner_scope_uses_arguments_) { | 902 if (inner_scope_uses_arguments_) { |
910 Indent(n1, "// inner scope uses 'arguments'\n"); | 903 Indent(n1, "// inner scope uses 'arguments'\n"); |
911 } | 904 } |
912 if (inner_scope_uses_super_property_) | 905 if (inner_scope_uses_super_property_) |
913 Indent(n1, "// inner scope uses 'super' property\n"); | 906 Indent(n1, "// inner scope uses 'super' property\n"); |
914 if (inner_scope_uses_super_constructor_call_) { | |
915 Indent(n1, "// inner scope uses 'super' constructor\n"); | |
916 } | |
917 if (inner_scope_uses_this_) Indent(n1, "// inner scope uses 'this'\n"); | 907 if (inner_scope_uses_this_) Indent(n1, "// inner scope uses 'this'\n"); |
918 if (outer_scope_calls_sloppy_eval_) { | 908 if (outer_scope_calls_sloppy_eval_) { |
919 Indent(n1, "// outer scope calls 'eval' in sloppy context\n"); | 909 Indent(n1, "// outer scope calls 'eval' in sloppy context\n"); |
920 } | 910 } |
921 if (inner_scope_calls_eval_) Indent(n1, "// inner scope calls 'eval'\n"); | 911 if (inner_scope_calls_eval_) Indent(n1, "// inner scope calls 'eval'\n"); |
922 if (num_stack_slots_ > 0) { Indent(n1, "// "); | 912 if (num_stack_slots_ > 0) { Indent(n1, "// "); |
923 PrintF("%d stack slots\n", num_stack_slots_); } | 913 PrintF("%d stack slots\n", num_stack_slots_); } |
924 if (num_heap_slots_ > 0) { Indent(n1, "// "); | 914 if (num_heap_slots_ > 0) { Indent(n1, "// "); |
925 PrintF("%d heap slots\n", num_heap_slots_); } | 915 PrintF("%d heap slots\n", num_heap_slots_); } |
926 | 916 |
(...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1183 // usage of arguments/super/this, but do not propagate them out from normal | 1173 // usage of arguments/super/this, but do not propagate them out from normal |
1184 // functions. | 1174 // functions. |
1185 if (!inner->is_function_scope() || inner->is_arrow_scope()) { | 1175 if (!inner->is_function_scope() || inner->is_arrow_scope()) { |
1186 if (inner->scope_uses_arguments_ || inner->inner_scope_uses_arguments_) { | 1176 if (inner->scope_uses_arguments_ || inner->inner_scope_uses_arguments_) { |
1187 inner_scope_uses_arguments_ = true; | 1177 inner_scope_uses_arguments_ = true; |
1188 } | 1178 } |
1189 if (inner->scope_uses_super_property_ || | 1179 if (inner->scope_uses_super_property_ || |
1190 inner->inner_scope_uses_super_property_) { | 1180 inner->inner_scope_uses_super_property_) { |
1191 inner_scope_uses_super_property_ = true; | 1181 inner_scope_uses_super_property_ = true; |
1192 } | 1182 } |
1193 if (inner->uses_super_constructor_call() || | |
1194 inner->inner_scope_uses_super_constructor_call_) { | |
1195 inner_scope_uses_super_constructor_call_ = true; | |
1196 } | |
1197 if (inner->scope_uses_this_ || inner->inner_scope_uses_this_) { | 1183 if (inner->scope_uses_this_ || inner->inner_scope_uses_this_) { |
1198 inner_scope_uses_this_ = true; | 1184 inner_scope_uses_this_ = true; |
1199 } | 1185 } |
1200 } | 1186 } |
1201 if (inner->force_eager_compilation_) { | 1187 if (inner->force_eager_compilation_) { |
1202 force_eager_compilation_ = true; | 1188 force_eager_compilation_ = true; |
1203 } | 1189 } |
1204 if (asm_module_ && inner->scope_type() == FUNCTION_SCOPE) { | 1190 if (asm_module_ && inner->scope_type() == FUNCTION_SCOPE) { |
1205 inner->asm_function_ = true; | 1191 inner->asm_function_ = true; |
1206 } | 1192 } |
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1439 } | 1425 } |
1440 | 1426 |
1441 | 1427 |
1442 int Scope::ContextLocalCount() const { | 1428 int Scope::ContextLocalCount() const { |
1443 if (num_heap_slots() == 0) return 0; | 1429 if (num_heap_slots() == 0) return 0; |
1444 return num_heap_slots() - Context::MIN_CONTEXT_SLOTS - | 1430 return num_heap_slots() - Context::MIN_CONTEXT_SLOTS - |
1445 (function_ != NULL && function_->proxy()->var()->IsContextSlot() ? 1 : 0); | 1431 (function_ != NULL && function_->proxy()->var()->IsContextSlot() ? 1 : 0); |
1446 } | 1432 } |
1447 | 1433 |
1448 } } // namespace v8::internal | 1434 } } // namespace v8::internal |
OLD | NEW |