| 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 "v8.h" | 5 #include "v8.h" |
| 6 | 6 |
| 7 #include "accessors.h" | 7 #include "accessors.h" |
| 8 #include "allocation-site-scopes.h" | 8 #include "allocation-site-scopes.h" |
| 9 #include "api.h" | 9 #include "api.h" |
| 10 #include "arguments.h" | 10 #include "arguments.h" |
| (...skipping 542 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 553 break; | 553 break; |
| 554 } | 554 } |
| 555 | 555 |
| 556 case INTERCEPTOR: { | 556 case INTERCEPTOR: { |
| 557 // If the object has an interceptor, try real named properties. | 557 // If the object has an interceptor, try real named properties. |
| 558 // No access check in GetPropertyAttributeWithInterceptor. | 558 // No access check in GetPropertyAttributeWithInterceptor. |
| 559 LookupResult r(object->GetIsolate()); | 559 LookupResult r(object->GetIsolate()); |
| 560 if (continue_search) { | 560 if (continue_search) { |
| 561 result->holder()->LookupRealNamedProperty(name, &r); | 561 result->holder()->LookupRealNamedProperty(name, &r); |
| 562 } else { | 562 } else { |
| 563 result->holder()->LocalLookupRealNamedProperty(name, &r); | 563 result->holder()->LookupOwnRealNamedProperty(name, &r); |
| 564 } | 564 } |
| 565 if (!r.IsFound()) break; | 565 if (!r.IsFound()) break; |
| 566 return GetPropertyAttributeWithFailedAccessCheck( | 566 return GetPropertyAttributeWithFailedAccessCheck( |
| 567 object, &r, name, continue_search); | 567 object, &r, name, continue_search); |
| 568 } | 568 } |
| 569 | 569 |
| 570 case HANDLER: | 570 case HANDLER: |
| 571 case NONEXISTENT: | 571 case NONEXISTENT: |
| 572 UNREACHABLE(); | 572 UNREACHABLE(); |
| 573 } | 573 } |
| (...skipping 1414 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1988 argc, args).Assert(); | 1988 argc, args).Assert(); |
| 1989 } | 1989 } |
| 1990 | 1990 |
| 1991 | 1991 |
| 1992 MaybeHandle<Object> JSObject::SetPropertyPostInterceptor( | 1992 MaybeHandle<Object> JSObject::SetPropertyPostInterceptor( |
| 1993 Handle<JSObject> object, | 1993 Handle<JSObject> object, |
| 1994 Handle<Name> name, | 1994 Handle<Name> name, |
| 1995 Handle<Object> value, | 1995 Handle<Object> value, |
| 1996 PropertyAttributes attributes, | 1996 PropertyAttributes attributes, |
| 1997 StrictMode strict_mode) { | 1997 StrictMode strict_mode) { |
| 1998 // Check local property, ignore interceptor. | 1998 // Check own property, ignore interceptor. |
| 1999 Isolate* isolate = object->GetIsolate(); | 1999 Isolate* isolate = object->GetIsolate(); |
| 2000 LookupResult result(isolate); | 2000 LookupResult result(isolate); |
| 2001 object->LocalLookupRealNamedProperty(name, &result); | 2001 object->LookupOwnRealNamedProperty(name, &result); |
| 2002 if (!result.IsFound()) { | 2002 if (!result.IsFound()) { |
| 2003 object->map()->LookupTransition(*object, *name, &result); | 2003 object->map()->LookupTransition(*object, *name, &result); |
| 2004 } | 2004 } |
| 2005 if (result.IsFound()) { | 2005 if (result.IsFound()) { |
| 2006 // An existing property or a map transition was found. Use set property to | 2006 // An existing property or a map transition was found. Use set property to |
| 2007 // handle all these cases. | 2007 // handle all these cases. |
| 2008 return SetPropertyForResult(object, &result, name, value, attributes, | 2008 return SetPropertyForResult(object, &result, name, value, attributes, |
| 2009 strict_mode, MAY_BE_STORE_FROM_KEYED); | 2009 strict_mode, MAY_BE_STORE_FROM_KEYED); |
| 2010 } | 2010 } |
| 2011 bool done = false; | 2011 bool done = false; |
| (...skipping 958 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2970 } | 2970 } |
| 2971 | 2971 |
| 2972 | 2972 |
| 2973 MaybeHandle<Object> JSReceiver::SetProperty(Handle<JSReceiver> object, | 2973 MaybeHandle<Object> JSReceiver::SetProperty(Handle<JSReceiver> object, |
| 2974 Handle<Name> name, | 2974 Handle<Name> name, |
| 2975 Handle<Object> value, | 2975 Handle<Object> value, |
| 2976 PropertyAttributes attributes, | 2976 PropertyAttributes attributes, |
| 2977 StrictMode strict_mode, | 2977 StrictMode strict_mode, |
| 2978 StoreFromKeyed store_mode) { | 2978 StoreFromKeyed store_mode) { |
| 2979 LookupResult result(object->GetIsolate()); | 2979 LookupResult result(object->GetIsolate()); |
| 2980 object->LocalLookup(name, &result, true); | 2980 object->LookupOwn(name, &result, true); |
| 2981 if (!result.IsFound()) { | 2981 if (!result.IsFound()) { |
| 2982 object->map()->LookupTransition(JSObject::cast(*object), *name, &result); | 2982 object->map()->LookupTransition(JSObject::cast(*object), *name, &result); |
| 2983 } | 2983 } |
| 2984 return SetProperty(object, &result, name, value, attributes, strict_mode, | 2984 return SetProperty(object, &result, name, value, attributes, strict_mode, |
| 2985 store_mode); | 2985 store_mode); |
| 2986 } | 2986 } |
| 2987 | 2987 |
| 2988 | 2988 |
| 2989 MaybeHandle<Object> JSObject::SetPropertyWithCallback(Handle<JSObject> object, | 2989 MaybeHandle<Object> JSObject::SetPropertyWithCallback(Handle<JSObject> object, |
| 2990 Handle<Object> structure, | 2990 Handle<Object> structure, |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3118 MaybeHandle<Object> JSObject::SetPropertyViaPrototypes( | 3118 MaybeHandle<Object> JSObject::SetPropertyViaPrototypes( |
| 3119 Handle<JSObject> object, | 3119 Handle<JSObject> object, |
| 3120 Handle<Name> name, | 3120 Handle<Name> name, |
| 3121 Handle<Object> value, | 3121 Handle<Object> value, |
| 3122 PropertyAttributes attributes, | 3122 PropertyAttributes attributes, |
| 3123 StrictMode strict_mode, | 3123 StrictMode strict_mode, |
| 3124 bool* done) { | 3124 bool* done) { |
| 3125 Isolate* isolate = object->GetIsolate(); | 3125 Isolate* isolate = object->GetIsolate(); |
| 3126 | 3126 |
| 3127 *done = false; | 3127 *done = false; |
| 3128 // We could not find a local property so let's check whether there is an | 3128 // We could not find an own property, so let's check whether there is an |
| 3129 // accessor that wants to handle the property, or whether the property is | 3129 // accessor that wants to handle the property, or whether the property is |
| 3130 // read-only on the prototype chain. | 3130 // read-only on the prototype chain. |
| 3131 LookupResult result(isolate); | 3131 LookupResult result(isolate); |
| 3132 object->LookupRealNamedPropertyInPrototypes(name, &result); | 3132 object->LookupRealNamedPropertyInPrototypes(name, &result); |
| 3133 if (result.IsFound()) { | 3133 if (result.IsFound()) { |
| 3134 switch (result.type()) { | 3134 switch (result.type()) { |
| 3135 case NORMAL: | 3135 case NORMAL: |
| 3136 case FIELD: | 3136 case FIELD: |
| 3137 case CONSTANT: | 3137 case CONSTANT: |
| 3138 *done = result.IsReadOnly(); | 3138 *done = result.IsReadOnly(); |
| (...skipping 355 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3494 } | 3494 } |
| 3495 | 3495 |
| 3496 | 3496 |
| 3497 Handle<Map> JSObject::GetElementsTransitionMap(Handle<JSObject> object, | 3497 Handle<Map> JSObject::GetElementsTransitionMap(Handle<JSObject> object, |
| 3498 ElementsKind to_kind) { | 3498 ElementsKind to_kind) { |
| 3499 Handle<Map> map(object->map()); | 3499 Handle<Map> map(object->map()); |
| 3500 return Map::TransitionElementsTo(map, to_kind); | 3500 return Map::TransitionElementsTo(map, to_kind); |
| 3501 } | 3501 } |
| 3502 | 3502 |
| 3503 | 3503 |
| 3504 void JSObject::LocalLookupRealNamedProperty(Handle<Name> name, | 3504 void JSObject::LookupOwnRealNamedProperty(Handle<Name> name, |
| 3505 LookupResult* result) { | 3505 LookupResult* result) { |
| 3506 DisallowHeapAllocation no_gc; | 3506 DisallowHeapAllocation no_gc; |
| 3507 if (IsJSGlobalProxy()) { | 3507 if (IsJSGlobalProxy()) { |
| 3508 Object* proto = GetPrototype(); | 3508 Object* proto = GetPrototype(); |
| 3509 if (proto->IsNull()) return result->NotFound(); | 3509 if (proto->IsNull()) return result->NotFound(); |
| 3510 ASSERT(proto->IsJSGlobalObject()); | 3510 ASSERT(proto->IsJSGlobalObject()); |
| 3511 return JSObject::cast(proto)->LocalLookupRealNamedProperty(name, result); | 3511 return JSObject::cast(proto)->LookupOwnRealNamedProperty(name, result); |
| 3512 } | 3512 } |
| 3513 | 3513 |
| 3514 if (HasFastProperties()) { | 3514 if (HasFastProperties()) { |
| 3515 map()->LookupDescriptor(this, *name, result); | 3515 map()->LookupDescriptor(this, *name, result); |
| 3516 // A property or a map transition was found. We return all of these result | 3516 // A property or a map transition was found. We return all of these result |
| 3517 // types because LocalLookupRealNamedProperty is used when setting | 3517 // types because LookupOwnRealNamedProperty is used when setting |
| 3518 // properties where map transitions are handled. | 3518 // properties where map transitions are handled. |
| 3519 ASSERT(!result->IsFound() || | 3519 ASSERT(!result->IsFound() || |
| 3520 (result->holder() == this && result->IsFastPropertyType())); | 3520 (result->holder() == this && result->IsFastPropertyType())); |
| 3521 // Disallow caching for uninitialized constants. These can only | 3521 // Disallow caching for uninitialized constants. These can only |
| 3522 // occur as fields. | 3522 // occur as fields. |
| 3523 if (result->IsField() && | 3523 if (result->IsField() && |
| 3524 result->IsReadOnly() && | 3524 result->IsReadOnly() && |
| 3525 RawFastPropertyAt(result->GetFieldIndex().field_index())->IsTheHole()) { | 3525 RawFastPropertyAt(result->GetFieldIndex().field_index())->IsTheHole()) { |
| 3526 result->DisallowCaching(); | 3526 result->DisallowCaching(); |
| 3527 } | 3527 } |
| (...skipping 18 matching lines...) Expand all Loading... |
| 3546 return; | 3546 return; |
| 3547 } | 3547 } |
| 3548 | 3548 |
| 3549 result->NotFound(); | 3549 result->NotFound(); |
| 3550 } | 3550 } |
| 3551 | 3551 |
| 3552 | 3552 |
| 3553 void JSObject::LookupRealNamedProperty(Handle<Name> name, | 3553 void JSObject::LookupRealNamedProperty(Handle<Name> name, |
| 3554 LookupResult* result) { | 3554 LookupResult* result) { |
| 3555 DisallowHeapAllocation no_gc; | 3555 DisallowHeapAllocation no_gc; |
| 3556 LocalLookupRealNamedProperty(name, result); | 3556 LookupOwnRealNamedProperty(name, result); |
| 3557 if (result->IsFound()) return; | 3557 if (result->IsFound()) return; |
| 3558 | 3558 |
| 3559 LookupRealNamedPropertyInPrototypes(name, result); | 3559 LookupRealNamedPropertyInPrototypes(name, result); |
| 3560 } | 3560 } |
| 3561 | 3561 |
| 3562 | 3562 |
| 3563 void JSObject::LookupRealNamedPropertyInPrototypes(Handle<Name> name, | 3563 void JSObject::LookupRealNamedPropertyInPrototypes(Handle<Name> name, |
| 3564 LookupResult* result) { | 3564 LookupResult* result) { |
| 3565 DisallowHeapAllocation no_gc; | 3565 DisallowHeapAllocation no_gc; |
| 3566 Isolate* isolate = GetIsolate(); | 3566 Isolate* isolate = GetIsolate(); |
| 3567 Heap* heap = isolate->heap(); | 3567 Heap* heap = isolate->heap(); |
| 3568 for (Object* pt = GetPrototype(); | 3568 for (Object* pt = GetPrototype(); |
| 3569 pt != heap->null_value(); | 3569 pt != heap->null_value(); |
| 3570 pt = pt->GetPrototype(isolate)) { | 3570 pt = pt->GetPrototype(isolate)) { |
| 3571 if (pt->IsJSProxy()) { | 3571 if (pt->IsJSProxy()) { |
| 3572 return result->HandlerResult(JSProxy::cast(pt)); | 3572 return result->HandlerResult(JSProxy::cast(pt)); |
| 3573 } | 3573 } |
| 3574 JSObject::cast(pt)->LocalLookupRealNamedProperty(name, result); | 3574 JSObject::cast(pt)->LookupOwnRealNamedProperty(name, result); |
| 3575 ASSERT(!(result->IsFound() && result->type() == INTERCEPTOR)); | 3575 ASSERT(!(result->IsFound() && result->type() == INTERCEPTOR)); |
| 3576 if (result->IsFound()) return; | 3576 if (result->IsFound()) return; |
| 3577 } | 3577 } |
| 3578 result->NotFound(); | 3578 result->NotFound(); |
| 3579 } | 3579 } |
| 3580 | 3580 |
| 3581 | 3581 |
| 3582 // We only need to deal with CALLBACKS and INTERCEPTORS | 3582 // We only need to deal with CALLBACKS and INTERCEPTORS |
| 3583 MaybeHandle<Object> JSObject::SetPropertyWithFailedAccessCheck( | 3583 MaybeHandle<Object> JSObject::SetPropertyWithFailedAccessCheck( |
| 3584 Handle<JSObject> object, | 3584 Handle<JSObject> object, |
| (...skipping 542 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4127 lookup->isolate(), field_representation); | 4127 lookup->isolate(), field_representation); |
| 4128 JSObject::GeneralizeFieldRepresentation(handle(lookup->holder()), | 4128 JSObject::GeneralizeFieldRepresentation(handle(lookup->holder()), |
| 4129 lookup->GetDescriptorIndex(), | 4129 lookup->GetDescriptorIndex(), |
| 4130 field_representation, field_type, | 4130 field_representation, field_type, |
| 4131 FORCE_FIELD); | 4131 FORCE_FIELD); |
| 4132 } | 4132 } |
| 4133 lookup->holder()->WriteToField(lookup->GetDescriptorIndex(), *value); | 4133 lookup->holder()->WriteToField(lookup->GetDescriptorIndex(), *value); |
| 4134 } | 4134 } |
| 4135 | 4135 |
| 4136 | 4136 |
| 4137 static void ConvertAndSetLocalProperty(LookupResult* lookup, | 4137 static void ConvertAndSetOwnProperty(LookupResult* lookup, |
| 4138 Handle<Name> name, | 4138 Handle<Name> name, |
| 4139 Handle<Object> value, | 4139 Handle<Object> value, |
| 4140 PropertyAttributes attributes) { | 4140 PropertyAttributes attributes) { |
| 4141 Handle<JSObject> object(lookup->holder()); | 4141 Handle<JSObject> object(lookup->holder()); |
| 4142 if (object->TooManyFastProperties()) { | 4142 if (object->TooManyFastProperties()) { |
| 4143 JSObject::NormalizeProperties(object, CLEAR_INOBJECT_PROPERTIES, 0); | 4143 JSObject::NormalizeProperties(object, CLEAR_INOBJECT_PROPERTIES, 0); |
| 4144 } | 4144 } |
| 4145 | 4145 |
| 4146 if (!object->HasFastProperties()) { | 4146 if (!object->HasFastProperties()) { |
| 4147 ReplaceSlowProperty(object, name, value, attributes); | 4147 ReplaceSlowProperty(object, name, value, attributes); |
| 4148 return; | 4148 return; |
| 4149 } | 4149 } |
| 4150 | 4150 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 4165 | 4165 |
| 4166 | 4166 |
| 4167 static void SetPropertyToFieldWithAttributes(LookupResult* lookup, | 4167 static void SetPropertyToFieldWithAttributes(LookupResult* lookup, |
| 4168 Handle<Name> name, | 4168 Handle<Name> name, |
| 4169 Handle<Object> value, | 4169 Handle<Object> value, |
| 4170 PropertyAttributes attributes) { | 4170 PropertyAttributes attributes) { |
| 4171 if (lookup->GetAttributes() == attributes) { | 4171 if (lookup->GetAttributes() == attributes) { |
| 4172 if (value->IsUninitialized()) return; | 4172 if (value->IsUninitialized()) return; |
| 4173 SetPropertyToField(lookup, value); | 4173 SetPropertyToField(lookup, value); |
| 4174 } else { | 4174 } else { |
| 4175 ConvertAndSetLocalProperty(lookup, name, value, attributes); | 4175 ConvertAndSetOwnProperty(lookup, name, value, attributes); |
| 4176 } | 4176 } |
| 4177 } | 4177 } |
| 4178 | 4178 |
| 4179 | 4179 |
| 4180 MaybeHandle<Object> JSObject::SetPropertyForResult( | 4180 MaybeHandle<Object> JSObject::SetPropertyForResult( |
| 4181 Handle<JSObject> object, | 4181 Handle<JSObject> object, |
| 4182 LookupResult* lookup, | 4182 LookupResult* lookup, |
| 4183 Handle<Name> name, | 4183 Handle<Name> name, |
| 4184 Handle<Object> value, | 4184 Handle<Object> value, |
| 4185 PropertyAttributes attributes, | 4185 PropertyAttributes attributes, |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4288 } | 4288 } |
| 4289 | 4289 |
| 4290 Handle<Object> result; | 4290 Handle<Object> result; |
| 4291 ASSIGN_RETURN_ON_EXCEPTION(isolate, result, maybe_result, Object); | 4291 ASSIGN_RETURN_ON_EXCEPTION(isolate, result, maybe_result, Object); |
| 4292 | 4292 |
| 4293 if (is_observed) { | 4293 if (is_observed) { |
| 4294 if (lookup->IsTransition()) { | 4294 if (lookup->IsTransition()) { |
| 4295 EnqueueChangeRecord(object, "add", name, old_value); | 4295 EnqueueChangeRecord(object, "add", name, old_value); |
| 4296 } else { | 4296 } else { |
| 4297 LookupResult new_lookup(isolate); | 4297 LookupResult new_lookup(isolate); |
| 4298 object->LocalLookup(name, &new_lookup, true); | 4298 object->LookupOwn(name, &new_lookup, true); |
| 4299 if (new_lookup.IsDataProperty()) { | 4299 if (new_lookup.IsDataProperty()) { |
| 4300 Handle<Object> new_value = | 4300 Handle<Object> new_value = |
| 4301 Object::GetPropertyOrElement(object, name).ToHandleChecked(); | 4301 Object::GetPropertyOrElement(object, name).ToHandleChecked(); |
| 4302 if (!new_value->SameValue(*old_value)) { | 4302 if (!new_value->SameValue(*old_value)) { |
| 4303 EnqueueChangeRecord(object, "update", name, old_value); | 4303 EnqueueChangeRecord(object, "update", name, old_value); |
| 4304 } | 4304 } |
| 4305 } | 4305 } |
| 4306 } | 4306 } |
| 4307 } | 4307 } |
| 4308 | 4308 |
| 4309 return result; | 4309 return result; |
| 4310 } | 4310 } |
| 4311 | 4311 |
| 4312 | 4312 |
| 4313 // Set a real local property, even if it is READ_ONLY. If the property is not | 4313 // Set a real own property, even if it is READ_ONLY. If the property is not |
| 4314 // present, add it with attributes NONE. This code is an exact clone of | 4314 // present, add it with attributes NONE. This code is an exact clone of |
| 4315 // SetProperty, with the check for IsReadOnly and the check for a | 4315 // SetProperty, with the check for IsReadOnly and the check for a |
| 4316 // callback setter removed. The two lines looking up the LookupResult | 4316 // callback setter removed. The two lines looking up the LookupResult |
| 4317 // result are also added. If one of the functions is changed, the other | 4317 // result are also added. If one of the functions is changed, the other |
| 4318 // should be. | 4318 // should be. |
| 4319 // Note that this method cannot be used to set the prototype of a function | 4319 // Note that this method cannot be used to set the prototype of a function |
| 4320 // because ConvertDescriptorToField() which is called in "case CALLBACKS:" | 4320 // because ConvertDescriptorToField() which is called in "case CALLBACKS:" |
| 4321 // doesn't handle function prototypes correctly. | 4321 // doesn't handle function prototypes correctly. |
| 4322 MaybeHandle<Object> JSObject::SetLocalPropertyIgnoreAttributes( | 4322 MaybeHandle<Object> JSObject::SetOwnPropertyIgnoreAttributes( |
| 4323 Handle<JSObject> object, | 4323 Handle<JSObject> object, |
| 4324 Handle<Name> name, | 4324 Handle<Name> name, |
| 4325 Handle<Object> value, | 4325 Handle<Object> value, |
| 4326 PropertyAttributes attributes, | 4326 PropertyAttributes attributes, |
| 4327 ValueType value_type, | 4327 ValueType value_type, |
| 4328 StoreMode mode, | 4328 StoreMode mode, |
| 4329 ExtensibilityCheck extensibility_check, | 4329 ExtensibilityCheck extensibility_check, |
| 4330 StoreFromKeyed store_from_keyed) { | 4330 StoreFromKeyed store_from_keyed) { |
| 4331 Isolate* isolate = object->GetIsolate(); | 4331 Isolate* isolate = object->GetIsolate(); |
| 4332 | 4332 |
| 4333 // Make sure that the top context does not change when doing callbacks or | 4333 // Make sure that the top context does not change when doing callbacks or |
| 4334 // interceptor calls. | 4334 // interceptor calls. |
| 4335 AssertNoContextChange ncc(isolate); | 4335 AssertNoContextChange ncc(isolate); |
| 4336 | 4336 |
| 4337 LookupResult lookup(isolate); | 4337 LookupResult lookup(isolate); |
| 4338 object->LocalLookup(name, &lookup, true); | 4338 object->LookupOwn(name, &lookup, true); |
| 4339 if (!lookup.IsFound()) { | 4339 if (!lookup.IsFound()) { |
| 4340 object->map()->LookupTransition(*object, *name, &lookup); | 4340 object->map()->LookupTransition(*object, *name, &lookup); |
| 4341 } | 4341 } |
| 4342 | 4342 |
| 4343 // Check access rights if needed. | 4343 // Check access rights if needed. |
| 4344 if (object->IsAccessCheckNeeded()) { | 4344 if (object->IsAccessCheckNeeded()) { |
| 4345 if (!isolate->MayNamedAccess(object, name, v8::ACCESS_SET)) { | 4345 if (!isolate->MayNamedAccess(object, name, v8::ACCESS_SET)) { |
| 4346 return SetPropertyWithFailedAccessCheck(object, &lookup, name, value, | 4346 return SetPropertyWithFailedAccessCheck(object, &lookup, name, value, |
| 4347 false, SLOPPY); | 4347 false, SLOPPY); |
| 4348 } | 4348 } |
| 4349 } | 4349 } |
| 4350 | 4350 |
| 4351 if (object->IsJSGlobalProxy()) { | 4351 if (object->IsJSGlobalProxy()) { |
| 4352 Handle<Object> proto(object->GetPrototype(), isolate); | 4352 Handle<Object> proto(object->GetPrototype(), isolate); |
| 4353 if (proto->IsNull()) return value; | 4353 if (proto->IsNull()) return value; |
| 4354 ASSERT(proto->IsJSGlobalObject()); | 4354 ASSERT(proto->IsJSGlobalObject()); |
| 4355 return SetLocalPropertyIgnoreAttributes(Handle<JSObject>::cast(proto), | 4355 return SetOwnPropertyIgnoreAttributes(Handle<JSObject>::cast(proto), |
| 4356 name, value, attributes, value_type, mode, extensibility_check); | 4356 name, value, attributes, value_type, mode, extensibility_check); |
| 4357 } | 4357 } |
| 4358 | 4358 |
| 4359 if (lookup.IsInterceptor() || | 4359 if (lookup.IsInterceptor() || |
| 4360 (lookup.IsDescriptorOrDictionary() && lookup.type() == CALLBACKS)) { | 4360 (lookup.IsDescriptorOrDictionary() && lookup.type() == CALLBACKS)) { |
| 4361 object->LocalLookupRealNamedProperty(name, &lookup); | 4361 object->LookupOwnRealNamedProperty(name, &lookup); |
| 4362 } | 4362 } |
| 4363 | 4363 |
| 4364 // Check for accessor in prototype chain removed here in clone. | 4364 // Check for accessor in prototype chain removed here in clone. |
| 4365 if (!lookup.IsFound()) { | 4365 if (!lookup.IsFound()) { |
| 4366 object->map()->LookupTransition(*object, *name, &lookup); | 4366 object->map()->LookupTransition(*object, *name, &lookup); |
| 4367 TransitionFlag flag = lookup.IsFound() | 4367 TransitionFlag flag = lookup.IsFound() |
| 4368 ? OMIT_TRANSITION : INSERT_TRANSITION; | 4368 ? OMIT_TRANSITION : INSERT_TRANSITION; |
| 4369 // Neither properties nor transitions found. | 4369 // Neither properties nor transitions found. |
| 4370 return AddProperty(object, name, value, attributes, SLOPPY, | 4370 return AddProperty(object, name, value, attributes, SLOPPY, |
| 4371 store_from_keyed, extensibility_check, value_type, mode, flag); | 4371 store_from_keyed, extensibility_check, value_type, mode, flag); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 4399 SetPropertyToFieldWithAttributes(&lookup, name, value, attributes); | 4399 SetPropertyToFieldWithAttributes(&lookup, name, value, attributes); |
| 4400 break; | 4400 break; |
| 4401 case CONSTANT: | 4401 case CONSTANT: |
| 4402 // Only replace the constant if necessary. | 4402 // Only replace the constant if necessary. |
| 4403 if (lookup.GetAttributes() != attributes || | 4403 if (lookup.GetAttributes() != attributes || |
| 4404 *value != lookup.GetConstant()) { | 4404 *value != lookup.GetConstant()) { |
| 4405 SetPropertyToFieldWithAttributes(&lookup, name, value, attributes); | 4405 SetPropertyToFieldWithAttributes(&lookup, name, value, attributes); |
| 4406 } | 4406 } |
| 4407 break; | 4407 break; |
| 4408 case CALLBACKS: | 4408 case CALLBACKS: |
| 4409 ConvertAndSetLocalProperty(&lookup, name, value, attributes); | 4409 ConvertAndSetOwnProperty(&lookup, name, value, attributes); |
| 4410 break; | 4410 break; |
| 4411 case NONEXISTENT: | 4411 case NONEXISTENT: |
| 4412 case HANDLER: | 4412 case HANDLER: |
| 4413 case INTERCEPTOR: | 4413 case INTERCEPTOR: |
| 4414 UNREACHABLE(); | 4414 UNREACHABLE(); |
| 4415 } | 4415 } |
| 4416 } | 4416 } |
| 4417 | 4417 |
| 4418 if (is_observed) { | 4418 if (is_observed) { |
| 4419 if (lookup.IsTransition()) { | 4419 if (lookup.IsTransition()) { |
| 4420 EnqueueChangeRecord(object, "add", name, old_value); | 4420 EnqueueChangeRecord(object, "add", name, old_value); |
| 4421 } else if (old_value->IsTheHole()) { | 4421 } else if (old_value->IsTheHole()) { |
| 4422 EnqueueChangeRecord(object, "reconfigure", name, old_value); | 4422 EnqueueChangeRecord(object, "reconfigure", name, old_value); |
| 4423 } else { | 4423 } else { |
| 4424 LookupResult new_lookup(isolate); | 4424 LookupResult new_lookup(isolate); |
| 4425 object->LocalLookup(name, &new_lookup, true); | 4425 object->LookupOwn(name, &new_lookup, true); |
| 4426 bool value_changed = false; | 4426 bool value_changed = false; |
| 4427 if (new_lookup.IsDataProperty()) { | 4427 if (new_lookup.IsDataProperty()) { |
| 4428 Handle<Object> new_value = | 4428 Handle<Object> new_value = |
| 4429 Object::GetPropertyOrElement(object, name).ToHandleChecked(); | 4429 Object::GetPropertyOrElement(object, name).ToHandleChecked(); |
| 4430 value_changed = !old_value->SameValue(*new_value); | 4430 value_changed = !old_value->SameValue(*new_value); |
| 4431 } | 4431 } |
| 4432 if (new_lookup.GetAttributes() != old_attributes) { | 4432 if (new_lookup.GetAttributes() != old_attributes) { |
| 4433 if (!value_changed) old_value = isolate->factory()->the_hole_value(); | 4433 if (!value_changed) old_value = isolate->factory()->the_hole_value(); |
| 4434 EnqueueChangeRecord(object, "reconfigure", name, old_value); | 4434 EnqueueChangeRecord(object, "reconfigure", name, old_value); |
| 4435 } else if (value_changed) { | 4435 } else if (value_changed) { |
| 4436 EnqueueChangeRecord(object, "update", name, old_value); | 4436 EnqueueChangeRecord(object, "update", name, old_value); |
| 4437 } | 4437 } |
| 4438 } | 4438 } |
| 4439 } | 4439 } |
| 4440 | 4440 |
| 4441 return value; | 4441 return value; |
| 4442 } | 4442 } |
| 4443 | 4443 |
| 4444 | 4444 |
| 4445 PropertyAttributes JSObject::GetPropertyAttributePostInterceptor( | 4445 PropertyAttributes JSObject::GetPropertyAttributePostInterceptor( |
| 4446 Handle<JSObject> object, | 4446 Handle<JSObject> object, |
| 4447 Handle<JSObject> receiver, | 4447 Handle<JSObject> receiver, |
| 4448 Handle<Name> name, | 4448 Handle<Name> name, |
| 4449 bool continue_search) { | 4449 bool continue_search) { |
| 4450 // Check local property, ignore interceptor. | 4450 // Check own property, ignore interceptor. |
| 4451 Isolate* isolate = object->GetIsolate(); | 4451 Isolate* isolate = object->GetIsolate(); |
| 4452 LookupResult result(isolate); | 4452 LookupResult result(isolate); |
| 4453 object->LocalLookupRealNamedProperty(name, &result); | 4453 object->LookupOwnRealNamedProperty(name, &result); |
| 4454 if (result.IsFound()) return result.GetAttributes(); | 4454 if (result.IsFound()) return result.GetAttributes(); |
| 4455 | 4455 |
| 4456 if (continue_search) { | 4456 if (continue_search) { |
| 4457 // Continue searching via the prototype chain. | 4457 // Continue searching via the prototype chain. |
| 4458 Handle<Object> proto(object->GetPrototype(), isolate); | 4458 Handle<Object> proto(object->GetPrototype(), isolate); |
| 4459 if (!proto->IsNull()) { | 4459 if (!proto->IsNull()) { |
| 4460 return JSReceiver::GetPropertyAttributeWithReceiver( | 4460 return JSReceiver::GetPropertyAttributeWithReceiver( |
| 4461 Handle<JSObject>::cast(proto), receiver, name); | 4461 Handle<JSObject>::cast(proto), receiver, name); |
| 4462 } | 4462 } |
| 4463 } | 4463 } |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4557 name, | 4557 name, |
| 4558 continue_search); | 4558 continue_search); |
| 4559 case NONEXISTENT: | 4559 case NONEXISTENT: |
| 4560 UNREACHABLE(); | 4560 UNREACHABLE(); |
| 4561 } | 4561 } |
| 4562 } | 4562 } |
| 4563 return ABSENT; | 4563 return ABSENT; |
| 4564 } | 4564 } |
| 4565 | 4565 |
| 4566 | 4566 |
| 4567 PropertyAttributes JSReceiver::GetLocalPropertyAttribute( | 4567 PropertyAttributes JSReceiver::GetOwnPropertyAttribute( |
| 4568 Handle<JSReceiver> object, Handle<Name> name) { | 4568 Handle<JSReceiver> object, Handle<Name> name) { |
| 4569 // Check whether the name is an array index. | 4569 // Check whether the name is an array index. |
| 4570 uint32_t index = 0; | 4570 uint32_t index = 0; |
| 4571 if (object->IsJSObject() && name->AsArrayIndex(&index)) { | 4571 if (object->IsJSObject() && name->AsArrayIndex(&index)) { |
| 4572 return GetLocalElementAttribute(object, index); | 4572 return GetOwnElementAttribute(object, index); |
| 4573 } | 4573 } |
| 4574 // Named property. | 4574 // Named property. |
| 4575 LookupResult lookup(object->GetIsolate()); | 4575 LookupResult lookup(object->GetIsolate()); |
| 4576 object->LocalLookup(name, &lookup, true); | 4576 object->LookupOwn(name, &lookup, true); |
| 4577 return GetPropertyAttributeForResult(object, object, &lookup, name, false); | 4577 return GetPropertyAttributeForResult(object, object, &lookup, name, false); |
| 4578 } | 4578 } |
| 4579 | 4579 |
| 4580 | 4580 |
| 4581 PropertyAttributes JSObject::GetElementAttributeWithReceiver( | 4581 PropertyAttributes JSObject::GetElementAttributeWithReceiver( |
| 4582 Handle<JSObject> object, | 4582 Handle<JSObject> object, |
| 4583 Handle<JSReceiver> receiver, | 4583 Handle<JSReceiver> receiver, |
| 4584 uint32_t index, | 4584 uint32_t index, |
| 4585 bool continue_search) { | 4585 bool continue_search) { |
| 4586 Isolate* isolate = object->GetIsolate(); | 4586 Isolate* isolate = object->GetIsolate(); |
| (...skipping 686 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5273 descriptors->GetFieldIndex(sorted_index)); | 5273 descriptors->GetFieldIndex(sorted_index)); |
| 5274 } else { | 5274 } else { |
| 5275 return GetHeap()->undefined_value(); | 5275 return GetHeap()->undefined_value(); |
| 5276 } | 5276 } |
| 5277 } else { | 5277 } else { |
| 5278 return GetHeap()->undefined_value(); | 5278 return GetHeap()->undefined_value(); |
| 5279 } | 5279 } |
| 5280 } else { | 5280 } else { |
| 5281 Isolate* isolate = GetIsolate(); | 5281 Isolate* isolate = GetIsolate(); |
| 5282 LookupResult result(isolate); | 5282 LookupResult result(isolate); |
| 5283 LocalLookupRealNamedProperty(isolate->factory()->hidden_string(), &result); | 5283 LookupOwnRealNamedProperty(isolate->factory()->hidden_string(), &result); |
| 5284 if (result.IsFound()) { | 5284 if (result.IsFound()) { |
| 5285 ASSERT(result.IsNormal()); | 5285 ASSERT(result.IsNormal()); |
| 5286 ASSERT(result.holder() == this); | 5286 ASSERT(result.holder() == this); |
| 5287 Object* value = GetNormalizedProperty(&result); | 5287 Object* value = GetNormalizedProperty(&result); |
| 5288 if (!value->IsTheHole()) return value; | 5288 if (!value->IsTheHole()) return value; |
| 5289 } | 5289 } |
| 5290 return GetHeap()->undefined_value(); | 5290 return GetHeap()->undefined_value(); |
| 5291 } | 5291 } |
| 5292 } | 5292 } |
| 5293 | 5293 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 5305 isolate, kInitialCapacity, USE_CUSTOM_MINIMUM_CAPACITY); | 5305 isolate, kInitialCapacity, USE_CUSTOM_MINIMUM_CAPACITY); |
| 5306 | 5306 |
| 5307 if (inline_value->IsSmi()) { | 5307 if (inline_value->IsSmi()) { |
| 5308 // We were storing the identity hash inline and now allocated an actual | 5308 // We were storing the identity hash inline and now allocated an actual |
| 5309 // dictionary. Put the identity hash into the new dictionary. | 5309 // dictionary. Put the identity hash into the new dictionary. |
| 5310 hashtable = ObjectHashTable::Put(hashtable, | 5310 hashtable = ObjectHashTable::Put(hashtable, |
| 5311 isolate->factory()->identity_hash_string(), | 5311 isolate->factory()->identity_hash_string(), |
| 5312 inline_value); | 5312 inline_value); |
| 5313 } | 5313 } |
| 5314 | 5314 |
| 5315 JSObject::SetLocalPropertyIgnoreAttributes( | 5315 JSObject::SetOwnPropertyIgnoreAttributes( |
| 5316 object, | 5316 object, |
| 5317 isolate->factory()->hidden_string(), | 5317 isolate->factory()->hidden_string(), |
| 5318 hashtable, | 5318 hashtable, |
| 5319 DONT_ENUM, | 5319 DONT_ENUM, |
| 5320 OPTIMAL_REPRESENTATION, | 5320 OPTIMAL_REPRESENTATION, |
| 5321 ALLOW_AS_CONSTANT, | 5321 ALLOW_AS_CONSTANT, |
| 5322 OMIT_EXTENSIBILITY_CHECK).Assert(); | 5322 OMIT_EXTENSIBILITY_CHECK).Assert(); |
| 5323 | 5323 |
| 5324 return hashtable; | 5324 return hashtable; |
| 5325 } | 5325 } |
| (...skipping 17 matching lines...) Expand all Loading... |
| 5343 if (descriptors->number_of_descriptors() > 0) { | 5343 if (descriptors->number_of_descriptors() > 0) { |
| 5344 int sorted_index = descriptors->GetSortedKeyIndex(0); | 5344 int sorted_index = descriptors->GetSortedKeyIndex(0); |
| 5345 if (descriptors->GetKey(sorted_index) == isolate->heap()->hidden_string() | 5345 if (descriptors->GetKey(sorted_index) == isolate->heap()->hidden_string() |
| 5346 && sorted_index < object->map()->NumberOfOwnDescriptors()) { | 5346 && sorted_index < object->map()->NumberOfOwnDescriptors()) { |
| 5347 object->WriteToField(sorted_index, *value); | 5347 object->WriteToField(sorted_index, *value); |
| 5348 return object; | 5348 return object; |
| 5349 } | 5349 } |
| 5350 } | 5350 } |
| 5351 } | 5351 } |
| 5352 | 5352 |
| 5353 SetLocalPropertyIgnoreAttributes(object, | 5353 SetOwnPropertyIgnoreAttributes(object, |
| 5354 isolate->factory()->hidden_string(), | 5354 isolate->factory()->hidden_string(), |
| 5355 value, | 5355 value, |
| 5356 DONT_ENUM, | 5356 DONT_ENUM, |
| 5357 OPTIMAL_REPRESENTATION, | 5357 OPTIMAL_REPRESENTATION, |
| 5358 ALLOW_AS_CONSTANT, | 5358 ALLOW_AS_CONSTANT, |
| 5359 OMIT_EXTENSIBILITY_CHECK).Assert(); | 5359 OMIT_EXTENSIBILITY_CHECK).Assert(); |
| 5360 return object; | 5360 return object; |
| 5361 } | 5361 } |
| 5362 | 5362 |
| 5363 | 5363 |
| 5364 Handle<Object> JSObject::DeletePropertyPostInterceptor(Handle<JSObject> object, | 5364 Handle<Object> JSObject::DeletePropertyPostInterceptor(Handle<JSObject> object, |
| 5365 Handle<Name> name, | 5365 Handle<Name> name, |
| 5366 DeleteMode mode) { | 5366 DeleteMode mode) { |
| 5367 // Check local property, ignore interceptor. | 5367 // Check own property, ignore interceptor. |
| 5368 Isolate* isolate = object->GetIsolate(); | 5368 Isolate* isolate = object->GetIsolate(); |
| 5369 LookupResult result(isolate); | 5369 LookupResult result(isolate); |
| 5370 object->LocalLookupRealNamedProperty(name, &result); | 5370 object->LookupOwnRealNamedProperty(name, &result); |
| 5371 if (!result.IsFound()) return isolate->factory()->true_value(); | 5371 if (!result.IsFound()) return isolate->factory()->true_value(); |
| 5372 | 5372 |
| 5373 // Normalize object if needed. | 5373 // Normalize object if needed. |
| 5374 NormalizeProperties(object, CLEAR_INOBJECT_PROPERTIES, 0); | 5374 NormalizeProperties(object, CLEAR_INOBJECT_PROPERTIES, 0); |
| 5375 | 5375 |
| 5376 return DeleteNormalizedProperty(object, name, mode); | 5376 return DeleteNormalizedProperty(object, name, mode); |
| 5377 } | 5377 } |
| 5378 | 5378 |
| 5379 | 5379 |
| 5380 MaybeHandle<Object> JSObject::DeletePropertyWithInterceptor( | 5380 MaybeHandle<Object> JSObject::DeletePropertyWithInterceptor( |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5473 if (object->IsJSGlobalProxy()) { | 5473 if (object->IsJSGlobalProxy()) { |
| 5474 Handle<Object> proto(object->GetPrototype(), isolate); | 5474 Handle<Object> proto(object->GetPrototype(), isolate); |
| 5475 if (proto->IsNull()) return factory->false_value(); | 5475 if (proto->IsNull()) return factory->false_value(); |
| 5476 ASSERT(proto->IsJSGlobalObject()); | 5476 ASSERT(proto->IsJSGlobalObject()); |
| 5477 return DeleteElement(Handle<JSObject>::cast(proto), index, mode); | 5477 return DeleteElement(Handle<JSObject>::cast(proto), index, mode); |
| 5478 } | 5478 } |
| 5479 | 5479 |
| 5480 Handle<Object> old_value; | 5480 Handle<Object> old_value; |
| 5481 bool should_enqueue_change_record = false; | 5481 bool should_enqueue_change_record = false; |
| 5482 if (object->map()->is_observed()) { | 5482 if (object->map()->is_observed()) { |
| 5483 should_enqueue_change_record = HasLocalElement(object, index); | 5483 should_enqueue_change_record = HasOwnElement(object, index); |
| 5484 if (should_enqueue_change_record) { | 5484 if (should_enqueue_change_record) { |
| 5485 if (!GetLocalElementAccessorPair(object, index).is_null()) { | 5485 if (!GetOwnElementAccessorPair(object, index).is_null()) { |
| 5486 old_value = Handle<Object>::cast(factory->the_hole_value()); | 5486 old_value = Handle<Object>::cast(factory->the_hole_value()); |
| 5487 } else { | 5487 } else { |
| 5488 old_value = Object::GetElement( | 5488 old_value = Object::GetElement( |
| 5489 isolate, object, index).ToHandleChecked(); | 5489 isolate, object, index).ToHandleChecked(); |
| 5490 } | 5490 } |
| 5491 } | 5491 } |
| 5492 } | 5492 } |
| 5493 | 5493 |
| 5494 // Skip interceptor if forcing deletion. | 5494 // Skip interceptor if forcing deletion. |
| 5495 MaybeHandle<Object> maybe_result; | 5495 MaybeHandle<Object> maybe_result; |
| 5496 if (object->HasIndexedInterceptor() && mode != FORCE_DELETION) { | 5496 if (object->HasIndexedInterceptor() && mode != FORCE_DELETION) { |
| 5497 maybe_result = DeleteElementWithInterceptor(object, index); | 5497 maybe_result = DeleteElementWithInterceptor(object, index); |
| 5498 } else { | 5498 } else { |
| 5499 maybe_result = object->GetElementsAccessor()->Delete(object, index, mode); | 5499 maybe_result = object->GetElementsAccessor()->Delete(object, index, mode); |
| 5500 } | 5500 } |
| 5501 Handle<Object> result; | 5501 Handle<Object> result; |
| 5502 ASSIGN_RETURN_ON_EXCEPTION(isolate, result, maybe_result, Object); | 5502 ASSIGN_RETURN_ON_EXCEPTION(isolate, result, maybe_result, Object); |
| 5503 | 5503 |
| 5504 if (should_enqueue_change_record && !HasLocalElement(object, index)) { | 5504 if (should_enqueue_change_record && !HasOwnElement(object, index)) { |
| 5505 Handle<String> name = factory->Uint32ToString(index); | 5505 Handle<String> name = factory->Uint32ToString(index); |
| 5506 EnqueueChangeRecord(object, "delete", name, old_value); | 5506 EnqueueChangeRecord(object, "delete", name, old_value); |
| 5507 } | 5507 } |
| 5508 | 5508 |
| 5509 return result; | 5509 return result; |
| 5510 } | 5510 } |
| 5511 | 5511 |
| 5512 | 5512 |
| 5513 MaybeHandle<Object> JSObject::DeleteProperty(Handle<JSObject> object, | 5513 MaybeHandle<Object> JSObject::DeleteProperty(Handle<JSObject> object, |
| 5514 Handle<Name> name, | 5514 Handle<Name> name, |
| (...skipping 17 matching lines...) Expand all Loading... |
| 5532 return JSGlobalObject::DeleteProperty( | 5532 return JSGlobalObject::DeleteProperty( |
| 5533 handle(JSGlobalObject::cast(proto)), name, mode); | 5533 handle(JSGlobalObject::cast(proto)), name, mode); |
| 5534 } | 5534 } |
| 5535 | 5535 |
| 5536 uint32_t index = 0; | 5536 uint32_t index = 0; |
| 5537 if (name->AsArrayIndex(&index)) { | 5537 if (name->AsArrayIndex(&index)) { |
| 5538 return DeleteElement(object, index, mode); | 5538 return DeleteElement(object, index, mode); |
| 5539 } | 5539 } |
| 5540 | 5540 |
| 5541 LookupResult lookup(isolate); | 5541 LookupResult lookup(isolate); |
| 5542 object->LocalLookup(name, &lookup, true); | 5542 object->LookupOwn(name, &lookup, true); |
| 5543 if (!lookup.IsFound()) return isolate->factory()->true_value(); | 5543 if (!lookup.IsFound()) return isolate->factory()->true_value(); |
| 5544 // Ignore attributes if forcing a deletion. | 5544 // Ignore attributes if forcing a deletion. |
| 5545 if (lookup.IsDontDelete() && mode != FORCE_DELETION) { | 5545 if (lookup.IsDontDelete() && mode != FORCE_DELETION) { |
| 5546 if (mode == STRICT_DELETION) { | 5546 if (mode == STRICT_DELETION) { |
| 5547 // Deleting a non-configurable property in strict mode. | 5547 // Deleting a non-configurable property in strict mode. |
| 5548 Handle<Object> args[2] = { name, object }; | 5548 Handle<Object> args[2] = { name, object }; |
| 5549 Handle<Object> error = isolate->factory()->NewTypeError( | 5549 Handle<Object> error = isolate->factory()->NewTypeError( |
| 5550 "strict_delete_property", HandleVector(args, ARRAY_SIZE(args))); | 5550 "strict_delete_property", HandleVector(args, ARRAY_SIZE(args))); |
| 5551 isolate->Throw(*error); | 5551 isolate->Throw(*error); |
| 5552 return Handle<Object>(); | 5552 return Handle<Object>(); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 5573 DeletePropertyWithInterceptor(object, name), | 5573 DeletePropertyWithInterceptor(object, name), |
| 5574 Object); | 5574 Object); |
| 5575 } | 5575 } |
| 5576 } else { | 5576 } else { |
| 5577 // Normalize object if needed. | 5577 // Normalize object if needed. |
| 5578 NormalizeProperties(object, CLEAR_INOBJECT_PROPERTIES, 0); | 5578 NormalizeProperties(object, CLEAR_INOBJECT_PROPERTIES, 0); |
| 5579 // Make sure the properties are normalized before removing the entry. | 5579 // Make sure the properties are normalized before removing the entry. |
| 5580 result = DeleteNormalizedProperty(object, name, mode); | 5580 result = DeleteNormalizedProperty(object, name, mode); |
| 5581 } | 5581 } |
| 5582 | 5582 |
| 5583 if (is_observed && !HasLocalProperty(object, name)) { | 5583 if (is_observed && !HasOwnProperty(object, name)) { |
| 5584 EnqueueChangeRecord(object, "delete", name, old_value); | 5584 EnqueueChangeRecord(object, "delete", name, old_value); |
| 5585 } | 5585 } |
| 5586 | 5586 |
| 5587 return result; | 5587 return result; |
| 5588 } | 5588 } |
| 5589 | 5589 |
| 5590 | 5590 |
| 5591 MaybeHandle<Object> JSReceiver::DeleteElement(Handle<JSReceiver> object, | 5591 MaybeHandle<Object> JSReceiver::DeleteElement(Handle<JSReceiver> object, |
| 5592 uint32_t index, | 5592 uint32_t index, |
| 5593 DeleteMode mode) { | 5593 DeleteMode mode) { |
| (...skipping 433 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6027 ElementsKind kind = copy->GetElementsKind(); | 6027 ElementsKind kind = copy->GetElementsKind(); |
| 6028 if (copying && IsFastSmiOrObjectElementsKind(kind) && | 6028 if (copying && IsFastSmiOrObjectElementsKind(kind) && |
| 6029 FixedArray::cast(copy->elements())->map() == | 6029 FixedArray::cast(copy->elements())->map() == |
| 6030 isolate->heap()->fixed_cow_array_map()) { | 6030 isolate->heap()->fixed_cow_array_map()) { |
| 6031 isolate->counters()->cow_arrays_created_runtime()->Increment(); | 6031 isolate->counters()->cow_arrays_created_runtime()->Increment(); |
| 6032 } | 6032 } |
| 6033 | 6033 |
| 6034 if (!shallow) { | 6034 if (!shallow) { |
| 6035 HandleScope scope(isolate); | 6035 HandleScope scope(isolate); |
| 6036 | 6036 |
| 6037 // Deep copy local properties. | 6037 // Deep copy own properties. |
| 6038 if (copy->HasFastProperties()) { | 6038 if (copy->HasFastProperties()) { |
| 6039 Handle<DescriptorArray> descriptors(copy->map()->instance_descriptors()); | 6039 Handle<DescriptorArray> descriptors(copy->map()->instance_descriptors()); |
| 6040 int limit = copy->map()->NumberOfOwnDescriptors(); | 6040 int limit = copy->map()->NumberOfOwnDescriptors(); |
| 6041 for (int i = 0; i < limit; i++) { | 6041 for (int i = 0; i < limit; i++) { |
| 6042 PropertyDetails details = descriptors->GetDetails(i); | 6042 PropertyDetails details = descriptors->GetDetails(i); |
| 6043 if (details.type() != FIELD) continue; | 6043 if (details.type() != FIELD) continue; |
| 6044 int index = descriptors->GetFieldIndex(i); | 6044 int index = descriptors->GetFieldIndex(i); |
| 6045 Handle<Object> value(object->RawFastPropertyAt(index), isolate); | 6045 Handle<Object> value(object->RawFastPropertyAt(index), isolate); |
| 6046 if (value->IsJSObject()) { | 6046 if (value->IsJSObject()) { |
| 6047 ASSIGN_RETURN_ON_EXCEPTION( | 6047 ASSIGN_RETURN_ON_EXCEPTION( |
| 6048 isolate, value, | 6048 isolate, value, |
| 6049 VisitElementOrProperty(copy, Handle<JSObject>::cast(value)), | 6049 VisitElementOrProperty(copy, Handle<JSObject>::cast(value)), |
| 6050 JSObject); | 6050 JSObject); |
| 6051 } else { | 6051 } else { |
| 6052 Representation representation = details.representation(); | 6052 Representation representation = details.representation(); |
| 6053 value = Object::NewStorageFor(isolate, value, representation); | 6053 value = Object::NewStorageFor(isolate, value, representation); |
| 6054 } | 6054 } |
| 6055 if (copying) { | 6055 if (copying) { |
| 6056 copy->FastPropertyAtPut(index, *value); | 6056 copy->FastPropertyAtPut(index, *value); |
| 6057 } | 6057 } |
| 6058 } | 6058 } |
| 6059 } else { | 6059 } else { |
| 6060 Handle<FixedArray> names = | 6060 Handle<FixedArray> names = |
| 6061 isolate->factory()->NewFixedArray(copy->NumberOfLocalProperties()); | 6061 isolate->factory()->NewFixedArray(copy->NumberOfOwnProperties()); |
| 6062 copy->GetLocalPropertyNames(*names, 0); | 6062 copy->GetOwnPropertyNames(*names, 0); |
| 6063 for (int i = 0; i < names->length(); i++) { | 6063 for (int i = 0; i < names->length(); i++) { |
| 6064 ASSERT(names->get(i)->IsString()); | 6064 ASSERT(names->get(i)->IsString()); |
| 6065 Handle<String> key_string(String::cast(names->get(i))); | 6065 Handle<String> key_string(String::cast(names->get(i))); |
| 6066 PropertyAttributes attributes = | 6066 PropertyAttributes attributes = |
| 6067 JSReceiver::GetLocalPropertyAttribute(copy, key_string); | 6067 JSReceiver::GetOwnPropertyAttribute(copy, key_string); |
| 6068 // Only deep copy fields from the object literal expression. | 6068 // Only deep copy fields from the object literal expression. |
| 6069 // In particular, don't try to copy the length attribute of | 6069 // In particular, don't try to copy the length attribute of |
| 6070 // an array. | 6070 // an array. |
| 6071 if (attributes != NONE) continue; | 6071 if (attributes != NONE) continue; |
| 6072 Handle<Object> value = | 6072 Handle<Object> value = |
| 6073 Object::GetProperty(copy, key_string).ToHandleChecked(); | 6073 Object::GetProperty(copy, key_string).ToHandleChecked(); |
| 6074 if (value->IsJSObject()) { | 6074 if (value->IsJSObject()) { |
| 6075 Handle<JSObject> result; | 6075 Handle<JSObject> result; |
| 6076 ASSIGN_RETURN_ON_EXCEPTION( | 6076 ASSIGN_RETURN_ON_EXCEPTION( |
| 6077 isolate, result, | 6077 isolate, result, |
| 6078 VisitElementOrProperty(copy, Handle<JSObject>::cast(value)), | 6078 VisitElementOrProperty(copy, Handle<JSObject>::cast(value)), |
| 6079 JSObject); | 6079 JSObject); |
| 6080 if (copying) { | 6080 if (copying) { |
| 6081 // Creating object copy for literals. No strict mode needed. | 6081 // Creating object copy for literals. No strict mode needed. |
| 6082 JSObject::SetProperty( | 6082 JSObject::SetProperty( |
| 6083 copy, key_string, result, NONE, SLOPPY).Assert(); | 6083 copy, key_string, result, NONE, SLOPPY).Assert(); |
| 6084 } | 6084 } |
| 6085 } | 6085 } |
| 6086 } | 6086 } |
| 6087 } | 6087 } |
| 6088 | 6088 |
| 6089 // Deep copy local elements. | 6089 // Deep copy own elements. |
| 6090 // Pixel elements cannot be created using an object literal. | 6090 // Pixel elements cannot be created using an object literal. |
| 6091 ASSERT(!copy->HasExternalArrayElements()); | 6091 ASSERT(!copy->HasExternalArrayElements()); |
| 6092 switch (kind) { | 6092 switch (kind) { |
| 6093 case FAST_SMI_ELEMENTS: | 6093 case FAST_SMI_ELEMENTS: |
| 6094 case FAST_ELEMENTS: | 6094 case FAST_ELEMENTS: |
| 6095 case FAST_HOLEY_SMI_ELEMENTS: | 6095 case FAST_HOLEY_SMI_ELEMENTS: |
| 6096 case FAST_HOLEY_ELEMENTS: { | 6096 case FAST_HOLEY_ELEMENTS: { |
| 6097 Handle<FixedArray> elements(FixedArray::cast(copy->elements())); | 6097 Handle<FixedArray> elements(FixedArray::cast(copy->elements())); |
| 6098 if (elements->map() == isolate->heap()->fixed_cow_array_map()) { | 6098 if (elements->map() == isolate->heap()->fixed_cow_array_map()) { |
| 6099 #ifdef DEBUG | 6099 #ifdef DEBUG |
| (...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6291 for (int i = 0; i < number_of_own_descriptors; i++) { | 6291 for (int i = 0; i < number_of_own_descriptors; i++) { |
| 6292 if (descs->GetType(i) == FIELD) { | 6292 if (descs->GetType(i) == FIELD) { |
| 6293 int current_index = descs->GetFieldIndex(i); | 6293 int current_index = descs->GetFieldIndex(i); |
| 6294 if (current_index > max_index) max_index = current_index; | 6294 if (current_index > max_index) max_index = current_index; |
| 6295 } | 6295 } |
| 6296 } | 6296 } |
| 6297 return max_index + 1; | 6297 return max_index + 1; |
| 6298 } | 6298 } |
| 6299 | 6299 |
| 6300 | 6300 |
| 6301 void JSReceiver::LocalLookup( | 6301 void JSReceiver::LookupOwn( |
| 6302 Handle<Name> name, LookupResult* result, bool search_hidden_prototypes) { | 6302 Handle<Name> name, LookupResult* result, bool search_hidden_prototypes) { |
| 6303 DisallowHeapAllocation no_gc; | 6303 DisallowHeapAllocation no_gc; |
| 6304 ASSERT(name->IsName()); | 6304 ASSERT(name->IsName()); |
| 6305 | 6305 |
| 6306 if (IsJSGlobalProxy()) { | 6306 if (IsJSGlobalProxy()) { |
| 6307 Object* proto = GetPrototype(); | 6307 Object* proto = GetPrototype(); |
| 6308 if (proto->IsNull()) return result->NotFound(); | 6308 if (proto->IsNull()) return result->NotFound(); |
| 6309 ASSERT(proto->IsJSGlobalObject()); | 6309 ASSERT(proto->IsJSGlobalObject()); |
| 6310 return JSReceiver::cast(proto)->LocalLookup( | 6310 return JSReceiver::cast(proto)->LookupOwn( |
| 6311 name, result, search_hidden_prototypes); | 6311 name, result, search_hidden_prototypes); |
| 6312 } | 6312 } |
| 6313 | 6313 |
| 6314 if (IsJSProxy()) { | 6314 if (IsJSProxy()) { |
| 6315 result->HandlerResult(JSProxy::cast(this)); | 6315 result->HandlerResult(JSProxy::cast(this)); |
| 6316 return; | 6316 return; |
| 6317 } | 6317 } |
| 6318 | 6318 |
| 6319 // Do not use inline caching if the object is a non-global object | 6319 // Do not use inline caching if the object is a non-global object |
| 6320 // that requires access checks. | 6320 // that requires access checks. |
| 6321 if (IsAccessCheckNeeded()) { | 6321 if (IsAccessCheckNeeded()) { |
| 6322 result->DisallowCaching(); | 6322 result->DisallowCaching(); |
| 6323 } | 6323 } |
| 6324 | 6324 |
| 6325 JSObject* js_object = JSObject::cast(this); | 6325 JSObject* js_object = JSObject::cast(this); |
| 6326 | 6326 |
| 6327 // Check for lookup interceptor except when bootstrapping. | 6327 // Check for lookup interceptor except when bootstrapping. |
| 6328 if (js_object->HasNamedInterceptor() && | 6328 if (js_object->HasNamedInterceptor() && |
| 6329 !GetIsolate()->bootstrapper()->IsActive()) { | 6329 !GetIsolate()->bootstrapper()->IsActive()) { |
| 6330 result->InterceptorResult(js_object); | 6330 result->InterceptorResult(js_object); |
| 6331 return; | 6331 return; |
| 6332 } | 6332 } |
| 6333 | 6333 |
| 6334 js_object->LocalLookupRealNamedProperty(name, result); | 6334 js_object->LookupOwnRealNamedProperty(name, result); |
| 6335 if (result->IsFound() || !search_hidden_prototypes) return; | 6335 if (result->IsFound() || !search_hidden_prototypes) return; |
| 6336 | 6336 |
| 6337 Object* proto = js_object->GetPrototype(); | 6337 Object* proto = js_object->GetPrototype(); |
| 6338 if (!proto->IsJSReceiver()) return; | 6338 if (!proto->IsJSReceiver()) return; |
| 6339 JSReceiver* receiver = JSReceiver::cast(proto); | 6339 JSReceiver* receiver = JSReceiver::cast(proto); |
| 6340 if (receiver->map()->is_hidden_prototype()) { | 6340 if (receiver->map()->is_hidden_prototype()) { |
| 6341 receiver->LocalLookup(name, result, search_hidden_prototypes); | 6341 receiver->LookupOwn(name, result, search_hidden_prototypes); |
| 6342 } | 6342 } |
| 6343 } | 6343 } |
| 6344 | 6344 |
| 6345 | 6345 |
| 6346 void JSReceiver::Lookup(Handle<Name> name, LookupResult* result) { | 6346 void JSReceiver::Lookup(Handle<Name> name, LookupResult* result) { |
| 6347 DisallowHeapAllocation no_gc; | 6347 DisallowHeapAllocation no_gc; |
| 6348 // Ecma-262 3rd 8.6.2.4 | 6348 // Ecma-262 3rd 8.6.2.4 |
| 6349 Handle<Object> null_value = GetIsolate()->factory()->null_value(); | 6349 Handle<Object> null_value = GetIsolate()->factory()->null_value(); |
| 6350 for (Object* current = this; | 6350 for (Object* current = this; |
| 6351 current != *null_value; | 6351 current != *null_value; |
| 6352 current = JSObject::cast(current)->GetPrototype()) { | 6352 current = JSObject::cast(current)->GetPrototype()) { |
| 6353 JSReceiver::cast(current)->LocalLookup(name, result, false); | 6353 JSReceiver::cast(current)->LookupOwn(name, result, false); |
| 6354 if (result->IsFound()) return; | 6354 if (result->IsFound()) return; |
| 6355 } | 6355 } |
| 6356 result->NotFound(); | 6356 result->NotFound(); |
| 6357 } | 6357 } |
| 6358 | 6358 |
| 6359 | 6359 |
| 6360 // Search object and its prototype chain for callback properties. | 6360 // Search object and its prototype chain for callback properties. |
| 6361 void JSObject::LookupCallbackProperty(Handle<Name> name, LookupResult* result) { | 6361 void JSObject::LookupCallbackProperty(Handle<Name> name, LookupResult* result) { |
| 6362 DisallowHeapAllocation no_gc; | 6362 DisallowHeapAllocation no_gc; |
| 6363 Handle<Object> null_value = GetIsolate()->factory()->null_value(); | 6363 Handle<Object> null_value = GetIsolate()->factory()->null_value(); |
| 6364 for (Object* current = this; | 6364 for (Object* current = this; |
| 6365 current != *null_value && current->IsJSObject(); | 6365 current != *null_value && current->IsJSObject(); |
| 6366 current = JSObject::cast(current)->GetPrototype()) { | 6366 current = JSObject::cast(current)->GetPrototype()) { |
| 6367 JSObject::cast(current)->LocalLookupRealNamedProperty(name, result); | 6367 JSObject::cast(current)->LookupOwnRealNamedProperty(name, result); |
| 6368 if (result->IsPropertyCallbacks()) return; | 6368 if (result->IsPropertyCallbacks()) return; |
| 6369 } | 6369 } |
| 6370 result->NotFound(); | 6370 result->NotFound(); |
| 6371 } | 6371 } |
| 6372 | 6372 |
| 6373 | 6373 |
| 6374 static bool ContainsOnlyValidKeys(Handle<FixedArray> array) { | 6374 static bool ContainsOnlyValidKeys(Handle<FixedArray> array) { |
| 6375 int len = array->length(); | 6375 int len = array->length(); |
| 6376 for (int i = 0; i < len; i++) { | 6376 for (int i = 0; i < len; i++) { |
| 6377 Object* e = array->get(i); | 6377 Object* e = array->get(i); |
| (...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6597 if (JSObject::GetKeysForNamedInterceptor( | 6597 if (JSObject::GetKeysForNamedInterceptor( |
| 6598 current, object).ToHandle(&result)) { | 6598 current, object).ToHandle(&result)) { |
| 6599 ASSIGN_RETURN_ON_EXCEPTION( | 6599 ASSIGN_RETURN_ON_EXCEPTION( |
| 6600 isolate, content, | 6600 isolate, content, |
| 6601 FixedArray::AddKeysFromArrayLike(content, result), | 6601 FixedArray::AddKeysFromArrayLike(content, result), |
| 6602 FixedArray); | 6602 FixedArray); |
| 6603 } | 6603 } |
| 6604 ASSERT(ContainsOnlyValidKeys(content)); | 6604 ASSERT(ContainsOnlyValidKeys(content)); |
| 6605 } | 6605 } |
| 6606 | 6606 |
| 6607 // If we only want local properties we bail out after the first | 6607 // If we only want own properties we bail out after the first |
| 6608 // iteration. | 6608 // iteration. |
| 6609 if (type == LOCAL_ONLY) break; | 6609 if (type == OWN_ONLY) break; |
| 6610 } | 6610 } |
| 6611 return content; | 6611 return content; |
| 6612 } | 6612 } |
| 6613 | 6613 |
| 6614 | 6614 |
| 6615 // Try to update an accessor in an elements dictionary. Return true if the | 6615 // Try to update an accessor in an elements dictionary. Return true if the |
| 6616 // update succeeded, and false otherwise. | 6616 // update succeeded, and false otherwise. |
| 6617 static bool UpdateGetterSetterInDictionary( | 6617 static bool UpdateGetterSetterInDictionary( |
| 6618 SeededNumberDictionary* dictionary, | 6618 SeededNumberDictionary* dictionary, |
| 6619 uint32_t index, | 6619 uint32_t index, |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6704 accessors->set_access_flags(access_control); | 6704 accessors->set_access_flags(access_control); |
| 6705 | 6705 |
| 6706 SetElementCallback(object, index, accessors, attributes); | 6706 SetElementCallback(object, index, accessors, attributes); |
| 6707 } | 6707 } |
| 6708 | 6708 |
| 6709 | 6709 |
| 6710 Handle<AccessorPair> JSObject::CreateAccessorPairFor(Handle<JSObject> object, | 6710 Handle<AccessorPair> JSObject::CreateAccessorPairFor(Handle<JSObject> object, |
| 6711 Handle<Name> name) { | 6711 Handle<Name> name) { |
| 6712 Isolate* isolate = object->GetIsolate(); | 6712 Isolate* isolate = object->GetIsolate(); |
| 6713 LookupResult result(isolate); | 6713 LookupResult result(isolate); |
| 6714 object->LocalLookupRealNamedProperty(name, &result); | 6714 object->LookupOwnRealNamedProperty(name, &result); |
| 6715 if (result.IsPropertyCallbacks()) { | 6715 if (result.IsPropertyCallbacks()) { |
| 6716 // Note that the result can actually have IsDontDelete() == true when we | 6716 // Note that the result can actually have IsDontDelete() == true when we |
| 6717 // e.g. have to fall back to the slow case while adding a setter after | 6717 // e.g. have to fall back to the slow case while adding a setter after |
| 6718 // successfully reusing a map transition for a getter. Nevertheless, this is | 6718 // successfully reusing a map transition for a getter. Nevertheless, this is |
| 6719 // OK, because the assertion only holds for the whole addition of both | 6719 // OK, because the assertion only holds for the whole addition of both |
| 6720 // accessors, not for the addition of each part. See first comment in | 6720 // accessors, not for the addition of each part. See first comment in |
| 6721 // DefinePropertyAccessor below. | 6721 // DefinePropertyAccessor below. |
| 6722 Object* obj = result.GetCallbackObject(); | 6722 Object* obj = result.GetCallbackObject(); |
| 6723 if (obj->IsAccessorPair()) { | 6723 if (obj->IsAccessorPair()) { |
| 6724 return AccessorPair::Copy(handle(AccessorPair::cast(obj), isolate)); | 6724 return AccessorPair::Copy(handle(AccessorPair::cast(obj), isolate)); |
| (...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6911 | 6911 |
| 6912 uint32_t index = 0; | 6912 uint32_t index = 0; |
| 6913 bool is_element = name->AsArrayIndex(&index); | 6913 bool is_element = name->AsArrayIndex(&index); |
| 6914 | 6914 |
| 6915 Handle<Object> old_value = isolate->factory()->the_hole_value(); | 6915 Handle<Object> old_value = isolate->factory()->the_hole_value(); |
| 6916 bool is_observed = object->map()->is_observed() && | 6916 bool is_observed = object->map()->is_observed() && |
| 6917 *name != isolate->heap()->hidden_string(); | 6917 *name != isolate->heap()->hidden_string(); |
| 6918 bool preexists = false; | 6918 bool preexists = false; |
| 6919 if (is_observed) { | 6919 if (is_observed) { |
| 6920 if (is_element) { | 6920 if (is_element) { |
| 6921 preexists = HasLocalElement(object, index); | 6921 preexists = HasOwnElement(object, index); |
| 6922 if (preexists && GetLocalElementAccessorPair(object, index).is_null()) { | 6922 if (preexists && GetOwnElementAccessorPair(object, index).is_null()) { |
| 6923 old_value = | 6923 old_value = |
| 6924 Object::GetElement(isolate, object, index).ToHandleChecked(); | 6924 Object::GetElement(isolate, object, index).ToHandleChecked(); |
| 6925 } | 6925 } |
| 6926 } else { | 6926 } else { |
| 6927 LookupResult lookup(isolate); | 6927 LookupResult lookup(isolate); |
| 6928 object->LocalLookup(name, &lookup, true); | 6928 object->LookupOwn(name, &lookup, true); |
| 6929 preexists = lookup.IsProperty(); | 6929 preexists = lookup.IsProperty(); |
| 6930 if (preexists && lookup.IsDataProperty()) { | 6930 if (preexists && lookup.IsDataProperty()) { |
| 6931 old_value = | 6931 old_value = |
| 6932 Object::GetPropertyOrElement(object, name).ToHandleChecked(); | 6932 Object::GetPropertyOrElement(object, name).ToHandleChecked(); |
| 6933 } | 6933 } |
| 6934 } | 6934 } |
| 6935 } | 6935 } |
| 6936 | 6936 |
| 6937 if (is_element) { | 6937 if (is_element) { |
| 6938 DefineElementAccessor( | 6938 DefineElementAccessor( |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6979 | 6979 |
| 6980 | 6980 |
| 6981 bool JSObject::DefineFastAccessor(Handle<JSObject> object, | 6981 bool JSObject::DefineFastAccessor(Handle<JSObject> object, |
| 6982 Handle<Name> name, | 6982 Handle<Name> name, |
| 6983 AccessorComponent component, | 6983 AccessorComponent component, |
| 6984 Handle<Object> accessor, | 6984 Handle<Object> accessor, |
| 6985 PropertyAttributes attributes) { | 6985 PropertyAttributes attributes) { |
| 6986 ASSERT(accessor->IsSpecFunction() || accessor->IsUndefined()); | 6986 ASSERT(accessor->IsSpecFunction() || accessor->IsUndefined()); |
| 6987 Isolate* isolate = object->GetIsolate(); | 6987 Isolate* isolate = object->GetIsolate(); |
| 6988 LookupResult result(isolate); | 6988 LookupResult result(isolate); |
| 6989 object->LocalLookup(name, &result); | 6989 object->LookupOwn(name, &result); |
| 6990 | 6990 |
| 6991 if (result.IsFound() && !result.IsPropertyCallbacks()) { | 6991 if (result.IsFound() && !result.IsPropertyCallbacks()) { |
| 6992 return false; | 6992 return false; |
| 6993 } | 6993 } |
| 6994 | 6994 |
| 6995 // Return success if the same accessor with the same attributes already exist. | 6995 // Return success if the same accessor with the same attributes already exist. |
| 6996 AccessorPair* source_accessors = NULL; | 6996 AccessorPair* source_accessors = NULL; |
| 6997 if (result.IsPropertyCallbacks()) { | 6997 if (result.IsPropertyCallbacks()) { |
| 6998 Object* callback_value = result.GetCallbackObject(); | 6998 Object* callback_value = result.GetCallbackObject(); |
| 6999 if (callback_value->IsAccessorPair()) { | 6999 if (callback_value->IsAccessorPair()) { |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7114 break; | 7114 break; |
| 7115 case SLOPPY_ARGUMENTS_ELEMENTS: | 7115 case SLOPPY_ARGUMENTS_ELEMENTS: |
| 7116 UNIMPLEMENTED(); | 7116 UNIMPLEMENTED(); |
| 7117 break; | 7117 break; |
| 7118 } | 7118 } |
| 7119 | 7119 |
| 7120 SetElementCallback(object, index, info, info->property_attributes()); | 7120 SetElementCallback(object, index, info, info->property_attributes()); |
| 7121 } else { | 7121 } else { |
| 7122 // Lookup the name. | 7122 // Lookup the name. |
| 7123 LookupResult result(isolate); | 7123 LookupResult result(isolate); |
| 7124 object->LocalLookup(name, &result, true); | 7124 object->LookupOwn(name, &result, true); |
| 7125 // ES5 forbids turning a property into an accessor if it's not | 7125 // ES5 forbids turning a property into an accessor if it's not |
| 7126 // configurable (that is IsDontDelete in ES3 and v8), see 8.6.1 (Table 5). | 7126 // configurable (that is IsDontDelete in ES3 and v8), see 8.6.1 (Table 5). |
| 7127 if (result.IsFound() && (result.IsReadOnly() || result.IsDontDelete())) { | 7127 if (result.IsFound() && (result.IsReadOnly() || result.IsDontDelete())) { |
| 7128 return factory->undefined_value(); | 7128 return factory->undefined_value(); |
| 7129 } | 7129 } |
| 7130 | 7130 |
| 7131 SetPropertyCallback(object, name, info, info->property_attributes()); | 7131 SetPropertyCallback(object, name, info, info->property_attributes()); |
| 7132 } | 7132 } |
| 7133 | 7133 |
| 7134 return object; | 7134 return object; |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7170 isolate); | 7170 isolate); |
| 7171 } | 7171 } |
| 7172 } | 7172 } |
| 7173 } | 7173 } |
| 7174 } | 7174 } |
| 7175 } else { | 7175 } else { |
| 7176 for (Handle<Object> obj = object; | 7176 for (Handle<Object> obj = object; |
| 7177 !obj->IsNull(); | 7177 !obj->IsNull(); |
| 7178 obj = handle(JSReceiver::cast(*obj)->GetPrototype(), isolate)) { | 7178 obj = handle(JSReceiver::cast(*obj)->GetPrototype(), isolate)) { |
| 7179 LookupResult result(isolate); | 7179 LookupResult result(isolate); |
| 7180 JSReceiver::cast(*obj)->LocalLookup(name, &result); | 7180 JSReceiver::cast(*obj)->LookupOwn(name, &result); |
| 7181 if (result.IsFound()) { | 7181 if (result.IsFound()) { |
| 7182 if (result.IsReadOnly()) return isolate->factory()->undefined_value(); | 7182 if (result.IsReadOnly()) return isolate->factory()->undefined_value(); |
| 7183 if (result.IsPropertyCallbacks()) { | 7183 if (result.IsPropertyCallbacks()) { |
| 7184 Object* obj = result.GetCallbackObject(); | 7184 Object* obj = result.GetCallbackObject(); |
| 7185 if (obj->IsAccessorPair()) { | 7185 if (obj->IsAccessorPair()) { |
| 7186 return handle(AccessorPair::cast(obj)->GetComponent(component), | 7186 return handle(AccessorPair::cast(obj)->GetComponent(component), |
| 7187 isolate); | 7187 isolate); |
| 7188 } | 7188 } |
| 7189 } | 7189 } |
| 7190 } | 7190 } |
| (...skipping 1609 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8800 } | 8800 } |
| 8801 } | 8801 } |
| 8802 | 8802 |
| 8803 | 8803 |
| 8804 // Reserve space for statics needing saving and restoring. | 8804 // Reserve space for statics needing saving and restoring. |
| 8805 int Relocatable::ArchiveSpacePerThread() { | 8805 int Relocatable::ArchiveSpacePerThread() { |
| 8806 return sizeof(Relocatable*); // NOLINT | 8806 return sizeof(Relocatable*); // NOLINT |
| 8807 } | 8807 } |
| 8808 | 8808 |
| 8809 | 8809 |
| 8810 // Archive statics that are thread local. | 8810 // Archive statics that are thread-local. |
| 8811 char* Relocatable::ArchiveState(Isolate* isolate, char* to) { | 8811 char* Relocatable::ArchiveState(Isolate* isolate, char* to) { |
| 8812 *reinterpret_cast<Relocatable**>(to) = isolate->relocatable_top(); | 8812 *reinterpret_cast<Relocatable**>(to) = isolate->relocatable_top(); |
| 8813 isolate->set_relocatable_top(NULL); | 8813 isolate->set_relocatable_top(NULL); |
| 8814 return to + ArchiveSpacePerThread(); | 8814 return to + ArchiveSpacePerThread(); |
| 8815 } | 8815 } |
| 8816 | 8816 |
| 8817 | 8817 |
| 8818 // Restore statics that are thread local. | 8818 // Restore statics that are thread-local. |
| 8819 char* Relocatable::RestoreState(Isolate* isolate, char* from) { | 8819 char* Relocatable::RestoreState(Isolate* isolate, char* from) { |
| 8820 isolate->set_relocatable_top(*reinterpret_cast<Relocatable**>(from)); | 8820 isolate->set_relocatable_top(*reinterpret_cast<Relocatable**>(from)); |
| 8821 return from + ArchiveSpacePerThread(); | 8821 return from + ArchiveSpacePerThread(); |
| 8822 } | 8822 } |
| 8823 | 8823 |
| 8824 | 8824 |
| 8825 char* Relocatable::Iterate(ObjectVisitor* v, char* thread_storage) { | 8825 char* Relocatable::Iterate(ObjectVisitor* v, char* thread_storage) { |
| 8826 Relocatable* top = *reinterpret_cast<Relocatable**>(thread_storage); | 8826 Relocatable* top = *reinterpret_cast<Relocatable**>(thread_storage); |
| 8827 Iterate(v, top); | 8827 Iterate(v, top); |
| 8828 return thread_storage + ArchiveSpacePerThread(); | 8828 return thread_storage + ArchiveSpacePerThread(); |
| (...skipping 3063 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 11892 | 11892 |
| 11893 // Returns false if the passed-in index is marked non-configurable, | 11893 // Returns false if the passed-in index is marked non-configurable, |
| 11894 // which will cause the ES5 truncation operation to halt, and thus | 11894 // which will cause the ES5 truncation operation to halt, and thus |
| 11895 // no further old values need be collected. | 11895 // no further old values need be collected. |
| 11896 static bool GetOldValue(Isolate* isolate, | 11896 static bool GetOldValue(Isolate* isolate, |
| 11897 Handle<JSObject> object, | 11897 Handle<JSObject> object, |
| 11898 uint32_t index, | 11898 uint32_t index, |
| 11899 List<Handle<Object> >* old_values, | 11899 List<Handle<Object> >* old_values, |
| 11900 List<uint32_t>* indices) { | 11900 List<uint32_t>* indices) { |
| 11901 PropertyAttributes attributes = | 11901 PropertyAttributes attributes = |
| 11902 JSReceiver::GetLocalElementAttribute(object, index); | 11902 JSReceiver::GetOwnElementAttribute(object, index); |
| 11903 ASSERT(attributes != ABSENT); | 11903 ASSERT(attributes != ABSENT); |
| 11904 if (attributes == DONT_DELETE) return false; | 11904 if (attributes == DONT_DELETE) return false; |
| 11905 Handle<Object> value; | 11905 Handle<Object> value; |
| 11906 if (!JSObject::GetLocalElementAccessorPair(object, index).is_null()) { | 11906 if (!JSObject::GetOwnElementAccessorPair(object, index).is_null()) { |
| 11907 value = Handle<Object>::cast(isolate->factory()->the_hole_value()); | 11907 value = Handle<Object>::cast(isolate->factory()->the_hole_value()); |
| 11908 } else { | 11908 } else { |
| 11909 value = Object::GetElement(isolate, object, index).ToHandleChecked(); | 11909 value = Object::GetElement(isolate, object, index).ToHandleChecked(); |
| 11910 } | 11910 } |
| 11911 old_values->Add(value); | 11911 old_values->Add(value); |
| 11912 indices->Add(index); | 11912 indices->Add(index); |
| 11913 return true; | 11913 return true; |
| 11914 } | 11914 } |
| 11915 | 11915 |
| 11916 static void EnqueueSpliceRecord(Handle<JSArray> object, | 11916 static void EnqueueSpliceRecord(Handle<JSArray> object, |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 11972 Isolate* isolate = array->GetIsolate(); | 11972 Isolate* isolate = array->GetIsolate(); |
| 11973 List<uint32_t> indices; | 11973 List<uint32_t> indices; |
| 11974 List<Handle<Object> > old_values; | 11974 List<Handle<Object> > old_values; |
| 11975 Handle<Object> old_length_handle(array->length(), isolate); | 11975 Handle<Object> old_length_handle(array->length(), isolate); |
| 11976 uint32_t old_length = 0; | 11976 uint32_t old_length = 0; |
| 11977 CHECK(old_length_handle->ToArrayIndex(&old_length)); | 11977 CHECK(old_length_handle->ToArrayIndex(&old_length)); |
| 11978 uint32_t new_length = 0; | 11978 uint32_t new_length = 0; |
| 11979 CHECK(new_length_handle->ToArrayIndex(&new_length)); | 11979 CHECK(new_length_handle->ToArrayIndex(&new_length)); |
| 11980 | 11980 |
| 11981 static const PropertyAttributes kNoAttrFilter = NONE; | 11981 static const PropertyAttributes kNoAttrFilter = NONE; |
| 11982 int num_elements = array->NumberOfLocalElements(kNoAttrFilter); | 11982 int num_elements = array->NumberOfOwnElements(kNoAttrFilter); |
| 11983 if (num_elements > 0) { | 11983 if (num_elements > 0) { |
| 11984 if (old_length == static_cast<uint32_t>(num_elements)) { | 11984 if (old_length == static_cast<uint32_t>(num_elements)) { |
| 11985 // Simple case for arrays without holes. | 11985 // Simple case for arrays without holes. |
| 11986 for (uint32_t i = old_length - 1; i + 1 > new_length; --i) { | 11986 for (uint32_t i = old_length - 1; i + 1 > new_length; --i) { |
| 11987 if (!GetOldValue(isolate, array, i, &old_values, &indices)) break; | 11987 if (!GetOldValue(isolate, array, i, &old_values, &indices)) break; |
| 11988 } | 11988 } |
| 11989 } else { | 11989 } else { |
| 11990 // For sparse arrays, only iterate over existing elements. | 11990 // For sparse arrays, only iterate over existing elements. |
| 11991 // TODO(rafaelw): For fast, sparse arrays, we can avoid iterating over | 11991 // TODO(rafaelw): For fast, sparse arrays, we can avoid iterating over |
| 11992 // the to-be-removed indices twice. | 11992 // the to-be-removed indices twice. |
| 11993 Handle<FixedArray> keys = isolate->factory()->NewFixedArray(num_elements); | 11993 Handle<FixedArray> keys = isolate->factory()->NewFixedArray(num_elements); |
| 11994 array->GetLocalElementKeys(*keys, kNoAttrFilter); | 11994 array->GetOwnElementKeys(*keys, kNoAttrFilter); |
| 11995 while (num_elements-- > 0) { | 11995 while (num_elements-- > 0) { |
| 11996 uint32_t index = NumberToUint32(keys->get(num_elements)); | 11996 uint32_t index = NumberToUint32(keys->get(num_elements)); |
| 11997 if (index < new_length) break; | 11997 if (index < new_length) break; |
| 11998 if (!GetOldValue(isolate, array, index, &old_values, &indices)) break; | 11998 if (!GetOldValue(isolate, array, index, &old_values, &indices)) break; |
| 11999 } | 11999 } |
| 12000 } | 12000 } |
| 12001 } | 12001 } |
| 12002 | 12002 |
| 12003 Handle<Object> hresult; | 12003 Handle<Object> hresult; |
| 12004 ASSIGN_RETURN_ON_EXCEPTION( | 12004 ASSIGN_RETURN_ON_EXCEPTION( |
| (...skipping 472 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 12477 uint32_t arg_count, | 12477 uint32_t arg_count, |
| 12478 EnsureElementsMode mode) { | 12478 EnsureElementsMode mode) { |
| 12479 // Elements in |Arguments| are ordered backwards (because they're on the | 12479 // Elements in |Arguments| are ordered backwards (because they're on the |
| 12480 // stack), but the method that's called here iterates over them in forward | 12480 // stack), but the method that's called here iterates over them in forward |
| 12481 // direction. | 12481 // direction. |
| 12482 return EnsureCanContainElements( | 12482 return EnsureCanContainElements( |
| 12483 object, args->arguments() - first_arg - (arg_count - 1), arg_count, mode); | 12483 object, args->arguments() - first_arg - (arg_count - 1), arg_count, mode); |
| 12484 } | 12484 } |
| 12485 | 12485 |
| 12486 | 12486 |
| 12487 MaybeHandle<AccessorPair> JSObject::GetLocalPropertyAccessorPair( | 12487 MaybeHandle<AccessorPair> JSObject::GetOwnPropertyAccessorPair( |
| 12488 Handle<JSObject> object, | 12488 Handle<JSObject> object, |
| 12489 Handle<Name> name) { | 12489 Handle<Name> name) { |
| 12490 uint32_t index = 0; | 12490 uint32_t index = 0; |
| 12491 if (name->AsArrayIndex(&index)) { | 12491 if (name->AsArrayIndex(&index)) { |
| 12492 return GetLocalElementAccessorPair(object, index); | 12492 return GetOwnElementAccessorPair(object, index); |
| 12493 } | 12493 } |
| 12494 | 12494 |
| 12495 Isolate* isolate = object->GetIsolate(); | 12495 Isolate* isolate = object->GetIsolate(); |
| 12496 LookupResult lookup(isolate); | 12496 LookupResult lookup(isolate); |
| 12497 object->LocalLookupRealNamedProperty(name, &lookup); | 12497 object->LookupOwnRealNamedProperty(name, &lookup); |
| 12498 | 12498 |
| 12499 if (lookup.IsPropertyCallbacks() && | 12499 if (lookup.IsPropertyCallbacks() && |
| 12500 lookup.GetCallbackObject()->IsAccessorPair()) { | 12500 lookup.GetCallbackObject()->IsAccessorPair()) { |
| 12501 return handle(AccessorPair::cast(lookup.GetCallbackObject()), isolate); | 12501 return handle(AccessorPair::cast(lookup.GetCallbackObject()), isolate); |
| 12502 } | 12502 } |
| 12503 return MaybeHandle<AccessorPair>(); | 12503 return MaybeHandle<AccessorPair>(); |
| 12504 } | 12504 } |
| 12505 | 12505 |
| 12506 | 12506 |
| 12507 MaybeHandle<AccessorPair> JSObject::GetLocalElementAccessorPair( | 12507 MaybeHandle<AccessorPair> JSObject::GetOwnElementAccessorPair( |
| 12508 Handle<JSObject> object, | 12508 Handle<JSObject> object, |
| 12509 uint32_t index) { | 12509 uint32_t index) { |
| 12510 if (object->IsJSGlobalProxy()) { | 12510 if (object->IsJSGlobalProxy()) { |
| 12511 Handle<Object> proto(object->GetPrototype(), object->GetIsolate()); | 12511 Handle<Object> proto(object->GetPrototype(), object->GetIsolate()); |
| 12512 if (proto->IsNull()) return MaybeHandle<AccessorPair>(); | 12512 if (proto->IsNull()) return MaybeHandle<AccessorPair>(); |
| 12513 ASSERT(proto->IsJSGlobalObject()); | 12513 ASSERT(proto->IsJSGlobalObject()); |
| 12514 return GetLocalElementAccessorPair(Handle<JSObject>::cast(proto), index); | 12514 return GetOwnElementAccessorPair(Handle<JSObject>::cast(proto), index); |
| 12515 } | 12515 } |
| 12516 | 12516 |
| 12517 // Check for lookup interceptor. | 12517 // Check for lookup interceptor. |
| 12518 if (object->HasIndexedInterceptor()) return MaybeHandle<AccessorPair>(); | 12518 if (object->HasIndexedInterceptor()) return MaybeHandle<AccessorPair>(); |
| 12519 | 12519 |
| 12520 return object->GetElementsAccessor()->GetAccessorPair(object, object, index); | 12520 return object->GetElementsAccessor()->GetAccessorPair(object, object, index); |
| 12521 } | 12521 } |
| 12522 | 12522 |
| 12523 | 12523 |
| 12524 MaybeHandle<Object> JSObject::SetElementWithInterceptor( | 12524 MaybeHandle<Object> JSObject::SetElementWithInterceptor( |
| (...skipping 617 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 13142 | 13142 |
| 13143 if (!object->map()->is_observed()) { | 13143 if (!object->map()->is_observed()) { |
| 13144 return object->HasIndexedInterceptor() | 13144 return object->HasIndexedInterceptor() |
| 13145 ? SetElementWithInterceptor(object, index, value, attributes, | 13145 ? SetElementWithInterceptor(object, index, value, attributes, |
| 13146 strict_mode, check_prototype, set_mode) | 13146 strict_mode, check_prototype, set_mode) |
| 13147 : SetElementWithoutInterceptor(object, index, value, attributes, | 13147 : SetElementWithoutInterceptor(object, index, value, attributes, |
| 13148 strict_mode, check_prototype, set_mode); | 13148 strict_mode, check_prototype, set_mode); |
| 13149 } | 13149 } |
| 13150 | 13150 |
| 13151 PropertyAttributes old_attributes = | 13151 PropertyAttributes old_attributes = |
| 13152 JSReceiver::GetLocalElementAttribute(object, index); | 13152 JSReceiver::GetOwnElementAttribute(object, index); |
| 13153 Handle<Object> old_value = isolate->factory()->the_hole_value(); | 13153 Handle<Object> old_value = isolate->factory()->the_hole_value(); |
| 13154 Handle<Object> old_length_handle; | 13154 Handle<Object> old_length_handle; |
| 13155 Handle<Object> new_length_handle; | 13155 Handle<Object> new_length_handle; |
| 13156 | 13156 |
| 13157 if (old_attributes != ABSENT) { | 13157 if (old_attributes != ABSENT) { |
| 13158 if (GetLocalElementAccessorPair(object, index).is_null()) { | 13158 if (GetOwnElementAccessorPair(object, index).is_null()) { |
| 13159 old_value = Object::GetElement(isolate, object, index).ToHandleChecked(); | 13159 old_value = Object::GetElement(isolate, object, index).ToHandleChecked(); |
| 13160 } | 13160 } |
| 13161 } else if (object->IsJSArray()) { | 13161 } else if (object->IsJSArray()) { |
| 13162 // Store old array length in case adding an element grows the array. | 13162 // Store old array length in case adding an element grows the array. |
| 13163 old_length_handle = handle(Handle<JSArray>::cast(object)->length(), | 13163 old_length_handle = handle(Handle<JSArray>::cast(object)->length(), |
| 13164 isolate); | 13164 isolate); |
| 13165 } | 13165 } |
| 13166 | 13166 |
| 13167 // Check for lookup interceptor | 13167 // Check for lookup interceptor |
| 13168 Handle<Object> result; | 13168 Handle<Object> result; |
| 13169 ASSIGN_RETURN_ON_EXCEPTION( | 13169 ASSIGN_RETURN_ON_EXCEPTION( |
| 13170 isolate, result, | 13170 isolate, result, |
| 13171 object->HasIndexedInterceptor() | 13171 object->HasIndexedInterceptor() |
| 13172 ? SetElementWithInterceptor( | 13172 ? SetElementWithInterceptor( |
| 13173 object, index, value, attributes, | 13173 object, index, value, attributes, |
| 13174 strict_mode, check_prototype, set_mode) | 13174 strict_mode, check_prototype, set_mode) |
| 13175 : SetElementWithoutInterceptor( | 13175 : SetElementWithoutInterceptor( |
| 13176 object, index, value, attributes, | 13176 object, index, value, attributes, |
| 13177 strict_mode, check_prototype, set_mode), | 13177 strict_mode, check_prototype, set_mode), |
| 13178 Object); | 13178 Object); |
| 13179 | 13179 |
| 13180 Handle<String> name = isolate->factory()->Uint32ToString(index); | 13180 Handle<String> name = isolate->factory()->Uint32ToString(index); |
| 13181 PropertyAttributes new_attributes = GetLocalElementAttribute(object, index); | 13181 PropertyAttributes new_attributes = GetOwnElementAttribute(object, index); |
| 13182 if (old_attributes == ABSENT) { | 13182 if (old_attributes == ABSENT) { |
| 13183 if (object->IsJSArray() && | 13183 if (object->IsJSArray() && |
| 13184 !old_length_handle->SameValue( | 13184 !old_length_handle->SameValue( |
| 13185 Handle<JSArray>::cast(object)->length())) { | 13185 Handle<JSArray>::cast(object)->length())) { |
| 13186 new_length_handle = handle(Handle<JSArray>::cast(object)->length(), | 13186 new_length_handle = handle(Handle<JSArray>::cast(object)->length(), |
| 13187 isolate); | 13187 isolate); |
| 13188 uint32_t old_length = 0; | 13188 uint32_t old_length = 0; |
| 13189 uint32_t new_length = 0; | 13189 uint32_t new_length = 0; |
| 13190 CHECK(old_length_handle->ToArrayIndex(&old_length)); | 13190 CHECK(old_length_handle->ToArrayIndex(&old_length)); |
| 13191 CHECK(new_length_handle->ToArrayIndex(&new_length)); | 13191 CHECK(new_length_handle->ToArrayIndex(&new_length)); |
| (...skipping 616 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 13808 constructor->shared()->get_api_func_data()->indexed_property_handler(); | 13808 constructor->shared()->get_api_func_data()->indexed_property_handler(); |
| 13809 return InterceptorInfo::cast(result); | 13809 return InterceptorInfo::cast(result); |
| 13810 } | 13810 } |
| 13811 | 13811 |
| 13812 | 13812 |
| 13813 MaybeHandle<Object> JSObject::GetPropertyPostInterceptor( | 13813 MaybeHandle<Object> JSObject::GetPropertyPostInterceptor( |
| 13814 Handle<JSObject> object, | 13814 Handle<JSObject> object, |
| 13815 Handle<Object> receiver, | 13815 Handle<Object> receiver, |
| 13816 Handle<Name> name, | 13816 Handle<Name> name, |
| 13817 PropertyAttributes* attributes) { | 13817 PropertyAttributes* attributes) { |
| 13818 // Check local property in holder, ignore interceptor. | 13818 // Check own property in holder, ignore interceptor. |
| 13819 Isolate* isolate = object->GetIsolate(); | 13819 Isolate* isolate = object->GetIsolate(); |
| 13820 LookupResult lookup(isolate); | 13820 LookupResult lookup(isolate); |
| 13821 object->LocalLookupRealNamedProperty(name, &lookup); | 13821 object->LookupOwnRealNamedProperty(name, &lookup); |
| 13822 if (lookup.IsFound()) { | 13822 if (lookup.IsFound()) { |
| 13823 return GetProperty(object, receiver, &lookup, name, attributes); | 13823 return GetProperty(object, receiver, &lookup, name, attributes); |
| 13824 } else { | 13824 } else { |
| 13825 // Continue searching via the prototype chain. | 13825 // Continue searching via the prototype chain. |
| 13826 Handle<Object> prototype(object->GetPrototype(), isolate); | 13826 Handle<Object> prototype(object->GetPrototype(), isolate); |
| 13827 *attributes = ABSENT; | 13827 *attributes = ABSENT; |
| 13828 if (prototype->IsNull()) return isolate->factory()->undefined_value(); | 13828 if (prototype->IsNull()) return isolate->factory()->undefined_value(); |
| 13829 return GetPropertyWithReceiver(prototype, receiver, name, attributes); | 13829 return GetPropertyWithReceiver(prototype, receiver, name, attributes); |
| 13830 } | 13830 } |
| 13831 } | 13831 } |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 13925 // Check access rights if needed. | 13925 // Check access rights if needed. |
| 13926 if (object->IsAccessCheckNeeded()) { | 13926 if (object->IsAccessCheckNeeded()) { |
| 13927 if (!isolate->MayNamedAccess(object, key, v8::ACCESS_HAS)) { | 13927 if (!isolate->MayNamedAccess(object, key, v8::ACCESS_HAS)) { |
| 13928 isolate->ReportFailedAccessCheck(object, v8::ACCESS_HAS); | 13928 isolate->ReportFailedAccessCheck(object, v8::ACCESS_HAS); |
| 13929 // TODO(yangguo): Issue 3269, check for scheduled exception missing? | 13929 // TODO(yangguo): Issue 3269, check for scheduled exception missing? |
| 13930 return false; | 13930 return false; |
| 13931 } | 13931 } |
| 13932 } | 13932 } |
| 13933 | 13933 |
| 13934 LookupResult result(isolate); | 13934 LookupResult result(isolate); |
| 13935 object->LocalLookupRealNamedProperty(key, &result); | 13935 object->LookupOwnRealNamedProperty(key, &result); |
| 13936 return result.IsFound() && !result.IsInterceptor(); | 13936 return result.IsFound() && !result.IsInterceptor(); |
| 13937 } | 13937 } |
| 13938 | 13938 |
| 13939 | 13939 |
| 13940 bool JSObject::HasRealElementProperty(Handle<JSObject> object, uint32_t index) { | 13940 bool JSObject::HasRealElementProperty(Handle<JSObject> object, uint32_t index) { |
| 13941 Isolate* isolate = object->GetIsolate(); | 13941 Isolate* isolate = object->GetIsolate(); |
| 13942 HandleScope scope(isolate); | 13942 HandleScope scope(isolate); |
| 13943 // Check access rights if needed. | 13943 // Check access rights if needed. |
| 13944 if (object->IsAccessCheckNeeded()) { | 13944 if (object->IsAccessCheckNeeded()) { |
| 13945 if (!isolate->MayIndexedAccess(object, index, v8::ACCESS_HAS)) { | 13945 if (!isolate->MayIndexedAccess(object, index, v8::ACCESS_HAS)) { |
| (...skipping 23 matching lines...) Expand all Loading... |
| 13969 // Check access rights if needed. | 13969 // Check access rights if needed. |
| 13970 if (object->IsAccessCheckNeeded()) { | 13970 if (object->IsAccessCheckNeeded()) { |
| 13971 if (!isolate->MayNamedAccess(object, key, v8::ACCESS_HAS)) { | 13971 if (!isolate->MayNamedAccess(object, key, v8::ACCESS_HAS)) { |
| 13972 isolate->ReportFailedAccessCheck(object, v8::ACCESS_HAS); | 13972 isolate->ReportFailedAccessCheck(object, v8::ACCESS_HAS); |
| 13973 // TODO(yangguo): Issue 3269, check for scheduled exception missing? | 13973 // TODO(yangguo): Issue 3269, check for scheduled exception missing? |
| 13974 return false; | 13974 return false; |
| 13975 } | 13975 } |
| 13976 } | 13976 } |
| 13977 | 13977 |
| 13978 LookupResult result(isolate); | 13978 LookupResult result(isolate); |
| 13979 object->LocalLookupRealNamedProperty(key, &result); | 13979 object->LookupOwnRealNamedProperty(key, &result); |
| 13980 return result.IsPropertyCallbacks(); | 13980 return result.IsPropertyCallbacks(); |
| 13981 } | 13981 } |
| 13982 | 13982 |
| 13983 | 13983 |
| 13984 int JSObject::NumberOfLocalProperties(PropertyAttributes filter) { | 13984 int JSObject::NumberOfOwnProperties(PropertyAttributes filter) { |
| 13985 if (HasFastProperties()) { | 13985 if (HasFastProperties()) { |
| 13986 Map* map = this->map(); | 13986 Map* map = this->map(); |
| 13987 if (filter == NONE) return map->NumberOfOwnDescriptors(); | 13987 if (filter == NONE) return map->NumberOfOwnDescriptors(); |
| 13988 if (filter & DONT_ENUM) { | 13988 if (filter & DONT_ENUM) { |
| 13989 int result = map->EnumLength(); | 13989 int result = map->EnumLength(); |
| 13990 if (result != kInvalidEnumCacheSentinel) return result; | 13990 if (result != kInvalidEnumCacheSentinel) return result; |
| 13991 } | 13991 } |
| 13992 return map->NumberOfDescribedProperties(OWN_DESCRIPTORS, filter); | 13992 return map->NumberOfDescribedProperties(OWN_DESCRIPTORS, filter); |
| 13993 } | 13993 } |
| 13994 return property_dictionary()->NumberOfElementsFilterAttributes(filter); | 13994 return property_dictionary()->NumberOfElementsFilterAttributes(filter); |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 14101 SwapPairs(numbers, i, p); | 14101 SwapPairs(numbers, i, p); |
| 14102 } | 14102 } |
| 14103 } | 14103 } |
| 14104 } else { | 14104 } else { |
| 14105 HeapSortPairs(this, numbers, len); | 14105 HeapSortPairs(this, numbers, len); |
| 14106 return; | 14106 return; |
| 14107 } | 14107 } |
| 14108 } | 14108 } |
| 14109 | 14109 |
| 14110 | 14110 |
| 14111 // Fill in the names of local properties into the supplied storage. The main | 14111 // Fill in the names of own properties into the supplied storage. The main |
| 14112 // purpose of this function is to provide reflection information for the object | 14112 // purpose of this function is to provide reflection information for the object |
| 14113 // mirrors. | 14113 // mirrors. |
| 14114 void JSObject::GetLocalPropertyNames( | 14114 void JSObject::GetOwnPropertyNames( |
| 14115 FixedArray* storage, int index, PropertyAttributes filter) { | 14115 FixedArray* storage, int index, PropertyAttributes filter) { |
| 14116 ASSERT(storage->length() >= (NumberOfLocalProperties(filter) - index)); | 14116 ASSERT(storage->length() >= (NumberOfOwnProperties(filter) - index)); |
| 14117 if (HasFastProperties()) { | 14117 if (HasFastProperties()) { |
| 14118 int real_size = map()->NumberOfOwnDescriptors(); | 14118 int real_size = map()->NumberOfOwnDescriptors(); |
| 14119 DescriptorArray* descs = map()->instance_descriptors(); | 14119 DescriptorArray* descs = map()->instance_descriptors(); |
| 14120 for (int i = 0; i < real_size; i++) { | 14120 for (int i = 0; i < real_size; i++) { |
| 14121 if ((descs->GetDetails(i).attributes() & filter) == 0 && | 14121 if ((descs->GetDetails(i).attributes() & filter) == 0 && |
| 14122 !FilterKey(descs->GetKey(i), filter)) { | 14122 !FilterKey(descs->GetKey(i), filter)) { |
| 14123 storage->set(index++, descs->GetKey(i)); | 14123 storage->set(index++, descs->GetKey(i)); |
| 14124 } | 14124 } |
| 14125 } | 14125 } |
| 14126 } else { | 14126 } else { |
| 14127 property_dictionary()->CopyKeysTo(storage, | 14127 property_dictionary()->CopyKeysTo(storage, |
| 14128 index, | 14128 index, |
| 14129 filter, | 14129 filter, |
| 14130 NameDictionary::UNSORTED); | 14130 NameDictionary::UNSORTED); |
| 14131 } | 14131 } |
| 14132 } | 14132 } |
| 14133 | 14133 |
| 14134 | 14134 |
| 14135 int JSObject::NumberOfLocalElements(PropertyAttributes filter) { | 14135 int JSObject::NumberOfOwnElements(PropertyAttributes filter) { |
| 14136 return GetLocalElementKeys(NULL, filter); | 14136 return GetOwnElementKeys(NULL, filter); |
| 14137 } | 14137 } |
| 14138 | 14138 |
| 14139 | 14139 |
| 14140 int JSObject::NumberOfEnumElements() { | 14140 int JSObject::NumberOfEnumElements() { |
| 14141 // Fast case for objects with no elements. | 14141 // Fast case for objects with no elements. |
| 14142 if (!IsJSValue() && HasFastObjectElements()) { | 14142 if (!IsJSValue() && HasFastObjectElements()) { |
| 14143 uint32_t length = IsJSArray() ? | 14143 uint32_t length = IsJSArray() ? |
| 14144 static_cast<uint32_t>( | 14144 static_cast<uint32_t>( |
| 14145 Smi::cast(JSArray::cast(this)->length())->value()) : | 14145 Smi::cast(JSArray::cast(this)->length())->value()) : |
| 14146 static_cast<uint32_t>(FixedArray::cast(elements())->length()); | 14146 static_cast<uint32_t>(FixedArray::cast(elements())->length()); |
| 14147 if (length == 0) return 0; | 14147 if (length == 0) return 0; |
| 14148 } | 14148 } |
| 14149 // Compute the number of enumerable elements. | 14149 // Compute the number of enumerable elements. |
| 14150 return NumberOfLocalElements(static_cast<PropertyAttributes>(DONT_ENUM)); | 14150 return NumberOfOwnElements(static_cast<PropertyAttributes>(DONT_ENUM)); |
| 14151 } | 14151 } |
| 14152 | 14152 |
| 14153 | 14153 |
| 14154 int JSObject::GetLocalElementKeys(FixedArray* storage, | 14154 int JSObject::GetOwnElementKeys(FixedArray* storage, |
| 14155 PropertyAttributes filter) { | 14155 PropertyAttributes filter) { |
| 14156 int counter = 0; | 14156 int counter = 0; |
| 14157 switch (GetElementsKind()) { | 14157 switch (GetElementsKind()) { |
| 14158 case FAST_SMI_ELEMENTS: | 14158 case FAST_SMI_ELEMENTS: |
| 14159 case FAST_ELEMENTS: | 14159 case FAST_ELEMENTS: |
| 14160 case FAST_HOLEY_SMI_ELEMENTS: | 14160 case FAST_HOLEY_SMI_ELEMENTS: |
| 14161 case FAST_HOLEY_ELEMENTS: { | 14161 case FAST_HOLEY_ELEMENTS: { |
| 14162 int length = IsJSArray() ? | 14162 int length = IsJSArray() ? |
| 14163 Smi::cast(JSArray::cast(this)->length())->value() : | 14163 Smi::cast(JSArray::cast(this)->length())->value() : |
| 14164 FixedArray::cast(elements())->length(); | 14164 FixedArray::cast(elements())->length(); |
| 14165 for (int i = 0; i < length; i++) { | 14165 for (int i = 0; i < length; i++) { |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 14271 } | 14271 } |
| 14272 counter += str->length(); | 14272 counter += str->length(); |
| 14273 } | 14273 } |
| 14274 } | 14274 } |
| 14275 ASSERT(!storage || storage->length() == counter); | 14275 ASSERT(!storage || storage->length() == counter); |
| 14276 return counter; | 14276 return counter; |
| 14277 } | 14277 } |
| 14278 | 14278 |
| 14279 | 14279 |
| 14280 int JSObject::GetEnumElementKeys(FixedArray* storage) { | 14280 int JSObject::GetEnumElementKeys(FixedArray* storage) { |
| 14281 return GetLocalElementKeys(storage, | 14281 return GetOwnElementKeys(storage, static_cast<PropertyAttributes>(DONT_ENUM)); |
| 14282 static_cast<PropertyAttributes>(DONT_ENUM)); | |
| 14283 } | 14282 } |
| 14284 | 14283 |
| 14285 | 14284 |
| 14286 // StringKey simply carries a string object as key. | 14285 // StringKey simply carries a string object as key. |
| 14287 class StringKey : public HashTableKey { | 14286 class StringKey : public HashTableKey { |
| 14288 public: | 14287 public: |
| 14289 explicit StringKey(String* string) : | 14288 explicit StringKey(String* string) : |
| 14290 string_(string), | 14289 string_(string), |
| 14291 hash_(HashForObject(string)) { } | 14290 hash_(HashForObject(string)) { } |
| 14292 | 14291 |
| (...skipping 2721 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 17014 ASSERT(index != kDateValue); | 17013 ASSERT(index != kDateValue); |
| 17015 | 17014 |
| 17016 DateCache* date_cache = GetIsolate()->date_cache(); | 17015 DateCache* date_cache = GetIsolate()->date_cache(); |
| 17017 | 17016 |
| 17018 if (index < kFirstUncachedField) { | 17017 if (index < kFirstUncachedField) { |
| 17019 Object* stamp = cache_stamp(); | 17018 Object* stamp = cache_stamp(); |
| 17020 if (stamp != date_cache->stamp() && stamp->IsSmi()) { | 17019 if (stamp != date_cache->stamp() && stamp->IsSmi()) { |
| 17021 // Since the stamp is not NaN, the value is also not NaN. | 17020 // Since the stamp is not NaN, the value is also not NaN. |
| 17022 int64_t local_time_ms = | 17021 int64_t local_time_ms = |
| 17023 date_cache->ToLocal(static_cast<int64_t>(value()->Number())); | 17022 date_cache->ToLocal(static_cast<int64_t>(value()->Number())); |
| 17024 SetLocalFields(local_time_ms, date_cache); | 17023 SetCachedFields(local_time_ms, date_cache); |
| 17025 } | 17024 } |
| 17026 switch (index) { | 17025 switch (index) { |
| 17027 case kYear: return year(); | 17026 case kYear: return year(); |
| 17028 case kMonth: return month(); | 17027 case kMonth: return month(); |
| 17029 case kDay: return day(); | 17028 case kDay: return day(); |
| 17030 case kWeekday: return weekday(); | 17029 case kWeekday: return weekday(); |
| 17031 case kHour: return hour(); | 17030 case kHour: return hour(); |
| 17032 case kMinute: return min(); | 17031 case kMinute: return min(); |
| 17033 case kSecond: return sec(); | 17032 case kSecond: return sec(); |
| 17034 default: UNREACHABLE(); | 17033 default: UNREACHABLE(); |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 17107 set_hour(nan, SKIP_WRITE_BARRIER); | 17106 set_hour(nan, SKIP_WRITE_BARRIER); |
| 17108 set_min(nan, SKIP_WRITE_BARRIER); | 17107 set_min(nan, SKIP_WRITE_BARRIER); |
| 17109 set_sec(nan, SKIP_WRITE_BARRIER); | 17108 set_sec(nan, SKIP_WRITE_BARRIER); |
| 17110 set_weekday(nan, SKIP_WRITE_BARRIER); | 17109 set_weekday(nan, SKIP_WRITE_BARRIER); |
| 17111 } else { | 17110 } else { |
| 17112 set_cache_stamp(Smi::FromInt(DateCache::kInvalidStamp), SKIP_WRITE_BARRIER); | 17111 set_cache_stamp(Smi::FromInt(DateCache::kInvalidStamp), SKIP_WRITE_BARRIER); |
| 17113 } | 17112 } |
| 17114 } | 17113 } |
| 17115 | 17114 |
| 17116 | 17115 |
| 17117 void JSDate::SetLocalFields(int64_t local_time_ms, DateCache* date_cache) { | 17116 void JSDate::SetCachedFields(int64_t local_time_ms, DateCache* date_cache) { |
| 17118 int days = DateCache::DaysFromTime(local_time_ms); | 17117 int days = DateCache::DaysFromTime(local_time_ms); |
| 17119 int time_in_day_ms = DateCache::TimeInDay(local_time_ms, days); | 17118 int time_in_day_ms = DateCache::TimeInDay(local_time_ms, days); |
| 17120 int year, month, day; | 17119 int year, month, day; |
| 17121 date_cache->YearMonthDayFromDays(days, &year, &month, &day); | 17120 date_cache->YearMonthDayFromDays(days, &year, &month, &day); |
| 17122 int weekday = date_cache->Weekday(days); | 17121 int weekday = date_cache->Weekday(days); |
| 17123 int hour = time_in_day_ms / (60 * 60 * 1000); | 17122 int hour = time_in_day_ms / (60 * 60 * 1000); |
| 17124 int min = (time_in_day_ms / (60 * 1000)) % 60; | 17123 int min = (time_in_day_ms / (60 * 1000)) % 60; |
| 17125 int sec = (time_in_day_ms / 1000) % 60; | 17124 int sec = (time_in_day_ms / 1000) % 60; |
| 17126 set_cache_stamp(date_cache->stamp()); | 17125 set_cache_stamp(date_cache->stamp()); |
| 17127 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER); | 17126 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER); |
| (...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 17282 #define ERROR_MESSAGES_TEXTS(C, T) T, | 17281 #define ERROR_MESSAGES_TEXTS(C, T) T, |
| 17283 static const char* error_messages_[] = { | 17282 static const char* error_messages_[] = { |
| 17284 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) | 17283 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) |
| 17285 }; | 17284 }; |
| 17286 #undef ERROR_MESSAGES_TEXTS | 17285 #undef ERROR_MESSAGES_TEXTS |
| 17287 return error_messages_[reason]; | 17286 return error_messages_[reason]; |
| 17288 } | 17287 } |
| 17289 | 17288 |
| 17290 | 17289 |
| 17291 } } // namespace v8::internal | 17290 } } // namespace v8::internal |
| OLD | NEW |