OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 520 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
531 break; | 531 break; |
532 } | 532 } |
533 default: | 533 default: |
534 UNREACHABLE(); | 534 UNREACHABLE(); |
535 } | 535 } |
536 } | 536 } |
537 | 537 |
538 // No accessible property found. | 538 // No accessible property found. |
539 *attributes = ABSENT; | 539 *attributes = ABSENT; |
540 isolate->ReportFailedAccessCheck(object, v8::ACCESS_GET); | 540 isolate->ReportFailedAccessCheck(object, v8::ACCESS_GET); |
541 RETURN_HANDLE_IF_SCHEDULED_EXCEPTION(isolate, Object); | 541 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); |
542 return isolate->factory()->undefined_value(); | 542 return isolate->factory()->undefined_value(); |
543 } | 543 } |
544 | 544 |
545 | 545 |
546 PropertyAttributes JSObject::GetPropertyAttributeWithFailedAccessCheck( | 546 PropertyAttributes JSObject::GetPropertyAttributeWithFailedAccessCheck( |
547 Handle<JSObject> object, | 547 Handle<JSObject> object, |
548 LookupResult* result, | 548 LookupResult* result, |
549 Handle<Name> name, | 549 Handle<Name> name, |
550 bool continue_search) { | 550 bool continue_search) { |
551 if (result->IsProperty()) { | 551 if (result->IsProperty()) { |
(...skipping 324 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
876 | 876 |
877 // Inline the case for JSObjects. Doing so significantly improves the | 877 // Inline the case for JSObjects. Doing so significantly improves the |
878 // performance of fetching elements where checking the prototype chain is | 878 // performance of fetching elements where checking the prototype chain is |
879 // necessary. | 879 // necessary. |
880 Handle<JSObject> js_object = Handle<JSObject>::cast(holder); | 880 Handle<JSObject> js_object = Handle<JSObject>::cast(holder); |
881 | 881 |
882 // Check access rights if needed. | 882 // Check access rights if needed. |
883 if (js_object->IsAccessCheckNeeded()) { | 883 if (js_object->IsAccessCheckNeeded()) { |
884 if (!isolate->MayIndexedAccess(js_object, index, v8::ACCESS_GET)) { | 884 if (!isolate->MayIndexedAccess(js_object, index, v8::ACCESS_GET)) { |
885 isolate->ReportFailedAccessCheck(js_object, v8::ACCESS_GET); | 885 isolate->ReportFailedAccessCheck(js_object, v8::ACCESS_GET); |
886 RETURN_HANDLE_IF_SCHEDULED_EXCEPTION(isolate, Object); | 886 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); |
887 return isolate->factory()->undefined_value(); | 887 return isolate->factory()->undefined_value(); |
888 } | 888 } |
889 } | 889 } |
890 | 890 |
891 if (js_object->HasIndexedInterceptor()) { | 891 if (js_object->HasIndexedInterceptor()) { |
892 return JSObject::GetElementWithInterceptor(js_object, receiver, index); | 892 return JSObject::GetElementWithInterceptor(js_object, receiver, index); |
893 } | 893 } |
894 | 894 |
895 if (js_object->elements() != isolate->heap()->empty_fixed_array()) { | 895 if (js_object->elements() != isolate->heap()->empty_fixed_array()) { |
896 Handle<Object> result; | 896 Handle<Object> result; |
(...skipping 4339 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5236 object->LocalLookupRealNamedProperty(*name, &result); | 5236 object->LocalLookupRealNamedProperty(*name, &result); |
5237 if (!result.IsFound()) return isolate->factory()->true_value(); | 5237 if (!result.IsFound()) return isolate->factory()->true_value(); |
5238 | 5238 |
5239 // Normalize object if needed. | 5239 // Normalize object if needed. |
5240 NormalizeProperties(object, CLEAR_INOBJECT_PROPERTIES, 0); | 5240 NormalizeProperties(object, CLEAR_INOBJECT_PROPERTIES, 0); |
5241 | 5241 |
5242 return DeleteNormalizedProperty(object, name, mode); | 5242 return DeleteNormalizedProperty(object, name, mode); |
5243 } | 5243 } |
5244 | 5244 |
5245 | 5245 |
5246 Handle<Object> JSObject::DeletePropertyWithInterceptor(Handle<JSObject> object, | 5246 MaybeHandle<Object> JSObject::DeletePropertyWithInterceptor( |
5247 Handle<Name> name) { | 5247 Handle<JSObject> object, Handle<Name> name) { |
5248 Isolate* isolate = object->GetIsolate(); | 5248 Isolate* isolate = object->GetIsolate(); |
5249 | 5249 |
5250 // TODO(rossberg): Support symbols in the API. | 5250 // TODO(rossberg): Support symbols in the API. |
5251 if (name->IsSymbol()) return isolate->factory()->false_value(); | 5251 if (name->IsSymbol()) return isolate->factory()->false_value(); |
5252 | 5252 |
5253 Handle<InterceptorInfo> interceptor(object->GetNamedInterceptor()); | 5253 Handle<InterceptorInfo> interceptor(object->GetNamedInterceptor()); |
5254 if (!interceptor->deleter()->IsUndefined()) { | 5254 if (!interceptor->deleter()->IsUndefined()) { |
5255 v8::NamedPropertyDeleterCallback deleter = | 5255 v8::NamedPropertyDeleterCallback deleter = |
5256 v8::ToCData<v8::NamedPropertyDeleterCallback>(interceptor->deleter()); | 5256 v8::ToCData<v8::NamedPropertyDeleterCallback>(interceptor->deleter()); |
5257 LOG(isolate, | 5257 LOG(isolate, |
5258 ApiNamedPropertyAccess("interceptor-named-delete", *object, *name)); | 5258 ApiNamedPropertyAccess("interceptor-named-delete", *object, *name)); |
5259 PropertyCallbackArguments args( | 5259 PropertyCallbackArguments args( |
5260 isolate, interceptor->data(), *object, *object); | 5260 isolate, interceptor->data(), *object, *object); |
5261 v8::Handle<v8::Boolean> result = | 5261 v8::Handle<v8::Boolean> result = |
5262 args.Call(deleter, v8::Utils::ToLocal(Handle<String>::cast(name))); | 5262 args.Call(deleter, v8::Utils::ToLocal(Handle<String>::cast(name))); |
5263 RETURN_HANDLE_IF_SCHEDULED_EXCEPTION(isolate, Object); | 5263 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); |
5264 if (!result.IsEmpty()) { | 5264 if (!result.IsEmpty()) { |
5265 ASSERT(result->IsBoolean()); | 5265 ASSERT(result->IsBoolean()); |
5266 Handle<Object> result_internal = v8::Utils::OpenHandle(*result); | 5266 Handle<Object> result_internal = v8::Utils::OpenHandle(*result); |
5267 result_internal->VerifyApiCallResultType(); | 5267 result_internal->VerifyApiCallResultType(); |
5268 // Rebox CustomArguments::kReturnValueOffset before returning. | 5268 // Rebox CustomArguments::kReturnValueOffset before returning. |
5269 return handle(*result_internal, isolate); | 5269 return handle(*result_internal, isolate); |
5270 } | 5270 } |
5271 } | 5271 } |
5272 Handle<Object> result = | 5272 Handle<Object> result = |
5273 DeletePropertyPostInterceptor(object, name, NORMAL_DELETION); | 5273 DeletePropertyPostInterceptor(object, name, NORMAL_DELETION); |
5274 RETURN_HANDLE_IF_SCHEDULED_EXCEPTION(isolate, Object); | |
5275 return result; | 5274 return result; |
5276 } | 5275 } |
5277 | 5276 |
5278 | 5277 |
5279 MaybeHandle<Object> JSObject::DeleteElementWithInterceptor( | 5278 MaybeHandle<Object> JSObject::DeleteElementWithInterceptor( |
5280 Handle<JSObject> object, | 5279 Handle<JSObject> object, |
5281 uint32_t index) { | 5280 uint32_t index) { |
5282 Isolate* isolate = object->GetIsolate(); | 5281 Isolate* isolate = object->GetIsolate(); |
5283 Factory* factory = isolate->factory(); | 5282 Factory* factory = isolate->factory(); |
5284 | 5283 |
5285 // Make sure that the top context does not change when doing | 5284 // Make sure that the top context does not change when doing |
5286 // callbacks or interceptor calls. | 5285 // callbacks or interceptor calls. |
5287 AssertNoContextChange ncc(isolate); | 5286 AssertNoContextChange ncc(isolate); |
5288 | 5287 |
5289 Handle<InterceptorInfo> interceptor(object->GetIndexedInterceptor()); | 5288 Handle<InterceptorInfo> interceptor(object->GetIndexedInterceptor()); |
5290 if (interceptor->deleter()->IsUndefined()) return factory->false_value(); | 5289 if (interceptor->deleter()->IsUndefined()) return factory->false_value(); |
5291 v8::IndexedPropertyDeleterCallback deleter = | 5290 v8::IndexedPropertyDeleterCallback deleter = |
5292 v8::ToCData<v8::IndexedPropertyDeleterCallback>(interceptor->deleter()); | 5291 v8::ToCData<v8::IndexedPropertyDeleterCallback>(interceptor->deleter()); |
5293 LOG(isolate, | 5292 LOG(isolate, |
5294 ApiIndexedPropertyAccess("interceptor-indexed-delete", *object, index)); | 5293 ApiIndexedPropertyAccess("interceptor-indexed-delete", *object, index)); |
5295 PropertyCallbackArguments args( | 5294 PropertyCallbackArguments args( |
5296 isolate, interceptor->data(), *object, *object); | 5295 isolate, interceptor->data(), *object, *object); |
5297 v8::Handle<v8::Boolean> result = args.Call(deleter, index); | 5296 v8::Handle<v8::Boolean> result = args.Call(deleter, index); |
5298 RETURN_HANDLE_IF_SCHEDULED_EXCEPTION(isolate, Object); | 5297 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); |
5299 if (!result.IsEmpty()) { | 5298 if (!result.IsEmpty()) { |
5300 ASSERT(result->IsBoolean()); | 5299 ASSERT(result->IsBoolean()); |
5301 Handle<Object> result_internal = v8::Utils::OpenHandle(*result); | 5300 Handle<Object> result_internal = v8::Utils::OpenHandle(*result); |
5302 result_internal->VerifyApiCallResultType(); | 5301 result_internal->VerifyApiCallResultType(); |
5303 // Rebox CustomArguments::kReturnValueOffset before returning. | 5302 // Rebox CustomArguments::kReturnValueOffset before returning. |
5304 return handle(*result_internal, isolate); | 5303 return handle(*result_internal, isolate); |
5305 } | 5304 } |
5306 MaybeHandle<Object> delete_result = object->GetElementsAccessor()->Delete( | 5305 MaybeHandle<Object> delete_result = object->GetElementsAccessor()->Delete( |
5307 object, index, NORMAL_DELETION); | 5306 object, index, NORMAL_DELETION); |
5308 return delete_result; | 5307 return delete_result; |
5309 } | 5308 } |
5310 | 5309 |
5311 | 5310 |
5312 MaybeHandle<Object> JSObject::DeleteElement(Handle<JSObject> object, | 5311 MaybeHandle<Object> JSObject::DeleteElement(Handle<JSObject> object, |
5313 uint32_t index, | 5312 uint32_t index, |
5314 DeleteMode mode) { | 5313 DeleteMode mode) { |
5315 Isolate* isolate = object->GetIsolate(); | 5314 Isolate* isolate = object->GetIsolate(); |
5316 Factory* factory = isolate->factory(); | 5315 Factory* factory = isolate->factory(); |
5317 | 5316 |
5318 // Check access rights if needed. | 5317 // Check access rights if needed. |
5319 if (object->IsAccessCheckNeeded() && | 5318 if (object->IsAccessCheckNeeded() && |
5320 !isolate->MayIndexedAccess(object, index, v8::ACCESS_DELETE)) { | 5319 !isolate->MayIndexedAccess(object, index, v8::ACCESS_DELETE)) { |
5321 isolate->ReportFailedAccessCheck(object, v8::ACCESS_DELETE); | 5320 isolate->ReportFailedAccessCheck(object, v8::ACCESS_DELETE); |
5322 RETURN_HANDLE_IF_SCHEDULED_EXCEPTION(isolate, Object); | 5321 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); |
5323 return factory->false_value(); | 5322 return factory->false_value(); |
5324 } | 5323 } |
5325 | 5324 |
5326 if (object->IsStringObjectWithCharacterAt(index)) { | 5325 if (object->IsStringObjectWithCharacterAt(index)) { |
5327 if (mode == STRICT_DELETION) { | 5326 if (mode == STRICT_DELETION) { |
5328 // Deleting a non-configurable property in strict mode. | 5327 // Deleting a non-configurable property in strict mode. |
5329 Handle<Object> name = factory->NewNumberFromUint(index); | 5328 Handle<Object> name = factory->NewNumberFromUint(index); |
5330 Handle<Object> args[2] = { name, object }; | 5329 Handle<Object> args[2] = { name, object }; |
5331 Handle<Object> error = | 5330 Handle<Object> error = |
5332 factory->NewTypeError("strict_delete_property", | 5331 factory->NewTypeError("strict_delete_property", |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5381 Handle<Name> name, | 5380 Handle<Name> name, |
5382 DeleteMode mode) { | 5381 DeleteMode mode) { |
5383 Isolate* isolate = object->GetIsolate(); | 5382 Isolate* isolate = object->GetIsolate(); |
5384 // ECMA-262, 3rd, 8.6.2.5 | 5383 // ECMA-262, 3rd, 8.6.2.5 |
5385 ASSERT(name->IsName()); | 5384 ASSERT(name->IsName()); |
5386 | 5385 |
5387 // Check access rights if needed. | 5386 // Check access rights if needed. |
5388 if (object->IsAccessCheckNeeded() && | 5387 if (object->IsAccessCheckNeeded() && |
5389 !isolate->MayNamedAccess(object, name, v8::ACCESS_DELETE)) { | 5388 !isolate->MayNamedAccess(object, name, v8::ACCESS_DELETE)) { |
5390 isolate->ReportFailedAccessCheck(object, v8::ACCESS_DELETE); | 5389 isolate->ReportFailedAccessCheck(object, v8::ACCESS_DELETE); |
5391 RETURN_HANDLE_IF_SCHEDULED_EXCEPTION(isolate, Object); | 5390 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); |
5392 return isolate->factory()->false_value(); | 5391 return isolate->factory()->false_value(); |
5393 } | 5392 } |
5394 | 5393 |
5395 if (object->IsJSGlobalProxy()) { | 5394 if (object->IsJSGlobalProxy()) { |
5396 Object* proto = object->GetPrototype(); | 5395 Object* proto = object->GetPrototype(); |
5397 if (proto->IsNull()) return isolate->factory()->false_value(); | 5396 if (proto->IsNull()) return isolate->factory()->false_value(); |
5398 ASSERT(proto->IsJSGlobalObject()); | 5397 ASSERT(proto->IsJSGlobalObject()); |
5399 return JSGlobalObject::DeleteProperty( | 5398 return JSGlobalObject::DeleteProperty( |
5400 handle(JSGlobalObject::cast(proto)), name, mode); | 5399 handle(JSGlobalObject::cast(proto)), name, mode); |
5401 } | 5400 } |
(...skipping 26 matching lines...) Expand all Loading... |
5428 old_value = Object::GetPropertyOrElement(object, name).ToHandleChecked(); | 5427 old_value = Object::GetPropertyOrElement(object, name).ToHandleChecked(); |
5429 } | 5428 } |
5430 Handle<Object> result; | 5429 Handle<Object> result; |
5431 | 5430 |
5432 // Check for interceptor. | 5431 // Check for interceptor. |
5433 if (lookup.IsInterceptor()) { | 5432 if (lookup.IsInterceptor()) { |
5434 // Skip interceptor if forcing a deletion. | 5433 // Skip interceptor if forcing a deletion. |
5435 if (mode == FORCE_DELETION) { | 5434 if (mode == FORCE_DELETION) { |
5436 result = DeletePropertyPostInterceptor(object, name, mode); | 5435 result = DeletePropertyPostInterceptor(object, name, mode); |
5437 } else { | 5436 } else { |
5438 result = DeletePropertyWithInterceptor(object, name); | 5437 ASSIGN_RETURN_ON_EXCEPTION( |
| 5438 isolate, result, |
| 5439 DeletePropertyWithInterceptor(object, name), |
| 5440 Object); |
5439 } | 5441 } |
5440 } else { | 5442 } else { |
5441 // Normalize object if needed. | 5443 // Normalize object if needed. |
5442 NormalizeProperties(object, CLEAR_INOBJECT_PROPERTIES, 0); | 5444 NormalizeProperties(object, CLEAR_INOBJECT_PROPERTIES, 0); |
5443 // Make sure the properties are normalized before removing the entry. | 5445 // Make sure the properties are normalized before removing the entry. |
5444 result = DeleteNormalizedProperty(object, name, mode); | 5446 result = DeleteNormalizedProperty(object, name, mode); |
5445 } | 5447 } |
5446 | 5448 |
5447 if (is_observed && !HasLocalProperty(object, name)) { | 5449 if (is_observed && !HasLocalProperty(object, name)) { |
5448 EnqueueChangeRecord(object, "delete", name, old_value); | 5450 EnqueueChangeRecord(object, "delete", name, old_value); |
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5603 | 5605 |
5604 return JSObject::cast(context->extension())->ReferencesObject(obj); | 5606 return JSObject::cast(context->extension())->ReferencesObject(obj); |
5605 } | 5607 } |
5606 } | 5608 } |
5607 | 5609 |
5608 // No references to object. | 5610 // No references to object. |
5609 return false; | 5611 return false; |
5610 } | 5612 } |
5611 | 5613 |
5612 | 5614 |
5613 Handle<Object> JSObject::PreventExtensions(Handle<JSObject> object) { | 5615 MaybeHandle<Object> JSObject::PreventExtensions(Handle<JSObject> object) { |
5614 Isolate* isolate = object->GetIsolate(); | 5616 Isolate* isolate = object->GetIsolate(); |
5615 | 5617 |
5616 if (!object->map()->is_extensible()) return object; | 5618 if (!object->map()->is_extensible()) return object; |
5617 | 5619 |
5618 if (object->IsAccessCheckNeeded() && | 5620 if (object->IsAccessCheckNeeded() && |
5619 !isolate->MayNamedAccess( | 5621 !isolate->MayNamedAccess( |
5620 object, isolate->factory()->undefined_value(), v8::ACCESS_KEYS)) { | 5622 object, isolate->factory()->undefined_value(), v8::ACCESS_KEYS)) { |
5621 isolate->ReportFailedAccessCheck(object, v8::ACCESS_KEYS); | 5623 isolate->ReportFailedAccessCheck(object, v8::ACCESS_KEYS); |
5622 RETURN_HANDLE_IF_SCHEDULED_EXCEPTION(isolate, Object); | 5624 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); |
5623 return isolate->factory()->false_value(); | 5625 return isolate->factory()->false_value(); |
5624 } | 5626 } |
5625 | 5627 |
5626 if (object->IsJSGlobalProxy()) { | 5628 if (object->IsJSGlobalProxy()) { |
5627 Handle<Object> proto(object->GetPrototype(), isolate); | 5629 Handle<Object> proto(object->GetPrototype(), isolate); |
5628 if (proto->IsNull()) return object; | 5630 if (proto->IsNull()) return object; |
5629 ASSERT(proto->IsJSGlobalObject()); | 5631 ASSERT(proto->IsJSGlobalObject()); |
5630 return PreventExtensions(Handle<JSObject>::cast(proto)); | 5632 return PreventExtensions(Handle<JSObject>::cast(proto)); |
5631 } | 5633 } |
5632 | 5634 |
5633 // It's not possible to seal objects with external array elements | 5635 // It's not possible to seal objects with external array elements |
5634 if (object->HasExternalArrayElements() || | 5636 if (object->HasExternalArrayElements() || |
5635 object->HasFixedTypedArrayElements()) { | 5637 object->HasFixedTypedArrayElements()) { |
5636 Handle<Object> error = | 5638 Handle<Object> error = |
5637 isolate->factory()->NewTypeError( | 5639 isolate->factory()->NewTypeError( |
5638 "cant_prevent_ext_external_array_elements", | 5640 "cant_prevent_ext_external_array_elements", |
5639 HandleVector(&object, 1)); | 5641 HandleVector(&object, 1)); |
5640 isolate->Throw(*error); | 5642 return isolate->Throw<Object>(error); |
5641 return Handle<Object>(); | |
5642 } | 5643 } |
5643 | 5644 |
5644 // If there are fast elements we normalize. | 5645 // If there are fast elements we normalize. |
5645 Handle<SeededNumberDictionary> dictionary = NormalizeElements(object); | 5646 Handle<SeededNumberDictionary> dictionary = NormalizeElements(object); |
5646 ASSERT(object->HasDictionaryElements() || | 5647 ASSERT(object->HasDictionaryElements() || |
5647 object->HasDictionaryArgumentsElements()); | 5648 object->HasDictionaryArgumentsElements()); |
5648 | 5649 |
5649 // Make sure that we never go back to fast case. | 5650 // Make sure that we never go back to fast case. |
5650 dictionary->set_requires_slow_elements(); | 5651 dictionary->set_requires_slow_elements(); |
5651 | 5652 |
(...skipping 1262 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6914 | 6915 |
6915 CallbacksDescriptor new_accessors_desc(name, accessors, attributes); | 6916 CallbacksDescriptor new_accessors_desc(name, accessors, attributes); |
6916 Handle<Map> new_map = Map::CopyInsertDescriptor( | 6917 Handle<Map> new_map = Map::CopyInsertDescriptor( |
6917 handle(object->map()), &new_accessors_desc, INSERT_TRANSITION); | 6918 handle(object->map()), &new_accessors_desc, INSERT_TRANSITION); |
6918 | 6919 |
6919 JSObject::MigrateToMap(object, new_map); | 6920 JSObject::MigrateToMap(object, new_map); |
6920 return true; | 6921 return true; |
6921 } | 6922 } |
6922 | 6923 |
6923 | 6924 |
6924 Handle<Object> JSObject::SetAccessor(Handle<JSObject> object, | 6925 MaybeHandle<Object> JSObject::SetAccessor(Handle<JSObject> object, |
6925 Handle<AccessorInfo> info) { | 6926 Handle<AccessorInfo> info) { |
6926 Isolate* isolate = object->GetIsolate(); | 6927 Isolate* isolate = object->GetIsolate(); |
6927 Factory* factory = isolate->factory(); | 6928 Factory* factory = isolate->factory(); |
6928 Handle<Name> name(Name::cast(info->name())); | 6929 Handle<Name> name(Name::cast(info->name())); |
6929 | 6930 |
6930 // Check access rights if needed. | 6931 // Check access rights if needed. |
6931 if (object->IsAccessCheckNeeded() && | 6932 if (object->IsAccessCheckNeeded() && |
6932 !isolate->MayNamedAccess(object, name, v8::ACCESS_SET)) { | 6933 !isolate->MayNamedAccess(object, name, v8::ACCESS_SET)) { |
6933 isolate->ReportFailedAccessCheck(object, v8::ACCESS_SET); | 6934 isolate->ReportFailedAccessCheck(object, v8::ACCESS_SET); |
6934 RETURN_HANDLE_IF_SCHEDULED_EXCEPTION(isolate, Object); | 6935 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); |
6935 return factory->undefined_value(); | 6936 return factory->undefined_value(); |
6936 } | 6937 } |
6937 | 6938 |
6938 if (object->IsJSGlobalProxy()) { | 6939 if (object->IsJSGlobalProxy()) { |
6939 Handle<Object> proto(object->GetPrototype(), isolate); | 6940 Handle<Object> proto(object->GetPrototype(), isolate); |
6940 if (proto->IsNull()) return object; | 6941 if (proto->IsNull()) return object; |
6941 ASSERT(proto->IsJSGlobalObject()); | 6942 ASSERT(proto->IsJSGlobalObject()); |
6942 return SetAccessor(Handle<JSObject>::cast(proto), info); | 6943 return SetAccessor(Handle<JSObject>::cast(proto), info); |
6943 } | 6944 } |
6944 | 6945 |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6997 return factory->undefined_value(); | 6998 return factory->undefined_value(); |
6998 } | 6999 } |
6999 | 7000 |
7000 SetPropertyCallback(object, name, info, info->property_attributes()); | 7001 SetPropertyCallback(object, name, info, info->property_attributes()); |
7001 } | 7002 } |
7002 | 7003 |
7003 return object; | 7004 return object; |
7004 } | 7005 } |
7005 | 7006 |
7006 | 7007 |
7007 Handle<Object> JSObject::GetAccessor(Handle<JSObject> object, | 7008 MaybeHandle<Object> JSObject::GetAccessor(Handle<JSObject> object, |
7008 Handle<Name> name, | 7009 Handle<Name> name, |
7009 AccessorComponent component) { | 7010 AccessorComponent component) { |
7010 Isolate* isolate = object->GetIsolate(); | 7011 Isolate* isolate = object->GetIsolate(); |
7011 | 7012 |
7012 // Make sure that the top context does not change when doing callbacks or | 7013 // Make sure that the top context does not change when doing callbacks or |
7013 // interceptor calls. | 7014 // interceptor calls. |
7014 AssertNoContextChange ncc(isolate); | 7015 AssertNoContextChange ncc(isolate); |
7015 | 7016 |
7016 // Check access rights if needed. | 7017 // Check access rights if needed. |
7017 if (object->IsAccessCheckNeeded() && | 7018 if (object->IsAccessCheckNeeded() && |
7018 !isolate->MayNamedAccess(object, name, v8::ACCESS_HAS)) { | 7019 !isolate->MayNamedAccess(object, name, v8::ACCESS_HAS)) { |
7019 isolate->ReportFailedAccessCheck(object, v8::ACCESS_HAS); | 7020 isolate->ReportFailedAccessCheck(object, v8::ACCESS_HAS); |
7020 RETURN_HANDLE_IF_SCHEDULED_EXCEPTION(isolate, Object); | 7021 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); |
7021 return isolate->factory()->undefined_value(); | 7022 return isolate->factory()->undefined_value(); |
7022 } | 7023 } |
7023 | 7024 |
7024 // Make the lookup and include prototypes. | 7025 // Make the lookup and include prototypes. |
7025 uint32_t index = 0; | 7026 uint32_t index = 0; |
7026 if (name->AsArrayIndex(&index)) { | 7027 if (name->AsArrayIndex(&index)) { |
7027 for (Handle<Object> obj = object; | 7028 for (Handle<Object> obj = object; |
7028 !obj->IsNull(); | 7029 !obj->IsNull(); |
7029 obj = handle(JSReceiver::cast(*obj)->GetPrototype(), isolate)) { | 7030 obj = handle(JSReceiver::cast(*obj)->GetPrototype(), isolate)) { |
7030 if (obj->IsJSObject() && JSObject::cast(*obj)->HasDictionaryElements()) { | 7031 if (obj->IsJSObject() && JSObject::cast(*obj)->HasDictionaryElements()) { |
(...skipping 6521 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13552 | 13553 |
13553 Handle<InterceptorInfo> interceptor(object->GetIndexedInterceptor(), isolate); | 13554 Handle<InterceptorInfo> interceptor(object->GetIndexedInterceptor(), isolate); |
13554 if (!interceptor->getter()->IsUndefined()) { | 13555 if (!interceptor->getter()->IsUndefined()) { |
13555 v8::IndexedPropertyGetterCallback getter = | 13556 v8::IndexedPropertyGetterCallback getter = |
13556 v8::ToCData<v8::IndexedPropertyGetterCallback>(interceptor->getter()); | 13557 v8::ToCData<v8::IndexedPropertyGetterCallback>(interceptor->getter()); |
13557 LOG(isolate, | 13558 LOG(isolate, |
13558 ApiIndexedPropertyAccess("interceptor-indexed-get", *object, index)); | 13559 ApiIndexedPropertyAccess("interceptor-indexed-get", *object, index)); |
13559 PropertyCallbackArguments | 13560 PropertyCallbackArguments |
13560 args(isolate, interceptor->data(), *receiver, *object); | 13561 args(isolate, interceptor->data(), *receiver, *object); |
13561 v8::Handle<v8::Value> result = args.Call(getter, index); | 13562 v8::Handle<v8::Value> result = args.Call(getter, index); |
13562 RETURN_HANDLE_IF_SCHEDULED_EXCEPTION(isolate, Object); | 13563 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); |
13563 if (!result.IsEmpty()) { | 13564 if (!result.IsEmpty()) { |
13564 Handle<Object> result_internal = v8::Utils::OpenHandle(*result); | 13565 Handle<Object> result_internal = v8::Utils::OpenHandle(*result); |
13565 result_internal->VerifyApiCallResultType(); | 13566 result_internal->VerifyApiCallResultType(); |
13566 // Rebox handle before return. | 13567 // Rebox handle before return. |
13567 return handle(*result_internal, isolate); | 13568 return handle(*result_internal, isolate); |
13568 } | 13569 } |
13569 } | 13570 } |
13570 | 13571 |
13571 ElementsAccessor* handler = object->GetElementsAccessor(); | 13572 ElementsAccessor* handler = object->GetElementsAccessor(); |
13572 Handle<Object> result; | 13573 Handle<Object> result; |
(...skipping 3538 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
17111 #define ERROR_MESSAGES_TEXTS(C, T) T, | 17112 #define ERROR_MESSAGES_TEXTS(C, T) T, |
17112 static const char* error_messages_[] = { | 17113 static const char* error_messages_[] = { |
17113 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) | 17114 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) |
17114 }; | 17115 }; |
17115 #undef ERROR_MESSAGES_TEXTS | 17116 #undef ERROR_MESSAGES_TEXTS |
17116 return error_messages_[reason]; | 17117 return error_messages_[reason]; |
17117 } | 17118 } |
17118 | 17119 |
17119 | 17120 |
17120 } } // namespace v8::internal | 17121 } } // namespace v8::internal |
OLD | NEW |