Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(236)

Side by Side Diff: src/objects.cc

Issue 240443005: Some MaybeHandles related cleanups. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/objects.h ('k') | src/runtime.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « src/objects.h ('k') | src/runtime.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698