From c2670d6187dc0dc56b3326064673eb7b72047c0a Mon Sep 17 00:00:00 2001 From: verwaest Date: Thu, 21 May 2015 07:34:52 -0700 Subject: [PATCH] Simplify GetProperty helpers to ease element support BUG=v8:4137 LOG=n Review URL: https://codereview.chromium.org/1148583002 Cr-Commit-Position: refs/heads/master@{#28556} --- src/ic/ic.cc | 3 ++- src/lookup.cc | 10 ++++++++- src/lookup.h | 1 + src/objects.cc | 52 ++++++++++++++++++++------------------------ src/objects.h | 9 ++------ src/runtime/runtime-debug.cc | 5 ++--- 6 files changed, 39 insertions(+), 41 deletions(-) diff --git a/src/ic/ic.cc b/src/ic/ic.cc index 68745dc..6f2fa2b 100644 --- a/src/ic/ic.cc +++ b/src/ic/ic.cc @@ -2787,7 +2787,8 @@ RUNTIME_FUNCTION(LoadPropertyWithInterceptorOnly) { Handle holder = args.at(NamedLoadHandlerCompiler::kInterceptorArgsHolderIndex); HandleScope scope(isolate); - auto res = JSObject::GetPropertyWithInterceptor(holder, receiver, name); + LookupIterator it(receiver, name, holder, LookupIterator::OWN); + auto res = JSObject::GetPropertyWithInterceptor(&it); RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate); Handle result; if (res.ToHandle(&result)) return *result; diff --git a/src/lookup.cc b/src/lookup.cc index 8eb5571..79407d9 100644 --- a/src/lookup.cc +++ b/src/lookup.cc @@ -355,7 +355,7 @@ void LookupIterator::WriteDataValue(Handle value) { bool LookupIterator::IsIntegerIndexedExotic(JSReceiver* holder) { - DCHECK(ExoticIndexState::kNotExotic != exotic_index_state_); + DCHECK(exotic_index_state_ != ExoticIndexState::kNotExotic); // Currently typed arrays are the only such objects. if (!holder->IsJSTypedArray()) return false; if (exotic_index_state_ == ExoticIndexState::kExotic) return true; @@ -386,6 +386,14 @@ bool LookupIterator::HasInterceptor(Map* map) const { } +Handle LookupIterator::GetInterceptor() const { + DCHECK_EQ(INTERCEPTOR, state_); + Handle js_holder = Handle::cast(holder_); + if (IsElement()) return handle(js_holder->GetIndexedInterceptor(), isolate_); + return handle(js_holder->GetNamedInterceptor(), isolate_); +} + + bool LookupIterator::SkipInterceptor(JSObject* holder) { auto info = holder->GetNamedInterceptor(); // TODO(dcarney): check for symbol/can_intercept_symbols here as well. diff --git a/src/lookup.h b/src/lookup.h index 48dce3a..849ce57 100644 --- a/src/lookup.h +++ b/src/lookup.h @@ -188,6 +188,7 @@ class LookupIterator final BASE_EMBEDDED { int GetConstantIndex() const; Handle GetPropertyCell() const; Handle GetAccessors() const; + Handle GetInterceptor() const; Handle GetDataValue() const; // Usually returns the value that was passed in, but may perform // non-observable modifications on it, such as internalize strings. diff --git a/src/objects.cc b/src/objects.cc index 24ecc6b..90985ee 100644 --- a/src/objects.cc +++ b/src/objects.cc @@ -136,8 +136,8 @@ MaybeHandle Object::GetProperty(LookupIterator* it) { return JSProxy::GetPropertyWithHandler(it->GetHolder(), it->GetReceiver(), it->name()); case LookupIterator::INTERCEPTOR: { - MaybeHandle maybe_result = JSObject::GetPropertyWithInterceptor( - it->GetHolder(), it->GetReceiver(), it->name()); + MaybeHandle maybe_result = + JSObject::GetPropertyWithInterceptor(it); if (!maybe_result.is_null()) return maybe_result; if (it->isolate()->has_pending_exception()) return maybe_result; break; @@ -146,9 +146,7 @@ MaybeHandle Object::GetProperty(LookupIterator* it) { if (it->HasAccess()) break; return JSObject::GetPropertyWithFailedAccessCheck(it); case LookupIterator::ACCESSOR: - return GetPropertyWithAccessor(it->GetReceiver(), it->name(), - it->GetHolder(), - it->GetAccessors()); + return GetPropertyWithAccessor(it); case LookupIterator::INTEGER_INDEXED_EXOTIC: return it->factory()->undefined_value(); case LookupIterator::DATA: @@ -303,14 +301,16 @@ MaybeHandle JSProxy::GetPropertyWithHandler(Handle proxy, } -MaybeHandle Object::GetPropertyWithAccessor(Handle receiver, - Handle name, - Handle holder, - Handle structure) { - Isolate* isolate = name->GetIsolate(); +MaybeHandle Object::GetPropertyWithAccessor(LookupIterator* it) { + Isolate* isolate = it->isolate(); + Handle structure = it->GetAccessors(); + Handle receiver = it->GetReceiver(); + DCHECK(!structure->IsForeign()); // api style callbacks. if (structure->IsAccessorInfo()) { + Handle holder = it->GetHolder(); + Handle name = it->name(); Handle info = Handle::cast(structure); if (!info->IsCompatibleReceiver(*receiver)) { THROW_NEW_ERROR(isolate, @@ -491,14 +491,10 @@ MaybeHandle JSObject::GetPropertyWithFailedAccessCheck( Handle checked = it->GetHolder(); while (FindAllCanReadHolder(it)) { if (it->state() == LookupIterator::ACCESSOR) { - return GetPropertyWithAccessor(it->GetReceiver(), it->name(), - it->GetHolder(), - it->GetAccessors()); + return GetPropertyWithAccessor(it); } DCHECK_EQ(LookupIterator::INTERCEPTOR, it->state()); - auto receiver = Handle::cast(it->GetReceiver()); - auto result = GetPropertyWithInterceptor(it->GetHolder(), - receiver, it->name()); + auto result = GetPropertyWithInterceptor(it); if (it->isolate()->has_scheduled_exception()) break; if (!result.is_null()) return result; } @@ -12764,8 +12760,7 @@ MaybeHandle JSObject::GetElementWithCallback( v8::ToCData(fun_obj); if (call_fun == NULL) return isolate->factory()->undefined_value(); Handle holder_handle = Handle::cast(holder); - Handle number = isolate->factory()->NewNumberFromUint(index); - Handle key = isolate->factory()->NumberToString(number); + Handle key = isolate->factory()->Uint32ToString(index); LOG(isolate, ApiNamedPropertyAccess("load", *holder_handle, *key)); PropertyCallbackArguments args(isolate, data->data(), *receiver, *holder_handle); @@ -12813,8 +12808,7 @@ MaybeHandle JSObject::SetElementWithCallback( v8::AccessorNameSetterCallback call_fun = v8::ToCData(call_obj); if (call_fun == NULL) return value; - Handle number = isolate->factory()->NewNumberFromUint(index); - Handle key(isolate->factory()->NumberToString(number)); + Handle key(isolate->factory()->Uint32ToString(index)); LOG(isolate, ApiNamedPropertyAccess("store", *holder, *key)); PropertyCallbackArguments args(isolate, data->data(), *object, *holder); @@ -14030,15 +14024,15 @@ InterceptorInfo* JSObject::GetIndexedInterceptor() { } -MaybeHandle JSObject::GetPropertyWithInterceptor( - Handle holder, - Handle receiver, - Handle name) { - Isolate* isolate = holder->GetIsolate(); - - Handle interceptor(holder->GetNamedInterceptor(), isolate); +MaybeHandle JSObject::GetPropertyWithInterceptor(LookupIterator* it) { + DCHECK_EQ(LookupIterator::INTERCEPTOR, it->state()); + Isolate* isolate = it->isolate(); + Handle interceptor = it->GetInterceptor(); if (interceptor->getter()->IsUndefined()) return MaybeHandle(); + Handle name = it->name(); + Handle holder = it->GetHolder(); + if (name->IsSymbol() && !interceptor->can_intercept_symbols()) { return MaybeHandle(); } @@ -14048,8 +14042,8 @@ MaybeHandle JSObject::GetPropertyWithInterceptor( interceptor->getter()); LOG(isolate, ApiNamedPropertyAccess("interceptor-named-get", *holder, *name)); - PropertyCallbackArguments - args(isolate, interceptor->data(), *receiver, *holder); + PropertyCallbackArguments args(isolate, interceptor->data(), + *it->GetReceiver(), *holder); v8::Handle result = args.Call(getter, v8::Utils::ToLocal(name)); RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); if (result.IsEmpty()) return MaybeHandle(); diff --git a/src/objects.h b/src/objects.h index 665da03..129c6c3 100644 --- a/src/objects.h +++ b/src/objects.h @@ -1187,10 +1187,7 @@ class Object { Handle key); MUST_USE_RESULT static MaybeHandle GetPropertyWithAccessor( - Handle receiver, - Handle name, - Handle holder, - Handle structure); + LookupIterator* it); MUST_USE_RESULT static MaybeHandle SetPropertyWithAccessor( Handle receiver, Handle name, Handle value, Handle holder, Handle structure, @@ -1895,9 +1892,7 @@ class JSObject: public JSReceiver { Handle info); MUST_USE_RESULT static MaybeHandle GetPropertyWithInterceptor( - Handle object, - Handle receiver, - Handle name); + LookupIterator* it); // Accessors for hidden properties object. // diff --git a/src/runtime/runtime-debug.cc b/src/runtime/runtime-debug.cc index 0d2f65d..660fc7f 100644 --- a/src/runtime/runtime-debug.cc +++ b/src/runtime/runtime-debug.cc @@ -80,9 +80,8 @@ static Handle DebugGetProperty(LookupIterator* it, if (!accessors->IsAccessorInfo()) { return it->isolate()->factory()->undefined_value(); } - MaybeHandle maybe_result = JSObject::GetPropertyWithAccessor( - it->GetReceiver(), it->name(), it->GetHolder(), - accessors); + MaybeHandle maybe_result = + JSObject::GetPropertyWithAccessor(it); Handle result; if (!maybe_result.ToHandle(&result)) { result = handle(it->isolate()->pending_exception(), it->isolate()); -- 2.7.4