| Index: runtime/vm/object.h
|
| diff --git a/runtime/vm/object.h b/runtime/vm/object.h
|
| index 6c95eb1ad0c9bc7db9b9f16786cd7ee5c3f47f6c..82f01cb130a7a6c2a3f8db741b97d954004d33c8 100644
|
| --- a/runtime/vm/object.h
|
| +++ b/runtime/vm/object.h
|
| @@ -1157,13 +1157,14 @@ class Class : public Object {
|
|
|
| bool IsPrivate() const;
|
|
|
| + // Returns an array of instance and static fields defined by this class.
|
| RawArray* fields() const { return raw_ptr()->fields_; }
|
| void SetFields(const Array& value) const;
|
| void AddField(const Field& field) const;
|
| void AddFields(const GrowableArray<const Field*>& fields) const;
|
|
|
| - // Returns an array of all fields of this class and its superclasses indexed
|
| - // by offset in words.
|
| + // Returns an array of all instance fields of this class and its superclasses
|
| + // indexed by offset in words.
|
| RawArray* OffsetToFieldMap() const;
|
|
|
| // Returns true if non-static fields are defined.
|
| @@ -1402,9 +1403,18 @@ class Class : public Object {
|
| void PatchFieldsAndFunctions() const;
|
| void CopyCanonicalConstants(const Class& old_cls) const;
|
| void CopyCanonicalType(const Class& old_cls) const;
|
| - bool CanReload(const Class& replacement) const;
|
| + void CheckReload(const Class& replacement,
|
| + IsolateReloadContext* context) const;
|
|
|
| private:
|
| + bool CanReloadFinalized(const Class& replacement,
|
| + IsolateReloadContext* context) const;
|
| + bool CanReloadPreFinalized(const Class& replacement,
|
| + IsolateReloadContext* context) const;
|
| +
|
| + // Tells whether instances need morphing for reload.
|
| + bool RequiresInstanceMorphing(const Class& replacement) const;
|
| +
|
| template <class FakeObject> static RawClass* NewCommon(intptr_t index);
|
|
|
| enum MemberKind {
|
| @@ -2970,6 +2980,7 @@ class Field : public Object {
|
| virtual RawString* DictionaryName() const { return name(); }
|
|
|
| bool is_static() const { return StaticBit::decode(raw_ptr()->kind_bits_); }
|
| + bool is_instance() const { return !is_static(); }
|
| bool is_final() const { return FinalBit::decode(raw_ptr()->kind_bits_); }
|
| bool is_const() const { return ConstBit::decode(raw_ptr()->kind_bits_); }
|
| bool is_reflectable() const {
|
| @@ -3735,7 +3746,8 @@ class Library : public Object {
|
| // the library-specific key.
|
| static const char kPrivateKeySeparator = '@';
|
|
|
| - bool CanReload(const Library& replacement) const;
|
| + void CheckReload(const Library& replacement,
|
| + IsolateReloadContext* context) const;
|
|
|
| private:
|
| static const int kInitialImportsCapacity = 4;
|
| @@ -5330,7 +5342,6 @@ class Instance : public Object {
|
| RawObject** NativeFieldsAddr() const {
|
| return FieldAddrAtOffset(sizeof(RawObject));
|
| }
|
| -
|
| void SetFieldAtOffset(intptr_t offset, const Object& value) const {
|
| StorePointer(FieldAddrAtOffset(offset), value.raw());
|
| }
|
| @@ -5340,6 +5351,18 @@ class Instance : public Object {
|
| return sizeof(RawInstance);
|
| }
|
|
|
| + // The follwoing raw methods are used for morphing.
|
| + // They are needed due to the extraction of the class in IsValidFieldOffset.
|
| + RawObject** RawFieldAddrAtOffset(intptr_t offset) const {
|
| + return reinterpret_cast<RawObject**>(raw_value() - kHeapObjectTag + offset);
|
| + }
|
| + RawObject* RawGetFieldAtOffset(intptr_t offset) const {
|
| + return *RawFieldAddrAtOffset(offset);
|
| + }
|
| + void RawSetFieldAtOffset(intptr_t offset, const Object& value) const {
|
| + StorePointer(RawFieldAddrAtOffset(offset), value.raw());
|
| + }
|
| +
|
| // TODO(iposva): Determine if this gets in the way of Smi.
|
| HEAP_OBJECT_IMPLEMENTATION(Instance, Object);
|
| friend class ByteBuffer;
|
| @@ -5353,6 +5376,7 @@ class Instance : public Object {
|
| friend class InstanceSerializationCluster;
|
| friend class InstanceDeserializationCluster;
|
| friend class ClassDeserializationCluster; // vtable
|
| + friend class InstanceMorpher;
|
| };
|
|
|
|
|
| @@ -8528,14 +8552,14 @@ DART_FORCE_INLINE void Object::SetRaw(RawObject* value) {
|
|
|
|
|
| intptr_t Field::Offset() const {
|
| - ASSERT(!is_static()); // Valid only for dart instance fields.
|
| + ASSERT(is_instance()); // Valid only for dart instance fields.
|
| intptr_t value = Smi::Value(raw_ptr()->value_.offset_);
|
| return (value * kWordSize);
|
| }
|
|
|
|
|
| void Field::SetOffset(intptr_t offset_in_bytes) const {
|
| - ASSERT(!is_static()); // Valid only for dart instance fields.
|
| + ASSERT(is_instance()); // Valid only for dart instance fields.
|
| ASSERT(kWordSize != 0);
|
| StorePointer(&raw_ptr()->value_.offset_,
|
| Smi::New(offset_in_bytes / kWordSize));
|
|
|