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

Side by Side Diff: src/objects.cc

Issue 1405243006: [es6] Partially implement Reflect.ownKeys. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 1 month 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 unified diff | Download patch
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/objects.h" 5 #include "src/objects.h"
6 6
7 #include <cmath> 7 #include <cmath>
8 #include <iomanip> 8 #include <iomanip>
9 #include <sstream> 9 #include <sstream>
10 10
(...skipping 7565 matching lines...) Expand 10 before | Expand all | Expand 10 after
7576 Handle<FixedArray> storage = isolate->factory()->NewFixedArray(length); 7576 Handle<FixedArray> storage = isolate->factory()->NewFixedArray(length);
7577 dictionary->CopyEnumKeysTo(*storage); 7577 dictionary->CopyEnumKeysTo(*storage);
7578 return storage; 7578 return storage;
7579 } 7579 }
7580 } 7580 }
7581 7581
7582 7582
7583 MaybeHandle<FixedArray> JSReceiver::GetKeys(Handle<JSReceiver> object, 7583 MaybeHandle<FixedArray> JSReceiver::GetKeys(Handle<JSReceiver> object,
7584 KeyCollectionType type, 7584 KeyCollectionType type,
7585 KeyFilter filter, 7585 KeyFilter filter,
7586 GetKeysConversion getConversion) { 7586 GetKeysConversion getConversion,
7587 bool only_enumerables) {
7587 USE(ContainsOnlyValidKeys); 7588 USE(ContainsOnlyValidKeys);
7588 Isolate* isolate = object->GetIsolate(); 7589 Isolate* isolate = object->GetIsolate();
7589 KeyAccumulator accumulator(isolate, filter); 7590 KeyAccumulator accumulator(isolate, filter);
7590 Handle<JSFunction> arguments_function( 7591 Handle<JSFunction> arguments_function(
7591 JSFunction::cast(isolate->sloppy_arguments_map()->GetConstructor())); 7592 JSFunction::cast(isolate->sloppy_arguments_map()->GetConstructor()));
7592 PrototypeIterator::WhereToEnd end = type == OWN_ONLY 7593 PrototypeIterator::WhereToEnd end = type == OWN_ONLY
7593 ? PrototypeIterator::END_AT_NON_HIDDEN 7594 ? PrototypeIterator::END_AT_NON_HIDDEN
7594 : PrototypeIterator::END_AT_NULL; 7595 : PrototypeIterator::END_AT_NULL;
7595 // Only collect keys if access is permitted. 7596 // Only collect keys if access is permitted.
7596 for (PrototypeIterator iter(isolate, object, 7597 for (PrototypeIterator iter(isolate, object,
(...skipping 21 matching lines...) Expand all
7618 // Check access rights if required. 7619 // Check access rights if required.
7619 if (current->IsAccessCheckNeeded() && 7620 if (current->IsAccessCheckNeeded() &&
7620 !isolate->MayAccess(handle(isolate->context()), current)) { 7621 !isolate->MayAccess(handle(isolate->context()), current)) {
7621 if (iter.IsAtEnd(PrototypeIterator::END_AT_NON_HIDDEN)) { 7622 if (iter.IsAtEnd(PrototypeIterator::END_AT_NON_HIDDEN)) {
7622 isolate->ReportFailedAccessCheck(current); 7623 isolate->ReportFailedAccessCheck(current);
7623 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, FixedArray); 7624 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, FixedArray);
7624 } 7625 }
7625 break; 7626 break;
7626 } 7627 }
7627 7628
7628 JSObject::CollectOwnElementKeys(current, &accumulator, 7629 JSObject::CollectOwnElementKeys(
7629 static_cast<PropertyAttributes>(DONT_ENUM)); 7630 current, &accumulator,
7631 static_cast<PropertyAttributes>(only_enumerables ? DONT_ENUM : NONE));
7630 7632
7631 // Add the element keys from the interceptor. 7633 // Add the element keys from the interceptor.
7632 if (current->HasIndexedInterceptor()) { 7634 if (current->HasIndexedInterceptor()) {
7633 Handle<JSObject> result; 7635 Handle<JSObject> result;
7634 if (JSObject::GetKeysForIndexedInterceptor(current, object) 7636 if (JSObject::GetKeysForIndexedInterceptor(current, object)
7635 .ToHandle(&result)) { 7637 .ToHandle(&result)) {
7636 accumulator.AddElementKeysFromInterceptor(result); 7638 accumulator.AddElementKeysFromInterceptor(result);
7637 } 7639 }
7638 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, FixedArray); 7640 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, FixedArray);
7639 } 7641 }
7640 7642
7641 if (filter == SKIP_SYMBOLS) { 7643 if (filter == SKIP_SYMBOLS) {
7644 if (!only_enumerables) UNIMPLEMENTED();
7645
7642 // We can cache the computed property keys if access checks are 7646 // We can cache the computed property keys if access checks are
7643 // not needed and no interceptors are involved. 7647 // not needed and no interceptors are involved.
7644 // 7648 //
7645 // We do not use the cache if the object has elements and 7649 // We do not use the cache if the object has elements and
7646 // therefore it does not make sense to cache the property names 7650 // therefore it does not make sense to cache the property names
7647 // for arguments objects. Arguments objects will always have 7651 // for arguments objects. Arguments objects will always have
7648 // elements. 7652 // elements.
7649 // Wrapped strings have elements, but don't have an elements 7653 // Wrapped strings have elements, but don't have an elements
7650 // array or dictionary. So the fast inline test for whether to 7654 // array or dictionary. So the fast inline test for whether to
7651 // use the cache says yes, so we should not create a cache. 7655 // use the cache says yes, so we should not create a cache.
7652 bool cache_enum_length = 7656 bool cache_enum_length =
7653 ((current->map()->GetConstructor() != *arguments_function) && 7657 ((current->map()->GetConstructor() != *arguments_function) &&
7654 !current->IsJSValue() && !current->IsAccessCheckNeeded() && 7658 !current->IsJSValue() && !current->IsAccessCheckNeeded() &&
7655 !current->HasNamedInterceptor() && 7659 !current->HasNamedInterceptor() &&
7656 !current->HasIndexedInterceptor()); 7660 !current->HasIndexedInterceptor());
7657 // Compute the property keys and cache them if possible. 7661 // Compute the property keys and cache them if possible.
7658 Handle<FixedArray> enum_keys = 7662 Handle<FixedArray> enum_keys =
7659 JSObject::GetEnumPropertyKeys(current, cache_enum_length); 7663 JSObject::GetEnumPropertyKeys(current, cache_enum_length);
7660 accumulator.AddKeys(enum_keys); 7664 accumulator.AddKeys(enum_keys);
7661 } else { 7665 } else {
7662 DCHECK(filter == INCLUDE_SYMBOLS); 7666 DCHECK(filter == INCLUDE_SYMBOLS);
7663 PropertyAttributes attr_filter = 7667 PropertyAttributes attr_filter = static_cast<PropertyAttributes>(
7664 static_cast<PropertyAttributes>(DONT_ENUM | PRIVATE_SYMBOL); 7668 (only_enumerables ? DONT_ENUM : NONE) | PRIVATE_SYMBOL);
Camillo Bruni 2015/11/05 08:29:35 If we're already at it, could you move attr_filter
7665 current->CollectOwnPropertyNames(&accumulator, attr_filter); 7669 current->CollectOwnPropertyNames(&accumulator, attr_filter);
7666 } 7670 }
7667 7671
7668 // Add the property keys from the interceptor. 7672 // Add the property keys from the interceptor.
7669 if (current->HasNamedInterceptor()) { 7673 if (current->HasNamedInterceptor()) {
7670 Handle<JSObject> result; 7674 Handle<JSObject> result;
7671 if (JSObject::GetKeysForNamedInterceptor(current, object) 7675 if (JSObject::GetKeysForNamedInterceptor(current, object)
7672 .ToHandle(&result)) { 7676 .ToHandle(&result)) {
7673 accumulator.AddKeys(result); 7677 accumulator.AddKeys(result);
7674 } 7678 }
(...skipping 10205 matching lines...) Expand 10 before | Expand all | Expand 10 after
17880 if (cell->value() != *new_value) { 17884 if (cell->value() != *new_value) {
17881 cell->set_value(*new_value); 17885 cell->set_value(*new_value);
17882 Isolate* isolate = cell->GetIsolate(); 17886 Isolate* isolate = cell->GetIsolate();
17883 cell->dependent_code()->DeoptimizeDependentCodeGroup( 17887 cell->dependent_code()->DeoptimizeDependentCodeGroup(
17884 isolate, DependentCode::kPropertyCellChangedGroup); 17888 isolate, DependentCode::kPropertyCellChangedGroup);
17885 } 17889 }
17886 } 17890 }
17887 17891
17888 } // namespace internal 17892 } // namespace internal
17889 } // namespace v8 17893 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698