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