| Index: src/factory.cc | 
| diff --git a/src/factory.cc b/src/factory.cc | 
| index 06373d2d8a39f62c0f98db6fd4978270f486f350..e25e6c2c3584a0a8fcfe9c1f4c8df1cabc7ec7f2 100644 | 
| --- a/src/factory.cc | 
| +++ b/src/factory.cc | 
| @@ -2344,28 +2344,44 @@ Handle<Map> Factory::ObjectLiteralMapFromCache(Handle<Context> context, | 
| const int kMapCacheSize = 128; | 
|  | 
| // We do not cache maps for too many properties or when running builtin code. | 
| -  // TODO(rossberg): cache strong maps properly | 
| -  if (number_of_properties > kMapCacheSize || is_strong || | 
| +  if (number_of_properties > kMapCacheSize || | 
| isolate()->bootstrapper()->IsActive()) { | 
| *is_result_from_cache = false; | 
| Handle<Map> map = Map::Create(isolate(), number_of_properties); | 
| -    if (is_strong) map->set_is_strong(true); | 
| +    if (is_strong) map->set_is_strong(); | 
| return map; | 
| } | 
| *is_result_from_cache = true; | 
| if (number_of_properties == 0) { | 
| // Reuse the initial map of the Object function if the literal has no | 
| -    // predeclared properties. | 
| -    return handle(context->object_function()->initial_map(), isolate()); | 
| +    // predeclared properties, or the strong map if strong. | 
| +    return handle(is_strong | 
| +                      ? context->js_object_strong_map() | 
| +                      : context->object_function()->initial_map(), isolate()); | 
| } | 
| + | 
| +  // Create a new map and add it to the cache. | 
| +  Handle<Map> map = Map::Create(isolate(), number_of_properties); | 
| int cache_index = number_of_properties - 1; | 
| -  if (context->map_cache()->IsUndefined()) { | 
| -    // Allocate the new map cache for the native context. | 
| -    Handle<FixedArray> new_cache = NewFixedArray(kMapCacheSize, TENURED); | 
| -    context->set_map_cache(*new_cache); | 
| +  Handle<FixedArray> cache; | 
| +  if (is_strong) { | 
| +    map->set_is_strong(); | 
| +    if (context->strong_map_cache()->IsUndefined()) { | 
| +      // Allocate the new map cache for the native context. | 
| +      Handle<FixedArray> new_cache = NewFixedArray(kMapCacheSize, TENURED); | 
| +      context->set_strong_map_cache(*new_cache); | 
| +    } | 
| +    // Check to see whether there is a matching element in the cache. | 
| +    cache = handle(FixedArray::cast(context->strong_map_cache())); | 
| +  } else { | 
| +    if (context->map_cache()->IsUndefined()) { | 
| +      // Allocate the new map cache for the native context. | 
| +      Handle<FixedArray> new_cache = NewFixedArray(kMapCacheSize, TENURED); | 
| +      context->set_map_cache(*new_cache); | 
| +    } | 
| +    // Check to see whether there is a matching element in the cache. | 
| +    cache = handle(FixedArray::cast(context->map_cache())); | 
| } | 
| -  // Check to see whether there is a matching element in the cache. | 
| -  Handle<FixedArray> cache(FixedArray::cast(context->map_cache())); | 
| { | 
| Object* result = cache->get(cache_index); | 
| if (result->IsWeakCell()) { | 
| @@ -2375,8 +2391,6 @@ Handle<Map> Factory::ObjectLiteralMapFromCache(Handle<Context> context, | 
| } | 
| } | 
| } | 
| -  // Create a new map and add it to the cache. | 
| -  Handle<Map> map = Map::Create(isolate(), number_of_properties); | 
| Handle<WeakCell> cell = NewWeakCell(map); | 
| cache->set(cache_index, *cell); | 
| return map; | 
|  |