| OLD | NEW |
| 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 <sstream> | 5 #include <sstream> |
| 6 | 6 |
| 7 #include "src/v8.h" | 7 #include "src/v8.h" |
| 8 | 8 |
| 9 #include "src/accessors.h" | 9 #include "src/accessors.h" |
| 10 #include "src/allocation-site-scopes.h" | 10 #include "src/allocation-site-scopes.h" |
| (...skipping 1734 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1745 Handle<PropertyCell> cell(PropertyCell::cast(dict->ValueAt(entry))); | 1745 Handle<PropertyCell> cell(PropertyCell::cast(dict->ValueAt(entry))); |
| 1746 PropertyCell::SetValueInferType(cell, value); | 1746 PropertyCell::SetValueInferType(cell, value); |
| 1747 // Assign an enumeration index to the property and update | 1747 // Assign an enumeration index to the property and update |
| 1748 // SetNextEnumerationIndex. | 1748 // SetNextEnumerationIndex. |
| 1749 int index = dict->NextEnumerationIndex(); | 1749 int index = dict->NextEnumerationIndex(); |
| 1750 PropertyDetails details(attributes, DATA, index); | 1750 PropertyDetails details(attributes, DATA, index); |
| 1751 dict->SetNextEnumerationIndex(index + 1); | 1751 dict->SetNextEnumerationIndex(index + 1); |
| 1752 dict->SetEntry(entry, name, cell, details); | 1752 dict->SetEntry(entry, name, cell, details); |
| 1753 return; | 1753 return; |
| 1754 } | 1754 } |
| 1755 Handle<PropertyCell> cell = isolate->factory()->NewPropertyCell(value); | 1755 value = isolate->factory()->NewPropertyCell(value); |
| 1756 PropertyCell::SetValueInferType(cell, value); | |
| 1757 value = cell; | |
| 1758 } | 1756 } |
| 1759 PropertyDetails details(attributes, DATA, 0); | 1757 PropertyDetails details(attributes, DATA, 0); |
| 1760 Handle<NameDictionary> result = | 1758 Handle<NameDictionary> result = |
| 1761 NameDictionary::Add(dict, name, value, details); | 1759 NameDictionary::Add(dict, name, value, details); |
| 1762 if (*dict != *result) object->set_properties(*result); | 1760 if (*dict != *result) object->set_properties(*result); |
| 1763 } | 1761 } |
| 1764 | 1762 |
| 1765 | 1763 |
| 1766 Context* JSObject::GetCreationContext() { | 1764 Context* JSObject::GetCreationContext() { |
| 1767 Object* constructor = this->map()->constructor(); | 1765 Object* constructor = this->map()->constructor(); |
| (...skipping 1281 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3049 NewTypeError("object_not_extensible", | 3047 NewTypeError("object_not_extensible", |
| 3050 HandleVector(args, arraysize(args))), | 3048 HandleVector(args, arraysize(args))), |
| 3051 Object); | 3049 Object); |
| 3052 } | 3050 } |
| 3053 it->ApplyTransitionToDataProperty(); | 3051 it->ApplyTransitionToDataProperty(); |
| 3054 | 3052 |
| 3055 // TODO(verwaest): Encapsulate dictionary handling better. | 3053 // TODO(verwaest): Encapsulate dictionary handling better. |
| 3056 if (receiver->map()->is_dictionary_map()) { | 3054 if (receiver->map()->is_dictionary_map()) { |
| 3057 // TODO(verwaest): Probably should ensure this is done beforehand. | 3055 // TODO(verwaest): Probably should ensure this is done beforehand. |
| 3058 it->InternalizeName(); | 3056 it->InternalizeName(); |
| 3057 // TODO(dcarney): just populate TransitionPropertyCell here? |
| 3059 JSObject::AddSlowProperty(receiver, it->name(), value, attributes); | 3058 JSObject::AddSlowProperty(receiver, it->name(), value, attributes); |
| 3060 } else { | 3059 } else { |
| 3061 // Write the property value. | 3060 // Write the property value. |
| 3062 value = it->WriteDataValue(value); | 3061 value = it->WriteDataValue(value); |
| 3063 } | 3062 } |
| 3064 | 3063 |
| 3065 // Send the change record if there are observers. | 3064 // Send the change record if there are observers. |
| 3066 if (receiver->map()->is_observed() && | 3065 if (receiver->map()->is_observed() && |
| 3067 !it->isolate()->IsInternallyUsedPropertyName(it->name())) { | 3066 !it->isolate()->IsInternallyUsedPropertyName(it->name())) { |
| 3068 RETURN_ON_EXCEPTION(it->isolate(), JSObject::EnqueueChangeRecord( | 3067 RETURN_ON_EXCEPTION(it->isolate(), JSObject::EnqueueChangeRecord( |
| (...skipping 12057 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 15126 Handle<Object> value(cell->value(), isolate); | 15125 Handle<Object> value(cell->value(), isolate); |
| 15127 Handle<PropertyCell> new_cell = isolate->factory()->NewPropertyCell(value); | 15126 Handle<PropertyCell> new_cell = isolate->factory()->NewPropertyCell(value); |
| 15128 global->property_dictionary()->ValueAtPut(entry, *new_cell); | 15127 global->property_dictionary()->ValueAtPut(entry, *new_cell); |
| 15129 | 15128 |
| 15130 Handle<Object> hole = global->GetIsolate()->factory()->the_hole_value(); | 15129 Handle<Object> hole = global->GetIsolate()->factory()->the_hole_value(); |
| 15131 PropertyCell::SetValueInferType(cell, hole); | 15130 PropertyCell::SetValueInferType(cell, hole); |
| 15132 } | 15131 } |
| 15133 } | 15132 } |
| 15134 | 15133 |
| 15135 | 15134 |
| 15136 Handle<PropertyCell> JSGlobalObject::EnsurePropertyCell( | 15135 Handle<PropertyCell> GlobalObject::EnsurePropertyCell( |
| 15137 Handle<JSGlobalObject> global, | 15136 Handle<GlobalObject> global, Handle<Name> name) { |
| 15138 Handle<Name> name) { | |
| 15139 DCHECK(!global->HasFastProperties()); | 15137 DCHECK(!global->HasFastProperties()); |
| 15140 int entry = global->property_dictionary()->FindEntry(name); | 15138 int entry = global->property_dictionary()->FindEntry(name); |
| 15141 if (entry == NameDictionary::kNotFound) { | 15139 if (entry == NameDictionary::kNotFound) { |
| 15142 Isolate* isolate = global->GetIsolate(); | 15140 Isolate* isolate = global->GetIsolate(); |
| 15143 Handle<PropertyCell> cell = isolate->factory()->NewPropertyCell( | 15141 Handle<PropertyCell> cell = isolate->factory()->NewPropertyCellWithHole(); |
| 15144 isolate->factory()->the_hole_value()); | |
| 15145 PropertyDetails details(NONE, DATA, 0); | 15142 PropertyDetails details(NONE, DATA, 0); |
| 15146 details = details.AsDeleted(); | 15143 details = details.AsDeleted(); |
| 15147 Handle<NameDictionary> dictionary = NameDictionary::Add( | 15144 Handle<NameDictionary> dictionary = NameDictionary::Add( |
| 15148 handle(global->property_dictionary()), name, cell, details); | 15145 handle(global->property_dictionary()), name, cell, details); |
| 15149 global->set_properties(*dictionary); | 15146 global->set_properties(*dictionary); |
| 15150 return cell; | 15147 return cell; |
| 15151 } else { | 15148 } else { |
| 15152 Object* value = global->property_dictionary()->ValueAt(entry); | 15149 Object* value = global->property_dictionary()->ValueAt(entry); |
| 15153 DCHECK(value->IsPropertyCell()); | 15150 DCHECK(value->IsPropertyCell()); |
| 15154 return handle(PropertyCell::cast(value)); | 15151 return handle(PropertyCell::cast(value)); |
| (...skipping 1778 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 16933 } | 16930 } |
| 16934 | 16931 |
| 16935 | 16932 |
| 16936 Handle<Object> PropertyCell::SetValueInferType(Handle<PropertyCell> cell, | 16933 Handle<Object> PropertyCell::SetValueInferType(Handle<PropertyCell> cell, |
| 16937 Handle<Object> value) { | 16934 Handle<Object> value) { |
| 16938 // Heuristic: if a small-ish string is stored in a previously uninitialized | 16935 // Heuristic: if a small-ish string is stored in a previously uninitialized |
| 16939 // property cell, internalize it. | 16936 // property cell, internalize it. |
| 16940 const int kMaxLengthForInternalization = 200; | 16937 const int kMaxLengthForInternalization = 200; |
| 16941 if ((cell->type()->Is(HeapType::None()) || | 16938 if ((cell->type()->Is(HeapType::None()) || |
| 16942 cell->type()->Is(HeapType::Undefined())) && | 16939 cell->type()->Is(HeapType::Undefined())) && |
| 16943 value->IsString() && | 16940 value->IsString()) { |
| 16944 Handle<String>::cast(value)->length() <= kMaxLengthForInternalization) { | 16941 auto string = Handle<String>::cast(value); |
| 16945 value = cell->GetIsolate()->factory()->InternalizeString( | 16942 if (string->length() <= kMaxLengthForInternalization && |
| 16946 Handle<String>::cast(value)); | 16943 !string->map()->is_undetectable()) { |
| 16944 value = cell->GetIsolate()->factory()->InternalizeString(string); |
| 16945 } |
| 16947 } | 16946 } |
| 16948 cell->set_value(*value); | 16947 cell->set_value(*value); |
| 16949 if (!HeapType::Any()->Is(cell->type())) { | 16948 if (!HeapType::Any()->Is(cell->type())) { |
| 16950 Handle<HeapType> new_type = UpdatedType(cell, value); | 16949 Handle<HeapType> new_type = UpdatedType(cell, value); |
| 16951 cell->set_type(*new_type); | 16950 cell->set_type(*new_type); |
| 16952 } | 16951 } |
| 16953 return value; | 16952 return value; |
| 16954 } | 16953 } |
| 16955 | 16954 |
| 16956 | 16955 |
| 16957 // static | 16956 // static |
| 16958 void PropertyCell::AddDependentCompilationInfo(Handle<PropertyCell> cell, | 16957 void PropertyCell::AddDependentCompilationInfo(Handle<PropertyCell> cell, |
| 16959 CompilationInfo* info) { | 16958 CompilationInfo* info) { |
| 16960 Handle<DependentCode> codes = | 16959 Handle<DependentCode> codes = |
| 16961 DependentCode::Insert(handle(cell->dependent_code(), info->isolate()), | 16960 DependentCode::Insert(handle(cell->dependent_code(), info->isolate()), |
| 16962 DependentCode::kPropertyCellChangedGroup, | 16961 DependentCode::kPropertyCellChangedGroup, |
| 16963 info->object_wrapper()); | 16962 info->object_wrapper()); |
| 16964 if (*codes != cell->dependent_code()) cell->set_dependent_code(*codes); | 16963 if (*codes != cell->dependent_code()) cell->set_dependent_code(*codes); |
| 16965 info->dependencies(DependentCode::kPropertyCellChangedGroup)->Add( | 16964 info->dependencies(DependentCode::kPropertyCellChangedGroup)->Add( |
| 16966 cell, info->zone()); | 16965 cell, info->zone()); |
| 16967 } | 16966 } |
| 16968 | 16967 |
| 16969 } } // namespace v8::internal | 16968 } } // namespace v8::internal |
| OLD | NEW |