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 <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 3205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3216 Isolate* isolate, Handle<Object> receiver, Handle<Object> name, | 3216 Isolate* isolate, Handle<Object> receiver, Handle<Object> name, |
3217 Handle<Object> value, LanguageMode language_mode) { | 3217 Handle<Object> value, LanguageMode language_mode) { |
3218 if (is_sloppy(language_mode)) return value; | 3218 if (is_sloppy(language_mode)) return value; |
3219 THROW_NEW_ERROR( | 3219 THROW_NEW_ERROR( |
3220 isolate, | 3220 isolate, |
3221 NewTypeError(MessageTemplate::kStrictReadOnlyProperty, name, receiver), | 3221 NewTypeError(MessageTemplate::kStrictReadOnlyProperty, name, receiver), |
3222 Object); | 3222 Object); |
3223 } | 3223 } |
3224 | 3224 |
3225 | 3225 |
| 3226 MaybeHandle<Object> Object::WriteToReadOnlyElement(Isolate* isolate, |
| 3227 Handle<Object> receiver, |
| 3228 uint32_t index, |
| 3229 Handle<Object> value, |
| 3230 LanguageMode language_mode) { |
| 3231 return WriteToReadOnlyProperty(isolate, receiver, |
| 3232 isolate->factory()->NewNumberFromUint(index), |
| 3233 value, language_mode); |
| 3234 } |
| 3235 |
| 3236 |
3226 MaybeHandle<Object> Object::RedefineNonconfigurableProperty( | 3237 MaybeHandle<Object> Object::RedefineNonconfigurableProperty( |
3227 Isolate* isolate, Handle<Object> name, Handle<Object> value, | 3238 Isolate* isolate, Handle<Object> name, Handle<Object> value, |
3228 LanguageMode language_mode) { | 3239 LanguageMode language_mode) { |
3229 if (is_sloppy(language_mode)) return value; | 3240 if (is_sloppy(language_mode)) return value; |
3230 THROW_NEW_ERROR(isolate, | 3241 THROW_NEW_ERROR(isolate, |
3231 NewTypeError(MessageTemplate::kRedefineDisallowed, name), | 3242 NewTypeError(MessageTemplate::kRedefineDisallowed, name), |
3232 Object); | 3243 Object); |
3233 } | 3244 } |
3234 | 3245 |
3235 | 3246 |
3236 MaybeHandle<Object> Object::SetDataProperty(LookupIterator* it, | 3247 MaybeHandle<Object> Object::SetDataProperty(LookupIterator* it, |
3237 Handle<Object> value) { | 3248 Handle<Object> value) { |
3238 // Proxies are handled on the WithHandler path. Other non-JSObjects cannot | 3249 // Proxies are handled on the WithHandler path. Other non-JSObjects cannot |
3239 // have own properties. | 3250 // have own properties. |
3240 Handle<JSObject> receiver = Handle<JSObject>::cast(it->GetReceiver()); | 3251 Handle<JSObject> receiver = Handle<JSObject>::cast(it->GetReceiver()); |
3241 | 3252 |
3242 // Store on the holder which may be hidden behind the receiver. | 3253 // Store on the holder which may be hidden behind the receiver. |
3243 DCHECK(it->HolderIsReceiverOrHiddenPrototype()); | 3254 DCHECK(it->HolderIsReceiverOrHiddenPrototype()); |
3244 | 3255 |
3245 // Old value for the observation change record. | 3256 // Old value for the observation change record. |
3246 // Fetch before transforming the object since the encoding may become | 3257 // Fetch before transforming the object since the encoding may become |
3247 // incompatible with what's cached in |it|. | 3258 // incompatible with what's cached in |it|. |
3248 bool is_observed = receiver->map()->is_observed() && | 3259 bool is_observed = receiver->map()->is_observed() && |
3249 (it->IsElement() || | 3260 (it->IsElement() || |
3250 !it->isolate()->IsInternallyUsedPropertyName(it->name())); | 3261 !it->isolate()->IsInternallyUsedPropertyName(it->name())); |
3251 MaybeHandle<Object> maybe_old; | 3262 MaybeHandle<Object> maybe_old; |
3252 if (is_observed) maybe_old = it->GetDataValue(); | 3263 if (is_observed) maybe_old = it->GetDataValue(); |
3253 | 3264 |
3254 Handle<Object> to_assign = value; | |
3255 // Convert the incoming value to a number for storing into typed arrays. | 3265 // Convert the incoming value to a number for storing into typed arrays. |
3256 if (it->IsElement() && (receiver->HasExternalArrayElements() || | 3266 if (it->IsElement() && (receiver->HasExternalArrayElements() || |
3257 receiver->HasFixedTypedArrayElements())) { | 3267 receiver->HasFixedTypedArrayElements())) { |
3258 if (!value->IsNumber() && !value->IsUndefined()) { | 3268 if (!value->IsNumber() && !value->IsUndefined()) { |
3259 ASSIGN_RETURN_ON_EXCEPTION(it->isolate(), to_assign, | 3269 ASSIGN_RETURN_ON_EXCEPTION(it->isolate(), value, |
3260 Execution::ToNumber(it->isolate(), value), | 3270 Execution::ToNumber(it->isolate(), value), |
3261 Object); | 3271 Object); |
3262 } | 3272 } |
3263 } | 3273 } |
3264 | 3274 |
3265 // Possibly migrate to the most up-to-date map that will be able to store | 3275 // Possibly migrate to the most up-to-date map that will be able to store |
3266 // |value| under it->name(). | 3276 // |value| under it->name(). |
3267 it->PrepareForDataProperty(to_assign); | 3277 it->PrepareForDataProperty(value); |
3268 | 3278 |
3269 // Write the property value. | 3279 // Write the property value. |
3270 it->WriteDataValue(to_assign); | 3280 value = it->WriteDataValue(value); |
3271 | 3281 |
3272 // Send the change record if there are observers. | 3282 // Send the change record if there are observers. |
3273 if (is_observed && !value->SameValue(*maybe_old.ToHandleChecked())) { | 3283 if (is_observed && !value->SameValue(*maybe_old.ToHandleChecked())) { |
3274 RETURN_ON_EXCEPTION(it->isolate(), JSObject::EnqueueChangeRecord( | 3284 RETURN_ON_EXCEPTION(it->isolate(), JSObject::EnqueueChangeRecord( |
3275 receiver, "update", it->GetName(), | 3285 receiver, "update", it->GetName(), |
3276 maybe_old.ToHandleChecked()), | 3286 maybe_old.ToHandleChecked()), |
3277 Object); | 3287 Object); |
3278 } | 3288 } |
3279 | 3289 |
3280 return value; | 3290 return value; |
(...skipping 956 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4237 | 4247 |
4238 | 4248 |
4239 // Reconfigures a property to a data property with attributes, even if it is not | 4249 // Reconfigures a property to a data property with attributes, even if it is not |
4240 // reconfigurable. | 4250 // reconfigurable. |
4241 MaybeHandle<Object> JSObject::SetOwnPropertyIgnoreAttributes( | 4251 MaybeHandle<Object> JSObject::SetOwnPropertyIgnoreAttributes( |
4242 Handle<JSObject> object, Handle<Name> name, Handle<Object> value, | 4252 Handle<JSObject> object, Handle<Name> name, Handle<Object> value, |
4243 PropertyAttributes attributes) { | 4253 PropertyAttributes attributes) { |
4244 DCHECK(!value->IsTheHole()); | 4254 DCHECK(!value->IsTheHole()); |
4245 LookupIterator it(object, name, LookupIterator::OWN_SKIP_INTERCEPTOR); | 4255 LookupIterator it(object, name, LookupIterator::OWN_SKIP_INTERCEPTOR); |
4246 if (it.state() == LookupIterator::ACCESS_CHECK) { | 4256 if (it.state() == LookupIterator::ACCESS_CHECK) { |
4247 if (!it.HasAccess()) { | 4257 if (!it.isolate()->MayAccess(object)) { |
4248 return SetPropertyWithFailedAccessCheck(&it, value, SLOPPY); | 4258 return SetPropertyWithFailedAccessCheck(&it, value, SLOPPY); |
4249 } | 4259 } |
4250 it.Next(); | 4260 it.Next(); |
4251 } | 4261 } |
4252 | 4262 |
4253 if (it.IsFound()) { | 4263 if (it.IsFound()) { |
4254 return ReconfigureAsDataProperty(&it, value, attributes); | 4264 return ReconfigureAsDataProperty(&it, value, attributes); |
4255 } | 4265 } |
4256 | 4266 |
4257 return AddDataProperty(&it, value, attributes, STRICT, | 4267 return AddDataProperty(&it, value, attributes, STRICT, |
4258 CERTAINLY_NOT_STORE_FROM_KEYED); | 4268 CERTAINLY_NOT_STORE_FROM_KEYED); |
4259 } | 4269 } |
4260 | 4270 |
4261 | 4271 |
4262 MaybeHandle<Object> JSObject::SetOwnElementIgnoreAttributes( | 4272 MaybeHandle<Object> JSObject::SetOwnElementIgnoreAttributes( |
4263 Handle<JSObject> object, uint32_t index, Handle<Object> value, | 4273 Handle<JSObject> object, uint32_t index, Handle<Object> value, |
4264 PropertyAttributes attributes) { | 4274 PropertyAttributes attributes) { |
4265 DCHECK(!object->HasExternalArrayElements()); | 4275 DCHECK(!object->HasExternalArrayElements()); |
4266 Isolate* isolate = object->GetIsolate(); | 4276 Isolate* isolate = object->GetIsolate(); |
4267 LookupIterator it(isolate, object, index, | 4277 LookupIterator it(isolate, object, index, |
4268 LookupIterator::OWN_SKIP_INTERCEPTOR); | 4278 LookupIterator::OWN_SKIP_INTERCEPTOR); |
4269 if (it.state() == LookupIterator::ACCESS_CHECK) { | 4279 if (it.state() == LookupIterator::ACCESS_CHECK) { |
4270 if (!it.HasAccess()) { | 4280 if (!isolate->MayAccess(object)) { |
4271 return SetPropertyWithFailedAccessCheck(&it, value, STRICT); | 4281 return SetPropertyWithFailedAccessCheck(&it, value, STRICT); |
4272 } | 4282 } |
4273 it.Next(); | 4283 it.Next(); |
4274 } | 4284 } |
4275 | 4285 |
4276 if (it.IsFound()) { | 4286 if (it.IsFound()) { |
4277 return ReconfigureAsDataProperty(&it, value, attributes); | 4287 return ReconfigureAsDataProperty(&it, value, attributes); |
4278 } | 4288 } |
4279 | 4289 |
4280 return AddDataProperty(&it, value, attributes, STRICT, | 4290 return AddDataProperty(&it, value, attributes, STRICT, |
(...skipping 12435 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
16716 Handle<Object> new_value) { | 16726 Handle<Object> new_value) { |
16717 if (cell->value() != *new_value) { | 16727 if (cell->value() != *new_value) { |
16718 cell->set_value(*new_value); | 16728 cell->set_value(*new_value); |
16719 Isolate* isolate = cell->GetIsolate(); | 16729 Isolate* isolate = cell->GetIsolate(); |
16720 cell->dependent_code()->DeoptimizeDependentCodeGroup( | 16730 cell->dependent_code()->DeoptimizeDependentCodeGroup( |
16721 isolate, DependentCode::kPropertyCellChangedGroup); | 16731 isolate, DependentCode::kPropertyCellChangedGroup); |
16722 } | 16732 } |
16723 } | 16733 } |
16724 } // namespace internal | 16734 } // namespace internal |
16725 } // namespace v8 | 16735 } // namespace v8 |
OLD | NEW |