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

Side by Side Diff: src/objects.cc

Issue 1515473003: [cleanup] Drop JSObject::GetOwnPropertyNames(). (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: rebased 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 unified diff | Download patch
« no previous file with comments | « src/objects.h ('k') | src/property-details.h » ('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 7779 matching lines...) Expand 10 before | Expand all | Expand 10 after
7790 } else { 7790 } else {
7791 if (copying) { 7791 if (copying) {
7792 Representation representation = details.representation(); 7792 Representation representation = details.representation();
7793 value = Object::NewStorageFor(isolate, value, representation); 7793 value = Object::NewStorageFor(isolate, value, representation);
7794 copy->FastPropertyAtPut(index, *value); 7794 copy->FastPropertyAtPut(index, *value);
7795 } 7795 }
7796 } 7796 }
7797 } 7797 }
7798 } 7798 }
7799 } else { 7799 } else {
7800 Handle<FixedArray> names = 7800 // Only deep copy fields from the object literal expression.
7801 isolate->factory()->NewFixedArray(copy->NumberOfOwnProperties()); 7801 // In particular, don't try to copy the length attribute of
7802 copy->GetOwnPropertyNames(*names, 0); 7802 // an array.
7803 PropertyFilter filter = static_cast<PropertyFilter>(
7804 ONLY_WRITABLE | ONLY_ENUMERABLE | ONLY_CONFIGURABLE);
7805 KeyAccumulator accumulator(isolate, filter);
7806 accumulator.NextPrototype();
7807 copy->CollectOwnPropertyNames(&accumulator, filter);
7808 Handle<FixedArray> names = accumulator.GetKeys();
7803 for (int i = 0; i < names->length(); i++) { 7809 for (int i = 0; i < names->length(); i++) {
7804 DCHECK(names->get(i)->IsName()); 7810 DCHECK(names->get(i)->IsName());
7805 Handle<Name> name(Name::cast(names->get(i))); 7811 Handle<Name> name(Name::cast(names->get(i)));
7806 Maybe<PropertyAttributes> maybe =
7807 JSReceiver::GetOwnPropertyAttributes(copy, name);
7808 DCHECK(maybe.IsJust());
7809 PropertyAttributes attributes = maybe.FromJust();
7810 // Only deep copy fields from the object literal expression.
7811 // In particular, don't try to copy the length attribute of
7812 // an array.
7813 if (attributes != NONE) continue;
7814 Handle<Object> value = 7812 Handle<Object> value =
7815 Object::GetProperty(copy, name).ToHandleChecked(); 7813 Object::GetProperty(copy, name).ToHandleChecked();
7816 if (value->IsJSObject()) { 7814 if (value->IsJSObject()) {
7817 Handle<JSObject> result; 7815 Handle<JSObject> result;
7818 ASSIGN_RETURN_ON_EXCEPTION( 7816 ASSIGN_RETURN_ON_EXCEPTION(
7819 isolate, result, 7817 isolate, result,
7820 VisitElementOrProperty(copy, Handle<JSObject>::cast(value)), 7818 VisitElementOrProperty(copy, Handle<JSObject>::cast(value)),
7821 JSObject); 7819 JSObject);
7822 if (copying) { 7820 if (copying) {
7823 // Creating object copy for literals. No strict mode needed. 7821 // Creating object copy for literals. No strict mode needed.
(...skipping 8010 matching lines...) Expand 10 before | Expand all | Expand 10 after
15834 Maybe<bool> JSObject::HasRealNamedCallbackProperty(Handle<JSObject> object, 15832 Maybe<bool> JSObject::HasRealNamedCallbackProperty(Handle<JSObject> object,
15835 Handle<Name> name) { 15833 Handle<Name> name) {
15836 LookupIterator it = LookupIterator::PropertyOrElement( 15834 LookupIterator it = LookupIterator::PropertyOrElement(
15837 name->GetIsolate(), object, name, LookupIterator::OWN_SKIP_INTERCEPTOR); 15835 name->GetIsolate(), object, name, LookupIterator::OWN_SKIP_INTERCEPTOR);
15838 Maybe<PropertyAttributes> maybe_result = GetPropertyAttributes(&it); 15836 Maybe<PropertyAttributes> maybe_result = GetPropertyAttributes(&it);
15839 return maybe_result.IsJust() ? Just(it.state() == LookupIterator::ACCESSOR) 15837 return maybe_result.IsJust() ? Just(it.state() == LookupIterator::ACCESSOR)
15840 : Nothing<bool>(); 15838 : Nothing<bool>();
15841 } 15839 }
15842 15840
15843 15841
15844 // Private symbols are always filtered out.
15845 int JSObject::NumberOfOwnProperties(PropertyFilter filter) {
15846 if (HasFastProperties()) {
15847 Map* map = this->map();
15848 if (filter == ENUMERABLE_STRINGS) {
15849 // The cached enum length was computed with filter == ENUMERABLE_STRING,
15850 // so that's the only filter for which it's valid to retrieve it.
15851 int result = map->EnumLength();
15852 if (result != kInvalidEnumCacheSentinel) return result;
15853 }
15854 return map->NumberOfDescribedProperties(OWN_DESCRIPTORS, filter);
15855 } else if (IsJSGlobalObject()) {
15856 return global_dictionary()->NumberOfElementsFilterAttributes(filter);
15857 } else {
15858 return property_dictionary()->NumberOfElementsFilterAttributes(filter);
15859 }
15860 }
15861
15862
15863 void FixedArray::SwapPairs(FixedArray* numbers, int i, int j) { 15842 void FixedArray::SwapPairs(FixedArray* numbers, int i, int j) {
15864 Object* temp = get(i); 15843 Object* temp = get(i);
15865 set(i, get(j)); 15844 set(i, get(j));
15866 set(j, temp); 15845 set(j, temp);
15867 if (this != numbers) { 15846 if (this != numbers) {
15868 temp = numbers->get(i); 15847 temp = numbers->get(i);
15869 numbers->set(i, Smi::cast(numbers->get(j))); 15848 numbers->set(i, Smi::cast(numbers->get(j)));
15870 numbers->set(j, Smi::cast(temp)); 15849 numbers->set(j, Smi::cast(temp));
15871 } 15850 }
15872 } 15851 }
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
15966 SwapPairs(numbers, i, p); 15945 SwapPairs(numbers, i, p);
15967 } 15946 }
15968 } 15947 }
15969 } else { 15948 } else {
15970 HeapSortPairs(this, numbers, len); 15949 HeapSortPairs(this, numbers, len);
15971 return; 15950 return;
15972 } 15951 }
15973 } 15952 }
15974 15953
15975 15954
15976 // Fill in the names of own properties into the supplied storage. The main
15977 // purpose of this function is to provide reflection information for the object
15978 // mirrors.
15979 int JSObject::GetOwnPropertyNames(FixedArray* storage, int index,
15980 PropertyFilter filter) {
15981 DCHECK(storage->length() >= (NumberOfOwnProperties(filter) - index));
15982 if (HasFastProperties()) {
15983 int start_index = index;
15984 int real_size = map()->NumberOfOwnDescriptors();
15985 DescriptorArray* descs = map()->instance_descriptors();
15986 for (int i = 0; i < real_size; i++) {
15987 if ((descs->GetDetails(i).attributes() & filter) == 0 &&
15988 !descs->GetKey(i)->FilterKey(filter)) {
15989 storage->set(index++, descs->GetKey(i));
15990 }
15991 }
15992 return index - start_index;
15993 } else if (IsJSGlobalObject()) {
15994 return global_dictionary()->CopyKeysTo(storage, index, filter,
15995 GlobalDictionary::UNSORTED);
15996 } else {
15997 return property_dictionary()->CopyKeysTo(storage, index, filter,
15998 NameDictionary::UNSORTED);
15999 }
16000 }
16001
16002
16003 void JSObject::CollectOwnPropertyNames(KeyAccumulator* keys, 15955 void JSObject::CollectOwnPropertyNames(KeyAccumulator* keys,
16004 PropertyFilter filter) { 15956 PropertyFilter filter) {
16005 if (HasFastProperties()) { 15957 if (HasFastProperties()) {
16006 int real_size = map()->NumberOfOwnDescriptors(); 15958 int real_size = map()->NumberOfOwnDescriptors();
16007 Handle<DescriptorArray> descs(map()->instance_descriptors()); 15959 Handle<DescriptorArray> descs(map()->instance_descriptors());
16008 for (int i = 0; i < real_size; i++) { 15960 for (int i = 0; i < real_size; i++) {
16009 PropertyDetails details = descs->GetDetails(i); 15961 PropertyDetails details = descs->GetDetails(i);
16010 if ((details.attributes() & filter) != 0) continue; 15962 if ((details.attributes() & filter) != 0) continue;
16011 if (filter & ONLY_ALL_CAN_READ) { 15963 if (filter & ONLY_ALL_CAN_READ) {
16012 if (details.kind() != kAccessor) continue; 15964 if (details.kind() != kAccessor) continue;
(...skipping 3222 matching lines...) Expand 10 before | Expand all | Expand 10 after
19235 if (cell->value() != *new_value) { 19187 if (cell->value() != *new_value) {
19236 cell->set_value(*new_value); 19188 cell->set_value(*new_value);
19237 Isolate* isolate = cell->GetIsolate(); 19189 Isolate* isolate = cell->GetIsolate();
19238 cell->dependent_code()->DeoptimizeDependentCodeGroup( 19190 cell->dependent_code()->DeoptimizeDependentCodeGroup(
19239 isolate, DependentCode::kPropertyCellChangedGroup); 19191 isolate, DependentCode::kPropertyCellChangedGroup);
19240 } 19192 }
19241 } 19193 }
19242 19194
19243 } // namespace internal 19195 } // namespace internal
19244 } // namespace v8 19196 } // namespace v8
OLDNEW
« no previous file with comments | « src/objects.h ('k') | src/property-details.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698