Index: src/runtime/runtime-object.cc |
diff --git a/src/runtime/runtime-object.cc b/src/runtime/runtime-object.cc |
index c8c379dc258124939e90863c52e50558861567d3..274a100932651bef931610457633189f0af127cf 100644 |
--- a/src/runtime/runtime-object.cc |
+++ b/src/runtime/runtime-object.cc |
@@ -35,22 +35,7 @@ MaybeHandle<Object> Runtime::GetElementOrCharAt(Isolate* isolate, |
if (!result->IsUndefined()) return result; |
} |
- // Handle [] indexing on String objects |
- if (object->IsStringObjectWithCharacterAt(index)) { |
- Handle<JSValue> js_value = Handle<JSValue>::cast(object); |
- Handle<Object> result = |
- GetCharAt(Handle<String>(String::cast(js_value->value())), index); |
- if (!result->IsUndefined()) return result; |
- } |
- |
- Handle<Object> result; |
- if (object->IsString() || object->IsNumber() || object->IsBoolean()) { |
- PrototypeIterator iter(isolate, object); |
- return Object::GetElement(isolate, PrototypeIterator::GetCurrent(iter), |
- index); |
- } else { |
- return Object::GetElement(isolate, object, index); |
- } |
+ return Object::GetElement(isolate, object, index); |
} |
@@ -360,61 +345,38 @@ MUST_USE_RESULT static MaybeHandle<Object> GetOwnProperty(Isolate* isolate, |
Factory* factory = isolate->factory(); |
PropertyAttributes attrs; |
- uint32_t index = 0; |
- Handle<Object> value; |
- MaybeHandle<AccessorPair> maybe_accessors; |
- // TODO(verwaest): Unify once indexed properties can be handled by the |
- // LookupIterator. |
- if (name->AsArrayIndex(&index)) { |
- // Get attributes. |
- Maybe<PropertyAttributes> maybe = |
- JSReceiver::GetOwnElementAttribute(obj, index); |
- if (!maybe.IsJust()) return MaybeHandle<Object>(); |
- attrs = maybe.FromJust(); |
- if (attrs == ABSENT) return factory->undefined_value(); |
- |
- // Get AccessorPair if present. |
- maybe_accessors = JSObject::GetOwnElementAccessorPair(obj, index); |
- |
- // Get value if not an AccessorPair. |
- if (maybe_accessors.is_null()) { |
- ASSIGN_RETURN_ON_EXCEPTION( |
- isolate, value, Runtime::GetElementOrCharAt(isolate, obj, index), |
- Object); |
- } |
- } else { |
- // Get attributes. |
- LookupIterator it(obj, name, LookupIterator::HIDDEN); |
- Maybe<PropertyAttributes> maybe = JSObject::GetPropertyAttributes(&it); |
- if (!maybe.IsJust()) return MaybeHandle<Object>(); |
- attrs = maybe.FromJust(); |
- if (attrs == ABSENT) return factory->undefined_value(); |
- |
- // Get AccessorPair if present. |
- if (it.state() == LookupIterator::ACCESSOR && |
- it.GetAccessors()->IsAccessorPair()) { |
- maybe_accessors = Handle<AccessorPair>::cast(it.GetAccessors()); |
- } |
+ uint32_t index; |
+ // Get attributes. |
+ LookupIterator it = |
+ name->AsArrayIndex(&index) |
+ ? LookupIterator(isolate, obj, index, LookupIterator::HIDDEN) |
+ : LookupIterator(obj, name, LookupIterator::HIDDEN); |
+ Maybe<PropertyAttributes> maybe = JSObject::GetPropertyAttributes(&it); |
+ |
+ if (!maybe.IsJust()) return MaybeHandle<Object>(); |
+ attrs = maybe.FromJust(); |
+ if (attrs == ABSENT) return factory->undefined_value(); |
- // Get value if not an AccessorPair. |
- if (maybe_accessors.is_null()) { |
- ASSIGN_RETURN_ON_EXCEPTION(isolate, value, Object::GetProperty(&it), |
- Object); |
- } |
- } |
DCHECK(!isolate->has_pending_exception()); |
Handle<FixedArray> elms = factory->NewFixedArray(DESCRIPTOR_SIZE); |
elms->set(ENUMERABLE_INDEX, heap->ToBoolean((attrs & DONT_ENUM) == 0)); |
elms->set(CONFIGURABLE_INDEX, heap->ToBoolean((attrs & DONT_DELETE) == 0)); |
- elms->set(IS_ACCESSOR_INDEX, heap->ToBoolean(!maybe_accessors.is_null())); |
- Handle<AccessorPair> accessors; |
- if (maybe_accessors.ToHandle(&accessors)) { |
+ bool is_accessor_pair = it.state() == LookupIterator::ACCESSOR && |
+ it.GetAccessors()->IsAccessorPair(); |
+ elms->set(IS_ACCESSOR_INDEX, heap->ToBoolean(is_accessor_pair)); |
+ |
+ if (is_accessor_pair) { |
+ Handle<AccessorPair> accessors = |
+ Handle<AccessorPair>::cast(it.GetAccessors()); |
Handle<Object> getter(accessors->GetComponent(ACCESSOR_GETTER), isolate); |
Handle<Object> setter(accessors->GetComponent(ACCESSOR_SETTER), isolate); |
elms->set(GETTER_INDEX, *getter); |
elms->set(SETTER_INDEX, *setter); |
} else { |
+ Handle<Object> value; |
+ ASSIGN_RETURN_ON_EXCEPTION(isolate, value, Object::GetProperty(&it), |
+ Object); |
elms->set(WRITABLE_INDEX, heap->ToBoolean((attrs & READ_ONLY) == 0)); |
elms->set(VALUE_INDEX, *value); |
} |