| Index: runtime/vm/object.h | 
| diff --git a/runtime/vm/object.h b/runtime/vm/object.h | 
| index 58e3670944dbc470e4b3321a833fafdf71eb2a4f..189b2ec2dca1b8eb71c2c5cc42df515e620821b1 100644 | 
| --- a/runtime/vm/object.h | 
| +++ b/runtime/vm/object.h | 
| @@ -2831,10 +2831,11 @@ class Field : public Object { | 
| } | 
|  | 
| inline intptr_t Offset() const; | 
| -  inline void SetOffset(intptr_t value_in_bytes) const; | 
| +  inline void SetOffset(intptr_t offset_in_bytes) const; | 
|  | 
| -  RawInstance* value() const; | 
| -  void set_value(const Instance& value) const; | 
| +  inline RawInstance* StaticValue() const; | 
| +  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(). | 
| @@ -2858,7 +2859,12 @@ class Field : public Object { | 
| // owner of the clone is new_owner. | 
| RawField* Clone(const Class& new_owner) const; | 
|  | 
| -  static intptr_t value_offset() { return OFFSET_OF(RawField, value_); } | 
| +  static intptr_t instance_field_offset() { | 
| +    return OFFSET_OF(RawField, value_.offset_); | 
| +  } | 
| +  static intptr_t static_value_offset() { | 
| +    return OFFSET_OF(RawField, value_.static_value_); | 
| +  } | 
|  | 
| static intptr_t kind_bits_offset() { return OFFSET_OF(RawField, kind_bits_); } | 
|  | 
| @@ -2969,10 +2975,16 @@ class Field : public Object { | 
|  | 
| void EvaluateInitializer() const; | 
|  | 
| -  RawFunction* initializer() const { | 
| -    return raw_ptr()->initializer_; | 
| +  RawFunction* PrecompiledInitializer() const { | 
| +    return raw_ptr()->initializer_.precompiled_; | 
| +  } | 
| +  void SetPrecompiledInitializer(const Function& initializer) const; | 
| +  bool HasPrecompiledInitializer() const; | 
| + | 
| +  RawInstance* SavedInitialStaticValue() const { | 
| +    return raw_ptr()->initializer_.saved_value_; | 
| } | 
| -  void set_initializer(const Function& initializer) const; | 
| +  void SetSavedInitialStaticValue(const Instance& value) const; | 
|  | 
| // For static fields only. Constructs a closure that gets/sets the | 
| // field value. | 
| @@ -3048,6 +3060,7 @@ class Field : public Object { | 
| FINAL_HEAP_OBJECT_IMPLEMENTATION(Field, Object); | 
| friend class Class; | 
| friend class HeapProfiler; | 
| +  friend class RawField; | 
| }; | 
|  | 
|  | 
| @@ -7975,17 +7988,33 @@ DART_FORCE_INLINE void Object::SetRaw(RawObject* value) { | 
|  | 
|  | 
| intptr_t Field::Offset() const { | 
| -  ASSERT(!is_static());  // Offset is valid only for instance fields. | 
| -  intptr_t value = Smi::Value(reinterpret_cast<RawSmi*>(raw_ptr()->value_)); | 
| +  ASSERT(!is_static());  // Valid only for dart instance fields. | 
| +  intptr_t value = Smi::Value(raw_ptr()->value_.offset_); | 
| return (value * kWordSize); | 
| } | 
|  | 
|  | 
| -void Field::SetOffset(intptr_t value_in_bytes) const { | 
| -  ASSERT(!is_static());  // SetOffset is valid only for instance fields. | 
| +void Field::SetOffset(intptr_t offset_in_bytes) const { | 
| +  ASSERT(!is_static());  // Valid only for dart instance fields. | 
| ASSERT(kWordSize != 0); | 
| -  StorePointer(&raw_ptr()->value_, | 
| -               static_cast<RawInstance*>(Smi::New(value_in_bytes / kWordSize))); | 
| +  StorePointer(&raw_ptr()->value_.offset_, | 
| +               Smi::New(offset_in_bytes / kWordSize)); | 
| +} | 
| + | 
| + | 
| +RawInstance* Field::StaticValue() const { | 
| +  ASSERT(is_static());  // Valid only for static dart fields. | 
| +  return raw_ptr()->value_.static_value_; | 
| +} | 
| + | 
| + | 
| +void Field::SetStaticValue(const Instance& value, | 
| +                           bool save_initial_value) const { | 
| +  ASSERT(is_static());  // Valid only for static dart fields. | 
| +  StorePointer(&raw_ptr()->value_.static_value_, value.raw()); | 
| +  if (save_initial_value) { | 
| +    StorePointer(&raw_ptr()->initializer_.saved_value_, value.raw()); | 
| +  } | 
| } | 
|  | 
|  | 
|  |