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 391 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
402 | 402 |
403 | 403 |
404 MaybeHandle<Object> Object::GetPropertyWithAccessor(Handle<Object> receiver, | 404 MaybeHandle<Object> Object::GetPropertyWithAccessor(Handle<Object> receiver, |
405 Handle<Name> name, | 405 Handle<Name> name, |
406 Handle<JSObject> holder, | 406 Handle<JSObject> holder, |
407 Handle<Object> structure) { | 407 Handle<Object> structure) { |
408 Isolate* isolate = name->GetIsolate(); | 408 Isolate* isolate = name->GetIsolate(); |
409 ASSERT(!structure->IsForeign()); | 409 ASSERT(!structure->IsForeign()); |
410 // api style callbacks. | 410 // api style callbacks. |
411 if (structure->IsAccessorInfo()) { | 411 if (structure->IsAccessorInfo()) { |
412 Handle<AccessorInfo> accessor_info = Handle<AccessorInfo>::cast(structure); | 412 Handle<AccessorInfo> info = Handle<AccessorInfo>::cast(structure); |
413 if (!accessor_info->IsCompatibleReceiver(*receiver)) { | 413 if (info->HasExpectedReceiverType() && |
| 414 !(receiver->IsHeapObject() && |
| 415 info->IsCompatibleReceiver(HeapObject::cast(*receiver)->map()))) { |
414 Handle<Object> args[2] = { name, receiver }; | 416 Handle<Object> args[2] = { name, receiver }; |
415 Handle<Object> error = | 417 Handle<Object> error = |
416 isolate->factory()->NewTypeError("incompatible_method_receiver", | 418 isolate->factory()->NewTypeError("incompatible_method_receiver", |
417 HandleVector(args, | 419 HandleVector(args, |
418 ARRAY_SIZE(args))); | 420 ARRAY_SIZE(args))); |
419 return isolate->Throw<Object>(error); | 421 return isolate->Throw<Object>(error); |
420 } | 422 } |
421 // TODO(rossberg): Handling symbols in the API requires changing the API, | 423 // TODO(rossberg): Handling symbols in the API requires changing the API, |
422 // so we do not support it for now. | 424 // so we do not support it for now. |
423 if (name->IsSymbol()) return isolate->factory()->undefined_value(); | 425 if (name->IsSymbol()) return isolate->factory()->undefined_value(); |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
467 Handle<JSObject> holder, Handle<Object> structure, StrictMode strict_mode) { | 469 Handle<JSObject> holder, Handle<Object> structure, StrictMode strict_mode) { |
468 Isolate* isolate = name->GetIsolate(); | 470 Isolate* isolate = name->GetIsolate(); |
469 | 471 |
470 // We should never get here to initialize a const with the hole | 472 // We should never get here to initialize a const with the hole |
471 // value since a const declaration would conflict with the setter. | 473 // value since a const declaration would conflict with the setter. |
472 ASSERT(!structure->IsForeign()); | 474 ASSERT(!structure->IsForeign()); |
473 if (structure->IsExecutableAccessorInfo()) { | 475 if (structure->IsExecutableAccessorInfo()) { |
474 // Don't call executable accessor setters with non-JSObject receivers. | 476 // Don't call executable accessor setters with non-JSObject receivers. |
475 if (!receiver->IsJSObject()) return value; | 477 if (!receiver->IsJSObject()) return value; |
476 // api style callbacks | 478 // api style callbacks |
477 ExecutableAccessorInfo* data = ExecutableAccessorInfo::cast(*structure); | 479 ExecutableAccessorInfo* info = ExecutableAccessorInfo::cast(*structure); |
478 if (!data->IsCompatibleReceiver(*receiver)) { | 480 if (info->HasExpectedReceiverType() && |
| 481 !(receiver->IsHeapObject() && |
| 482 info->IsCompatibleReceiver(HeapObject::cast(*receiver)->map()))) { |
479 Handle<Object> args[2] = { name, receiver }; | 483 Handle<Object> args[2] = { name, receiver }; |
480 Handle<Object> error = | 484 Handle<Object> error = |
481 isolate->factory()->NewTypeError("incompatible_method_receiver", | 485 isolate->factory()->NewTypeError("incompatible_method_receiver", |
482 HandleVector(args, | 486 HandleVector(args, |
483 ARRAY_SIZE(args))); | 487 ARRAY_SIZE(args))); |
484 return isolate->Throw<Object>(error); | 488 return isolate->Throw<Object>(error); |
485 } | 489 } |
486 // TODO(rossberg): Support symbols in the API. | 490 // TODO(rossberg): Support symbols in the API. |
487 if (name->IsSymbol()) return value; | 491 if (name->IsSymbol()) return value; |
488 Object* call_obj = data->setter(); | 492 Object* call_obj = info->setter(); |
489 v8::AccessorSetterCallback call_fun = | 493 v8::AccessorSetterCallback call_fun = |
490 v8::ToCData<v8::AccessorSetterCallback>(call_obj); | 494 v8::ToCData<v8::AccessorSetterCallback>(call_obj); |
491 if (call_fun == NULL) return value; | 495 if (call_fun == NULL) return value; |
492 Handle<String> key = Handle<String>::cast(name); | 496 Handle<String> key = Handle<String>::cast(name); |
493 LOG(isolate, ApiNamedPropertyAccess("store", *holder, *name)); | 497 LOG(isolate, ApiNamedPropertyAccess("store", *holder, *name)); |
494 PropertyCallbackArguments args(isolate, data->data(), *receiver, *holder); | 498 PropertyCallbackArguments args(isolate, info->data(), *receiver, *holder); |
495 args.Call(call_fun, | 499 args.Call(call_fun, |
496 v8::Utils::ToLocal(key), | 500 v8::Utils::ToLocal(key), |
497 v8::Utils::ToLocal(value)); | 501 v8::Utils::ToLocal(value)); |
498 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); | 502 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); |
499 return value; | 503 return value; |
500 } | 504 } |
501 | 505 |
502 if (structure->IsAccessorPair()) { | 506 if (structure->IsAccessorPair()) { |
503 Handle<Object> setter(AccessorPair::cast(*structure)->setter(), isolate); | 507 Handle<Object> setter(AccessorPair::cast(*structure)->setter(), isolate); |
504 if (setter->IsSpecFunction()) { | 508 if (setter->IsSpecFunction()) { |
(...skipping 16458 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
16963 #define ERROR_MESSAGES_TEXTS(C, T) T, | 16967 #define ERROR_MESSAGES_TEXTS(C, T) T, |
16964 static const char* error_messages_[] = { | 16968 static const char* error_messages_[] = { |
16965 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) | 16969 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) |
16966 }; | 16970 }; |
16967 #undef ERROR_MESSAGES_TEXTS | 16971 #undef ERROR_MESSAGES_TEXTS |
16968 return error_messages_[reason]; | 16972 return error_messages_[reason]; |
16969 } | 16973 } |
16970 | 16974 |
16971 | 16975 |
16972 } } // namespace v8::internal | 16976 } } // namespace v8::internal |
OLD | NEW |