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

Side by Side Diff: src/objects.cc

Issue 341453003: Support symbol-named properties in API (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 6 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/objects-debug.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 // 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 "src/v8.h" 5 #include "src/v8.h"
6 6
7 #include "src/accessors.h" 7 #include "src/accessors.h"
8 #include "src/allocation-site-scopes.h" 8 #include "src/allocation-site-scopes.h"
9 #include "src/api.h" 9 #include "src/api.h"
10 #include "src/arguments.h" 10 #include "src/arguments.h"
(...skipping 399 matching lines...) Expand 10 before | Expand all | Expand 10 after
410 if (structure->IsAccessorInfo()) { 410 if (structure->IsAccessorInfo()) {
411 Handle<AccessorInfo> accessor_info = Handle<AccessorInfo>::cast(structure); 411 Handle<AccessorInfo> accessor_info = Handle<AccessorInfo>::cast(structure);
412 if (!accessor_info->IsCompatibleReceiver(*receiver)) { 412 if (!accessor_info->IsCompatibleReceiver(*receiver)) {
413 Handle<Object> args[2] = { name, receiver }; 413 Handle<Object> args[2] = { name, receiver };
414 Handle<Object> error = 414 Handle<Object> error =
415 isolate->factory()->NewTypeError("incompatible_method_receiver", 415 isolate->factory()->NewTypeError("incompatible_method_receiver",
416 HandleVector(args, 416 HandleVector(args,
417 ARRAY_SIZE(args))); 417 ARRAY_SIZE(args)));
418 return isolate->Throw<Object>(error); 418 return isolate->Throw<Object>(error);
419 } 419 }
420 // TODO(rossberg): Handling symbols in the API requires changing the API,
421 // so we do not support it for now.
422 if (name->IsSymbol()) return isolate->factory()->undefined_value();
423 if (structure->IsDeclaredAccessorInfo()) { 420 if (structure->IsDeclaredAccessorInfo()) {
424 return GetDeclaredAccessorProperty( 421 return GetDeclaredAccessorProperty(
425 receiver, 422 receiver,
426 Handle<DeclaredAccessorInfo>::cast(structure), 423 Handle<DeclaredAccessorInfo>::cast(structure),
427 isolate); 424 isolate);
428 } 425 }
429 426
430 Handle<ExecutableAccessorInfo> data = 427 Handle<ExecutableAccessorInfo> data =
431 Handle<ExecutableAccessorInfo>::cast(structure); 428 Handle<ExecutableAccessorInfo>::cast(structure);
432 v8::AccessorGetterCallback call_fun =
433 v8::ToCData<v8::AccessorGetterCallback>(data->getter());
434 if (call_fun == NULL) return isolate->factory()->undefined_value();
435
436 Handle<String> key = Handle<String>::cast(name);
437 LOG(isolate, ApiNamedPropertyAccess("load", *holder, *name)); 429 LOG(isolate, ApiNamedPropertyAccess("load", *holder, *name));
438 PropertyCallbackArguments args(isolate, data->data(), *receiver, *holder); 430 PropertyCallbackArguments args(isolate, data->data(), *receiver, *holder);
439 v8::Handle<v8::Value> result = 431
440 args.Call(call_fun, v8::Utils::ToLocal(key)); 432 v8::Handle<v8::Value> result;
433 if (name->IsSymbol()) {
434 v8::AccessorSymbolGetterCallback call_fun =
435 v8::ToCData<v8::AccessorSymbolGetterCallback>(data->getter());
436 if (call_fun == NULL) return isolate->factory()->undefined_value();
437 result =
438 args.Call(call_fun, v8::Utils::ToLocal(Handle<Symbol>::cast(name)));
439 } else {
440 v8::AccessorGetterCallback call_fun =
441 v8::ToCData<v8::AccessorGetterCallback>(data->getter());
442 if (call_fun == NULL) return isolate->factory()->undefined_value();
443 result =
444 args.Call(call_fun, v8::Utils::ToLocal(Handle<String>::cast(name)));
445 }
446
441 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); 447 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object);
442 if (result.IsEmpty()) { 448 if (result.IsEmpty()) {
443 return isolate->factory()->undefined_value(); 449 return isolate->factory()->undefined_value();
444 } 450 }
445 Handle<Object> return_value = v8::Utils::OpenHandle(*result); 451 Handle<Object> return_value = v8::Utils::OpenHandle(*result);
446 return_value->VerifyApiCallResultType(); 452 return_value->VerifyApiCallResultType();
447 // Rebox handle before return. 453 // Rebox handle before return.
448 return handle(*return_value, isolate); 454 return handle(*return_value, isolate);
449 } 455 }
450 456
(...skipping 26 matching lines...) Expand all
477 // api style callbacks 483 // api style callbacks
478 ExecutableAccessorInfo* data = ExecutableAccessorInfo::cast(*structure); 484 ExecutableAccessorInfo* data = ExecutableAccessorInfo::cast(*structure);
479 if (!data->IsCompatibleReceiver(*receiver)) { 485 if (!data->IsCompatibleReceiver(*receiver)) {
480 Handle<Object> args[2] = { name, receiver }; 486 Handle<Object> args[2] = { name, receiver };
481 Handle<Object> error = 487 Handle<Object> error =
482 isolate->factory()->NewTypeError("incompatible_method_receiver", 488 isolate->factory()->NewTypeError("incompatible_method_receiver",
483 HandleVector(args, 489 HandleVector(args,
484 ARRAY_SIZE(args))); 490 ARRAY_SIZE(args)));
485 return isolate->Throw<Object>(error); 491 return isolate->Throw<Object>(error);
486 } 492 }
487 // TODO(rossberg): Support symbols in the API.
488 if (name->IsSymbol()) return value;
489 Object* call_obj = data->setter(); 493 Object* call_obj = data->setter();
490 v8::AccessorSetterCallback call_fun =
491 v8::ToCData<v8::AccessorSetterCallback>(call_obj);
492 if (call_fun == NULL) return value;
493 Handle<String> key = Handle<String>::cast(name);
494 LOG(isolate, ApiNamedPropertyAccess("store", *holder, *name)); 494 LOG(isolate, ApiNamedPropertyAccess("store", *holder, *name));
495 PropertyCallbackArguments args(isolate, data->data(), *receiver, *holder); 495 PropertyCallbackArguments args(isolate, data->data(), *receiver, *holder);
496 args.Call(call_fun, 496 if (name->IsSymbol()) {
497 v8::Utils::ToLocal(key), 497 v8::AccessorSymbolSetterCallback call_fun =
498 v8::Utils::ToLocal(value)); 498 v8::ToCData<v8::AccessorSymbolSetterCallback>(call_obj);
499 if (call_fun == NULL) return value;
500 args.Call(call_fun,
501 v8::Utils::ToLocal(Handle<Symbol>::cast(name)),
502 v8::Utils::ToLocal(value));
503 } else {
504 v8::AccessorSetterCallback call_fun =
505 v8::ToCData<v8::AccessorSetterCallback>(call_obj);
506 if (call_fun == NULL) return value;
507 args.Call(call_fun,
508 v8::Utils::ToLocal(Handle<String>::cast(name)),
509 v8::Utils::ToLocal(value));
510 }
511
499 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); 512 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object);
500 return value; 513 return value;
501 } 514 }
502 515
503 if (structure->IsAccessorPair()) { 516 if (structure->IsAccessorPair()) {
504 Handle<Object> setter(AccessorPair::cast(*structure)->setter(), isolate); 517 Handle<Object> setter(AccessorPair::cast(*structure)->setter(), isolate);
505 if (setter->IsSpecFunction()) { 518 if (setter->IsSpecFunction()) {
506 // TODO(rossberg): nicer would be to cast to some JSCallable here... 519 // TODO(rossberg): nicer would be to cast to some JSCallable here...
507 return SetPropertyWithDefinedSetter( 520 return SetPropertyWithDefinedSetter(
508 receiver, Handle<JSReceiver>::cast(setter), value); 521 receiver, Handle<JSReceiver>::cast(setter), value);
(...skipping 2410 matching lines...) Expand 10 before | Expand all | Expand 10 after
2919 return handle(new_map); 2932 return handle(new_map);
2920 } 2933 }
2921 2934
2922 2935
2923 MaybeHandle<Object> JSObject::SetPropertyWithInterceptor( 2936 MaybeHandle<Object> JSObject::SetPropertyWithInterceptor(
2924 Handle<JSObject> object, 2937 Handle<JSObject> object,
2925 Handle<Name> name, 2938 Handle<Name> name,
2926 Handle<Object> value, 2939 Handle<Object> value,
2927 PropertyAttributes attributes, 2940 PropertyAttributes attributes,
2928 StrictMode strict_mode) { 2941 StrictMode strict_mode) {
2929 // TODO(rossberg): Support symbols in the API.
2930 if (name->IsSymbol()) return value;
2931 Isolate* isolate = object->GetIsolate(); 2942 Isolate* isolate = object->GetIsolate();
2932 Handle<String> name_string = Handle<String>::cast(name);
2933 Handle<InterceptorInfo> interceptor(object->GetNamedInterceptor()); 2943 Handle<InterceptorInfo> interceptor(object->GetNamedInterceptor());
2934 if (!interceptor->setter()->IsUndefined()) { 2944 if (!interceptor->setter()->IsUndefined()
2945 && (name->IsString() || interceptor->can_intercept_symbols())) {
2935 LOG(isolate, 2946 LOG(isolate,
2936 ApiNamedPropertyAccess("interceptor-named-set", *object, *name)); 2947 ApiNamedPropertyAccess("interceptor-named-set", *object, *name));
2937 PropertyCallbackArguments args( 2948 PropertyCallbackArguments args(
2938 isolate, interceptor->data(), *object, *object); 2949 isolate, interceptor->data(), *object, *object);
2939 v8::NamedPropertySetterCallback setter = 2950 v8::GenericNamedPropertySetterCallback setter =
2940 v8::ToCData<v8::NamedPropertySetterCallback>(interceptor->setter()); 2951 v8::ToCData<v8::GenericNamedPropertySetterCallback>(
2952 interceptor->setter());
2941 Handle<Object> value_unhole = value->IsTheHole() 2953 Handle<Object> value_unhole = value->IsTheHole()
2942 ? Handle<Object>(isolate->factory()->undefined_value()) : value; 2954 ? Handle<Object>(isolate->factory()->undefined_value()) : value;
2943 v8::Handle<v8::Value> result = args.Call(setter, 2955 v8::Handle<v8::Value> result = args.Call(setter,
2944 v8::Utils::ToLocal(name_string), 2956 v8::Utils::ToLocal(name),
2945 v8::Utils::ToLocal(value_unhole)); 2957 v8::Utils::ToLocal(value_unhole));
2946 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); 2958 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object);
2947 if (!result.IsEmpty()) return value; 2959 if (!result.IsEmpty()) return value;
2948 } 2960 }
2949 return SetPropertyPostInterceptor( 2961 return SetPropertyPostInterceptor(
2950 object, name, value, attributes, strict_mode); 2962 object, name, value, attributes, strict_mode);
2951 } 2963 }
2952 2964
2953 2965
2954 MaybeHandle<Object> JSReceiver::SetProperty(Handle<JSReceiver> object, 2966 MaybeHandle<Object> JSReceiver::SetProperty(Handle<JSReceiver> object,
(...skipping 1357 matching lines...) Expand 10 before | Expand all | Expand 10 after
4312 } 4324 }
4313 4325
4314 return value; 4326 return value;
4315 } 4327 }
4316 4328
4317 4329
4318 Maybe<PropertyAttributes> JSObject::GetPropertyAttributesWithInterceptor( 4330 Maybe<PropertyAttributes> JSObject::GetPropertyAttributesWithInterceptor(
4319 Handle<JSObject> holder, 4331 Handle<JSObject> holder,
4320 Handle<Object> receiver, 4332 Handle<Object> receiver,
4321 Handle<Name> name) { 4333 Handle<Name> name) {
4322 // TODO(rossberg): Support symbols in the API.
4323 if (name->IsSymbol()) return Maybe<PropertyAttributes>(ABSENT);
4324
4325 Isolate* isolate = holder->GetIsolate(); 4334 Isolate* isolate = holder->GetIsolate();
4326 HandleScope scope(isolate); 4335 HandleScope scope(isolate);
4327 4336
4328 // Make sure that the top context does not change when doing 4337 // Make sure that the top context does not change when doing
4329 // callbacks or interceptor calls. 4338 // callbacks or interceptor calls.
4330 AssertNoContextChange ncc(isolate); 4339 AssertNoContextChange ncc(isolate);
4331 4340
4332 Handle<InterceptorInfo> interceptor(holder->GetNamedInterceptor()); 4341 Handle<InterceptorInfo> interceptor(holder->GetNamedInterceptor());
4342 if (name->IsSymbol() && !interceptor->can_intercept_symbols()) {
4343 return Maybe<PropertyAttributes>(ABSENT);
4344 }
4333 PropertyCallbackArguments args( 4345 PropertyCallbackArguments args(
4334 isolate, interceptor->data(), *receiver, *holder); 4346 isolate, interceptor->data(), *receiver, *holder);
4335 if (!interceptor->query()->IsUndefined()) { 4347 if (!interceptor->query()->IsUndefined()) {
4336 v8::NamedPropertyQueryCallback query = 4348 v8::GenericNamedPropertyQueryCallback query =
4337 v8::ToCData<v8::NamedPropertyQueryCallback>(interceptor->query()); 4349 v8::ToCData<v8::GenericNamedPropertyQueryCallback>(
4350 interceptor->query());
4338 LOG(isolate, 4351 LOG(isolate,
4339 ApiNamedPropertyAccess("interceptor-named-has", *holder, *name)); 4352 ApiNamedPropertyAccess("interceptor-named-has", *holder, *name));
4340 v8::Handle<v8::Integer> result = 4353 v8::Handle<v8::Integer> result =
4341 args.Call(query, v8::Utils::ToLocal(Handle<String>::cast(name))); 4354 args.Call(query, v8::Utils::ToLocal(name));
4342 if (!result.IsEmpty()) { 4355 if (!result.IsEmpty()) {
4343 ASSERT(result->IsInt32()); 4356 ASSERT(result->IsInt32());
4344 return Maybe<PropertyAttributes>( 4357 return Maybe<PropertyAttributes>(
4345 static_cast<PropertyAttributes>(result->Int32Value())); 4358 static_cast<PropertyAttributes>(result->Int32Value()));
4346 } 4359 }
4347 } else if (!interceptor->getter()->IsUndefined()) { 4360 } else if (!interceptor->getter()->IsUndefined()) {
4348 v8::NamedPropertyGetterCallback getter = 4361 v8::GenericNamedPropertyGetterCallback getter =
4349 v8::ToCData<v8::NamedPropertyGetterCallback>(interceptor->getter()); 4362 v8::ToCData<v8::GenericNamedPropertyGetterCallback>(
4363 interceptor->getter());
4350 LOG(isolate, 4364 LOG(isolate,
4351 ApiNamedPropertyAccess("interceptor-named-get-has", *holder, *name)); 4365 ApiNamedPropertyAccess("interceptor-named-get-has", *holder, *name));
4352 v8::Handle<v8::Value> result = 4366 v8::Handle<v8::Value> result =
4353 args.Call(getter, v8::Utils::ToLocal(Handle<String>::cast(name))); 4367 args.Call(getter, v8::Utils::ToLocal(name));
4354 if (!result.IsEmpty()) return Maybe<PropertyAttributes>(DONT_ENUM); 4368 if (!result.IsEmpty()) return Maybe<PropertyAttributes>(DONT_ENUM);
4355 } 4369 }
4356 return Maybe<PropertyAttributes>(); 4370 return Maybe<PropertyAttributes>();
4357 } 4371 }
4358 4372
4359 4373
4360 PropertyAttributes JSReceiver::GetOwnPropertyAttributes( 4374 PropertyAttributes JSReceiver::GetOwnPropertyAttributes(
4361 Handle<JSReceiver> object, Handle<Name> name) { 4375 Handle<JSReceiver> object, Handle<Name> name) {
4362 // Check whether the name is an array index. 4376 // Check whether the name is an array index.
4363 uint32_t index = 0; 4377 uint32_t index = 0;
(...skipping 812 matching lines...) Expand 10 before | Expand all | Expand 10 after
5176 NormalizeProperties(object, CLEAR_INOBJECT_PROPERTIES, 0); 5190 NormalizeProperties(object, CLEAR_INOBJECT_PROPERTIES, 0);
5177 5191
5178 return DeleteNormalizedProperty(object, name, mode); 5192 return DeleteNormalizedProperty(object, name, mode);
5179 } 5193 }
5180 5194
5181 5195
5182 MaybeHandle<Object> JSObject::DeletePropertyWithInterceptor( 5196 MaybeHandle<Object> JSObject::DeletePropertyWithInterceptor(
5183 Handle<JSObject> object, Handle<Name> name) { 5197 Handle<JSObject> object, Handle<Name> name) {
5184 Isolate* isolate = object->GetIsolate(); 5198 Isolate* isolate = object->GetIsolate();
5185 5199
5186 // TODO(rossberg): Support symbols in the API.
5187 if (name->IsSymbol()) return isolate->factory()->false_value();
5188
5189 Handle<InterceptorInfo> interceptor(object->GetNamedInterceptor()); 5200 Handle<InterceptorInfo> interceptor(object->GetNamedInterceptor());
5190 if (!interceptor->deleter()->IsUndefined()) { 5201 if (!interceptor->deleter()->IsUndefined()
5191 v8::NamedPropertyDeleterCallback deleter = 5202 && (name->IsString() || interceptor->can_intercept_symbols())) {
5192 v8::ToCData<v8::NamedPropertyDeleterCallback>(interceptor->deleter()); 5203 v8::GenericNamedPropertyDeleterCallback deleter =
5204 v8::ToCData<v8::GenericNamedPropertyDeleterCallback>(
5205 interceptor->deleter());
5193 LOG(isolate, 5206 LOG(isolate,
5194 ApiNamedPropertyAccess("interceptor-named-delete", *object, *name)); 5207 ApiNamedPropertyAccess("interceptor-named-delete", *object, *name));
5195 PropertyCallbackArguments args( 5208 PropertyCallbackArguments args(
5196 isolate, interceptor->data(), *object, *object); 5209 isolate, interceptor->data(), *object, *object);
5197 v8::Handle<v8::Boolean> result = 5210 v8::Handle<v8::Boolean> result =
5198 args.Call(deleter, v8::Utils::ToLocal(Handle<String>::cast(name))); 5211 args.Call(deleter, v8::Utils::ToLocal(name));
5199 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); 5212 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object);
5200 if (!result.IsEmpty()) { 5213 if (!result.IsEmpty()) {
5201 ASSERT(result->IsBoolean()); 5214 ASSERT(result->IsBoolean());
5202 Handle<Object> result_internal = v8::Utils::OpenHandle(*result); 5215 Handle<Object> result_internal = v8::Utils::OpenHandle(*result);
5203 result_internal->VerifyApiCallResultType(); 5216 result_internal->VerifyApiCallResultType();
5204 // Rebox CustomArguments::kReturnValueOffset before returning. 5217 // Rebox CustomArguments::kReturnValueOffset before returning.
5205 return handle(*result_internal, isolate); 5218 return handle(*result_internal, isolate);
5206 } 5219 }
5207 } 5220 }
5208 Handle<Object> result = 5221 Handle<Object> result =
(...skipping 8349 matching lines...) Expand 10 before | Expand all | Expand 10 after
13558 return InterceptorInfo::cast(result); 13571 return InterceptorInfo::cast(result);
13559 } 13572 }
13560 13573
13561 13574
13562 MaybeHandle<Object> JSObject::GetPropertyWithInterceptor( 13575 MaybeHandle<Object> JSObject::GetPropertyWithInterceptor(
13563 Handle<JSObject> holder, 13576 Handle<JSObject> holder,
13564 Handle<Object> receiver, 13577 Handle<Object> receiver,
13565 Handle<Name> name) { 13578 Handle<Name> name) {
13566 Isolate* isolate = holder->GetIsolate(); 13579 Isolate* isolate = holder->GetIsolate();
13567 13580
13568 // TODO(rossberg): Support symbols in the API.
13569 if (name->IsSymbol()) return isolate->factory()->undefined_value();
13570
13571 Handle<InterceptorInfo> interceptor(holder->GetNamedInterceptor(), isolate); 13581 Handle<InterceptorInfo> interceptor(holder->GetNamedInterceptor(), isolate);
13572 Handle<String> name_string = Handle<String>::cast(name);
13573
13574 if (interceptor->getter()->IsUndefined()) return MaybeHandle<Object>(); 13582 if (interceptor->getter()->IsUndefined()) return MaybeHandle<Object>();
13575 13583
13576 v8::NamedPropertyGetterCallback getter = 13584 if (name->IsSymbol() && !interceptor->can_intercept_symbols()) {
13577 v8::ToCData<v8::NamedPropertyGetterCallback>(interceptor->getter()); 13585 return MaybeHandle<Object>();
13586 }
13587
13588 v8::GenericNamedPropertyGetterCallback getter =
13589 v8::ToCData<v8::GenericNamedPropertyGetterCallback>(
13590 interceptor->getter());
13578 LOG(isolate, 13591 LOG(isolate,
13579 ApiNamedPropertyAccess("interceptor-named-get", *holder, *name)); 13592 ApiNamedPropertyAccess("interceptor-named-get", *holder, *name));
13580 PropertyCallbackArguments 13593 PropertyCallbackArguments
13581 args(isolate, interceptor->data(), *receiver, *holder); 13594 args(isolate, interceptor->data(), *receiver, *holder);
13582 v8::Handle<v8::Value> result = 13595 v8::Handle<v8::Value> result =
13583 args.Call(getter, v8::Utils::ToLocal(name_string)); 13596 args.Call(getter, v8::Utils::ToLocal(name));
13584 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); 13597 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object);
13585 if (result.IsEmpty()) return MaybeHandle<Object>(); 13598 if (result.IsEmpty()) return MaybeHandle<Object>();
13586 13599
13587 Handle<Object> result_internal = v8::Utils::OpenHandle(*result); 13600 Handle<Object> result_internal = v8::Utils::OpenHandle(*result);
13588 result_internal->VerifyApiCallResultType(); 13601 result_internal->VerifyApiCallResultType();
13589 // Rebox handle before return 13602 // Rebox handle before return
13590 return handle(*result_internal, isolate); 13603 return handle(*result_internal, isolate);
13591 } 13604 }
13592 13605
13593 13606
13594 // Compute the property keys from the interceptor. 13607 // Compute the property keys from the interceptor.
13595 // TODO(rossberg): support symbols in API, and filter here if needed.
13596 MaybeHandle<JSObject> JSObject::GetKeysForNamedInterceptor( 13608 MaybeHandle<JSObject> JSObject::GetKeysForNamedInterceptor(
13597 Handle<JSObject> object, Handle<JSReceiver> receiver) { 13609 Handle<JSObject> object, Handle<JSReceiver> receiver) {
13598 Isolate* isolate = receiver->GetIsolate(); 13610 Isolate* isolate = receiver->GetIsolate();
13599 Handle<InterceptorInfo> interceptor(object->GetNamedInterceptor()); 13611 Handle<InterceptorInfo> interceptor(object->GetNamedInterceptor());
13600 PropertyCallbackArguments 13612 PropertyCallbackArguments
13601 args(isolate, interceptor->data(), *receiver, *object); 13613 args(isolate, interceptor->data(), *receiver, *object);
13602 v8::Handle<v8::Object> result; 13614 v8::Handle<v8::Object> result;
13603 if (!interceptor->enumerator()->IsUndefined()) { 13615 if (!interceptor->enumerator()->IsUndefined()) {
13604 v8::NamedPropertyEnumeratorCallback enum_fun = 13616 v8::GenericNamedPropertyEnumeratorCallback enum_fun =
13605 v8::ToCData<v8::NamedPropertyEnumeratorCallback>( 13617 v8::ToCData<v8::GenericNamedPropertyEnumeratorCallback>(
13606 interceptor->enumerator()); 13618 interceptor->enumerator());
13607 LOG(isolate, ApiObjectAccess("interceptor-named-enum", *object)); 13619 LOG(isolate, ApiObjectAccess("interceptor-named-enum", *object));
13608 result = args.Call(enum_fun); 13620 result = args.Call(enum_fun);
13609 } 13621 }
13610 if (result.IsEmpty()) return MaybeHandle<JSObject>(); 13622 if (result.IsEmpty()) return MaybeHandle<JSObject>();
13611 #if ENABLE_EXTRA_CHECKS 13623 #if ENABLE_EXTRA_CHECKS
13612 CHECK(v8::Utils::OpenHandle(*result)->IsJSArray() || 13624 CHECK(v8::Utils::OpenHandle(*result)->IsJSArray() ||
13613 v8::Utils::OpenHandle(*result)->HasSloppyArgumentsElements()); 13625 v8::Utils::OpenHandle(*result)->HasSloppyArgumentsElements());
13614 #endif 13626 #endif
13615 // Rebox before returning. 13627 // Rebox before returning.
(...skipping 3338 matching lines...) Expand 10 before | Expand all | Expand 10 after
16954 #define ERROR_MESSAGES_TEXTS(C, T) T, 16966 #define ERROR_MESSAGES_TEXTS(C, T) T,
16955 static const char* error_messages_[] = { 16967 static const char* error_messages_[] = {
16956 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) 16968 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS)
16957 }; 16969 };
16958 #undef ERROR_MESSAGES_TEXTS 16970 #undef ERROR_MESSAGES_TEXTS
16959 return error_messages_[reason]; 16971 return error_messages_[reason];
16960 } 16972 }
16961 16973
16962 16974
16963 } } // namespace v8::internal 16975 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/objects.h ('k') | src/objects-debug.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698