Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(89)

Side by Side Diff: src/ast/scopeinfo.cc

Issue 1439693002: [runtime] Support Proxy setPrototypeOf trap (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@2015-11-09_new_Proxy_1417063011
Patch Set: merging with master Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/ast/scopeinfo.h ('k') | src/ast/scopes.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 "src/ast/scopeinfo.h" 5 #include "src/ast/scopeinfo.h"
6 6
7 #include <stdlib.h> 7 #include <stdlib.h>
8 8
9 #include "src/ast/scopes.h" 9 #include "src/ast/scopes.h"
10 #include "src/bootstrapper.h" 10 #include "src/bootstrapper.h"
(...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after
234 const int length = kVariablePartIndex + parameter_count + 234 const int length = kVariablePartIndex + parameter_count +
235 (1 + stack_local_count) + 2 * context_local_count + 235 (1 + stack_local_count) + 2 * context_local_count +
236 2 * context_global_count + 236 2 * context_global_count +
237 3 * strong_mode_free_variable_count + 237 3 * strong_mode_free_variable_count +
238 (has_receiver ? 1 : 0) + (has_function_name ? 2 : 0); 238 (has_receiver ? 1 : 0) + (has_function_name ? 2 : 0);
239 239
240 Factory* factory = isolate->factory(); 240 Factory* factory = isolate->factory();
241 Handle<ScopeInfo> scope_info = factory->NewScopeInfo(length); 241 Handle<ScopeInfo> scope_info = factory->NewScopeInfo(length);
242 242
243 // Encode the flags. 243 // Encode the flags.
244 int flags = ScopeTypeField::encode(SCRIPT_SCOPE) | 244 int flags =
245 CallsEvalField::encode(false) | 245 ScopeTypeField::encode(SCRIPT_SCOPE) | CallsEvalField::encode(false) |
246 LanguageModeField::encode(SLOPPY) | 246 LanguageModeField::encode(SLOPPY) | DeclarationScopeField::encode(true) |
247 DeclarationScopeField::encode(true) | 247 ReceiverVariableField::encode(receiver_info) |
248 ReceiverVariableField::encode(receiver_info) | 248 FunctionVariableField::encode(function_name_info) |
249 FunctionVariableField::encode(function_name_info) | 249 FunctionVariableMode::encode(function_variable_mode) |
250 FunctionVariableMode::encode(function_variable_mode) | 250 AsmModuleField::encode(false) | AsmFunctionField::encode(false) |
251 AsmModuleField::encode(false) | AsmFunctionField::encode(false) | 251 HasSimpleParametersField::encode(has_simple_parameters) |
252 HasSimpleParametersField::encode(has_simple_parameters) | 252 FunctionKindField::encode(FunctionKind::kNormalFunction);
253 FunctionKindField::encode(FunctionKind::kNormalFunction);
254 scope_info->SetFlags(flags); 253 scope_info->SetFlags(flags);
255 scope_info->SetParameterCount(parameter_count); 254 scope_info->SetParameterCount(parameter_count);
256 scope_info->SetStackLocalCount(stack_local_count); 255 scope_info->SetStackLocalCount(stack_local_count);
257 scope_info->SetContextLocalCount(context_local_count); 256 scope_info->SetContextLocalCount(context_local_count);
258 scope_info->SetContextGlobalCount(context_global_count); 257 scope_info->SetContextGlobalCount(context_global_count);
259 scope_info->SetStrongModeFreeVariableCount(strong_mode_free_variable_count); 258 scope_info->SetStrongModeFreeVariableCount(strong_mode_free_variable_count);
260 259
261 int index = kVariablePartIndex; 260 int index = kVariablePartIndex;
262 const int first_slot_index = 0; 261 const int first_slot_index = 0;
263 DCHECK(index == scope_info->StackLocalFirstSlotIndex()); 262 DCHECK(index == scope_info->StackLocalFirstSlotIndex());
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
310 LanguageMode ScopeInfo::language_mode() { 309 LanguageMode ScopeInfo::language_mode() {
311 return length() > 0 ? LanguageModeField::decode(Flags()) : SLOPPY; 310 return length() > 0 ? LanguageModeField::decode(Flags()) : SLOPPY;
312 } 311 }
313 312
314 313
315 bool ScopeInfo::is_declaration_scope() { 314 bool ScopeInfo::is_declaration_scope() {
316 return DeclarationScopeField::decode(Flags()); 315 return DeclarationScopeField::decode(Flags());
317 } 316 }
318 317
319 318
320 int ScopeInfo::LocalCount() { 319 int ScopeInfo::LocalCount() { return StackLocalCount() + ContextLocalCount(); }
321 return StackLocalCount() + ContextLocalCount();
322 }
323 320
324 321
325 int ScopeInfo::StackSlotCount() { 322 int ScopeInfo::StackSlotCount() {
326 if (length() > 0) { 323 if (length() > 0) {
327 bool function_name_stack_slot = 324 bool function_name_stack_slot =
328 FunctionVariableField::decode(Flags()) == STACK; 325 FunctionVariableField::decode(Flags()) == STACK;
329 return StackLocalCount() + (function_name_stack_slot ? 1 : 0); 326 return StackLocalCount() + (function_name_stack_slot ? 1 : 0);
330 } 327 }
331 return 0; 328 return 0;
332 } 329 }
333 330
334 331
335 int ScopeInfo::ContextLength() { 332 int ScopeInfo::ContextLength() {
336 if (length() > 0) { 333 if (length() > 0) {
337 int context_locals = ContextLocalCount(); 334 int context_locals = ContextLocalCount();
338 int context_globals = ContextGlobalCount(); 335 int context_globals = ContextGlobalCount();
339 bool function_name_context_slot = 336 bool function_name_context_slot =
340 FunctionVariableField::decode(Flags()) == CONTEXT; 337 FunctionVariableField::decode(Flags()) == CONTEXT;
341 bool has_context = context_locals > 0 || context_globals > 0 || 338 bool has_context = context_locals > 0 || context_globals > 0 ||
342 function_name_context_slot || 339 function_name_context_slot ||
343 scope_type() == WITH_SCOPE || 340 scope_type() == WITH_SCOPE ||
344 (scope_type() == BLOCK_SCOPE && CallsSloppyEval() && 341 (scope_type() == BLOCK_SCOPE && CallsSloppyEval() &&
345 is_declaration_scope()) || 342 is_declaration_scope()) ||
346 (scope_type() == FUNCTION_SCOPE && CallsSloppyEval()) || 343 (scope_type() == FUNCTION_SCOPE && CallsSloppyEval()) ||
347 scope_type() == MODULE_SCOPE; 344 scope_type() == MODULE_SCOPE;
348 345
349 if (has_context) { 346 if (has_context) {
350 return Context::MIN_CONTEXT_SLOTS + context_locals + context_globals + 347 return Context::MIN_CONTEXT_SLOTS + context_locals + context_globals +
351 (function_name_context_slot ? 1 : 0); 348 (function_name_context_slot ? 1 : 0);
352 } 349 }
353 } 350 }
354 return 0; 351 return 0;
355 } 352 }
(...skipping 29 matching lines...) Expand all
385 382
386 bool ScopeInfo::HasHeapAllocatedLocals() { 383 bool ScopeInfo::HasHeapAllocatedLocals() {
387 if (length() > 0) { 384 if (length() > 0) {
388 return ContextLocalCount() > 0; 385 return ContextLocalCount() > 0;
389 } else { 386 } else {
390 return false; 387 return false;
391 } 388 }
392 } 389 }
393 390
394 391
395 bool ScopeInfo::HasContext() { 392 bool ScopeInfo::HasContext() { return ContextLength() > 0; }
396 return ContextLength() > 0;
397 }
398 393
399 394
400 String* ScopeInfo::FunctionName() { 395 String* ScopeInfo::FunctionName() {
401 DCHECK(HasFunctionName()); 396 DCHECK(HasFunctionName());
402 return String::cast(get(FunctionNameEntryIndex())); 397 return String::cast(get(FunctionNameEntryIndex()));
403 } 398 }
404 399
405 400
406 String* ScopeInfo::ParameterName(int var) { 401 String* ScopeInfo::ParameterName(int var) {
407 DCHECK(0 <= var && var < ParameterCount()); 402 DCHECK(0 <= var && var < ParameterCount());
(...skipping 324 matching lines...) Expand 10 before | Expand all | Expand 10 after
732 } 727 }
733 728
734 729
735 void ContextSlotCache::Update(Handle<Object> data, Handle<String> name, 730 void ContextSlotCache::Update(Handle<Object> data, Handle<String> name,
736 VariableMode mode, InitializationFlag init_flag, 731 VariableMode mode, InitializationFlag init_flag,
737 MaybeAssignedFlag maybe_assigned_flag, 732 MaybeAssignedFlag maybe_assigned_flag,
738 int slot_index) { 733 int slot_index) {
739 DisallowHeapAllocation no_gc; 734 DisallowHeapAllocation no_gc;
740 Handle<String> internalized_name; 735 Handle<String> internalized_name;
741 DCHECK(slot_index > kNotFound); 736 DCHECK(slot_index > kNotFound);
742 if (StringTable::InternalizeStringIfExists(name->GetIsolate(), name). 737 if (StringTable::InternalizeStringIfExists(name->GetIsolate(), name)
743 ToHandle(&internalized_name)) { 738 .ToHandle(&internalized_name)) {
744 int index = Hash(*data, *internalized_name); 739 int index = Hash(*data, *internalized_name);
745 Key& key = keys_[index]; 740 Key& key = keys_[index];
746 key.data = *data; 741 key.data = *data;
747 key.name = *internalized_name; 742 key.name = *internalized_name;
748 // Please note value only takes a uint as index. 743 // Please note value only takes a uint as index.
749 values_[index] = Value(mode, init_flag, maybe_assigned_flag, 744 values_[index] =
750 slot_index - kNotFound).raw(); 745 Value(mode, init_flag, maybe_assigned_flag, slot_index - kNotFound)
746 .raw();
751 #ifdef DEBUG 747 #ifdef DEBUG
752 ValidateEntry(data, name, mode, init_flag, maybe_assigned_flag, slot_index); 748 ValidateEntry(data, name, mode, init_flag, maybe_assigned_flag, slot_index);
753 #endif 749 #endif
754 } 750 }
755 } 751 }
756 752
757 753
758 void ContextSlotCache::Clear() { 754 void ContextSlotCache::Clear() {
759 for (int index = 0; index < kLength; index++) keys_[index].data = NULL; 755 for (int index = 0; index < kLength; index++) keys_[index].data = NULL;
760 } 756 }
761 757
762 758
763 #ifdef DEBUG 759 #ifdef DEBUG
764 760
765 void ContextSlotCache::ValidateEntry(Handle<Object> data, Handle<String> name, 761 void ContextSlotCache::ValidateEntry(Handle<Object> data, Handle<String> name,
766 VariableMode mode, 762 VariableMode mode,
767 InitializationFlag init_flag, 763 InitializationFlag init_flag,
768 MaybeAssignedFlag maybe_assigned_flag, 764 MaybeAssignedFlag maybe_assigned_flag,
769 int slot_index) { 765 int slot_index) {
770 DisallowHeapAllocation no_gc; 766 DisallowHeapAllocation no_gc;
771 Handle<String> internalized_name; 767 Handle<String> internalized_name;
772 if (StringTable::InternalizeStringIfExists(name->GetIsolate(), name). 768 if (StringTable::InternalizeStringIfExists(name->GetIsolate(), name)
773 ToHandle(&internalized_name)) { 769 .ToHandle(&internalized_name)) {
774 int index = Hash(*data, *name); 770 int index = Hash(*data, *name);
775 Key& key = keys_[index]; 771 Key& key = keys_[index];
776 DCHECK(key.data == *data); 772 DCHECK(key.data == *data);
777 DCHECK(key.name->Equals(*name)); 773 DCHECK(key.name->Equals(*name));
778 Value result(values_[index]); 774 Value result(values_[index]);
779 DCHECK(result.mode() == mode); 775 DCHECK(result.mode() == mode);
780 DCHECK(result.initialization_flag() == init_flag); 776 DCHECK(result.initialization_flag() == init_flag);
781 DCHECK(result.maybe_assigned_flag() == maybe_assigned_flag); 777 DCHECK(result.maybe_assigned_flag() == maybe_assigned_flag);
782 DCHECK(result.index() + kNotFound == slot_index); 778 DCHECK(result.index() + kNotFound == slot_index);
783 } 779 }
784 } 780 }
785 781
786 782
787 static void PrintList(const char* list_name, 783 static void PrintList(const char* list_name, int nof_internal_slots, int start,
788 int nof_internal_slots, 784 int end, ScopeInfo* scope_info) {
789 int start,
790 int end,
791 ScopeInfo* scope_info) {
792 if (start < end) { 785 if (start < end) {
793 PrintF("\n // %s\n", list_name); 786 PrintF("\n // %s\n", list_name);
794 if (nof_internal_slots > 0) { 787 if (nof_internal_slots > 0) {
795 PrintF(" %2d - %2d [internal slots]\n", 0 , nof_internal_slots - 1); 788 PrintF(" %2d - %2d [internal slots]\n", 0, nof_internal_slots - 1);
796 } 789 }
797 for (int i = nof_internal_slots; start < end; ++i, ++start) { 790 for (int i = nof_internal_slots; start < end; ++i, ++start) {
798 PrintF(" %2d ", i); 791 PrintF(" %2d ", i);
799 String::cast(scope_info->get(start))->ShortPrint(); 792 String::cast(scope_info->get(start))->ShortPrint();
800 PrintF("\n"); 793 PrintF("\n");
801 } 794 }
802 } 795 }
803 } 796 }
804 797
805 798
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
843 info->set_mode(i, var->mode()); 836 info->set_mode(i, var->mode());
844 DCHECK(var->index() >= 0); 837 DCHECK(var->index() >= 0);
845 info->set_index(i, var->index()); 838 info->set_index(i, var->index());
846 } 839 }
847 DCHECK(i == info->length()); 840 DCHECK(i == info->length());
848 return info; 841 return info;
849 } 842 }
850 843
851 } // namespace internal 844 } // namespace internal
852 } // namespace v8 845 } // namespace v8
OLDNEW
« no previous file with comments | « src/ast/scopeinfo.h ('k') | src/ast/scopes.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698