| OLD | NEW |
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 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/objects.h" | 5 #include "src/objects.h" |
| 6 | 6 |
| 7 #include <cmath> | 7 #include <cmath> |
| 8 #include <iomanip> | 8 #include <iomanip> |
| 9 #include <sstream> | 9 #include <sstream> |
| 10 | 10 |
| (...skipping 4475 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4486 DCHECK_NE(LookupIterator::INTEGER_INDEXED_EXOTIC, it->state()); | 4486 DCHECK_NE(LookupIterator::INTEGER_INDEXED_EXOTIC, it->state()); |
| 4487 | 4487 |
| 4488 Handle<JSObject> receiver = it->GetStoreTarget(); | 4488 Handle<JSObject> receiver = it->GetStoreTarget(); |
| 4489 | 4489 |
| 4490 // If the receiver is a JSGlobalProxy, store on the prototype (JSGlobalObject) | 4490 // If the receiver is a JSGlobalProxy, store on the prototype (JSGlobalObject) |
| 4491 // instead. If the prototype is Null, the proxy is detached. | 4491 // instead. If the prototype is Null, the proxy is detached. |
| 4492 if (receiver->IsJSGlobalProxy()) return Just(true); | 4492 if (receiver->IsJSGlobalProxy()) return Just(true); |
| 4493 | 4493 |
| 4494 Isolate* isolate = it->isolate(); | 4494 Isolate* isolate = it->isolate(); |
| 4495 | 4495 |
| 4496 if (!receiver->map()->is_extensible() && | 4496 if (it->ExtendingNonExtensible(receiver)) { |
| 4497 (it->IsElement() || !isolate->IsInternallyUsedPropertyName(it->name()))) { | |
| 4498 RETURN_FAILURE( | 4497 RETURN_FAILURE( |
| 4499 isolate, should_throw, | 4498 isolate, should_throw, |
| 4500 NewTypeError(MessageTemplate::kObjectNotExtensible, it->GetName())); | 4499 NewTypeError(MessageTemplate::kObjectNotExtensible, it->GetName())); |
| 4501 } | 4500 } |
| 4502 | 4501 |
| 4503 if (it->IsElement()) { | 4502 if (it->IsElement()) { |
| 4504 if (receiver->IsJSArray()) { | 4503 if (receiver->IsJSArray()) { |
| 4505 Handle<JSArray> array = Handle<JSArray>::cast(receiver); | 4504 Handle<JSArray> array = Handle<JSArray>::cast(receiver); |
| 4506 if (JSArray::WouldChangeReadOnlyLength(array, it->index())) { | 4505 if (JSArray::WouldChangeReadOnlyLength(array, it->index())) { |
| 4507 RETURN_FAILURE(array->GetIsolate(), should_throw, | 4506 RETURN_FAILURE(array->GetIsolate(), should_throw, |
| (...skipping 12 matching lines...) Expand all Loading... |
| 4520 } | 4519 } |
| 4521 } | 4520 } |
| 4522 | 4521 |
| 4523 Maybe<bool> result = JSObject::AddDataElement(receiver, it->index(), value, | 4522 Maybe<bool> result = JSObject::AddDataElement(receiver, it->index(), value, |
| 4524 attributes, should_throw); | 4523 attributes, should_throw); |
| 4525 JSObject::ValidateElements(receiver); | 4524 JSObject::ValidateElements(receiver); |
| 4526 return result; | 4525 return result; |
| 4527 } else { | 4526 } else { |
| 4528 // Migrate to the most up-to-date map that will be able to store |value| | 4527 // Migrate to the most up-to-date map that will be able to store |value| |
| 4529 // under it->name() with |attributes|. | 4528 // under it->name() with |attributes|. |
| 4530 it->PrepareTransitionToDataProperty(value, attributes, store_mode); | 4529 it->PrepareTransitionToDataProperty(receiver, value, attributes, |
| 4530 store_mode); |
| 4531 DCHECK_EQ(LookupIterator::TRANSITION, it->state()); | 4531 DCHECK_EQ(LookupIterator::TRANSITION, it->state()); |
| 4532 it->ApplyTransitionToDataProperty(); | 4532 it->ApplyTransitionToDataProperty(receiver); |
| 4533 | 4533 |
| 4534 // TODO(verwaest): Encapsulate dictionary handling better. | 4534 // TODO(verwaest): Encapsulate dictionary handling better. |
| 4535 if (receiver->map()->is_dictionary_map()) { | 4535 if (receiver->map()->is_dictionary_map()) { |
| 4536 // TODO(verwaest): Probably should ensure this is done beforehand. | 4536 // TODO(verwaest): Probably should ensure this is done beforehand. |
| 4537 it->InternalizeName(); | 4537 it->InternalizeName(); |
| 4538 // TODO(dcarney): just populate TransitionPropertyCell here? | 4538 // TODO(dcarney): just populate TransitionPropertyCell here? |
| 4539 JSObject::AddSlowProperty(receiver, it->name(), value, attributes); | 4539 JSObject::AddSlowProperty(receiver, it->name(), value, attributes); |
| 4540 } else { | 4540 } else { |
| 4541 // Write the property value. | 4541 // Write the property value. |
| 4542 it->WriteDataValue(value); | 4542 it->WriteDataValue(value); |
| (...skipping 5392 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9935 | 9935 |
| 9936 // static | 9936 // static |
| 9937 Handle<Map> Map::PrepareForDataProperty(Handle<Map> map, int descriptor, | 9937 Handle<Map> Map::PrepareForDataProperty(Handle<Map> map, int descriptor, |
| 9938 Handle<Object> value) { | 9938 Handle<Object> value) { |
| 9939 // Dictionaries can store any property value. | 9939 // Dictionaries can store any property value. |
| 9940 if (map->is_dictionary_map()) return map; | 9940 if (map->is_dictionary_map()) return map; |
| 9941 | 9941 |
| 9942 // Migrate to the newest map before storing the property. | 9942 // Migrate to the newest map before storing the property. |
| 9943 map = Update(map); | 9943 map = Update(map); |
| 9944 | 9944 |
| 9945 Handle<DescriptorArray> descriptors(map->instance_descriptors()); | 9945 if (map->instance_descriptors()->CanHoldValue(descriptor, *value)) return map; |
| 9946 | |
| 9947 if (descriptors->CanHoldValue(descriptor, *value)) return map; | |
| 9948 | 9946 |
| 9949 Isolate* isolate = map->GetIsolate(); | 9947 Isolate* isolate = map->GetIsolate(); |
| 9950 PropertyAttributes attributes = | 9948 PropertyAttributes attributes = |
| 9951 descriptors->GetDetails(descriptor).attributes(); | 9949 map->instance_descriptors()->GetDetails(descriptor).attributes(); |
| 9952 Representation representation = value->OptimalRepresentation(); | 9950 Representation representation = value->OptimalRepresentation(); |
| 9953 Handle<FieldType> type = value->OptimalType(isolate, representation); | 9951 Handle<FieldType> type = value->OptimalType(isolate, representation); |
| 9954 | 9952 |
| 9955 return ReconfigureProperty(map, descriptor, kData, attributes, representation, | 9953 return ReconfigureProperty(map, descriptor, kData, attributes, representation, |
| 9956 type, FORCE_FIELD); | 9954 type, FORCE_FIELD); |
| 9957 } | 9955 } |
| 9958 | 9956 |
| 9959 | 9957 |
| 9960 Handle<Map> Map::TransitionToDataProperty(Handle<Map> map, Handle<Name> name, | 9958 Handle<Map> Map::TransitionToDataProperty(Handle<Map> map, Handle<Name> name, |
| 9961 Handle<Object> value, | 9959 Handle<Object> value, |
| (...skipping 10023 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 19985 if (cell->value() != *new_value) { | 19983 if (cell->value() != *new_value) { |
| 19986 cell->set_value(*new_value); | 19984 cell->set_value(*new_value); |
| 19987 Isolate* isolate = cell->GetIsolate(); | 19985 Isolate* isolate = cell->GetIsolate(); |
| 19988 cell->dependent_code()->DeoptimizeDependentCodeGroup( | 19986 cell->dependent_code()->DeoptimizeDependentCodeGroup( |
| 19989 isolate, DependentCode::kPropertyCellChangedGroup); | 19987 isolate, DependentCode::kPropertyCellChangedGroup); |
| 19990 } | 19988 } |
| 19991 } | 19989 } |
| 19992 | 19990 |
| 19993 } // namespace internal | 19991 } // namespace internal |
| 19994 } // namespace v8 | 19992 } // namespace v8 |
| OLD | NEW |