Revision: 12542
Author:   [email protected]
Date:     Wed Sep 19 01:08:02 2012
Log:      Clear EnumIndices as well on CNLT.

BUG=

Review URL: https://chromiumcodereview.appspot.com/10944011
http://code.google.com/p/v8/source/detail?r=12542

Modified:
 /branches/bleeding_edge/src/handles.cc
 /branches/bleeding_edge/src/objects.cc
 /branches/bleeding_edge/src/objects.h

=======================================
--- /branches/bleeding_edge/src/handles.cc      Wed Sep 12 09:43:57 2012
+++ /branches/bleeding_edge/src/handles.cc      Wed Sep 19 01:08:02 2012
@@ -735,7 +735,7 @@
       }

       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
=======================================
--- /branches/bleeding_edge/src/objects.cc      Tue Sep 18 06:25:12 2012
+++ /branches/bleeding_edge/src/objects.cc      Wed Sep 19 01:08:02 2012
@@ -6106,7 +6106,7 @@
   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 @@
           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);
+              }
             }
           }
         }
=======================================
--- /branches/bleeding_edge/src/objects.h       Tue Sep 18 06:25:12 2012
+++ /branches/bleeding_edge/src/objects.h       Wed Sep 19 01:08:02 2012
@@ -2507,10 +2507,24 @@
     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