Ensure all maps gathered from the ICs are updated if deprecated.
authordanno@chromium.org <danno@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Wed, 15 May 2013 09:04:10 +0000 (09:04 +0000)
committerdanno@chromium.org <danno@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Wed, 15 May 2013 09:04:10 +0000 (09:04 +0000)
Add ASSERT to SmallMapList::Add to ensure no deprecated maps are ever added.

BUG=
R=danno@chromium.org

Review URL: https://codereview.chromium.org/15179004

Patch from Toon Verwaest <verwaest@chromium.org>.

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@14675 ce2b1a6d-e550-0410-aec6-3dcde31c8c00

src/ast.h
src/type-info.cc

index a32540c..d697da7 100644 (file)
--- a/src/ast.h
+++ b/src/ast.h
@@ -286,6 +286,7 @@ class SmallMapList {
   }
 
   void Add(Handle<Map> handle, Zone* zone) {
+    ASSERT(!handle->is_deprecated());
     list_.Add(handle.location(), zone);
   }
 
index 1757bee..d52536e 100644 (file)
@@ -192,13 +192,14 @@ Handle<Map> TypeFeedbackOracle::LoadMonomorphicReceiverType(Property* expr) {
   Handle<Object> map_or_code = GetInfo(expr->PropertyFeedbackId());
   if (map_or_code->IsCode()) {
     Handle<Code> code = Handle<Code>::cast(map_or_code);
-    Map* first_map = code->FindFirstMap();
-    ASSERT(first_map != NULL);
-    return CanRetainOtherContext(first_map, *native_context_)
+    Handle<Map> first_map(code->FindFirstMap());
+    ASSERT(!first_map.is_null());
+    first_map = Map::CurrentMapForDeprecated(first_map);
+    return CanRetainOtherContext(*first_map, *native_context_)
         ? Handle<Map>::null()
-        : Handle<Map>(first_map);
+        : first_map;
   }
-  return Handle<Map>::cast(map_or_code);
+  return Map::CurrentMapForDeprecated(Handle<Map>::cast(map_or_code));
 }
 
 
@@ -208,13 +209,14 @@ Handle<Map> TypeFeedbackOracle::StoreMonomorphicReceiverType(
   Handle<Object> map_or_code = GetInfo(ast_id);
   if (map_or_code->IsCode()) {
     Handle<Code> code = Handle<Code>::cast(map_or_code);
-    Map* first_map = code->FindFirstMap();
-    ASSERT(first_map != NULL);
-    return CanRetainOtherContext(first_map, *native_context_)
+    Handle<Map> first_map(code->FindFirstMap());
+    ASSERT(!first_map.is_null());
+    first_map = Map::CurrentMapForDeprecated(first_map);
+    return CanRetainOtherContext(*first_map, *native_context_)
         ? Handle<Map>::null()
-        : Handle<Map>(first_map);
+        : first_map;
   }
-  return Handle<Map>::cast(map_or_code);
+  return Map::CurrentMapForDeprecated(Handle<Map>::cast(map_or_code));
 }
 
 
@@ -223,7 +225,9 @@ Handle<Map> TypeFeedbackOracle::CompareNilMonomorphicReceiverType(
   Handle<Object> maybe_code = GetInfo(id);
   if (maybe_code->IsCode()) {
     Map* first_map = Handle<Code>::cast(maybe_code)->FindFirstMap();
-    if (first_map != NULL) return Handle<Map>(first_map);
+    if (first_map != NULL) {
+      return Map::CurrentMapForDeprecated(Handle<Map>(first_map));
+    }
   }
   return Handle<Map>();
 }
@@ -347,7 +351,8 @@ ElementsKind TypeFeedbackOracle::GetCallNewElementsKind(CallNew* expr) {
 Handle<Map> TypeFeedbackOracle::GetObjectLiteralStoreMap(
     ObjectLiteral::Property* prop) {
   ASSERT(ObjectLiteralStoreIsMonomorphic(prop));
-  return Handle<Map>::cast(GetInfo(prop->key()->LiteralFeedbackId()));
+  return Map::CurrentMapForDeprecated(
+      Handle<Map>::cast(GetInfo(prop->key()->LiteralFeedbackId())));
 }
 
 
@@ -426,11 +431,12 @@ Handle<Map> TypeFeedbackOracle::GetCompareMap(CompareOperation* expr) {
   if (state != CompareIC::KNOWN_OBJECT) {
     return Handle<Map>::null();
   }
-  Map* first_map = code->FindFirstMap();
-  ASSERT(first_map != NULL);
-  return CanRetainOtherContext(first_map, *native_context_)
+  Handle<Map> first_map(code->FindFirstMap());
+  ASSERT(!first_map.is_null());
+  first_map = Map::CurrentMapForDeprecated(first_map);
+  return CanRetainOtherContext(*first_map, *native_context_)
       ? Handle<Map>::null()
-      : Handle<Map>(first_map);
+      : first_map;
 }