| Index: runtime/vm/object.h | 
| diff --git a/runtime/vm/object.h b/runtime/vm/object.h | 
| index 1680d6ecc6f50f49bb6ed06f56eaef455a52aaf3..30fee143bb256bcb0aa8159e0918acc1cf3a5379 100644 | 
| --- a/runtime/vm/object.h | 
| +++ b/runtime/vm/object.h | 
| @@ -2881,6 +2881,20 @@ class RedirectionData: public Object { | 
|  | 
| class Field : public Object { | 
| public: | 
| +  RawField* Original() const; | 
| +  void SetOriginal(const Field& value) const; | 
| +  bool IsOriginal() const { | 
| +    if (IsNull()) { | 
| +      return true; | 
| +    } | 
| +    NoSafepointScope no_safepoint; | 
| +    return !raw_ptr()->owner_->IsField(); | 
| +  } | 
| + | 
| +  // Returns a field cloned from 'this'. 'this' is set as the | 
| +  // original field of result. | 
| +  RawField* CloneFromOriginal() const; | 
| + | 
| RawString* name() const { return raw_ptr()->name_; } | 
| RawString* UserVisibleName() const;  // Same as scrubbed name. | 
| virtual RawString* DictionaryName() const { return name(); } | 
| @@ -2892,6 +2906,7 @@ class Field : public Object { | 
| return ReflectableBit::decode(raw_ptr()->kind_bits_); | 
| } | 
| void set_is_reflectable(bool value) const { | 
| +    ASSERT(IsOriginal()); | 
| set_kind_bits(ReflectableBit::update(value, raw_ptr()->kind_bits_)); | 
| } | 
| bool is_double_initialized() const { | 
| @@ -2901,6 +2916,7 @@ class Field : public Object { | 
| // Marks fields that are initialized with a simple double constant. | 
| void set_is_double_initialized(bool value) const { | 
| ASSERT(Thread::Current()->IsMutatorThread()); | 
| +    ASSERT(IsOriginal()); | 
| set_kind_bits(DoubleInitializedBit::update(value, raw_ptr()->kind_bits_)); | 
| } | 
|  | 
| @@ -2912,10 +2928,10 @@ class Field : public Object { | 
| inline void SetStaticValue(const Instance& value, | 
| bool save_initial_value = false) const; | 
|  | 
| -  RawClass* owner() const; | 
| -  RawClass* origin() const;  // Either mixin class, or same as owner(). | 
| -  RawScript* script() const; | 
| -  RawObject* RawOwner() const { return raw_ptr()->owner_; } | 
| +  RawClass* Owner() const; | 
| +  RawClass* Origin() const;  // Either mixin class, or same as owner(). | 
| +  RawScript* Script() const; | 
| +  RawObject* RawOwner() const; | 
|  | 
| RawAbstractType* type() const  { return raw_ptr()->type_; } | 
| // Used by class finalizer, otherwise initialized in constructor. | 
| @@ -2943,6 +2959,9 @@ class Field : public Object { | 
| // Allocate new field object, clone values from this field. The | 
| // owner of the clone is new_owner. | 
| RawField* Clone(const Class& new_owner) const; | 
| +  // Allocate new field object, clone values from this field. The | 
| +  // original is specified. | 
| +  RawField* Clone(const Field& original) const; | 
|  | 
| static intptr_t instance_field_offset() { | 
| return OFFSET_OF(RawField, value_.offset_); | 
| @@ -2960,6 +2979,7 @@ class Field : public Object { | 
| } | 
| // Called by parser after allocating field. | 
| void set_has_initializer(bool has_initializer) const { | 
| +    ASSERT(IsOriginal()); | 
| ASSERT(Thread::Current()->IsMutatorThread()); | 
| set_kind_bits(HasInitializerBit::update(has_initializer, | 
| raw_ptr()->kind_bits_)); | 
| @@ -3010,6 +3030,7 @@ class Field : public Object { | 
| // Default 'true', set to false once optimizing compiler determines it should | 
| // be boxed. | 
| void set_is_unboxing_candidate(bool b) const { | 
| +    ASSERT(IsOriginal()); | 
| set_kind_bits(UnboxingCandidateBit::update(b, raw_ptr()->kind_bits_)); | 
| } | 
|  | 
|  |