Reviewers: Jakob,

Message:
PTAL.

Description:
Clear EnumIndices as well on CNLT.


BUG=


Please review this at https://chromiumcodereview.appspot.com/10944011/

SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge

Affected files:
  M src/handles.cc
  M src/objects.h
  M src/objects.cc


Index: src/handles.cc
diff --git a/src/handles.cc b/src/handles.cc
index 7999a10614b50c76f3e5cf967570441bd9059e97..46399d65ea141412dcbad66952678bc147068405 100644
--- a/src/handles.cc
+++ b/src/handles.cc
@@ -735,7 +735,7 @@ Handle<FixedArray> GetEnumPropertyKeys(Handle<JSObject> object,
       }

       DescriptorArray* desc = object->map()->instance_descriptors();
- Handle<FixedArray> keys(FixedArray::cast(desc->GetEnumCache()), isolate);
+      Handle<FixedArray> keys(desc->GetEnumCache(), isolate);

       // In case the number of properties required in the enum are actually
// present, we can reuse the enum cache. Otherwise, this means that the
Index: src/objects.cc
diff --git a/src/objects.cc b/src/objects.cc
index 12aeef7d5dc08afc8a4796fabeec4a62dc72297c..db2c1eb75d5cfd40c7c7dfce590c96f4df9b13d0 100644
--- a/src/objects.cc
+++ b/src/objects.cc
@@ -6106,7 +6106,7 @@ void DescriptorArray::SetEnumCache(FixedArray* bridge_storage,
   ASSERT(bridge_storage->length() >= kEnumCacheBridgeLength);
   ASSERT(new_index_cache->IsSmi() || new_index_cache->IsFixedArray());
   if (HasEnumCache()) {
- ASSERT(new_cache->length() > FixedArray::cast(GetEnumCache())->length());
+    ASSERT(new_cache->length() > GetEnumCache()->length());
     FixedArray::cast(get(kEnumCacheIndex))->
       set(kEnumCacheBridgeCacheIndex, new_cache);
     FixedArray::cast(get(kEnumCacheIndex))->
@@ -7521,12 +7521,15 @@ void Map::ClearNonLiveTransitions(Heap* heap) {
           if (live_enum == 0) {
             descriptors->ClearEnumCache();
           } else {
-            FixedArray* enum_cache =
-                FixedArray::cast(descriptors->GetEnumCache());
+            FixedArray* enum_cache = descriptors->GetEnumCache();
             to_trim = enum_cache->length() - live_enum;
             if (to_trim > 0) {
               RightTrimFixedArray<FROM_GC>(
- heap, FixedArray::cast(descriptors->GetEnumCache()), to_trim);
+                  heap, descriptors->GetEnumCache(), to_trim);
+              if (descriptors->HasEnumIndicesCache()) {
+                RightTrimFixedArray<FROM_GC>(
+                    heap, descriptors->GetEnumIndicesCache(), to_trim);
+              }
             }
           }
         }
Index: src/objects.h
diff --git a/src/objects.h b/src/objects.h
index a4653aa061138c328d365490361383a43d806be8..8d17eb6636036b643efb6424f856c5abacf7e358 100644
--- a/src/objects.h
+++ b/src/objects.h
@@ -2507,10 +2507,24 @@ class DescriptorArray: public FixedArray {
     set(kEnumCacheIndex, array->get(kEnumCacheIndex));
   }

-  Object* GetEnumCache() {
+  FixedArray* GetEnumCache() {
     ASSERT(HasEnumCache());
     FixedArray* bridge = FixedArray::cast(get(kEnumCacheIndex));
-    return bridge->get(kEnumCacheBridgeCacheIndex);
+    return FixedArray::cast(bridge->get(kEnumCacheBridgeCacheIndex));
+  }
+
+  bool HasEnumIndicesCache() {
+    if (IsEmpty()) return false;;
+    Object* object = get(kEnumCacheIndex);
+    if (object->IsSmi()) return false;
+    FixedArray* bridge = FixedArray::cast(object);
+    return bridge->get(kEnumCacheBridgeIndicesCacheIndex)->IsSmi();
+  }
+
+  FixedArray* GetEnumIndicesCache() {
+    ASSERT(HasEnumIndicesCache());
+    FixedArray* bridge = FixedArray::cast(get(kEnumCacheIndex));
+ return FixedArray::cast(bridge->get(kEnumCacheBridgeIndicesCacheIndex));
   }

   Object** GetEnumCacheSlot() {


--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev

Reply via email to