| Index: src/runtime/runtime-literals.cc
 | 
| diff --git a/src/runtime/runtime-literals.cc b/src/runtime/runtime-literals.cc
 | 
| index 76226d68f596facea57862488c6a71de1d3e705b..8fe6e3f2fd3922bbb40ac7d7385c6fc4eafa98aa 100644
 | 
| --- a/src/runtime/runtime-literals.cc
 | 
| +++ b/src/runtime/runtime-literals.cc
 | 
| @@ -16,7 +16,7 @@ namespace internal {
 | 
|  
 | 
|  static Handle<Map> ComputeObjectLiteralMap(
 | 
|      Handle<Context> context, Handle<FixedArray> constant_properties,
 | 
| -    bool* is_result_from_cache) {
 | 
| +    bool is_strong, bool* is_result_from_cache) {
 | 
|    int properties_length = constant_properties->length();
 | 
|    int number_of_properties = properties_length / 2;
 | 
|  
 | 
| @@ -30,28 +30,30 @@ static Handle<Map> ComputeObjectLiteralMap(
 | 
|    }
 | 
|    Isolate* isolate = context->GetIsolate();
 | 
|    return isolate->factory()->ObjectLiteralMapFromCache(
 | 
| -      context, number_of_properties, is_result_from_cache);
 | 
| +      context, number_of_properties, is_strong, is_result_from_cache);
 | 
|  }
 | 
|  
 | 
|  MUST_USE_RESULT static MaybeHandle<Object> CreateLiteralBoilerplate(
 | 
|      Isolate* isolate, Handle<FixedArray> literals,
 | 
| -    Handle<FixedArray> constant_properties);
 | 
| +    Handle<FixedArray> constant_properties, bool is_strong);
 | 
|  
 | 
|  
 | 
