| Index: src/ast.h
 | 
| diff --git a/src/ast.h b/src/ast.h
 | 
| index 6fd5d96f0495c7963145c554012f0623b6c3b658..c1774b66eaf3e625cc22929ebef32ca1e55af52c 100644
 | 
| --- a/src/ast.h
 | 
| +++ b/src/ast.h
 | 
| @@ -1295,11 +1295,14 @@ class MaterializedLiteral : public Expression {
 | 
|      return depth_;
 | 
|    }
 | 
|  
 | 
| +  bool is_strong() const { return is_strong_; }
 | 
| +
 | 
|   protected:
 | 
| -  MaterializedLiteral(Zone* zone, int literal_index, int pos)
 | 
| +  MaterializedLiteral(Zone* zone, int literal_index, bool is_strong, int pos)
 | 
|        : Expression(zone, pos),
 | 
|          literal_index_(literal_index),
 | 
|          is_simple_(false),
 | 
| +        is_strong_(is_strong),
 | 
|          depth_(0) {}
 | 
|  
 | 
|    // A materialized literal is simple if the values consist of only
 | 
| @@ -1328,6 +1331,7 @@ class MaterializedLiteral : public Expression {
 | 
|   private:
 | 
|    int literal_index_;
 | 
|    bool is_simple_;
 | 
| +  bool is_strong_;
 | 
|    int depth_;
 | 
|  };
 | 
|  
 | 
| @@ -1422,6 +1426,9 @@ class ObjectLiteral final : public MaterializedLiteral {
 | 
|      if (disable_mementos) {
 | 
|        flags |= kDisableMementos;
 | 
|      }
 | 
| +    if (is_strong()) {
 | 
| +      flags |= kIsStrong;
 | 
| +    }
 | 
|      return flags;
 | 
|    }
 | 
|  
 | 
| @@ -1430,7 +1437,8 @@ class ObjectLiteral final : public MaterializedLiteral {
 | 
|      kFastElements = 1,
 | 
|      kHasFunction = 1 << 1,
 | 
|      kShallowProperties = 1 << 2,
 | 
| -    kDisableMementos = 1 << 3
 | 
| +    kDisableMementos = 1 << 3,
 | 
| +    kIsStrong = 1 << 4
 | 
|    };
 | 
|  
 | 
|    struct Accessors: public ZoneObject {
 | 
| @@ -1450,8 +1458,9 @@ class ObjectLiteral final : public MaterializedLiteral {
 | 
|  
 | 
|   protected:
 | 
|    ObjectLiteral(Zone* zone, ZoneList<Property*>* properties, int literal_index,
 | 
| -                int boilerplate_properties, bool has_function, int pos)
 | 
| -      : MaterializedLiteral(zone, literal_index, pos),
 | 
| +                int boilerplate_properties, bool has_function,
 | 
| +                bool is_strong, int pos)
 | 
| +      : MaterializedLiteral(zone, literal_index, is_strong, pos),
 | 
|          properties_(properties),
 | 
|          boilerplate_properties_(boilerplate_properties),
 | 
|          fast_elements_(false),
 | 
| @@ -1482,8 +1491,9 @@ class RegExpLiteral final : public MaterializedLiteral {
 | 
|  
 | 
|   protected:
 | 
|    RegExpLiteral(Zone* zone, const AstRawString* pattern,
 | 
| -                const AstRawString* flags, int literal_index, int pos)
 | 
| -      : MaterializedLiteral(zone, literal_index, pos),
 | 
| +                const AstRawString* flags, int literal_index, bool is_strong,
 | 
| +                int pos)
 | 
| +      : MaterializedLiteral(zone, literal_index, is_strong, pos),
 | 
|          pattern_(pattern),
 | 
|          flags_(flags) {
 | 
|      set_depth(1);
 | 
| @@ -1528,19 +1538,24 @@ class ArrayLiteral final : public MaterializedLiteral {
 | 
|      if (disable_mementos) {
 | 
|        flags |= kDisableMementos;
 | 
|      }
 | 
| +    if (is_strong()) {
 | 
| +      flags |= kIsStrong;
 | 
| +    }
 | 
|      return flags;
 | 
|    }
 | 
|  
 | 
|    enum Flags {
 | 
|      kNoFlags = 0,
 | 
|      kShallowElements = 1,
 | 
| -    kDisableMementos = 1 << 1
 | 
| +    kDisableMementos = 1 << 1,
 | 
| +    kIsStrong = 1 << 2
 | 
|    };
 | 
|  
 | 
|   protected:
 | 
|    ArrayLiteral(Zone* zone, ZoneList<Expression*>* values, int literal_index,
 | 
| -               int pos)
 | 
| -      : MaterializedLiteral(zone, literal_index, pos), values_(values) {}
 | 
| +               bool is_strong, int pos)
 | 
| +      : MaterializedLiteral(zone, literal_index, is_strong, pos),
 | 
| +        values_(values) {}
 | 
|    static int parent_num_ids() { return MaterializedLiteral::num_ids(); }
 | 
|  
 | 
|   private:
 | 
| @@ -3309,9 +3324,11 @@ class AstNodeFactory final BASE_EMBEDDED {
 | 
|        int literal_index,
 | 
|        int boilerplate_properties,
 | 
|        bool has_function,
 | 
| +      bool is_strong,
 | 
|        int pos) {
 | 
|      return new (zone_) ObjectLiteral(zone_, properties, literal_index,
 | 
| -                                     boilerplate_properties, has_function, pos);
 | 
| +                                     boilerplate_properties, has_function,
 | 
| +                                     is_strong, pos);
 | 
|    }
 | 
|  
 | 
|    ObjectLiteral::Property* NewObjectLiteralProperty(
 | 
| @@ -3332,14 +3349,18 @@ class AstNodeFactory final BASE_EMBEDDED {
 | 
|    RegExpLiteral* NewRegExpLiteral(const AstRawString* pattern,
 | 
|                                    const AstRawString* flags,
 | 
|                                    int literal_index,
 | 
| +                                  bool is_strong,
 | 
|                                    int pos) {
 | 
| -    return new (zone_) RegExpLiteral(zone_, pattern, flags, literal_index, pos);
 | 
| +    return new (zone_) RegExpLiteral(zone_, pattern, flags, literal_index,
 | 
| +                                     is_strong, pos);
 | 
|    }
 | 
|  
 | 
|    ArrayLiteral* NewArrayLiteral(ZoneList<Expression*>* values,
 | 
|                                  int literal_index,
 | 
| +                                bool is_strong,
 | 
|                                  int pos) {
 | 
| -    return new (zone_) ArrayLiteral(zone_, values, literal_index, pos);
 | 
| +    return new (zone_) ArrayLiteral(zone_, values, literal_index, is_strong,
 | 
| +                                    pos);
 | 
|    }
 | 
|  
 | 
|    VariableProxy* NewVariableProxy(Variable* var,
 | 
| 
 |