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

Side by Side Diff: src/objects.cc

Issue 1426943007: Revert of "[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
« no previous file with comments | « src/objects.h ('k') | test/mjsunit/harmony/reflect.js » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 7571 matching lines...) Expand 10 before | Expand all | Expand 10 after
7582 Handle<FixedArray> storage = isolate->factory()->NewFixedArray(length); 7582 Handle<FixedArray> storage = isolate->factory()->NewFixedArray(length);
7583 dictionary->CopyEnumKeysTo(*storage); 7583 dictionary->CopyEnumKeysTo(*storage);
7584 return storage; 7584 return storage;
7585 } 7585 }
7586 } 7586 }
7587 7587
7588 7588
7589 MaybeHandle<FixedArray> JSReceiver::GetKeys(Handle<JSReceiver> object, 7589 MaybeHandle<FixedArray> JSReceiver::GetKeys(Handle<JSReceiver> object,
7590 KeyCollectionType type, 7590 KeyCollectionType type,
7591 KeyFilter filter, 7591 KeyFilter filter,
7592 GetKeysConversion getConversion, 7592 GetKeysConversion getConversion) {
7593 Enumerability enum_policy) {
7594 USE(ContainsOnlyValidKeys); 7593 USE(ContainsOnlyValidKeys);
7595 Isolate* isolate = object->GetIsolate(); 7594 Isolate* isolate = object->GetIsolate();
7596 KeyAccumulator accumulator(isolate, filter); 7595 KeyAccumulator accumulator(isolate, filter);
7597 Handle<JSFunction> arguments_function( 7596 Handle<JSFunction> arguments_function(
7598 JSFunction::cast(isolate->sloppy_arguments_map()->GetConstructor())); 7597 JSFunction::cast(isolate->sloppy_arguments_map()->GetConstructor()));
7599 PrototypeIterator::WhereToEnd end = type == OWN_ONLY 7598 PrototypeIterator::WhereToEnd end = type == OWN_ONLY
7600 ? PrototypeIterator::END_AT_NON_HIDDEN 7599 ? PrototypeIterator::END_AT_NON_HIDDEN
7601 : PrototypeIterator::END_AT_NULL; 7600 : PrototypeIterator::END_AT_NULL;
7602 PropertyAttributes attr_filter = static_cast<PropertyAttributes>(
7603 (enum_policy == RESPECT_ENUMERABILITY ? DONT_ENUM : NONE) |
7604 PRIVATE_SYMBOL);
7605
7606 // Only collect keys if access is permitted. 7601 // Only collect keys if access is permitted.
7607 for (PrototypeIterator iter(isolate, object, 7602 for (PrototypeIterator iter(isolate, object,
7608 PrototypeIterator::START_AT_RECEIVER); 7603 PrototypeIterator::START_AT_RECEIVER);
7609 !iter.IsAtEnd(end); iter.Advance()) { 7604 !iter.IsAtEnd(end); iter.Advance()) {
7610 accumulator.NextPrototype(); 7605 accumulator.NextPrototype();
7611 if (PrototypeIterator::GetCurrent(iter)->IsJSProxy()) { 7606 if (PrototypeIterator::GetCurrent(iter)->IsJSProxy()) {
7612 Handle<JSProxy> proxy = PrototypeIterator::GetCurrent<JSProxy>(iter); 7607 Handle<JSProxy> proxy = PrototypeIterator::GetCurrent<JSProxy>(iter);
7613 Handle<Object> args[] = { proxy }; 7608 Handle<Object> args[] = { proxy };
7614 Handle<Object> names; 7609 Handle<Object> names;
7615 ASSIGN_RETURN_ON_EXCEPTION( 7610 ASSIGN_RETURN_ON_EXCEPTION(
(...skipping 13 matching lines...) Expand all
7629 // Check access rights if required. 7624 // Check access rights if required.
7630 if (current->IsAccessCheckNeeded() && 7625 if (current->IsAccessCheckNeeded() &&
7631 !isolate->MayAccess(handle(isolate->context()), current)) { 7626 !isolate->MayAccess(handle(isolate->context()), current)) {
7632 if (iter.IsAtEnd(PrototypeIterator::END_AT_NON_HIDDEN)) { 7627 if (iter.IsAtEnd(PrototypeIterator::END_AT_NON_HIDDEN)) {
7633 isolate->ReportFailedAccessCheck(current); 7628 isolate->ReportFailedAccessCheck(current);
7634 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, FixedArray); 7629 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, FixedArray);
7635 } 7630 }
7636 break; 7631 break;
7637 } 7632 }
7638 7633
7639 JSObject::CollectOwnElementKeys(current, &accumulator, attr_filter); 7634 JSObject::CollectOwnElementKeys(current, &accumulator,
7635 static_cast<PropertyAttributes>(DONT_ENUM));
7640 7636
7641 // Add the element keys from the interceptor. 7637 // Add the element keys from the interceptor.
7642 if (current->HasIndexedInterceptor()) { 7638 if (current->HasIndexedInterceptor()) {
7643 Handle<JSObject> result; 7639 Handle<JSObject> result;
7644 if (JSObject::GetKeysForIndexedInterceptor(current, object) 7640 if (JSObject::GetKeysForIndexedInterceptor(current, object)
7645 .ToHandle(&result)) { 7641 .ToHandle(&result)) {
7646 accumulator.AddElementKeysFromInterceptor(result); 7642 accumulator.AddElementKeysFromInterceptor(result);
7647 } 7643 }
7648 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, FixedArray); 7644 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, FixedArray);
7649 } 7645 }
7650 7646
7651 if (filter == SKIP_SYMBOLS) { 7647 if (filter == SKIP_SYMBOLS) {
7652 if (enum_policy == IGNORE_ENUMERABILITY) UNIMPLEMENTED();
7653
7654 // We can cache the computed property keys if access checks are 7648 // We can cache the computed property keys if access checks are
7655 // not needed and no interceptors are involved. 7649 // not needed and no interceptors are involved.
7656 // 7650 //
7657 // We do not use the cache if the object has elements and 7651 // We do not use the cache if the object has elements and
7658 // therefore it does not make sense to cache the property names 7652 // therefore it does not make sense to cache the property names
7659 // for arguments objects. Arguments objects will always have 7653 // for arguments objects. Arguments objects will always have
7660 // elements. 7654 // elements.
7661 // Wrapped strings have elements, but don't have an elements 7655 // Wrapped strings have elements, but don't have an elements
7662 // array or dictionary. So the fast inline test for whether to 7656 // array or dictionary. So the fast inline test for whether to
7663 // use the cache says yes, so we should not create a cache. 7657 // use the cache says yes, so we should not create a cache.
7664 bool cache_enum_length = 7658 bool cache_enum_length =
7665 ((current->map()->GetConstructor() != *arguments_function) && 7659 ((current->map()->GetConstructor() != *arguments_function) &&
7666 !current->IsJSValue() && !current->IsAccessCheckNeeded() && 7660 !current->IsJSValue() && !current->IsAccessCheckNeeded() &&
7667 !current->HasNamedInterceptor() && 7661 !current->HasNamedInterceptor() &&
7668 !current->HasIndexedInterceptor()); 7662 !current->HasIndexedInterceptor());
7669 // Compute the property keys and cache them if possible. 7663 // Compute the property keys and cache them if possible.
7670 Handle<FixedArray> enum_keys = 7664 Handle<FixedArray> enum_keys =
7671 JSObject::GetEnumPropertyKeys(current, cache_enum_length); 7665 JSObject::GetEnumPropertyKeys(current, cache_enum_length);
7672 accumulator.AddKeys(enum_keys); 7666 accumulator.AddKeys(enum_keys);
7673 } else { 7667 } else {
7674 DCHECK(filter == INCLUDE_SYMBOLS); 7668 DCHECK(filter == INCLUDE_SYMBOLS);
7669 PropertyAttributes attr_filter =
7670 static_cast<PropertyAttributes>(DONT_ENUM | PRIVATE_SYMBOL);
7675 current->CollectOwnPropertyNames(&accumulator, attr_filter); 7671 current->CollectOwnPropertyNames(&accumulator, attr_filter);
7676 } 7672 }
7677 7673
7678 // Add the property keys from the interceptor. 7674 // Add the property keys from the interceptor.
7679 if (current->HasNamedInterceptor()) { 7675 if (current->HasNamedInterceptor()) {
7680 Handle<JSObject> result; 7676 Handle<JSObject> result;
7681 if (JSObject::GetKeysForNamedInterceptor(current, object) 7677 if (JSObject::GetKeysForNamedInterceptor(current, object)
7682 .ToHandle(&result)) { 7678 .ToHandle(&result)) {
7683 accumulator.AddKeys(result); 7679 accumulator.AddKeys(result);
7684 } 7680 }
(...skipping 10223 matching lines...) Expand 10 before | Expand all | Expand 10 after
17908 if (cell->value() != *new_value) { 17904 if (cell->value() != *new_value) {
17909 cell->set_value(*new_value); 17905 cell->set_value(*new_value);
17910 Isolate* isolate = cell->GetIsolate(); 17906 Isolate* isolate = cell->GetIsolate();
17911 cell->dependent_code()->DeoptimizeDependentCodeGroup( 17907 cell->dependent_code()->DeoptimizeDependentCodeGroup(
17912 isolate, DependentCode::kPropertyCellChangedGroup); 17908 isolate, DependentCode::kPropertyCellChangedGroup);
17913 } 17909 }
17914 } 17910 }
17915 17911
17916 } // namespace internal 17912 } // namespace internal
17917 } // namespace v8 17913 } // namespace v8
OLDNEW
« no previous file with comments | « src/objects.h ('k') | test/mjsunit/harmony/reflect.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698