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