| 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());
|
| + }
|
| }
|
|
|
|
|
|
|