|  MUST_USE_RESULT static MaybeHandle<Object> CreateObjectLiteralBoilerplate(
 | 
|      Isolate* isolate, Handle<FixedArray> literals,
 | 
|      Handle<FixedArray> constant_properties, bool should_have_fast_elements,
 | 
| -    bool has_function_literal) {
 | 
| +    bool has_function_literal, bool is_strong) {
 | 
|    Handle<Context> context = isolate->native_context();
 | 
|  
 | 
|    // In case we have function literals, we want the object to be in
 | 
|    // slow properties mode for now. We don't go in the map cache because
 | 
|    // maps with constant functions can't be shared if the functions are
 | 
|    // not the same (which is the common case).
 | 
| +  // TODO(rossberg): handle strong objects with function literals
 | 
|    bool is_result_from_cache = false;
 | 
|    Handle<Map> map = has_function_literal
 | 
|                          ? Handle<Map>(context->object_function()->initial_map())
 | 
|                          : ComputeObjectLiteralMap(context, constant_properties,
 | 
| +                                                  is_strong,
 | 
|                                                    &is_result_from_cache);
 | 
|  
 | 
|    PretenureFlag pretenure_flag =
 | 
| @@ -82,7 +84,8 @@ MUST_USE_RESULT static MaybeHandle<Object> CreateObjectLiteralBoilerplate(
 | 
|        // simple object or array literal.
 | 
|        Handle<FixedArray> array = Handle<FixedArray>::cast(value);
 | 
|        ASSIGN_RETURN_ON_EXCEPTION(
 | 
| -          isolate, value, CreateLiteralBoilerplate(isolate, literals, array),
 | 
| +          isolate, value,
 | 
| +          CreateLiteralBoilerplate(isolate, literals, array, is_strong),
 | 
|            Object);
 | 
|      }
 | 
|      MaybeHandle<Object> maybe_result;
 | 
| @@ -137,7 +140,7 @@ MUST_USE_RESULT static MaybeHandle<Object> CreateObjectLiteralBoilerplate(
 | 
|  
 | 
|  MaybeHandle<Object> Runtime::CreateArrayLiteralBoilerplate(
 | 
|      Isolate* isolate, Handle<FixedArray> literals,
 | 
| -    Handle<FixedArray> elements) {
 | 
| +    Handle<FixedArray> elements, bool is_strong) {
 | 
|    // Create the JSArray.
 | 
|    Handle<JSFunction> constructor = isolate->array_function();
 | 
|  
 | 
| @@ -156,7 +159,9 @@ MaybeHandle<Object> Runtime::CreateArrayLiteralBoilerplate(
 | 
|      DisallowHeapAllocation no_gc;
 | 
|      DCHECK(IsFastElementsKind(constant_elements_kind));
 | 
|      Context* native_context = isolate->context()->native_context();
 | 
| -    Object* maps_array = native_context->js_array_maps();
 | 
| +    Object* maps_array = is_strong
 | 
| +        ? native_context->js_array_strong_maps()
 | 
| +        : native_context->js_array_maps();
 | 
|      DCHECK(!maps_array->IsUndefined());
 | 
|      Object* map = FixedArray::cast(maps_array)->get(constant_elements_kind);
 | 
|      object->set_map(Map::cast(map));
 | 
| @@ -192,7 +197,8 @@ MaybeHandle<Object> Runtime::CreateArrayLiteralBoilerplate(
 | 
|            Handle<FixedArray> fa(FixedArray::cast(fixed_array_values->get(i)));
 | 
|            Handle<Object> result;
 | 
|            ASSIGN_RETURN_ON_EXCEPTION(
 | 
| -              isolate, result, CreateLiteralBoilerplate(isolate, literals, fa),
 | 
| +              isolate, result,
 | 
| +              CreateLiteralBoilerplate(isolate, literals, fa, is_strong),
 | 
|                Object);
 | 
|            fixed_array_values_copy->set(i, *result);
 | 
|          }
 | 
| @@ -208,19 +214,20 @@ MaybeHandle<Object> Runtime::CreateArrayLiteralBoilerplate(
 | 
|  
 | 
|  
 | 
|  MUST_USE_RESULT static MaybeHandle<Object> CreateLiteralBoilerplate(
 | 
| -    Isolate* isolate, Handle<FixedArray> literals, Handle<FixedArray> array) {
 | 
| +    Isolate* isolate, Handle<FixedArray> literals, Handle<FixedArray> array,
 | 
| +    bool is_strong) {
 | 
|    Handle<FixedArray> elements = CompileTimeValue::GetElements(array);
 | 
|    const bool kHasNoFunctionLiteral = false;
 | 
|    switch (CompileTimeValue::GetLiteralType(array)) {
 | 
|      case CompileTimeValue::OBJECT_LITERAL_FAST_ELEMENTS:
 | 
|        return CreateObjectLiteralBoilerplate(isolate, literals, elements, true,
 | 
| -                                            kHasNoFunctionLiteral);
 | 
| +                                            kHasNoFunctionLiteral, is_strong);
 | 
|      case CompileTimeValue::OBJECT_LITERAL_SLOW_ELEMENTS:
 | 
|        return CreateObjectLiteralBoilerplate(isolate, literals, elements, false,
 | 
| -                                            kHasNoFunctionLiteral);
 | 
| +                                            kHasNoFunctionLiteral, is_strong);
 | 
|      case CompileTimeValue::ARRAY_LITERAL:
 | 
|        return Runtime::CreateArrayLiteralBoilerplate(isolate, literals,
 | 
| -                                                    elements);
 | 
| +                                                    elements, is_strong);
 | 
|      default:
 | 
|        UNREACHABLE();
 | 
|        return MaybeHandle<Object>();
 | 
| @@ -238,6 +245,7 @@ RUNTIME_FUNCTION(Runtime_CreateObjectLiteral) {
 | 
|    bool should_have_fast_elements = (flags & ObjectLiteral::kFastElements) != 0;
 | 
|    bool has_function_literal = (flags & ObjectLiteral::kHasFunction) != 0;
 | 
|    bool enable_mementos = (flags & ObjectLiteral::kDisableMementos) == 0;
 | 
| +  bool is_strong = (flags & ObjectLiteral::kIsStrong) != 0;
 | 
|  
 | 
|    RUNTIME_ASSERT(literals_index >= 0 && literals_index < literals->length());
 | 
|  
 | 
| @@ -251,7 +259,7 @@ RUNTIME_FUNCTION(Runtime_CreateObjectLiteral) {
 | 
|          isolate, raw_boilerplate,
 | 
|          CreateObjectLiteralBoilerplate(isolate, literals, constant_properties,
 | 
|                                         should_have_fast_elements,
 | 
| -                                       has_function_literal));
 | 
| +                                       has_function_literal, is_strong));
 | 
|      boilerplate = Handle<JSObject>::cast(raw_boilerplate);
 | 
|  
 | 
|      AllocationSiteCreationContext creation_context(isolate);
 | 
| @@ -281,7 +289,7 @@ RUNTIME_FUNCTION(Runtime_CreateObjectLiteral) {
 | 
|  
 | 
|  MUST_USE_RESULT static MaybeHandle<AllocationSite> GetLiteralAllocationSite(
 | 
|      Isolate* isolate, Handle<FixedArray> literals, int literals_index,
 | 
| -    Handle<FixedArray> elements) {
 | 
| +    Handle<FixedArray> elements, bool is_strong) {
 | 
|    // Check if boilerplate exists. If not, create it first.
 | 
|    Handle<Object> literal_site(literals->get(literals_index), isolate);
 | 
|    Handle<AllocationSite> site;
 | 
| @@ -290,7 +298,8 @@ MUST_USE_RESULT static MaybeHandle<AllocationSite> GetLiteralAllocationSite(
 | 
|      Handle<Object> boilerplate;
 | 
|      ASSIGN_RETURN_ON_EXCEPTION(
 | 
|          isolate, boilerplate,
 | 
| -        Runtime::CreateArrayLiteralBoilerplate(isolate, literals, elements),
 | 
| +        Runtime::CreateArrayLiteralBoilerplate(isolate, literals, elements,
 | 
| +                                               is_strong),
 | 
|          AllocationSite);
 | 
|  
 | 
|      AllocationSiteCreationContext creation_context(isolate);
 | 
| @@ -318,9 +327,11 @@ static MaybeHandle<JSObject> CreateArrayLiteralImpl(Isolate* isolate,
 | 
|    RUNTIME_ASSERT_HANDLIFIED(
 | 
|        literals_index >= 0 && literals_index < literals->length(), JSObject);
 | 
|    Handle<AllocationSite> site;
 | 
| +  bool is_strong = (flags & ArrayLiteral::kIsStrong) != 0;
 | 
|    ASSIGN_RETURN_ON_EXCEPTION(
 | 
|        isolate, site,
 | 
| -      GetLiteralAllocationSite(isolate, literals, literals_index, elements),
 | 
| +      GetLiteralAllocationSite(isolate, literals, literals_index, elements,
 | 
| +                               is_strong),
 | 
|        JSObject);
 | 
|  
 | 
|    bool enable_mementos = (flags & ArrayLiteral::kDisableMementos) == 0;
 | 
| 
 |