From 49bcf5c39680bddf45d9fef90e679b2440b20bfd Mon Sep 17 00:00:00 2001 From: "svenpanne@chromium.org" Date: Mon, 6 Feb 2012 13:54:46 +0000 Subject: [PATCH] Consolidated property counting methods a bit. Review URL: https://chromiumcodereview.appspot.com/9317119 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@10611 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/handles.cc | 4 ++-- src/objects.cc | 30 +++++++++--------------------- src/objects.h | 9 ++++----- src/runtime.cc | 4 ++-- 4 files changed, 17 insertions(+), 30 deletions(-) diff --git a/src/handles.cc b/src/handles.cc index 34eaddb..943a1c0 100644 --- a/src/handles.cc +++ b/src/handles.cc @@ -711,7 +711,7 @@ Handle GetEnumPropertyKeys(Handle object, isolate); } isolate->counters()->enum_cache_misses()->Increment(); - int num_enum = object->NumberOfEnumProperties(); + int num_enum = object->NumberOfLocalProperties(DONT_ENUM); Handle storage = isolate->factory()->NewFixedArray(num_enum); Handle sort_array = isolate->factory()->NewFixedArray(num_enum); Handle descs = @@ -735,7 +735,7 @@ Handle GetEnumPropertyKeys(Handle object, ASSERT(storage->length() == index); return storage; } else { - int num_enum = object->NumberOfEnumProperties(); + int num_enum = object->NumberOfLocalProperties(DONT_ENUM); Handle storage = isolate->factory()->NewFixedArray(num_enum); Handle sort_array = isolate->factory()->NewFixedArray(num_enum); object->property_dictionary()->CopyEnumKeysTo(*storage, *sort_array); diff --git a/src/objects.cc b/src/objects.cc index 692fa87..d3d2d8f 100644 --- a/src/objects.cc +++ b/src/objects.cc @@ -4247,11 +4247,14 @@ bool JSReceiver::IsSimpleEnum() { } -int Map::NumberOfDescribedProperties() { +int Map::NumberOfDescribedProperties(PropertyAttributes filter) { int result = 0; DescriptorArray* descs = instance_descriptors(); for (int i = 0; i < descs->number_of_descriptors(); i++) { - if (descs->IsProperty(i)) result++; + PropertyDetails details(descs->GetDetails(i)); + if (descs->IsProperty(i) && (details.attributes() & filter) == 0) { + result++; + } } return result; } @@ -10355,24 +10358,9 @@ bool JSObject::HasRealNamedCallbackProperty(String* key) { int JSObject::NumberOfLocalProperties(PropertyAttributes filter) { - if (HasFastProperties()) { - DescriptorArray* descs = map()->instance_descriptors(); - int result = 0; - for (int i = 0; i < descs->number_of_descriptors(); i++) { - PropertyDetails details(descs->GetDetails(i)); - if (descs->IsProperty(i) && (details.attributes() & filter) == 0) { - result++; - } - } - return result; - } else { - return property_dictionary()->NumberOfElementsFilterAttributes(filter); - } -} - - -int JSObject::NumberOfEnumProperties() { - return NumberOfLocalProperties(static_cast(DONT_ENUM)); + return HasFastProperties() ? + map()->NumberOfDescribedProperties(filter) : + property_dictionary()->NumberOfElementsFilterAttributes(filter); } @@ -10493,7 +10481,7 @@ void FixedArray::SortPairs(FixedArray* numbers, uint32_t len) { // purpose of this function is to provide reflection information for the object // mirrors. void JSObject::GetLocalPropertyNames(FixedArray* storage, int index) { - ASSERT(storage->length() >= (NumberOfLocalProperties(NONE) - index)); + ASSERT(storage->length() >= (NumberOfLocalProperties() - index)); if (HasFastProperties()) { DescriptorArray* descs = map()->instance_descriptors(); for (int i = 0; i < descs->number_of_descriptors(); i++) { diff --git a/src/objects.h b/src/objects.h index 6edd6cc..17e66d7 100644 --- a/src/objects.h +++ b/src/objects.h @@ -1807,9 +1807,7 @@ class JSObject: public JSReceiver { // Returns the number of properties on this object filtering out properties // with the specified attributes (ignoring interceptors). - int NumberOfLocalProperties(PropertyAttributes filter); - // Returns the number of enumerable properties (ignoring interceptors). - int NumberOfEnumProperties(); + int NumberOfLocalProperties(PropertyAttributes filter = NONE); // Fill in details for properties into storage starting at the specified // index. void GetLocalPropertyNames(FixedArray* storage, int index); @@ -4638,8 +4636,9 @@ class Map: public HeapObject { // Returns the next free property index (only valid for FAST MODE). int NextFreePropertyIndex(); - // Returns the number of properties described in instance_descriptors. - int NumberOfDescribedProperties(); + // Returns the number of properties described in instance_descriptors + // filtering out properties with the specified attributes. + int NumberOfDescribedProperties(PropertyAttributes filter = NONE); // Casting. static inline Map* cast(Object* obj); diff --git a/src/runtime.cc b/src/runtime.cc index 308ef86..e46b855 100644 --- a/src/runtime.cc +++ b/src/runtime.cc @@ -165,7 +165,7 @@ MUST_USE_RESULT static MaybeObject* DeepCopyBoilerplate(Isolate* isolate, } } else { { MaybeObject* maybe_result = - heap->AllocateFixedArray(copy->NumberOfLocalProperties(NONE)); + heap->AllocateFixedArray(copy->NumberOfLocalProperties()); if (!maybe_result->ToObject(&result)) return maybe_result; } FixedArray* names = FixedArray::cast(result); @@ -5010,7 +5010,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_GetLocalPropertyNames) { return *isolate->factory()->NewJSArray(0); } int n; - n = jsproto->NumberOfLocalProperties(static_cast(NONE)); + n = jsproto->NumberOfLocalProperties(); local_property_count[i] = n; total_property_count += n; if (i < length - 1) { -- 2.7.4