OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 <stdlib.h> | 5 #include <stdlib.h> |
6 | 6 |
7 #include "src/v8.h" | 7 #include "src/v8.h" |
8 | 8 |
9 #include "src/bootstrapper.h" | 9 #include "src/bootstrapper.h" |
10 #include "src/scopeinfo.h" | 10 #include "src/scopeinfo.h" |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
82 Factory* factory = isolate->factory(); | 82 Factory* factory = isolate->factory(); |
83 Handle<ScopeInfo> scope_info = factory->NewScopeInfo(length); | 83 Handle<ScopeInfo> scope_info = factory->NewScopeInfo(length); |
84 | 84 |
85 bool has_simple_parameters = | 85 bool has_simple_parameters = |
86 scope->is_function_scope() && scope->has_simple_parameters(); | 86 scope->is_function_scope() && scope->has_simple_parameters(); |
87 | 87 |
88 // Encode the flags. | 88 // Encode the flags. |
89 int flags = ScopeTypeField::encode(scope->scope_type()) | | 89 int flags = ScopeTypeField::encode(scope->scope_type()) | |
90 CallsEvalField::encode(scope->calls_eval()) | | 90 CallsEvalField::encode(scope->calls_eval()) | |
91 LanguageModeField::encode(scope->language_mode()) | | 91 LanguageModeField::encode(scope->language_mode()) | |
| 92 DeclarationScopeField::encode(scope->is_declaration_scope()) | |
92 ReceiverVariableField::encode(receiver_info) | | 93 ReceiverVariableField::encode(receiver_info) | |
93 FunctionVariableField::encode(function_name_info) | | 94 FunctionVariableField::encode(function_name_info) | |
94 FunctionVariableMode::encode(function_variable_mode) | | 95 FunctionVariableMode::encode(function_variable_mode) | |
95 AsmModuleField::encode(scope->asm_module()) | | 96 AsmModuleField::encode(scope->asm_module()) | |
96 AsmFunctionField::encode(scope->asm_function()) | | 97 AsmFunctionField::encode(scope->asm_function()) | |
97 HasSimpleParametersField::encode(has_simple_parameters) | | 98 HasSimpleParametersField::encode(has_simple_parameters) | |
98 FunctionKindField::encode(scope->function_kind()); | 99 FunctionKindField::encode(scope->function_kind()); |
99 scope_info->SetFlags(flags); | 100 scope_info->SetFlags(flags); |
100 scope_info->SetParameterCount(parameter_count); | 101 scope_info->SetParameterCount(parameter_count); |
101 scope_info->SetStackLocalCount(stack_local_count); | 102 scope_info->SetStackLocalCount(stack_local_count); |
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
237 3 * strong_mode_free_variable_count + | 238 3 * strong_mode_free_variable_count + |
238 (has_receiver ? 1 : 0) + (has_function_name ? 2 : 0); | 239 (has_receiver ? 1 : 0) + (has_function_name ? 2 : 0); |
239 | 240 |
240 Factory* factory = isolate->factory(); | 241 Factory* factory = isolate->factory(); |
241 Handle<ScopeInfo> scope_info = factory->NewScopeInfo(length); | 242 Handle<ScopeInfo> scope_info = factory->NewScopeInfo(length); |
242 | 243 |
243 // Encode the flags. | 244 // Encode the flags. |
244 int flags = ScopeTypeField::encode(SCRIPT_SCOPE) | | 245 int flags = ScopeTypeField::encode(SCRIPT_SCOPE) | |
245 CallsEvalField::encode(false) | | 246 CallsEvalField::encode(false) | |
246 LanguageModeField::encode(SLOPPY) | | 247 LanguageModeField::encode(SLOPPY) | |
| 248 DeclarationScopeField::encode(true) | |
247 ReceiverVariableField::encode(receiver_info) | | 249 ReceiverVariableField::encode(receiver_info) | |
248 FunctionVariableField::encode(function_name_info) | | 250 FunctionVariableField::encode(function_name_info) | |
249 FunctionVariableMode::encode(function_variable_mode) | | 251 FunctionVariableMode::encode(function_variable_mode) | |
250 AsmModuleField::encode(false) | AsmFunctionField::encode(false) | | 252 AsmModuleField::encode(false) | AsmFunctionField::encode(false) | |
251 HasSimpleParametersField::encode(has_simple_parameters) | | 253 HasSimpleParametersField::encode(has_simple_parameters) | |
252 FunctionKindField::encode(FunctionKind::kNormalFunction); | 254 FunctionKindField::encode(FunctionKind::kNormalFunction); |
253 scope_info->SetFlags(flags); | 255 scope_info->SetFlags(flags); |
254 scope_info->SetParameterCount(parameter_count); | 256 scope_info->SetParameterCount(parameter_count); |
255 scope_info->SetStackLocalCount(stack_local_count); | 257 scope_info->SetStackLocalCount(stack_local_count); |
256 scope_info->SetContextLocalCount(context_local_count); | 258 scope_info->SetContextLocalCount(context_local_count); |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
304 bool ScopeInfo::CallsEval() { | 306 bool ScopeInfo::CallsEval() { |
305 return length() > 0 && CallsEvalField::decode(Flags()); | 307 return length() > 0 && CallsEvalField::decode(Flags()); |
306 } | 308 } |
307 | 309 |
308 | 310 |
309 LanguageMode ScopeInfo::language_mode() { | 311 LanguageMode ScopeInfo::language_mode() { |
310 return length() > 0 ? LanguageModeField::decode(Flags()) : SLOPPY; | 312 return length() > 0 ? LanguageModeField::decode(Flags()) : SLOPPY; |
311 } | 313 } |
312 | 314 |
313 | 315 |
| 316 bool ScopeInfo::is_declaration_scope() { |
| 317 return DeclarationScopeField::decode(Flags()); |
| 318 } |
| 319 |
| 320 |
314 int ScopeInfo::LocalCount() { | 321 int ScopeInfo::LocalCount() { |
315 return StackLocalCount() + ContextLocalCount(); | 322 return StackLocalCount() + ContextLocalCount(); |
316 } | 323 } |
317 | 324 |
318 | 325 |
319 int ScopeInfo::StackSlotCount() { | 326 int ScopeInfo::StackSlotCount() { |
320 if (length() > 0) { | 327 if (length() > 0) { |
321 bool function_name_stack_slot = | 328 bool function_name_stack_slot = |
322 FunctionVariableField::decode(Flags()) == STACK; | 329 FunctionVariableField::decode(Flags()) == STACK; |
323 return StackLocalCount() + (function_name_stack_slot ? 1 : 0); | 330 return StackLocalCount() + (function_name_stack_slot ? 1 : 0); |
324 } | 331 } |
325 return 0; | 332 return 0; |
326 } | 333 } |
327 | 334 |
328 | 335 |
329 int ScopeInfo::ContextLength() { | 336 int ScopeInfo::ContextLength() { |
330 if (length() > 0) { | 337 if (length() > 0) { |
331 int context_locals = ContextLocalCount(); | 338 int context_locals = ContextLocalCount(); |
332 int context_globals = ContextGlobalCount(); | 339 int context_globals = ContextGlobalCount(); |
333 bool function_name_context_slot = | 340 bool function_name_context_slot = |
334 FunctionVariableField::decode(Flags()) == CONTEXT; | 341 FunctionVariableField::decode(Flags()) == CONTEXT; |
335 bool has_context = context_locals > 0 || context_globals > 0 || | 342 bool has_context = context_locals > 0 || context_globals > 0 || |
336 function_name_context_slot || | 343 function_name_context_slot || |
337 scope_type() == WITH_SCOPE || | 344 scope_type() == WITH_SCOPE || |
| 345 (scope_type() == BLOCK_SCOPE && CallsSloppyEval() && |
| 346 is_declaration_scope()) || |
338 (scope_type() == ARROW_SCOPE && CallsSloppyEval()) || | 347 (scope_type() == ARROW_SCOPE && CallsSloppyEval()) || |
339 (scope_type() == FUNCTION_SCOPE && CallsSloppyEval()) || | 348 (scope_type() == FUNCTION_SCOPE && CallsSloppyEval()) || |
340 scope_type() == MODULE_SCOPE; | 349 scope_type() == MODULE_SCOPE; |
341 | 350 |
342 if (has_context) { | 351 if (has_context) { |
343 return Context::MIN_CONTEXT_SLOTS + context_locals + context_globals + | 352 return Context::MIN_CONTEXT_SLOTS + context_locals + context_globals + |
344 (function_name_context_slot ? 1 : 0); | 353 (function_name_context_slot ? 1 : 0); |
345 } | 354 } |
346 } | 355 } |
347 return 0; | 356 return 0; |
(...skipping 482 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
830 info->set_mode(i, var->mode()); | 839 info->set_mode(i, var->mode()); |
831 DCHECK(var->index() >= 0); | 840 DCHECK(var->index() >= 0); |
832 info->set_index(i, var->index()); | 841 info->set_index(i, var->index()); |
833 } | 842 } |
834 DCHECK(i == info->length()); | 843 DCHECK(i == info->length()); |
835 return info; | 844 return info; |
836 } | 845 } |
837 | 846 |
838 } // namespace internal | 847 } // namespace internal |
839 } // namespace v8 | 848 } // namespace v8 |
OLD | NEW |