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