| 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);
|
| }
|
|
|