| 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 "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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |