Reviewers: rossberg, arv,
Message:
PTAL
Description:
Introduce NonJSProxyHolder returning Handle<JSObject> and return
Handle<JSReceiver> for GetHolder
BUG=
Please review this at https://codereview.chromium.org/415953005/
SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge
Affected files (+31, -25 lines):
M src/lookup.h
M src/lookup.cc
M src/objects.cc
Index: src/lookup.cc
diff --git a/src/lookup.cc b/src/lookup.cc
index
e98e111e3ea9db77883822ad6d2ca258eb21cd56..98aaa786c8744a9eacf7626c06bfd918c77fe152
100644
--- a/src/lookup.cc
+++ b/src/lookup.cc
@@ -100,7 +100,7 @@ bool LookupIterator::IsBootstrapping() const {
bool LookupIterator::HasAccess(v8::AccessType access_type) const {
ASSERT_EQ(ACCESS_CHECK, state_);
ASSERT(is_guaranteed_to_have_holder());
- return isolate_->MayNamedAccess(GetHolder(), name_, access_type);
+ return isolate_->MayNamedAccess(GetNonJSProxyHolder(), name_,
access_type);
}
@@ -109,11 +109,11 @@ bool LookupIterator::HasProperty() {
ASSERT(is_guaranteed_to_have_holder());
if (property_encoding_ == DICTIONARY) {
- Handle<JSObject> holder = GetHolder();
+ Handle<JSObject> holder = GetNonJSProxyHolder();
number_ = holder->property_dictionary()->FindEntry(name_);
if (number_ == NameDictionary::kNotFound) return false;
- property_details_ =
GetHolder()->property_dictionary()->DetailsAt(number_);
+ property_details_ = holder->property_dictionary()->DetailsAt(number_);
// Holes in dictionary cells are absent values.
if (holder->IsGlobalObject() &&
(property_details_.IsDeleted() || FetchValue()->IsTheHole())) {
@@ -149,7 +149,7 @@ void
LookupIterator::PrepareForDataProperty(Handle<Object> value) {
ASSERT(HolderIsReceiver());
if (property_encoding_ == DICTIONARY) return;
holder_map_ = Map::PrepareForDataProperty(holder_map_, number_, value);
- JSObject::MigrateToMap(GetHolder(), holder_map_);
+ JSObject::MigrateToMap(GetNonJSProxyHolder(), holder_map_);
// Reload property information.
if (holder_map_->is_dictionary_map()) {
property_encoding_ = DICTIONARY;
@@ -218,10 +218,11 @@ bool LookupIterator::HolderIsReceiver() const {
Handle<Object> LookupIterator::FetchValue() const {
Object* result = NULL;
+ Handle<JSObject> holder = GetNonJSProxyHolder();
switch (property_encoding_) {
case DICTIONARY:
- result = GetHolder()->property_dictionary()->ValueAt(number_);
- if (GetHolder()->IsGlobalObject()) {
+ result = holder->property_dictionary()->ValueAt(number_);
+ if (holder->IsGlobalObject()) {
result = PropertyCell::cast(result)->value();
}
break;
@@ -230,7 +231,7 @@ Handle<Object> LookupIterator::FetchValue() const {
FieldIndex field_index = FieldIndex::ForDescriptor(
*holder_map_, number_);
return JSObject::FastPropertyAt(
- GetHolder(), property_details_.representation(), field_index);
+ holder, property_details_.representation(), field_index);
}
result = holder_map_->instance_descriptors()->GetValue(number_);
}
@@ -256,8 +257,8 @@ Handle<Object> LookupIterator::GetDataValue() const {
void LookupIterator::WriteDataValue(Handle<Object> value) {
ASSERT(is_guaranteed_to_have_holder());
ASSERT(has_property_);
+ Handle<JSObject> holder = GetNonJSProxyHolder();
if (property_encoding_ == DICTIONARY) {
- Handle<JSObject> holder = GetHolder();
NameDictionary* property_dictionary = holder->property_dictionary();
if (holder->IsGlobalObject()) {
Handle<PropertyCell> cell(
@@ -267,7 +268,7 @@ void LookupIterator::WriteDataValue(Handle<Object>
value) {
property_dictionary->ValueAtPut(number_, *value);
}
} else if (property_details_.type() == v8::internal::FIELD) {
- GetHolder()->WriteToField(number_, *value);
+ holder->WriteToField(number_, *value);
} else {
ASSERT_EQ(v8::internal::CONSTANT, property_details_.type());
}
Index: src/lookup.h
diff --git a/src/lookup.h b/src/lookup.h
index
c96a1e66e7b981aa04fec81797008e0c65ee075a..1881cda373159a94c507b74f4be47499c7a5ad5c
100644
--- a/src/lookup.h
+++ b/src/lookup.h
@@ -93,7 +93,11 @@ class LookupIterator V8_FINAL BASE_EMBEDDED {
return Handle<Object>::cast(maybe_receiver_.ToHandleChecked());
}
Handle<Map> holder_map() const { return holder_map_; }
- Handle<JSObject> GetHolder() const {
+ Handle<JSReceiver> GetHolder() const {
+ ASSERT(IsFound());
+ return maybe_holder_.ToHandleChecked();
+ }
+ Handle<JSObject> GetNonJSProxyHolder() const {
ASSERT(IsFound() && state_ != JSPROXY);
return Handle<JSObject>::cast(maybe_holder_.ToHandleChecked());
}
Index: src/objects.cc
diff --git a/src/objects.cc b/src/objects.cc
index
a527d282a3eeeb756e527cb5470ce0d3284e59af..f58d057b52dd9c734e050d217464c90fcc7b417d
100644
--- a/src/objects.cc
+++ b/src/objects.cc
@@ -139,7 +139,7 @@ MaybeHandle<Object> Object::GetProperty(LookupIterator*
it) {
it->GetJSProxy(), it->GetReceiver(), it->name());
case LookupIterator::INTERCEPTOR: {
MaybeHandle<Object> maybe_result =
JSObject::GetPropertyWithInterceptor(
- it->GetHolder(), it->GetReceiver(), it->name());
+ it->GetNonJSProxyHolder(), it->GetReceiver(), it->name());
if (!maybe_result.is_null()) return maybe_result;
if (it->isolate()->has_pending_exception()) return maybe_result;
break;
@@ -151,9 +151,9 @@ MaybeHandle<Object> Object::GetProperty(LookupIterator*
it) {
if (it->HasProperty()) {
switch (it->property_kind()) {
case LookupIterator::ACCESSOR:
- return GetPropertyWithAccessor(
- it->GetReceiver(), it->name(),
- it->GetHolder(), it->GetAccessors());
+ return GetPropertyWithAccessor(it->GetReceiver(), it->name(),
+ it->GetNonJSProxyHolder(),
+ it->GetAccessors());
case LookupIterator::DATA:
return it->GetDataValue();
}
@@ -582,10 +582,11 @@ static bool FindAllCanReadHolder(LookupIterator* it) {
MaybeHandle<Object> JSObject::GetPropertyWithFailedAccessCheck(
LookupIterator* it) {
- Handle<JSObject> checked = Handle<JSObject>::cast(it->GetHolder());
+ Handle<JSObject> checked = it->GetNonJSProxyHolder();
if (FindAllCanReadHolder(it)) {
- return GetPropertyWithAccessor(
- it->GetReceiver(), it->name(), it->GetHolder(),
it->GetAccessors());
+ return GetPropertyWithAccessor(it->GetReceiver(), it->name(),
+ it->GetNonJSProxyHolder(),
+ it->GetAccessors());
}
it->isolate()->ReportFailedAccessCheck(checked, v8::ACCESS_GET);
RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(it->isolate(), Object);
@@ -595,7 +596,7 @@ MaybeHandle<Object>
JSObject::GetPropertyWithFailedAccessCheck(
PropertyAttributes JSObject::GetPropertyAttributesWithFailedAccessCheck(
LookupIterator* it) {
- Handle<JSObject> checked = Handle<JSObject>::cast(it->GetHolder());
+ Handle<JSObject> checked = it->GetNonJSProxyHolder();
if (FindAllCanReadHolder(it)) return it->property_details().attributes();
it->isolate()->ReportFailedAccessCheck(checked, v8::ACCESS_HAS);
// TODO(yangguo): Issue 3269, check for scheduled exception missing?
@@ -621,11 +622,11 @@ static bool FindAllCanWriteHolder(LookupIterator* it)
{
MaybeHandle<Object> JSObject::SetPropertyWithFailedAccessCheck(
LookupIterator* it, Handle<Object> value, StrictMode strict_mode) {
- Handle<JSObject> checked = Handle<JSObject>::cast(it->GetHolder());
+ Handle<JSObject> checked = it->GetNonJSProxyHolder();
if (FindAllCanWriteHolder(it)) {
return SetPropertyWithAccessor(it->GetReceiver(), it->name(), value,
- it->GetHolder(), it->GetAccessors(),
- strict_mode);
+ it->GetNonJSProxyHolder(),
+ it->GetAccessors(), strict_mode);
}
it->isolate()->ReportFailedAccessCheck(checked, v8::ACCESS_SET);
@@ -2941,7 +2942,7 @@ MaybeHandle<Object>
JSObject::SetPropertyWithInterceptor(LookupIterator* it,
if (it->name()->IsSymbol()) return value;
Handle<String> name_string = Handle<String>::cast(it->name());
- Handle<JSObject> holder = it->GetHolder();
+ Handle<JSObject> holder = it->GetNonJSProxyHolder();
Handle<InterceptorInfo> interceptor(holder->GetNamedInterceptor());
if (interceptor->setter()->IsUndefined()) return MaybeHandle<Object>();
@@ -3017,7 +3018,7 @@ MaybeHandle<Object>
Object::SetProperty(LookupIterator* it,
} else {
Maybe<PropertyAttributes> maybe_attributes =
JSObject::GetPropertyAttributesWithInterceptor(
- it->GetHolder(), it->GetReceiver(), it->name());
+ it->GetNonJSProxyHolder(), it->GetReceiver(),
it->name());
RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(it->isolate(), Object);
done = maybe_attributes.has_value;
if (done && (maybe_attributes.value & READ_ONLY) != 0) {
@@ -3036,7 +3037,7 @@ MaybeHandle<Object>
Object::SetProperty(LookupIterator* it,
if (it->HolderIsReceiver() ||
!it->GetAccessors()->IsDeclaredAccessorInfo()) {
return SetPropertyWithAccessor(it->GetReceiver(), it->name(),
- value, it->GetHolder(),
+ value,
it->GetNonJSProxyHolder(),
it->GetAccessors(),
strict_mode);
}
break;
@@ -4337,7 +4338,7 @@ PropertyAttributes
JSReceiver::GetPropertyAttributes(LookupIterator* it) {
case LookupIterator::INTERCEPTOR: {
Maybe<PropertyAttributes> result =
JSObject::GetPropertyAttributesWithInterceptor(
- it->GetHolder(), it->GetReceiver(), it->name());
+ it->GetNonJSProxyHolder(), it->GetReceiver(), it->name());
if (result.has_value) return result.value;
break;
}
--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.