Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(899)

Unified Diff: src/objects.cc

Issue 1498593006: [proxies] Use JSReceiver::GetKeys() for more purposes (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/objects.cc
diff --git a/src/objects.cc b/src/objects.cc
index 455d1540eb8939b6901467974132307662fa1240..786c92a917291e765d81c9c1d0638db95cca7f8e 100644
--- a/src/objects.cc
+++ b/src/objects.cc
@@ -8175,11 +8175,10 @@ static bool GetKeysFromInterceptor(Isolate* isolate,
static bool GetKeysFromJSObject(Isolate* isolate, Handle<JSReceiver> receiver,
- Handle<JSObject> object, PropertyFilter filter,
+ Handle<JSObject> object, PropertyFilter* filter,
Jakob Kummerow 2015/12/04 13:39:29 If you have any better ideas than passing |filter|
Camillo Bruni 2015/12/04 14:37:16 we might want to push all of this onto the KeyAccu
JSReceiver::KeyCollectionType type,
KeyAccumulator* accumulator) {
accumulator->NextPrototype();
- bool keep_going = true;
// Check access rights if required.
if (object->IsAccessCheckNeeded() &&
!isolate->MayAccess(handle(isolate->context()), object)) {
@@ -8190,25 +8189,19 @@ static bool GetKeysFromJSObject(Isolate* isolate, Handle<JSReceiver> receiver,
}
// ...whereas [[OwnPropertyKeys]] shall return whitelisted properties.
DCHECK(type == JSReceiver::OWN_ONLY);
- filter = static_cast<PropertyFilter>(filter | ONLY_ALL_CAN_READ);
- keep_going = false;
-
- // TODO(jkummerow): LayoutTests need adaptation before we can be spec
Jakob Kummerow 2015/12/04 13:39:29 Waiting for https://codereview.chromium.org/150345
- // compliant.
- // Let [[OwnPropertyKeys]] also return an empty list for now.
- return false;
+ *filter = static_cast<PropertyFilter>(*filter | ONLY_ALL_CAN_READ);
}
- JSObject::CollectOwnElementKeys(object, accumulator, filter);
+ JSObject::CollectOwnElementKeys(object, accumulator, *filter);
// Add the element keys from the interceptor.
if (!GetKeysFromInterceptor<v8::IndexedPropertyEnumeratorCallback, kIndexed>(
- isolate, receiver, object, filter, accumulator)) {
+ isolate, receiver, object, *filter, accumulator)) {
DCHECK(isolate->has_pending_exception());
return false;
}
- if (filter == ENUMERABLE_STRINGS) {
+ if (*filter == ENUMERABLE_STRINGS) {
// We can cache the computed property keys if access checks are
// not needed and no interceptors are involved.
//
@@ -8230,17 +8223,17 @@ static bool GetKeysFromJSObject(Isolate* isolate, Handle<JSReceiver> receiver,
JSObject::GetEnumPropertyKeys(object, cache_enum_length);
accumulator->AddKeys(enum_keys);
} else {
- object->CollectOwnPropertyNames(accumulator, filter);
+ object->CollectOwnPropertyNames(accumulator, *filter);
}
// Add the property keys from the interceptor.
if (!GetKeysFromInterceptor<v8::GenericNamedPropertyEnumeratorCallback,
- kNamed>(isolate, receiver, object, filter,
+ kNamed>(isolate, receiver, object, *filter,
accumulator)) {
DCHECK(isolate->has_pending_exception());
return false;
}
- return keep_going;
+ return true;
}
@@ -8273,7 +8266,7 @@ static bool GetKeys_Internal(Isolate* isolate, Handle<JSReceiver> receiver,
} else {
DCHECK(current->IsJSObject());
result = GetKeysFromJSObject(isolate, receiver,
- Handle<JSObject>::cast(current), filter,
+ Handle<JSObject>::cast(current), &filter,
type, accumulator);
}
if (!result) {
@@ -15654,58 +15647,6 @@ MaybeHandle<Object> JSObject::GetPropertyWithInterceptor(LookupIterator* it,
}
-// Compute the property keys from the interceptor.
-// TODO(jkummerow): Deprecated.
-MaybeHandle<JSObject> JSObject::GetKeysForNamedInterceptor(
- Handle<JSObject> object, Handle<JSReceiver> receiver) {
- Isolate* isolate = receiver->GetIsolate();
- Handle<InterceptorInfo> interceptor(object->GetNamedInterceptor());
- PropertyCallbackArguments
- args(isolate, interceptor->data(), *receiver, *object);
- v8::Local<v8::Object> result;
- if (!interceptor->enumerator()->IsUndefined()) {
- v8::GenericNamedPropertyEnumeratorCallback enum_fun =
- v8::ToCData<v8::GenericNamedPropertyEnumeratorCallback>(
- interceptor->enumerator());
- LOG(isolate, ApiObjectAccess("interceptor-named-enum", *object));
- result = args.Call(enum_fun);
- }
- if (result.IsEmpty()) return MaybeHandle<JSObject>();
- DCHECK(v8::Utils::OpenHandle(*result)->IsJSArray() ||
- (v8::Utils::OpenHandle(*result)->IsJSObject() &&
- Handle<JSObject>::cast(v8::Utils::OpenHandle(*result))
- ->HasSloppyArgumentsElements()));
- // Rebox before returning.
- return handle(JSObject::cast(*v8::Utils::OpenHandle(*result)), isolate);
-}
-
-
-// Compute the element keys from the interceptor.
-// TODO(jkummerow): Deprecated.
-MaybeHandle<JSObject> JSObject::GetKeysForIndexedInterceptor(
- Handle<JSObject> object, Handle<JSReceiver> receiver) {
- Isolate* isolate = receiver->GetIsolate();
- Handle<InterceptorInfo> interceptor(object->GetIndexedInterceptor());
- PropertyCallbackArguments
- args(isolate, interceptor->data(), *receiver, *object);
- v8::Local<v8::Object> result;
- if (!interceptor->enumerator()->IsUndefined()) {
- v8::IndexedPropertyEnumeratorCallback enum_fun =
- v8::ToCData<v8::IndexedPropertyEnumeratorCallback>(
- interceptor->enumerator());
- LOG(isolate, ApiObjectAccess("interceptor-indexed-enum", *object));
- result = args.Call(enum_fun);
- }
- if (result.IsEmpty()) return MaybeHandle<JSObject>();
- DCHECK(v8::Utils::OpenHandle(*result)->IsJSArray() ||
- (v8::Utils::OpenHandle(*result)->IsJSObject() &&
- Handle<JSObject>::cast(v8::Utils::OpenHandle(*result))
- ->HasSloppyArgumentsElements()));
- // Rebox before returning.
- return handle(JSObject::cast(*v8::Utils::OpenHandle(*result)), isolate);
-}
-
-
Maybe<bool> JSObject::HasRealNamedProperty(Handle<JSObject> object,
Handle<Name> name) {
LookupIterator it = LookupIterator::PropertyOrElement(
@@ -17909,6 +17850,9 @@ void Dictionary<Derived, Shape, Key>::CollectKeysTo(
if (filter & ONLY_ALL_CAN_READ) {
if (details.kind() != kAccessor) continue;
Object* accessors = raw_dict->ValueAt(i);
+ if (accessors->IsPropertyCell()) {
Jakob Kummerow 2015/12/04 13:39:29 cf. line 17883.
+ accessors = PropertyCell::cast(accessors)->value();
+ }
if (!accessors->IsAccessorInfo()) continue;
if (!AccessorInfo::cast(accessors)->all_can_read()) continue;
}
« no previous file with comments | « src/objects.h ('k') | src/runtime/runtime.h » ('j') | test/cctest/test-debug.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698