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

Side by Side Diff: src/objects.cc

Issue 1255133002: [stubs] Properly handle read-only properties in StoreGlobalViaContextStub. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: REBASE Created 5 years, 4 months 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/mips64/code-stubs-mips64.cc ('k') | src/property-details.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 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 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 <iomanip> 5 #include <iomanip>
6 #include <sstream> 6 #include <sstream>
7 7
8 #include "src/v8.h" 8 #include "src/v8.h"
9 9
10 #include "src/accessors.h" 10 #include "src/accessors.h"
(...skipping 15798 matching lines...) Expand 10 before | Expand all | Expand 10 after
15809 PropertyDetails details = cell->property_details(); 15809 PropertyDetails details = cell->property_details();
15810 details = details.set_cell_type(is_the_hole ? PropertyCellType::kInvalidated 15810 details = details.set_cell_type(is_the_hole ? PropertyCellType::kInvalidated
15811 : PropertyCellType::kMutable); 15811 : PropertyCellType::kMutable);
15812 new_cell->set_property_details(details); 15812 new_cell->set_property_details(details);
15813 // Old cell is ready for invalidation. 15813 // Old cell is ready for invalidation.
15814 if (is_the_hole) { 15814 if (is_the_hole) {
15815 cell->set_value(isolate->heap()->undefined_value()); 15815 cell->set_value(isolate->heap()->undefined_value());
15816 } else { 15816 } else {
15817 cell->set_value(isolate->heap()->the_hole_value()); 15817 cell->set_value(isolate->heap()->the_hole_value());
15818 } 15818 }
15819 details = details.set_cell_type(PropertyCellType::kInvalidated);
15820 cell->set_property_details(details);
15819 cell->dependent_code()->DeoptimizeDependentCodeGroup( 15821 cell->dependent_code()->DeoptimizeDependentCodeGroup(
15820 isolate, DependentCode::kPropertyCellChangedGroup); 15822 isolate, DependentCode::kPropertyCellChangedGroup);
15821 return new_cell; 15823 return new_cell;
15822 } 15824 }
15823 15825
15824 15826
15825 PropertyCellConstantType PropertyCell::GetConstantType() { 15827 PropertyCellConstantType PropertyCell::GetConstantType() {
15826 if (value()->IsSmi()) return PropertyCellConstantType::kSmi; 15828 if (value()->IsSmi()) return PropertyCellConstantType::kSmi;
15827 return PropertyCellConstantType::kStableMap; 15829 return PropertyCellConstantType::kStableMap;
15828 } 15830 }
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
15880 15882
15881 15883
15882 void PropertyCell::UpdateCell(Handle<GlobalDictionary> dictionary, int entry, 15884 void PropertyCell::UpdateCell(Handle<GlobalDictionary> dictionary, int entry,
15883 Handle<Object> value, PropertyDetails details) { 15885 Handle<Object> value, PropertyDetails details) {
15884 DCHECK(!value->IsTheHole()); 15886 DCHECK(!value->IsTheHole());
15885 DCHECK(dictionary->ValueAt(entry)->IsPropertyCell()); 15887 DCHECK(dictionary->ValueAt(entry)->IsPropertyCell());
15886 Handle<PropertyCell> cell(PropertyCell::cast(dictionary->ValueAt(entry))); 15888 Handle<PropertyCell> cell(PropertyCell::cast(dictionary->ValueAt(entry)));
15887 const PropertyDetails original_details = cell->property_details(); 15889 const PropertyDetails original_details = cell->property_details();
15888 // Data accesses could be cached in ics or optimized code. 15890 // Data accesses could be cached in ics or optimized code.
15889 bool invalidate = 15891 bool invalidate =
15890 (original_details.kind() == kData && details.kind() == kAccessor) || 15892 original_details.kind() == kData && details.kind() == kAccessor;
15891 ((original_details.attributes() & READ_ONLY) !=
15892 (details.attributes() & READ_ONLY));
15893 int index = original_details.dictionary_index(); 15893 int index = original_details.dictionary_index();
15894 PropertyCellType old_type = original_details.cell_type(); 15894 PropertyCellType old_type = original_details.cell_type();
15895 // Preserve the enumeration index unless the property was deleted or never 15895 // Preserve the enumeration index unless the property was deleted or never
15896 // initialized. 15896 // initialized.
15897 if (cell->value()->IsTheHole()) { 15897 if (cell->value()->IsTheHole()) {
15898 index = dictionary->NextEnumerationIndex(); 15898 index = dictionary->NextEnumerationIndex();
15899 dictionary->SetNextEnumerationIndex(index + 1); 15899 dictionary->SetNextEnumerationIndex(index + 1);
15900 // Negative lookup cells must be invalidated. 15900 // Negative lookup cells must be invalidated.
15901 invalidate = true; 15901 invalidate = true;
15902 } 15902 }
15903 DCHECK(index > 0); 15903 DCHECK(index > 0);
15904 details = details.set_index(index); 15904 details = details.set_index(index);
15905 15905
15906 PropertyCellType new_type = UpdatedType(cell, value, original_details); 15906 PropertyCellType new_type = UpdatedType(cell, value, original_details);
15907 if (invalidate) cell = PropertyCell::InvalidateEntry(dictionary, entry); 15907 if (invalidate) cell = PropertyCell::InvalidateEntry(dictionary, entry);
15908 15908
15909 // Install new property details and cell value. 15909 // Install new property details and cell value.
15910 details = details.set_cell_type(new_type); 15910 details = details.set_cell_type(new_type);
15911 cell->set_property_details(details); 15911 cell->set_property_details(details);
15912 cell->set_value(*value); 15912 cell->set_value(*value);
15913 15913
15914 // Deopt when transitioning from a constant type. 15914 // Deopt when transitioning from a constant type.
15915 if (!invalidate && (old_type != new_type)) { 15915 if (!invalidate && (old_type != new_type ||
15916 auto isolate = dictionary->GetIsolate(); 15916 original_details.IsReadOnly() != details.IsReadOnly())) {
15917 Isolate* isolate = dictionary->GetIsolate();
15917 cell->dependent_code()->DeoptimizeDependentCodeGroup( 15918 cell->dependent_code()->DeoptimizeDependentCodeGroup(
15918 isolate, DependentCode::kPropertyCellChangedGroup); 15919 isolate, DependentCode::kPropertyCellChangedGroup);
15919 } 15920 }
15920 } 15921 }
15921 15922
15922 15923
15923 // static 15924 // static
15924 void PropertyCell::SetValueWithInvalidation(Handle<PropertyCell> cell, 15925 void PropertyCell::SetValueWithInvalidation(Handle<PropertyCell> cell,
15925 Handle<Object> new_value) { 15926 Handle<Object> new_value) {
15926 if (cell->value() != *new_value) { 15927 if (cell->value() != *new_value) {
15927 cell->set_value(*new_value); 15928 cell->set_value(*new_value);
15928 Isolate* isolate = cell->GetIsolate(); 15929 Isolate* isolate = cell->GetIsolate();
15929 cell->dependent_code()->DeoptimizeDependentCodeGroup( 15930 cell->dependent_code()->DeoptimizeDependentCodeGroup(
15930 isolate, DependentCode::kPropertyCellChangedGroup); 15931 isolate, DependentCode::kPropertyCellChangedGroup);
15931 } 15932 }
15932 } 15933 }
15934
15933 } // namespace internal 15935 } // namespace internal
15934 } // namespace v8 15936 } // namespace v8
OLDNEW
« no previous file with comments | « src/mips64/code-stubs-mips64.cc ('k') | src/property-details.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698