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

Side by Side Diff: src/api.cc

Issue 972623003: convert more object functions to return maybes (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 9 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
« no previous file with comments | « include/v8.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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/api.h" 5 #include "src/api.h"
6 6
7 #include <string.h> // For memcpy, strlen. 7 #include <string.h> // For memcpy, strlen.
8 #ifdef V8_USE_ADDRESS_SANITIZER 8 #ifdef V8_USE_ADDRESS_SANITIZER
9 #include <sanitizer/asan_interface.h> 9 #include <sanitizer/asan_interface.h>
10 #endif // V8_USE_ADDRESS_SANITIZER 10 #endif // V8_USE_ADDRESS_SANITIZER
(...skipping 3461 matching lines...) Expand 10 before | Expand all | Expand 10 after
3472 } 3472 }
3473 3473
3474 3474
3475 Local<Value> v8::Object::GetOwnPropertyDescriptor(Local<String> key) { 3475 Local<Value> v8::Object::GetOwnPropertyDescriptor(Local<String> key) {
3476 auto context = ContextFromHeapObject(Utils::OpenHandle(this)); 3476 auto context = ContextFromHeapObject(Utils::OpenHandle(this));
3477 RETURN_TO_LOCAL_UNCHECKED(GetOwnPropertyDescriptor(context, key), Value); 3477 RETURN_TO_LOCAL_UNCHECKED(GetOwnPropertyDescriptor(context, key), Value);
3478 } 3478 }
3479 3479
3480 3480
3481 Local<Value> v8::Object::GetPrototype() { 3481 Local<Value> v8::Object::GetPrototype() {
3482 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 3482 auto isolate = Utils::OpenHandle(this)->GetIsolate();
3483 ON_BAILOUT(isolate, "v8::Object::GetPrototype()", return Local<v8::Value>()); 3483 auto self = Utils::OpenHandle(this);
3484 ENTER_V8(isolate);
3485 i::Handle<i::Object> self = Utils::OpenHandle(this);
3486 i::PrototypeIterator iter(isolate, self); 3484 i::PrototypeIterator iter(isolate, self);
3487 return Utils::ToLocal(i::PrototypeIterator::GetCurrent(iter)); 3485 return Utils::ToLocal(i::PrototypeIterator::GetCurrent(iter));
3488 } 3486 }
3489 3487
3490 3488
3491 bool v8::Object::SetPrototype(Handle<Value> value) { 3489 Maybe<bool> v8::Object::SetPrototype(Local<Context> context,
3492 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 3490 Local<Value> value) {
3493 ON_BAILOUT(isolate, "v8::Object::SetPrototype()", return false); 3491 PREPARE_FOR_EXECUTION_PRIMITIVE(context, "v8::Object::SetPrototype()", bool);
3494 ENTER_V8(isolate); 3492 auto self = Utils::OpenHandle(this);
3495 i::Handle<i::JSObject> self = Utils::OpenHandle(this); 3493 auto value_obj = Utils::OpenHandle(*value);
3496 i::Handle<i::Object> value_obj = Utils::OpenHandle(*value);
3497 // We do not allow exceptions thrown while setting the prototype 3494 // We do not allow exceptions thrown while setting the prototype
3498 // to propagate outside. 3495 // to propagate outside.
3499 TryCatch try_catch; 3496 TryCatch try_catch(reinterpret_cast<v8::Isolate*>(isolate));
3500 EXCEPTION_PREAMBLE(isolate); 3497 auto result = i::JSObject::SetPrototype(self, value_obj, false);
3501 i::MaybeHandle<i::Object> result =
3502 i::JSObject::SetPrototype(self, value_obj, false);
3503 has_pending_exception = result.is_null(); 3498 has_pending_exception = result.is_null();
3504 EXCEPTION_BAILOUT_CHECK(isolate, false); 3499 RETURN_ON_FAILED_EXECUTION_PRIMITIVE(bool);
3505 return true; 3500 return Just(true);
3501 }
3502
3503
3504 bool v8::Object::SetPrototype(Handle<Value> value) {
3505 auto context = ContextFromHeapObject(Utils::OpenHandle(this));
3506 return SetPrototype(context, value).FromMaybe(false);
3506 } 3507 }
3507 3508
3508 3509
3509 Local<Object> v8::Object::FindInstanceInPrototypeChain( 3510 Local<Object> v8::Object::FindInstanceInPrototypeChain(
3510 v8::Handle<FunctionTemplate> tmpl) { 3511 v8::Handle<FunctionTemplate> tmpl) {
3511 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 3512 auto isolate = Utils::OpenHandle(this)->GetIsolate();
3512 ON_BAILOUT(isolate,
3513 "v8::Object::FindInstanceInPrototypeChain()",
3514 return Local<v8::Object>());
3515 ENTER_V8(isolate);
3516 i::PrototypeIterator iter(isolate, *Utils::OpenHandle(this), 3513 i::PrototypeIterator iter(isolate, *Utils::OpenHandle(this),
3517 i::PrototypeIterator::START_AT_RECEIVER); 3514 i::PrototypeIterator::START_AT_RECEIVER);
3518 i::FunctionTemplateInfo* tmpl_info = *Utils::OpenHandle(*tmpl); 3515 auto tmpl_info = *Utils::OpenHandle(*tmpl);
3519 while (!tmpl_info->IsTemplateFor(iter.GetCurrent())) { 3516 while (!tmpl_info->IsTemplateFor(iter.GetCurrent())) {
3520 iter.Advance(); 3517 iter.Advance();
3521 if (iter.IsAtEnd()) { 3518 if (iter.IsAtEnd()) {
3522 return Local<Object>(); 3519 return Local<Object>();
3523 } 3520 }
3524 } 3521 }
3525 return Utils::ToLocal( 3522 return Utils::ToLocal(
3526 i::handle(i::JSObject::cast(iter.GetCurrent()), isolate)); 3523 i::handle(i::JSObject::cast(iter.GetCurrent()), isolate));
3527 } 3524 }
3528 3525
3529 3526
3527 MaybeLocal<Array> v8::Object::GetPropertyNames(Local<Context> context) {
3528 PREPARE_FOR_EXECUTION(context, "v8::Object::GetPropertyNames()", Array);
3529 auto self = Utils::OpenHandle(this);
3530 i::Handle<i::FixedArray> value;
3531 has_pending_exception = !i::JSReceiver::GetKeys(
3532 self, i::JSReceiver::INCLUDE_PROTOS).ToHandle(&value);
3533 RETURN_ON_FAILED_EXECUTION(Array);
3534 // Because we use caching to speed up enumeration it is important
3535 // to never change the result of the basic enumeration function so
3536 // we clone the result.
3537 auto elms = isolate->factory()->CopyFixedArray(value);
3538 auto result = isolate->factory()->NewJSArrayWithElements(elms);
3539 RETURN_ESCAPED(Utils::ToLocal(result));
3540 }
3541
3542
3530 Local<Array> v8::Object::GetPropertyNames() { 3543 Local<Array> v8::Object::GetPropertyNames() {
3531 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 3544 auto context = ContextFromHeapObject(Utils::OpenHandle(this));
3532 ON_BAILOUT(isolate, "v8::Object::GetPropertyNames()", 3545 RETURN_TO_LOCAL_UNCHECKED(GetPropertyNames(context), Array);
3533 return Local<v8::Array>()); 3546 }
3534 ENTER_V8(isolate); 3547
3535 i::HandleScope scope(isolate); 3548
3536 i::Handle<i::JSObject> self = Utils::OpenHandle(this); 3549 MaybeLocal<Array> v8::Object::GetOwnPropertyNames(Local<Context> context) {
3537 EXCEPTION_PREAMBLE(isolate); 3550 PREPARE_FOR_EXECUTION(context, "v8::Object::GetOwnPropertyNames()", Array);
3551 auto self = Utils::OpenHandle(this);
3538 i::Handle<i::FixedArray> value; 3552 i::Handle<i::FixedArray> value;
3539 has_pending_exception = !i::JSReceiver::GetKeys( 3553 has_pending_exception = !i::JSReceiver::GetKeys(
3540 self, i::JSReceiver::INCLUDE_PROTOS).ToHandle(&value); 3554 self, i::JSReceiver::OWN_ONLY).ToHandle(&value);
3541 EXCEPTION_BAILOUT_CHECK(isolate, Local<v8::Array>()); 3555 RETURN_ON_FAILED_EXECUTION(Array);
3542 // Because we use caching to speed up enumeration it is important 3556 // Because we use caching to speed up enumeration it is important
3543 // to never change the result of the basic enumeration function so 3557 // to never change the result of the basic enumeration function so
3544 // we clone the result. 3558 // we clone the result.
3545 i::Handle<i::FixedArray> elms = isolate->factory()->CopyFixedArray(value); 3559 auto elms = isolate->factory()->CopyFixedArray(value);
3546 i::Handle<i::JSArray> result = 3560 auto result = isolate->factory()->NewJSArrayWithElements(elms);
3547 isolate->factory()->NewJSArrayWithElements(elms); 3561 RETURN_ESCAPED(Utils::ToLocal(result));
3548 return Utils::ToLocal(scope.CloseAndEscape(result));
3549 } 3562 }
3550 3563
3551 3564
3552 Local<Array> v8::Object::GetOwnPropertyNames() { 3565 Local<Array> v8::Object::GetOwnPropertyNames() {
3553 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 3566 auto context = ContextFromHeapObject(Utils::OpenHandle(this));
3554 ON_BAILOUT(isolate, "v8::Object::GetOwnPropertyNames()", 3567 RETURN_TO_LOCAL_UNCHECKED(GetOwnPropertyNames(context), Array);
3555 return Local<v8::Array>());
3556 ENTER_V8(isolate);
3557 i::HandleScope scope(isolate);
3558 i::Handle<i::JSObject> self = Utils::OpenHandle(this);
3559 EXCEPTION_PREAMBLE(isolate);
3560 i::Handle<i::FixedArray> value;
3561 has_pending_exception = !i::JSReceiver::GetKeys(
3562 self, i::JSReceiver::OWN_ONLY).ToHandle(&value);
3563 EXCEPTION_BAILOUT_CHECK(isolate, Local<v8::Array>());
3564 // Because we use caching to speed up enumeration it is important
3565 // to never change the result of the basic enumeration function so
3566 // we clone the result.
3567 i::Handle<i::FixedArray> elms = isolate->factory()->CopyFixedArray(value);
3568 i::Handle<i::JSArray> result =
3569 isolate->factory()->NewJSArrayWithElements(elms);
3570 return Utils::ToLocal(scope.CloseAndEscape(result));
3571 } 3568 }
3572 3569
3573 3570
3574 Local<String> v8::Object::ObjectProtoToString() { 3571 Local<String> v8::Object::ObjectProtoToString() {
3575 i::Isolate* i_isolate = Utils::OpenHandle(this)->GetIsolate(); 3572 i::Isolate* i_isolate = Utils::OpenHandle(this)->GetIsolate();
3576 Isolate* isolate = reinterpret_cast<Isolate*>(i_isolate); 3573 Isolate* isolate = reinterpret_cast<Isolate*>(i_isolate);
3577 ON_BAILOUT(i_isolate, "v8::Object::ObjectProtoToString()", 3574 ON_BAILOUT(i_isolate, "v8::Object::ObjectProtoToString()",
3578 return Local<v8::String>()); 3575 return Local<v8::String>());
3579 ENTER_V8(i_isolate); 3576 ENTER_V8(i_isolate);
3580 i::Handle<i::JSObject> self = Utils::OpenHandle(this); 3577 i::Handle<i::JSObject> self = Utils::OpenHandle(this);
(...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after
3812 i::Handle<i::Object> setter_i = v8::Utils::OpenHandle(*setter, true); 3809 i::Handle<i::Object> setter_i = v8::Utils::OpenHandle(*setter, true);
3813 if (setter_i.is_null()) setter_i = isolate->factory()->null_value(); 3810 if (setter_i.is_null()) setter_i = isolate->factory()->null_value();
3814 i::JSObject::DefineAccessor(v8::Utils::OpenHandle(this), 3811 i::JSObject::DefineAccessor(v8::Utils::OpenHandle(this),
3815 v8::Utils::OpenHandle(*name), 3812 v8::Utils::OpenHandle(*name),
3816 getter_i, 3813 getter_i,
3817 setter_i, 3814 setter_i,
3818 static_cast<PropertyAttributes>(attribute)); 3815 static_cast<PropertyAttributes>(attribute));
3819 } 3816 }
3820 3817
3821 3818
3819 Maybe<bool> v8::Object::HasOwnProperty(Local<Context> context,
3820 Local<Name> key) {
3821 PREPARE_FOR_EXECUTION_PRIMITIVE(context, "v8::Object::HasOwnProperty()",
3822 bool);
3823 auto self = Utils::OpenHandle(this);
3824 auto key_val = Utils::OpenHandle(*key);
3825 auto result = i::JSReceiver::HasOwnProperty(self, key_val);
3826 has_pending_exception = result.IsNothing();
3827 RETURN_ON_FAILED_EXECUTION_PRIMITIVE(bool);
3828 return result;
3829 }
3830
3831
3822 bool v8::Object::HasOwnProperty(Handle<String> key) { 3832 bool v8::Object::HasOwnProperty(Handle<String> key) {
3823 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 3833 auto context = ContextFromHeapObject(Utils::OpenHandle(this));
3824 ON_BAILOUT(isolate, "v8::Object::HasOwnProperty()", 3834 return HasOwnProperty(context, key).FromMaybe(false);
3825 return false); 3835 }
3826 EXCEPTION_PREAMBLE(isolate); 3836
3827 Maybe<bool> maybe = i::JSReceiver::HasOwnProperty(Utils::OpenHandle(this), 3837
3828 Utils::OpenHandle(*key)); 3838 Maybe<bool> v8::Object::HasRealNamedProperty(Local<Context> context,
3829 has_pending_exception = !maybe.IsJust(); 3839 Local<Name> key) {
3830 EXCEPTION_BAILOUT_CHECK(isolate, false); 3840 PREPARE_FOR_EXECUTION_PRIMITIVE(context, "v8::Object::HasRealNamedProperty()",
3831 return maybe.FromJust(); 3841 bool);
3842 auto self = Utils::OpenHandle(this);
3843 auto key_val = Utils::OpenHandle(*key);
3844 auto result = i::JSObject::HasRealNamedProperty(self, key_val);
3845 has_pending_exception = result.IsNothing();
3846 RETURN_ON_FAILED_EXECUTION_PRIMITIVE(bool);
3847 return result;
3832 } 3848 }
3833 3849
3834 3850
3835 bool v8::Object::HasRealNamedProperty(Handle<String> key) { 3851 bool v8::Object::HasRealNamedProperty(Handle<String> key) {
3836 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 3852 auto context = ContextFromHeapObject(Utils::OpenHandle(this));
3837 ON_BAILOUT(isolate, "v8::Object::HasRealNamedProperty()", 3853 return HasRealNamedProperty(context, key).FromMaybe(false);
3838 return false); 3854 }
3839 EXCEPTION_PREAMBLE(isolate); 3855
3840 Maybe<bool> maybe = i::JSObject::HasRealNamedProperty( 3856
3841 Utils::OpenHandle(this), Utils::OpenHandle(*key)); 3857 Maybe<bool> v8::Object::HasRealIndexedProperty(Local<Context> context,
3842 has_pending_exception = !maybe.IsJust(); 3858 uint32_t index) {
3843 EXCEPTION_BAILOUT_CHECK(isolate, false); 3859 PREPARE_FOR_EXECUTION_PRIMITIVE(context,
3844 return maybe.FromJust(); 3860 "v8::Object::HasRealIndexedProperty()", bool);
3861 auto self = Utils::OpenHandle(this);
3862 auto result = i::JSObject::HasRealElementProperty(self, index);
3863 has_pending_exception = result.IsNothing();
3864 RETURN_ON_FAILED_EXECUTION_PRIMITIVE(bool);
3865 return result;
3845 } 3866 }
3846 3867
3847 3868
3848 bool v8::Object::HasRealIndexedProperty(uint32_t index) { 3869 bool v8::Object::HasRealIndexedProperty(uint32_t index) {
3849 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 3870 auto context = ContextFromHeapObject(Utils::OpenHandle(this));
3850 ON_BAILOUT(isolate, "v8::Object::HasRealIndexedProperty()", 3871 return HasRealIndexedProperty(context, index).FromMaybe(false);
3851 return false); 3872 }
3852 EXCEPTION_PREAMBLE(isolate); 3873
3853 Maybe<bool> maybe = 3874
3854 i::JSObject::HasRealElementProperty(Utils::OpenHandle(this), index); 3875 Maybe<bool> v8::Object::HasRealNamedCallbackProperty(Local<Context> context,
3855 has_pending_exception = !maybe.IsJust(); 3876 Local<Name> key) {
3856 EXCEPTION_BAILOUT_CHECK(isolate, false); 3877 PREPARE_FOR_EXECUTION_PRIMITIVE(
3857 return maybe.FromJust(); 3878 context, "v8::Object::HasRealNamedCallbackProperty()", bool);
3879 auto self = Utils::OpenHandle(this);
3880 auto key_val = Utils::OpenHandle(*key);
3881 auto result = i::JSObject::HasRealNamedCallbackProperty(self, key_val);
3882 has_pending_exception = result.IsNothing();
3883 RETURN_ON_FAILED_EXECUTION_PRIMITIVE(bool);
3884 return result;
3858 } 3885 }
3859 3886
3860 3887
3861 bool v8::Object::HasRealNamedCallbackProperty(Handle<String> key) { 3888 bool v8::Object::HasRealNamedCallbackProperty(Handle<String> key) {
3862 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 3889 auto context = ContextFromHeapObject(Utils::OpenHandle(this));
3863 ON_BAILOUT(isolate, 3890 return HasRealNamedCallbackProperty(context, key).FromMaybe(false);
3864 "v8::Object::HasRealNamedCallbackProperty()",
3865 return false);
3866 ENTER_V8(isolate);
3867 EXCEPTION_PREAMBLE(isolate);
3868 Maybe<bool> maybe = i::JSObject::HasRealNamedCallbackProperty(
3869 Utils::OpenHandle(this), Utils::OpenHandle(*key));
3870 has_pending_exception = !maybe.IsJust();
3871 EXCEPTION_BAILOUT_CHECK(isolate, false);
3872 return maybe.FromJust();
3873 } 3891 }
3874 3892
3875 3893
3876 bool v8::Object::HasNamedLookupInterceptor() { 3894 bool v8::Object::HasNamedLookupInterceptor() {
3877 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 3895 auto self = Utils::OpenHandle(this);
3878 ON_BAILOUT(isolate, "v8::Object::HasNamedLookupInterceptor()", 3896 return self->HasNamedInterceptor();
3879 return false);
3880 return Utils::OpenHandle(this)->HasNamedInterceptor();
3881 } 3897 }
3882 3898
3883 3899
3884 bool v8::Object::HasIndexedLookupInterceptor() { 3900 bool v8::Object::HasIndexedLookupInterceptor() {
3885 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 3901 auto self = Utils::OpenHandle(this);
3886 ON_BAILOUT(isolate, "v8::Object::HasIndexedLookupInterceptor()", 3902 return self->HasIndexedInterceptor();
3887 return false);
3888 return Utils::OpenHandle(this)->HasIndexedInterceptor();
3889 } 3903 }
3890 3904
3891 3905
3892 static Local<Value> GetPropertyByLookup(i::LookupIterator* it) { 3906 MaybeLocal<Value> v8::Object::GetRealNamedPropertyInPrototypeChain(
3893 // If the property being looked up is a callback, it can throw an exception. 3907 Local<Context> context, Local<Name> key) {
3894 EXCEPTION_PREAMBLE(it->isolate()); 3908 PREPARE_FOR_EXECUTION(
3895 i::Handle<i::Object> result; 3909 context, "v8::Object::GetRealNamedPropertyInPrototypeChain()", Value);
3896 has_pending_exception = !i::Object::GetProperty(it).ToHandle(&result); 3910 auto self = Utils::OpenHandle(this);
3897 EXCEPTION_BAILOUT_CHECK(it->isolate(), Local<Value>()); 3911 auto key_obj = Utils::OpenHandle(*key);
3898 3912 i::PrototypeIterator iter(isolate, self);
3899 if (it->IsFound()) return Utils::ToLocal(result); 3913 if (iter.IsAtEnd()) return MaybeLocal<Value>();
3900 return Local<Value>(); 3914 auto proto = i::PrototypeIterator::GetCurrent(iter);
3901 } 3915 i::LookupIterator it(self, key_obj, i::Handle<i::JSReceiver>::cast(proto),
3902 3916 i::LookupIterator::PROTOTYPE_CHAIN_SKIP_INTERCEPTOR);
3903 3917 if (!it.IsFound()) return MaybeLocal<Value>();
3904 static Maybe<PropertyAttribute> GetPropertyAttributesByLookup( 3918 Local<Value> result;
3905 i::LookupIterator* it) { 3919 has_pending_exception = !ToLocal<Value>(i::Object::GetProperty(&it), &result);
3906 Maybe<PropertyAttributes> attr = i::JSReceiver::GetPropertyAttributes(it); 3920 RETURN_ON_FAILED_EXECUTION(Value);
3907 return it->IsFound() ? Just<PropertyAttribute>( 3921 RETURN_ESCAPED(result);
3908 static_cast<PropertyAttribute>(attr.FromJust()))
3909 : Nothing<PropertyAttribute>();
3910 } 3922 }
3911 3923
3912 3924
3913 Local<Value> v8::Object::GetRealNamedPropertyInPrototypeChain( 3925 Local<Value> v8::Object::GetRealNamedPropertyInPrototypeChain(
3914 Handle<String> key) { 3926 Handle<String> key) {
3915 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 3927 auto context = ContextFromHeapObject(Utils::OpenHandle(this));
3916 ON_BAILOUT(isolate, 3928 RETURN_TO_LOCAL_UNCHECKED(GetRealNamedPropertyInPrototypeChain(context, key),
3917 "v8::Object::GetRealNamedPropertyInPrototypeChain()", 3929 Value);
3918 return Local<Value>()); 3930 }
3919 ENTER_V8(isolate); 3931
3920 i::Handle<i::JSObject> self_obj = Utils::OpenHandle(this); 3932
3921 i::Handle<i::String> key_obj = Utils::OpenHandle(*key); 3933 Maybe<PropertyAttribute>
3922 i::PrototypeIterator iter(isolate, self_obj); 3934 v8::Object::GetRealNamedPropertyAttributesInPrototypeChain(
3923 if (iter.IsAtEnd()) return Local<Value>(); 3935 Local<Context> context, Local<Name> key) {
3924 i::Handle<i::Object> proto = i::PrototypeIterator::GetCurrent(iter); 3936 PREPARE_FOR_EXECUTION_PRIMITIVE(
3925 i::LookupIterator it(self_obj, key_obj, i::Handle<i::JSReceiver>::cast(proto), 3937 context, "v8::Object::GetRealNamedPropertyAttributesInPrototypeChain()",
3938 PropertyAttribute);
3939 auto self = Utils::OpenHandle(this);
3940 auto key_obj = Utils::OpenHandle(*key);
3941 i::PrototypeIterator iter(isolate, self);
3942 if (iter.IsAtEnd()) return Nothing<PropertyAttribute>();
3943 auto proto = i::PrototypeIterator::GetCurrent(iter);
3944 i::LookupIterator it(self, key_obj, i::Handle<i::JSReceiver>::cast(proto),
3926 i::LookupIterator::PROTOTYPE_CHAIN_SKIP_INTERCEPTOR); 3945 i::LookupIterator::PROTOTYPE_CHAIN_SKIP_INTERCEPTOR);
3927 return GetPropertyByLookup(&it); 3946 if (!it.IsFound()) return Nothing<PropertyAttribute>();
3947 auto result = i::JSReceiver::GetPropertyAttributes(&it);
3948 RETURN_ON_FAILED_EXECUTION_PRIMITIVE(PropertyAttribute);
3949 if (result.FromJust() == ABSENT) {
3950 return Just(static_cast<PropertyAttribute>(NONE));
3951 }
3952 return Just<PropertyAttribute>(
3953 static_cast<PropertyAttribute>(result.FromJust()));
3928 } 3954 }
3929 3955
3930 3956
3931 Maybe<PropertyAttribute> 3957 Maybe<PropertyAttribute>
3932 v8::Object::GetRealNamedPropertyAttributesInPrototypeChain(Handle<String> key) { 3958 v8::Object::GetRealNamedPropertyAttributesInPrototypeChain(Handle<String> key) {
3933 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 3959 auto context = ContextFromHeapObject(Utils::OpenHandle(this));
3934 ON_BAILOUT(isolate, 3960 return GetRealNamedPropertyAttributesInPrototypeChain(context, key);
3935 "v8::Object::GetRealNamedPropertyAttributesInPrototypeChain()", 3961 }
3936 return Nothing<PropertyAttribute>()); 3962
3937 ENTER_V8(isolate); 3963
3938 i::Handle<i::JSObject> self_obj = Utils::OpenHandle(this); 3964 MaybeLocal<Value> v8::Object::GetRealNamedProperty(Local<Context> context,
3939 i::Handle<i::String> key_obj = Utils::OpenHandle(*key); 3965 Local<Name> key) {
3940 i::PrototypeIterator iter(isolate, self_obj); 3966 PREPARE_FOR_EXECUTION(
3941 if (iter.IsAtEnd()) return Nothing<PropertyAttribute>(); 3967 context, "v8::Object::GetRealNamedPropertyInPrototypeChain()", Value);
3942 i::Handle<i::Object> proto = i::PrototypeIterator::GetCurrent(iter); 3968 auto self = Utils::OpenHandle(this);
3943 i::LookupIterator it(self_obj, key_obj, i::Handle<i::JSReceiver>::cast(proto), 3969 auto key_obj = Utils::OpenHandle(*key);
3970 i::LookupIterator it(self, key_obj,
3944 i::LookupIterator::PROTOTYPE_CHAIN_SKIP_INTERCEPTOR); 3971 i::LookupIterator::PROTOTYPE_CHAIN_SKIP_INTERCEPTOR);
3945 return GetPropertyAttributesByLookup(&it); 3972 if (!it.IsFound()) return MaybeLocal<Value>();
3973 Local<Value> result;
3974 has_pending_exception = !ToLocal<Value>(i::Object::GetProperty(&it), &result);
3975 RETURN_ON_FAILED_EXECUTION(Value);
3976 RETURN_ESCAPED(result);
3946 } 3977 }
3947 3978
3948 3979
3949 Local<Value> v8::Object::GetRealNamedProperty(Handle<String> key) { 3980 Local<Value> v8::Object::GetRealNamedProperty(Handle<String> key) {
3950 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 3981 auto context = ContextFromHeapObject(Utils::OpenHandle(this));
3951 ON_BAILOUT(isolate, "v8::Object::GetRealNamedProperty()", 3982 RETURN_TO_LOCAL_UNCHECKED(GetRealNamedProperty(context, key), Value);
3952 return Local<Value>()); 3983 }
3953 ENTER_V8(isolate); 3984
3954 i::Handle<i::JSObject> self_obj = Utils::OpenHandle(this); 3985
3955 i::Handle<i::String> key_obj = Utils::OpenHandle(*key); 3986 Maybe<PropertyAttribute> v8::Object::GetRealNamedPropertyAttributes(
3956 i::LookupIterator it(self_obj, key_obj, 3987 Local<Context> context, Local<Name> key) {
3988 PREPARE_FOR_EXECUTION_PRIMITIVE(
3989 context, "v8::Object::GetRealNamedPropertyAttributes()",
3990 PropertyAttribute);
3991 auto self = Utils::OpenHandle(this);
3992 auto key_obj = Utils::OpenHandle(*key);
3993 i::LookupIterator it(self, key_obj,
3957 i::LookupIterator::PROTOTYPE_CHAIN_SKIP_INTERCEPTOR); 3994 i::LookupIterator::PROTOTYPE_CHAIN_SKIP_INTERCEPTOR);
3958 return GetPropertyByLookup(&it); 3995 if (!it.IsFound()) return Nothing<PropertyAttribute>();
3996 auto result = i::JSReceiver::GetPropertyAttributes(&it);
3997 RETURN_ON_FAILED_EXECUTION_PRIMITIVE(PropertyAttribute);
3998 if (result.FromJust() == ABSENT) {
3999 return Just(static_cast<PropertyAttribute>(NONE));
4000 }
4001 return Just<PropertyAttribute>(
4002 static_cast<PropertyAttribute>(result.FromJust()));
3959 } 4003 }
3960 4004
3961 4005
3962 Maybe<PropertyAttribute> v8::Object::GetRealNamedPropertyAttributes( 4006 Maybe<PropertyAttribute> v8::Object::GetRealNamedPropertyAttributes(
3963 Handle<String> key) { 4007 Handle<String> key) {
3964 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 4008 auto context = ContextFromHeapObject(Utils::OpenHandle(this));
3965 ON_BAILOUT(isolate, "v8::Object::GetRealNamedPropertyAttributes()", 4009 return GetRealNamedPropertyAttributes(context, key);
3966 return Nothing<PropertyAttribute>());
3967 ENTER_V8(isolate);
3968 i::Handle<i::JSObject> self_obj = Utils::OpenHandle(this);
3969 i::Handle<i::String> key_obj = Utils::OpenHandle(*key);
3970 i::LookupIterator it(self_obj, key_obj,
3971 i::LookupIterator::PROTOTYPE_CHAIN_SKIP_INTERCEPTOR);
3972 return GetPropertyAttributesByLookup(&it);
3973 } 4010 }
3974 4011
3975 4012
3976 // Turns on access checks by copying the map and setting the check flag. 4013 // Turns on access checks by copying the map and setting the check flag.
3977 // Because the object gets a new map, existing inline cache caching 4014 // Because the object gets a new map, existing inline cache caching
3978 // the old map of this object will fail. 4015 // the old map of this object will fail.
3979 void v8::Object::TurnOnAccessCheck() { 4016 void v8::Object::TurnOnAccessCheck() {
3980 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 4017 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
3981 ON_BAILOUT(isolate, "v8::Object::TurnOnAccessCheck()", return);
3982 ENTER_V8(isolate); 4018 ENTER_V8(isolate);
3983 i::HandleScope scope(isolate); 4019 i::HandleScope scope(isolate);
3984 i::Handle<i::JSObject> obj = Utils::OpenHandle(this); 4020 i::Handle<i::JSObject> obj = Utils::OpenHandle(this);
3985 4021
3986 // When turning on access checks for a global object deoptimize all functions 4022 // When turning on access checks for a global object deoptimize all functions
3987 // as optimized code does not always handle access checks. 4023 // as optimized code does not always handle access checks.
3988 i::Deoptimizer::DeoptimizeGlobalObject(*obj); 4024 i::Deoptimizer::DeoptimizeGlobalObject(*obj);
3989 4025
3990 i::Handle<i::Map> new_map = 4026 i::Handle<i::Map> new_map =
3991 i::Map::Copy(i::Handle<i::Map>(obj->map()), "APITurnOnAccessCheck"); 4027 i::Map::Copy(i::Handle<i::Map>(obj->map()), "APITurnOnAccessCheck");
3992 new_map->set_is_access_check_needed(true); 4028 new_map->set_is_access_check_needed(true);
3993 i::JSObject::MigrateToMap(obj, new_map); 4029 i::JSObject::MigrateToMap(obj, new_map);
3994 } 4030 }
3995 4031
3996 4032
3997 Local<v8::Object> v8::Object::Clone() { 4033 Local<v8::Object> v8::Object::Clone() {
3998 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 4034 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
3999 ON_BAILOUT(isolate, "v8::Object::Clone()", return Local<Object>()); 4035 ON_BAILOUT(isolate, "v8::Object::Clone()", return Local<Object>());
4000 ENTER_V8(isolate); 4036 ENTER_V8(isolate);
4001 i::Handle<i::JSObject> self = Utils::OpenHandle(this); 4037 i::Handle<i::JSObject> self = Utils::OpenHandle(this);
4002 EXCEPTION_PREAMBLE(isolate); 4038 EXCEPTION_PREAMBLE(isolate);
4003 i::Handle<i::JSObject> result = isolate->factory()->CopyJSObject(self); 4039 i::Handle<i::JSObject> result = isolate->factory()->CopyJSObject(self);
4004 has_pending_exception = result.is_null(); 4040 has_pending_exception = result.is_null();
4005 EXCEPTION_BAILOUT_CHECK(isolate, Local<Object>()); 4041 EXCEPTION_BAILOUT_CHECK(isolate, Local<Object>());
4006 return Utils::ToLocal(result); 4042 return Utils::ToLocal(result);
4007 } 4043 }
4008 4044
4009 4045
4010 Local<v8::Context> v8::Object::CreationContext() { 4046 Local<v8::Context> v8::Object::CreationContext() {
4011 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 4047 auto self = Utils::OpenHandle(this);
4012 ON_BAILOUT(isolate, 4048 auto context = handle(self->GetCreationContext());
4013 "v8::Object::CreationContext()", return Local<v8::Context>()); 4049 return Utils::ToLocal(context);
4014 ENTER_V8(isolate);
4015 i::Handle<i::JSObject> self = Utils::OpenHandle(this);
4016 i::Context* context = self->GetCreationContext();
4017 return Utils::ToLocal(i::Handle<i::Context>(context));
4018 } 4050 }
4019 4051
4020 4052
4021 int v8::Object::GetIdentityHash() { 4053 int v8::Object::GetIdentityHash() {
4022 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 4054 auto isolate = Utils::OpenHandle(this)->GetIsolate();
4023 ON_BAILOUT(isolate, "v8::Object::GetIdentityHash()", return 0);
4024 ENTER_V8(isolate);
4025 i::HandleScope scope(isolate); 4055 i::HandleScope scope(isolate);
4026 i::Handle<i::JSObject> self = Utils::OpenHandle(this); 4056 auto self = Utils::OpenHandle(this);
4027 return i::JSReceiver::GetOrCreateIdentityHash(self)->value(); 4057 return i::JSReceiver::GetOrCreateIdentityHash(self)->value();
4028 } 4058 }
4029 4059
4030 4060
4031 bool v8::Object::SetHiddenValue(v8::Handle<v8::String> key, 4061 bool v8::Object::SetHiddenValue(v8::Handle<v8::String> key,
4032 v8::Handle<v8::Value> value) { 4062 v8::Handle<v8::Value> value) {
4033 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 4063 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
4034 ON_BAILOUT(isolate, "v8::Object::SetHiddenValue()", return false);
4035 if (value.IsEmpty()) return DeleteHiddenValue(key); 4064 if (value.IsEmpty()) return DeleteHiddenValue(key);
4036 ENTER_V8(isolate); 4065 ENTER_V8(isolate);
4037 i::HandleScope scope(isolate); 4066 i::HandleScope scope(isolate);
4038 i::Handle<i::JSObject> self = Utils::OpenHandle(this); 4067 i::Handle<i::JSObject> self = Utils::OpenHandle(this);
4039 i::Handle<i::String> key_obj = Utils::OpenHandle(*key); 4068 i::Handle<i::String> key_obj = Utils::OpenHandle(*key);
4040 i::Handle<i::String> key_string = 4069 i::Handle<i::String> key_string =
4041 isolate->factory()->InternalizeString(key_obj); 4070 isolate->factory()->InternalizeString(key_obj);
4042 i::Handle<i::Object> value_obj = Utils::OpenHandle(*value); 4071 i::Handle<i::Object> value_obj = Utils::OpenHandle(*value);
4043 i::Handle<i::Object> result = 4072 i::Handle<i::Object> result =
4044 i::JSObject::SetHiddenProperty(self, key_string, value_obj); 4073 i::JSObject::SetHiddenProperty(self, key_string, value_obj);
4045 return *result == *self; 4074 return *result == *self;
4046 } 4075 }
4047 4076
4048 4077
4049 v8::Local<v8::Value> v8::Object::GetHiddenValue(v8::Handle<v8::String> key) { 4078 v8::Local<v8::Value> v8::Object::GetHiddenValue(v8::Handle<v8::String> key) {
4050 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 4079 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
4051 ON_BAILOUT(isolate, "v8::Object::GetHiddenValue()",
4052 return Local<v8::Value>());
4053 ENTER_V8(isolate); 4080 ENTER_V8(isolate);
4054 i::Handle<i::JSObject> self = Utils::OpenHandle(this); 4081 i::Handle<i::JSObject> self = Utils::OpenHandle(this);
4055 i::Handle<i::String> key_obj = Utils::OpenHandle(*key); 4082 i::Handle<i::String> key_obj = Utils::OpenHandle(*key);
4056 i::Handle<i::String> key_string = 4083 i::Handle<i::String> key_string =
4057 isolate->factory()->InternalizeString(key_obj); 4084 isolate->factory()->InternalizeString(key_obj);
4058 i::Handle<i::Object> result(self->GetHiddenProperty(key_string), isolate); 4085 i::Handle<i::Object> result(self->GetHiddenProperty(key_string), isolate);
4059 if (result->IsTheHole()) return v8::Local<v8::Value>(); 4086 if (result->IsTheHole()) return v8::Local<v8::Value>();
4060 return Utils::ToLocal(result); 4087 return Utils::ToLocal(result);
4061 } 4088 }
4062 4089
4063 4090
4064 bool v8::Object::DeleteHiddenValue(v8::Handle<v8::String> key) { 4091 bool v8::Object::DeleteHiddenValue(v8::Handle<v8::String> key) {
4065 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 4092 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
4066 ON_BAILOUT(isolate, "v8::DeleteHiddenValue()", return false);
4067 ENTER_V8(isolate); 4093 ENTER_V8(isolate);
4068 i::HandleScope scope(isolate); 4094 i::HandleScope scope(isolate);
4069 i::Handle<i::JSObject> self = Utils::OpenHandle(this); 4095 i::Handle<i::JSObject> self = Utils::OpenHandle(this);
4070 i::Handle<i::String> key_obj = Utils::OpenHandle(*key); 4096 i::Handle<i::String> key_obj = Utils::OpenHandle(*key);
4071 i::Handle<i::String> key_string = 4097 i::Handle<i::String> key_string =
4072 isolate->factory()->InternalizeString(key_obj); 4098 isolate->factory()->InternalizeString(key_obj);
4073 i::JSObject::DeleteHiddenProperty(self, key_string); 4099 i::JSObject::DeleteHiddenProperty(self, key_string);
4074 return true; 4100 return true;
4075 } 4101 }
4076 4102
(...skipping 3897 matching lines...) Expand 10 before | Expand all | Expand 10 after
7974 Isolate* isolate = reinterpret_cast<Isolate*>(info.GetIsolate()); 8000 Isolate* isolate = reinterpret_cast<Isolate*>(info.GetIsolate());
7975 Address callback_address = 8001 Address callback_address =
7976 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); 8002 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback));
7977 VMState<EXTERNAL> state(isolate); 8003 VMState<EXTERNAL> state(isolate);
7978 ExternalCallbackScope call_scope(isolate, callback_address); 8004 ExternalCallbackScope call_scope(isolate, callback_address);
7979 callback(info); 8005 callback(info);
7980 } 8006 }
7981 8007
7982 8008
7983 } } // namespace v8::internal 8009 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « include/v8.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698