Index: src/objects.cc |
diff --git a/src/objects.cc b/src/objects.cc |
index 99113f6fcfe08f43907cbb5d284931592af230c1..4d08b7999ed27c317b41109f381eafb8d25575c3 100644 |
--- a/src/objects.cc |
+++ b/src/objects.cc |
@@ -594,13 +594,15 @@ MaybeHandle<Object> JSObject::GetPropertyWithFailedAccessCheck( |
} |
-PropertyAttributes JSObject::GetPropertyAttributesWithFailedAccessCheck( |
+Maybe<PropertyAttributes> JSObject::GetPropertyAttributesWithFailedAccessCheck( |
LookupIterator* it) { |
Handle<JSObject> checked = it->GetHolder<JSObject>(); |
- if (FindAllCanReadHolder(it)) return it->property_details().attributes(); |
+ if (FindAllCanReadHolder(it)) |
+ return maybe(it->property_details().attributes()); |
it->isolate()->ReportFailedAccessCheck(checked, v8::ACCESS_HAS); |
- // TODO(yangguo): Issue 3269, check for scheduled exception missing? |
- return ABSENT; |
+ RETURN_VALUE_IF_SCHEDULED_EXCEPTION(it->isolate(), |
+ Maybe<PropertyAttributes>()); |
+ return maybe(ABSENT); |
} |
@@ -3019,8 +3021,8 @@ MaybeHandle<Object> Object::SetProperty(LookupIterator* it, |
Maybe<PropertyAttributes> maybe_attributes = |
JSObject::GetPropertyAttributesWithInterceptor( |
it->GetHolder<JSObject>(), it->GetReceiver(), it->name()); |
- RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(it->isolate(), Object); |
- done = maybe_attributes.has_value; |
+ if (!maybe_attributes.has_value) return MaybeHandle<Object>(); |
+ done = maybe_attributes.value != ABSENT; |
if (done && (maybe_attributes.value & READ_ONLY) != 0) { |
return WriteToReadOnlyProperty(it, value, strict_mode); |
} |
@@ -3594,24 +3596,21 @@ void JSObject::LookupRealNamedPropertyInPrototypes(Handle<Name> name, |
} |
-bool JSProxy::HasPropertyWithHandler(Handle<JSProxy> proxy, Handle<Name> name) { |
+Maybe<bool> JSProxy::HasPropertyWithHandler(Handle<JSProxy> proxy, |
+ Handle<Name> name) { |
Isolate* isolate = proxy->GetIsolate(); |
// TODO(rossberg): adjust once there is a story for symbols vs proxies. |
- if (name->IsSymbol()) return false; |
+ if (name->IsSymbol()) return maybe(false); |
Handle<Object> args[] = { name }; |
Handle<Object> result; |
ASSIGN_RETURN_ON_EXCEPTION_VALUE( |
- isolate, result, |
- CallTrap(proxy, |
- "has", |
- isolate->derived_has_trap(), |
- ARRAY_SIZE(args), |
- args), |
- false); |
+ isolate, result, CallTrap(proxy, "has", isolate->derived_has_trap(), |
+ ARRAY_SIZE(args), args), |
+ Maybe<bool>()); |
- return result->BooleanValue(); |
+ return maybe(result->BooleanValue()); |
} |
@@ -3779,62 +3778,58 @@ MaybeHandle<Object> JSProxy::DeleteElementWithHandler( |
} |
-PropertyAttributes JSProxy::GetPropertyAttributesWithHandler( |
- Handle<JSProxy> proxy, |
- Handle<Object> receiver, |
- Handle<Name> name) { |
+Maybe<PropertyAttributes> JSProxy::GetPropertyAttributesWithHandler( |
+ Handle<JSProxy> proxy, Handle<Object> receiver, Handle<Name> name) { |
Isolate* isolate = proxy->GetIsolate(); |
HandleScope scope(isolate); |
// TODO(rossberg): adjust once there is a story for symbols vs proxies. |
- if (name->IsSymbol()) return ABSENT; |
+ if (name->IsSymbol()) return maybe(ABSENT); |
Handle<Object> args[] = { name }; |
Handle<Object> result; |
ASSIGN_RETURN_ON_EXCEPTION_VALUE( |
isolate, result, |
- proxy->CallTrap(proxy, |
- "getPropertyDescriptor", |
- Handle<Object>(), |
- ARRAY_SIZE(args), |
- args), |
- NONE); |
+ proxy->CallTrap(proxy, "getPropertyDescriptor", Handle<Object>(), |
+ ARRAY_SIZE(args), args), |
+ Maybe<PropertyAttributes>()); |
- if (result->IsUndefined()) return ABSENT; |
+ if (result->IsUndefined()) return maybe(ABSENT); |
Handle<Object> argv[] = { result }; |
Handle<Object> desc; |
ASSIGN_RETURN_ON_EXCEPTION_VALUE( |
isolate, desc, |
- Execution::Call(isolate, |
- isolate->to_complete_property_descriptor(), |
- result, |
- ARRAY_SIZE(argv), |
- argv), |
- NONE); |
+ Execution::Call(isolate, isolate->to_complete_property_descriptor(), |
+ result, ARRAY_SIZE(argv), argv), |
+ Maybe<PropertyAttributes>()); |
// Convert result to PropertyAttributes. |
Handle<String> enum_n = isolate->factory()->InternalizeOneByteString( |
STATIC_ASCII_VECTOR("enumerable_")); |
Handle<Object> enumerable; |
- ASSIGN_RETURN_ON_EXCEPTION_VALUE( |
- isolate, enumerable, Object::GetProperty(desc, enum_n), NONE); |
+ ASSIGN_RETURN_ON_EXCEPTION_VALUE(isolate, enumerable, |
+ Object::GetProperty(desc, enum_n), |
+ Maybe<PropertyAttributes>()); |
Handle<String> conf_n = isolate->factory()->InternalizeOneByteString( |
STATIC_ASCII_VECTOR("configurable_")); |
Handle<Object> configurable; |
- ASSIGN_RETURN_ON_EXCEPTION_VALUE( |
- isolate, configurable, Object::GetProperty(desc, conf_n), NONE); |
+ ASSIGN_RETURN_ON_EXCEPTION_VALUE(isolate, configurable, |
+ Object::GetProperty(desc, conf_n), |
+ Maybe<PropertyAttributes>()); |
Handle<String> writ_n = isolate->factory()->InternalizeOneByteString( |
STATIC_ASCII_VECTOR("writable_")); |
Handle<Object> writable; |
- ASSIGN_RETURN_ON_EXCEPTION_VALUE( |
- isolate, writable, Object::GetProperty(desc, writ_n), NONE); |
+ ASSIGN_RETURN_ON_EXCEPTION_VALUE(isolate, writable, |
+ Object::GetProperty(desc, writ_n), |
+ Maybe<PropertyAttributes>()); |
if (!writable->BooleanValue()) { |
Handle<String> set_n = isolate->factory()->InternalizeOneByteString( |
STATIC_ASCII_VECTOR("set_")); |
Handle<Object> setter; |
- ASSIGN_RETURN_ON_EXCEPTION_VALUE( |
- isolate, setter, Object::GetProperty(desc, set_n), NONE); |
+ ASSIGN_RETURN_ON_EXCEPTION_VALUE(isolate, setter, |
+ Object::GetProperty(desc, set_n), |
+ Maybe<PropertyAttributes>()); |
writable = isolate->factory()->ToBoolean(!setter->IsUndefined()); |
} |
@@ -3846,21 +3841,19 @@ PropertyAttributes JSProxy::GetPropertyAttributesWithHandler( |
Handle<Object> error = isolate->factory()->NewTypeError( |
"proxy_prop_not_configurable", HandleVector(args, ARRAY_SIZE(args))); |
isolate->Throw(*error); |
- return NONE; |
+ return maybe(NONE); |
} |
int attributes = NONE; |
if (!enumerable->BooleanValue()) attributes |= DONT_ENUM; |
if (!configurable->BooleanValue()) attributes |= DONT_DELETE; |
if (!writable->BooleanValue()) attributes |= READ_ONLY; |
- return static_cast<PropertyAttributes>(attributes); |
+ return maybe(static_cast<PropertyAttributes>(attributes)); |
} |
-PropertyAttributes JSProxy::GetElementAttributeWithHandler( |
- Handle<JSProxy> proxy, |
- Handle<JSReceiver> receiver, |
- uint32_t index) { |
+Maybe<PropertyAttributes> JSProxy::GetElementAttributeWithHandler( |
+ Handle<JSProxy> proxy, Handle<JSReceiver> receiver, uint32_t index) { |
Isolate* isolate = proxy->GetIsolate(); |
Handle<String> name = isolate->factory()->Uint32ToString(index); |
return GetPropertyAttributesWithHandler(proxy, receiver, name); |
@@ -4278,7 +4271,7 @@ Maybe<PropertyAttributes> JSObject::GetPropertyAttributesWithInterceptor( |
Handle<Object> receiver, |
Handle<Name> name) { |
// TODO(rossberg): Support symbols in the API. |
- if (name->IsSymbol()) return Maybe<PropertyAttributes>(); |
+ if (name->IsSymbol()) return maybe(ABSENT); |
Isolate* isolate = holder->GetIsolate(); |
HandleScope scope(isolate); |
@@ -4299,8 +4292,7 @@ Maybe<PropertyAttributes> JSObject::GetPropertyAttributesWithInterceptor( |
args.Call(query, v8::Utils::ToLocal(Handle<String>::cast(name))); |
if (!result.IsEmpty()) { |
ASSERT(result->IsInt32()); |
- return Maybe<PropertyAttributes>( |
- static_cast<PropertyAttributes>(result->Int32Value())); |
+ return maybe(static_cast<PropertyAttributes>(result->Int32Value())); |
} |
} else if (!interceptor->getter()->IsUndefined()) { |
v8::NamedPropertyGetterCallback getter = |
@@ -4309,13 +4301,15 @@ Maybe<PropertyAttributes> JSObject::GetPropertyAttributesWithInterceptor( |
ApiNamedPropertyAccess("interceptor-named-get-has", *holder, *name)); |
v8::Handle<v8::Value> result = |
args.Call(getter, v8::Utils::ToLocal(Handle<String>::cast(name))); |
- if (!result.IsEmpty()) return Maybe<PropertyAttributes>(DONT_ENUM); |
+ if (!result.IsEmpty()) return maybe(DONT_ENUM); |
} |
- return Maybe<PropertyAttributes>(); |
+ |
+ RETURN_VALUE_IF_SCHEDULED_EXCEPTION(isolate, Maybe<PropertyAttributes>()); |
+ return maybe(ABSENT); |
} |
-PropertyAttributes JSReceiver::GetOwnPropertyAttributes( |
+Maybe<PropertyAttributes> JSReceiver::GetOwnPropertyAttributes( |
Handle<JSReceiver> object, Handle<Name> name) { |
// Check whether the name is an array index. |
uint32_t index = 0; |
@@ -4327,7 +4321,8 @@ PropertyAttributes JSReceiver::GetOwnPropertyAttributes( |
} |
-PropertyAttributes JSReceiver::GetPropertyAttributes(LookupIterator* it) { |
+Maybe<PropertyAttributes> JSReceiver::GetPropertyAttributes( |
+ LookupIterator* it) { |
for (; it->IsFound(); it->Next()) { |
switch (it->state()) { |
case LookupIterator::NOT_FOUND: |
@@ -4339,25 +4334,26 @@ PropertyAttributes JSReceiver::GetPropertyAttributes(LookupIterator* it) { |
Maybe<PropertyAttributes> result = |
JSObject::GetPropertyAttributesWithInterceptor( |
it->GetHolder<JSObject>(), it->GetReceiver(), it->name()); |
- if (result.has_value) return result.value; |
+ if (!result.has_value) return result; |
+ if (result.value != ABSENT) return result; |
break; |
} |
case LookupIterator::ACCESS_CHECK: |
if (it->HasAccess(v8::ACCESS_HAS)) break; |
return JSObject::GetPropertyAttributesWithFailedAccessCheck(it); |
case LookupIterator::PROPERTY: |
- if (it->HasProperty()) return it->property_details().attributes(); |
+ if (it->HasProperty()) { |
+ return maybe(it->property_details().attributes()); |
+ } |
break; |
} |
} |
- return ABSENT; |
+ return maybe(ABSENT); |
} |
-PropertyAttributes JSObject::GetElementAttributeWithReceiver( |
- Handle<JSObject> object, |
- Handle<JSReceiver> receiver, |
- uint32_t index, |
+Maybe<PropertyAttributes> JSObject::GetElementAttributeWithReceiver( |
+ Handle<JSObject> object, Handle<JSReceiver> receiver, uint32_t index, |
bool check_prototype) { |
Isolate* isolate = object->GetIsolate(); |
@@ -4365,14 +4361,14 @@ PropertyAttributes JSObject::GetElementAttributeWithReceiver( |
if (object->IsAccessCheckNeeded()) { |
if (!isolate->MayIndexedAccess(object, index, v8::ACCESS_HAS)) { |
isolate->ReportFailedAccessCheck(object, v8::ACCESS_HAS); |
- // TODO(yangguo): Issue 3269, check for scheduled exception missing? |
- return ABSENT; |
+ RETURN_VALUE_IF_SCHEDULED_EXCEPTION(isolate, Maybe<PropertyAttributes>()); |
+ return maybe(ABSENT); |
} |
} |
if (object->IsJSGlobalProxy()) { |
PrototypeIterator iter(isolate, object); |
- if (iter.IsAtEnd()) return ABSENT; |
+ if (iter.IsAtEnd()) return maybe(ABSENT); |
ASSERT(PrototypeIterator::GetCurrent(iter)->IsJSGlobalObject()); |
return JSObject::GetElementAttributeWithReceiver( |
Handle<JSObject>::cast(PrototypeIterator::GetCurrent(iter)), receiver, |
@@ -4390,10 +4386,8 @@ PropertyAttributes JSObject::GetElementAttributeWithReceiver( |
} |
-PropertyAttributes JSObject::GetElementAttributeWithInterceptor( |
- Handle<JSObject> object, |
- Handle<JSReceiver> receiver, |
- uint32_t index, |
+Maybe<PropertyAttributes> JSObject::GetElementAttributeWithInterceptor( |
+ Handle<JSObject> object, Handle<JSReceiver> receiver, uint32_t index, |
bool check_prototype) { |
Isolate* isolate = object->GetIsolate(); |
HandleScope scope(isolate); |
@@ -4412,7 +4406,7 @@ PropertyAttributes JSObject::GetElementAttributeWithInterceptor( |
ApiIndexedPropertyAccess("interceptor-indexed-has", *object, index)); |
v8::Handle<v8::Integer> result = args.Call(query, index); |
if (!result.IsEmpty()) |
- return static_cast<PropertyAttributes>(result->Int32Value()); |
+ return maybe(static_cast<PropertyAttributes>(result->Int32Value())); |
} else if (!interceptor->getter()->IsUndefined()) { |
v8::IndexedPropertyGetterCallback getter = |
v8::ToCData<v8::IndexedPropertyGetterCallback>(interceptor->getter()); |
@@ -4420,7 +4414,7 @@ PropertyAttributes JSObject::GetElementAttributeWithInterceptor( |
ApiIndexedPropertyAccess( |
"interceptor-indexed-get-has", *object, index)); |
v8::Handle<v8::Value> result = args.Call(getter, index); |
- if (!result.IsEmpty()) return NONE; |
+ if (!result.IsEmpty()) return maybe(NONE); |
} |
return GetElementAttributeWithoutInterceptor( |
@@ -4428,21 +4422,19 @@ PropertyAttributes JSObject::GetElementAttributeWithInterceptor( |
} |
-PropertyAttributes JSObject::GetElementAttributeWithoutInterceptor( |
- Handle<JSObject> object, |
- Handle<JSReceiver> receiver, |
- uint32_t index, |
+Maybe<PropertyAttributes> JSObject::GetElementAttributeWithoutInterceptor( |
+ Handle<JSObject> object, Handle<JSReceiver> receiver, uint32_t index, |
bool check_prototype) { |
PropertyAttributes attr = object->GetElementsAccessor()->GetAttributes( |
receiver, object, index); |
- if (attr != ABSENT) return attr; |
+ if (attr != ABSENT) return maybe(attr); |
// Handle [] on String objects. |
if (object->IsStringObjectWithCharacterAt(index)) { |
- return static_cast<PropertyAttributes>(READ_ONLY | DONT_DELETE); |
+ return maybe(static_cast<PropertyAttributes>(READ_ONLY | DONT_DELETE)); |
} |
- if (!check_prototype) return ABSENT; |
+ if (!check_prototype) return maybe(ABSENT); |
PrototypeIterator iter(object->GetIsolate(), object); |
if (PrototypeIterator::GetCurrent(iter)->IsJSProxy()) { |
@@ -4451,7 +4443,7 @@ PropertyAttributes JSObject::GetElementAttributeWithoutInterceptor( |
Handle<JSProxy>::cast(PrototypeIterator::GetCurrent(iter)), receiver, |
index); |
} |
- if (iter.IsAtEnd()) return ABSENT; |
+ if (iter.IsAtEnd()) return maybe(ABSENT); |
return GetElementAttributeWithReceiver( |
Handle<JSObject>::cast(PrototypeIterator::GetCurrent(iter)), receiver, |
index, true); |
@@ -5031,7 +5023,10 @@ void JSObject::DeleteHiddenProperty(Handle<JSObject> object, Handle<Name> key) { |
bool JSObject::HasHiddenProperties(Handle<JSObject> object) { |
Handle<Name> hidden = object->GetIsolate()->factory()->hidden_string(); |
LookupIterator it(object, hidden, LookupIterator::CHECK_OWN_REAL); |
- return GetPropertyAttributes(&it) != ABSENT; |
+ Maybe<PropertyAttributes> maybe = GetPropertyAttributes(&it); |
+ // Cannot get an exception since the hidden_string isn't accessible to JS. |
+ ASSERT(maybe.has_value); |
+ return maybe.value != ABSENT; |
} |
@@ -5254,7 +5249,9 @@ MaybeHandle<Object> JSObject::DeleteElement(Handle<JSObject> object, |
Handle<Object> old_value; |
bool should_enqueue_change_record = false; |
if (object->map()->is_observed()) { |
- should_enqueue_change_record = HasOwnElement(object, index); |
+ Maybe<bool> maybe = HasOwnElement(object, index); |
+ if (!maybe.has_value) return MaybeHandle<Object>(); |
+ should_enqueue_change_record = maybe.value; |
if (should_enqueue_change_record) { |
if (!GetOwnElementAccessorPair(object, index).is_null()) { |
old_value = Handle<Object>::cast(factory->the_hole_value()); |
@@ -5275,9 +5272,13 @@ MaybeHandle<Object> JSObject::DeleteElement(Handle<JSObject> object, |
Handle<Object> result; |
ASSIGN_RETURN_ON_EXCEPTION(isolate, result, maybe_result, Object); |
- if (should_enqueue_change_record && !HasOwnElement(object, index)) { |
- Handle<String> name = factory->Uint32ToString(index); |
- EnqueueChangeRecord(object, "delete", name, old_value); |
+ if (should_enqueue_change_record) { |
+ Maybe<bool> maybe = HasOwnElement(object, index); |
+ if (!maybe.has_value) return MaybeHandle<Object>(); |
+ if (!maybe.value) { |
+ Handle<String> name = factory->Uint32ToString(index); |
+ EnqueueChangeRecord(object, "delete", name, old_value); |
+ } |
} |
return result; |
@@ -5355,8 +5356,12 @@ MaybeHandle<Object> JSObject::DeleteProperty(Handle<JSObject> object, |
result = DeleteNormalizedProperty(object, name, mode); |
} |
- if (is_observed && !HasOwnProperty(object, name)) { |
- EnqueueChangeRecord(object, "delete", name, old_value); |
+ if (is_observed) { |
+ Maybe<bool> maybe = HasOwnProperty(object, name); |
+ if (!maybe.has_value) return MaybeHandle<Object>(); |
+ if (!maybe.value) { |
+ EnqueueChangeRecord(object, "delete", name, old_value); |
+ } |
} |
return result; |
@@ -5839,8 +5844,10 @@ MaybeHandle<JSObject> JSObjectWalkVisitor<ContextObject>::StructureWalk( |
for (int i = 0; i < names->length(); i++) { |
ASSERT(names->get(i)->IsString()); |
Handle<String> key_string(String::cast(names->get(i))); |
- PropertyAttributes attributes = |
+ Maybe<PropertyAttributes> maybe = |
JSReceiver::GetOwnPropertyAttributes(copy, key_string); |
+ ASSERT(maybe.has_value); |
+ PropertyAttributes attributes = maybe.value; |
// Only deep copy fields from the object literal expression. |
// In particular, don't try to copy the length attribute of |
// an array. |
@@ -6588,27 +6595,27 @@ void JSObject::SetPropertyCallback(Handle<JSObject> object, |
} |
-void JSObject::DefineAccessor(Handle<JSObject> object, |
- Handle<Name> name, |
- Handle<Object> getter, |
- Handle<Object> setter, |
- PropertyAttributes attributes) { |
+MaybeHandle<Object> JSObject::DefineAccessor(Handle<JSObject> object, |
+ Handle<Name> name, |
+ Handle<Object> getter, |
+ Handle<Object> setter, |
+ PropertyAttributes attributes) { |
Isolate* isolate = object->GetIsolate(); |
// Check access rights if needed. |
if (object->IsAccessCheckNeeded() && |
!isolate->MayNamedAccess(object, name, v8::ACCESS_SET)) { |
isolate->ReportFailedAccessCheck(object, v8::ACCESS_SET); |
- // TODO(yangguo): Issue 3269, check for scheduled exception missing? |
- return; |
+ RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); |
+ return isolate->factory()->undefined_value(); |
} |
if (object->IsJSGlobalProxy()) { |
PrototypeIterator iter(isolate, object); |
- if (iter.IsAtEnd()) return; |
+ if (iter.IsAtEnd()) return isolate->factory()->undefined_value(); |
ASSERT(PrototypeIterator::GetCurrent(iter)->IsJSGlobalObject()); |
DefineAccessor(Handle<JSObject>::cast(PrototypeIterator::GetCurrent(iter)), |
name, getter, setter, attributes); |
- return; |
+ return isolate->factory()->undefined_value(); |
} |
// Make sure that the top context does not change when doing callbacks or |
@@ -6627,7 +6634,9 @@ void JSObject::DefineAccessor(Handle<JSObject> object, |
bool preexists = false; |
if (is_observed) { |
if (is_element) { |
- preexists = HasOwnElement(object, index); |
+ Maybe<bool> maybe = HasOwnElement(object, index); |
+ ASSERT(maybe.has_value); |
+ preexists = maybe.value; |
if (preexists && GetOwnElementAccessorPair(object, index).is_null()) { |
old_value = |
Object::GetElement(isolate, object, index).ToHandleChecked(); |
@@ -6653,6 +6662,8 @@ void JSObject::DefineAccessor(Handle<JSObject> object, |
const char* type = preexists ? "reconfigure" : "add"; |
EnqueueChangeRecord(object, type, name, old_value); |
} |
+ |
+ return isolate->factory()->undefined_value(); |
} |
@@ -11655,10 +11666,11 @@ static bool GetOldValue(Isolate* isolate, |
uint32_t index, |
List<Handle<Object> >* old_values, |
List<uint32_t>* indices) { |
- PropertyAttributes attributes = |
+ Maybe<PropertyAttributes> maybe = |
JSReceiver::GetOwnElementAttribute(object, index); |
- ASSERT(attributes != ABSENT); |
- if (attributes == DONT_DELETE) return false; |
+ ASSERT(maybe.has_value); |
+ ASSERT(maybe.value != ABSENT); |
+ if (maybe.value == DONT_DELETE) return false; |
Handle<Object> value; |
if (!JSObject::GetOwnElementAccessorPair(object, index).is_null()) { |
value = Handle<Object>::cast(isolate->factory()->the_hole_value()); |
@@ -12891,8 +12903,11 @@ MaybeHandle<Object> JSObject::SetElement(Handle<JSObject> object, |
strict_mode, check_prototype, set_mode); |
} |
- PropertyAttributes old_attributes = |
+ Maybe<PropertyAttributes> maybe = |
JSReceiver::GetOwnElementAttribute(object, index); |
+ if (!maybe.has_value) return MaybeHandle<Object>(); |
+ PropertyAttributes old_attributes = maybe.value; |
+ |
Handle<Object> old_value = isolate->factory()->the_hole_value(); |
Handle<Object> old_length_handle; |
Handle<Object> new_length_handle; |
@@ -12921,7 +12936,10 @@ MaybeHandle<Object> JSObject::SetElement(Handle<JSObject> object, |
Object); |
Handle<String> name = isolate->factory()->Uint32ToString(index); |
- PropertyAttributes new_attributes = GetOwnElementAttribute(object, index); |
+ maybe = GetOwnElementAttribute(object, index); |
+ if (!maybe.has_value) return MaybeHandle<Object>(); |
+ PropertyAttributes new_attributes = maybe.value; |
+ |
if (old_attributes == ABSENT) { |
if (object->IsJSArray() && |
!old_length_handle->SameValue( |
@@ -13691,67 +13709,70 @@ MaybeHandle<JSObject> JSObject::GetKeysForIndexedInterceptor( |
} |
-bool JSObject::HasRealNamedProperty(Handle<JSObject> object, |
- Handle<Name> key) { |
+Maybe<bool> JSObject::HasRealNamedProperty(Handle<JSObject> object, |
+ Handle<Name> key) { |
Isolate* isolate = object->GetIsolate(); |
SealHandleScope shs(isolate); |
// Check access rights if needed. |
if (object->IsAccessCheckNeeded()) { |
if (!isolate->MayNamedAccess(object, key, v8::ACCESS_HAS)) { |
isolate->ReportFailedAccessCheck(object, v8::ACCESS_HAS); |
- // TODO(yangguo): Issue 3269, check for scheduled exception missing? |
- return false; |
+ RETURN_VALUE_IF_SCHEDULED_EXCEPTION(isolate, Maybe<bool>()); |
+ return maybe(false); |
} |
} |
LookupResult result(isolate); |
object->LookupOwnRealNamedProperty(key, &result); |
- return result.IsFound() && !result.IsInterceptor(); |
+ return maybe(result.IsFound() && !result.IsInterceptor()); |
} |
-bool JSObject::HasRealElementProperty(Handle<JSObject> object, uint32_t index) { |
+Maybe<bool> JSObject::HasRealElementProperty(Handle<JSObject> object, |
+ uint32_t index) { |
Isolate* isolate = object->GetIsolate(); |
HandleScope scope(isolate); |
// Check access rights if needed. |
if (object->IsAccessCheckNeeded()) { |
if (!isolate->MayIndexedAccess(object, index, v8::ACCESS_HAS)) { |
isolate->ReportFailedAccessCheck(object, v8::ACCESS_HAS); |
- // TODO(yangguo): Issue 3269, check for scheduled exception missing? |
- return false; |
+ RETURN_VALUE_IF_SCHEDULED_EXCEPTION(isolate, Maybe<bool>()); |
+ return maybe(false); |
} |
} |
if (object->IsJSGlobalProxy()) { |
HandleScope scope(isolate); |
PrototypeIterator iter(isolate, object); |
- if (iter.IsAtEnd()) return false; |
+ if (iter.IsAtEnd()) return maybe(false); |
ASSERT(PrototypeIterator::GetCurrent(iter)->IsJSGlobalObject()); |
return HasRealElementProperty( |
Handle<JSObject>::cast(PrototypeIterator::GetCurrent(iter)), index); |
} |
- return GetElementAttributeWithoutInterceptor( |
- object, object, index, false) != ABSENT; |
+ Maybe<PropertyAttributes> result = |
+ GetElementAttributeWithoutInterceptor(object, object, index, false); |
+ if (!result.has_value) return Maybe<bool>(); |
+ return maybe(result.value != ABSENT); |
} |
-bool JSObject::HasRealNamedCallbackProperty(Handle<JSObject> object, |
- Handle<Name> key) { |
+Maybe<bool> JSObject::HasRealNamedCallbackProperty(Handle<JSObject> object, |
+ Handle<Name> key) { |
Isolate* isolate = object->GetIsolate(); |
SealHandleScope shs(isolate); |
// Check access rights if needed. |
if (object->IsAccessCheckNeeded()) { |
if (!isolate->MayNamedAccess(object, key, v8::ACCESS_HAS)) { |
isolate->ReportFailedAccessCheck(object, v8::ACCESS_HAS); |
- // TODO(yangguo): Issue 3269, check for scheduled exception missing? |
- return false; |
+ RETURN_VALUE_IF_SCHEDULED_EXCEPTION(isolate, Maybe<bool>()); |
+ return maybe(false); |
} |
} |
LookupResult result(isolate); |
object->LookupOwnRealNamedProperty(key, &result); |
- return result.IsPropertyCallbacks(); |
+ return maybe(result.IsPropertyCallbacks()); |
} |