| Index: runtime/vm/raw_object.h
|
| ===================================================================
|
| --- runtime/vm/raw_object.h (revision 37443)
|
| +++ runtime/vm/raw_object.h (working copy)
|
| @@ -223,6 +223,12 @@
|
| SNAPSHOT_WRITER_SUPPORT() \
|
| HEAP_PROFILER_SUPPORT() \
|
|
|
| +#define OPEN_ARRAY_START(type, align) \
|
| + do { \
|
| + const uword result = reinterpret_cast<uword>(this) + sizeof(*this); \
|
| + ASSERT(Utils::IsAligned(result, sizeof(align))); \
|
| + return reinterpret_cast<type*>(result); \
|
| + } while (0)
|
|
|
| // RawObject is the base class of all raw objects, even though it carries the
|
| // class_ field not all raw objects are allocated in the heap and thus cannot
|
| @@ -558,9 +564,11 @@
|
| RawSmi* length_;
|
|
|
| // Variable length data follows here.
|
| - RawAbstractType* types_[0];
|
| + RawAbstractType** types() {
|
| + OPEN_ARRAY_START(RawAbstractType*, RawAbstractType*);
|
| + }
|
| RawObject** to(intptr_t length) {
|
| - return reinterpret_cast<RawObject**>(&ptr()->types_[length - 1]);
|
| + return reinterpret_cast<RawObject**>(&ptr()->types()[length - 1]);
|
| }
|
|
|
| friend class SnapshotReader;
|
| @@ -855,10 +863,8 @@
|
| intptr_t patch_code_pc_offset_;
|
| intptr_t lazy_deopt_pc_offset_;
|
|
|
| - intptr_t dummy_alignment_;
|
| -
|
| // Variable length data follows here.
|
| - int32_t data_[0];
|
| + int32_t* data() { OPEN_ARRAY_START(int32_t, int32_t); }
|
|
|
| friend class StackFrame;
|
| friend class MarkingVisitor;
|
| @@ -880,7 +886,7 @@
|
| intptr_t size_;
|
|
|
| // Variable length data follows here.
|
| - uint8_t data_[0];
|
| + uint8_t* data() { OPEN_ARRAY_START(uint8_t, uint8_t); }
|
|
|
| // Private helper function used while visiting stack frames. The
|
| // code which iterates over dart frames is also called during GC and
|
| @@ -901,7 +907,7 @@
|
| intptr_t length_; // Number of descriptors.
|
|
|
| // Variable length data follows here.
|
| - intptr_t data_[0];
|
| + intptr_t* data() { OPEN_ARRAY_START(intptr_t, intptr_t); }
|
|
|
| friend class Object;
|
| };
|
| @@ -925,7 +931,7 @@
|
| uword pc_; // PC corresponding to this stack map representation.
|
|
|
| // Variable length data follows here (bitmap of the stack layout).
|
| - uint8_t data_[0];
|
| + uint8_t* data() { OPEN_ARRAY_START(uint8_t, uint8_t); }
|
| };
|
|
|
|
|
| @@ -952,7 +958,8 @@
|
| intptr_t length_; // Number of descriptors.
|
| RawArray* names_; // Array of [length_] variable names.
|
|
|
| - VarInfo data_[0]; // Variable info with [length_] entries.
|
| + // Variable info with [length_] entries.
|
| + VarInfo* data() { OPEN_ARRAY_START(VarInfo, intptr_t); }
|
| };
|
|
|
|
|
| @@ -966,6 +973,7 @@
|
| int8_t needs_stacktrace; // True if a stacktrace is needed.
|
| int8_t has_catch_all; // Catches all exceptions.
|
| };
|
| +
|
| private:
|
| RAW_HEAP_OBJECT_IMPLEMENTATION(ExceptionHandlers);
|
|
|
| @@ -977,7 +985,7 @@
|
| RawArray* handled_types_data_;
|
|
|
| // Exception handler info of length [length_].
|
| - HandlerInfo data_[0];
|
| + HandlerInfo* data() { OPEN_ARRAY_START(HandlerInfo, intptr_t); }
|
| };
|
|
|
|
|
| @@ -989,7 +997,7 @@
|
| RawSmi* length_; // Number of deoptimization commands
|
|
|
| // Variable length data follows here.
|
| - intptr_t data_[0];
|
| + intptr_t* data() { OPEN_ARRAY_START(intptr_t, intptr_t); }
|
| };
|
|
|
|
|
| @@ -1003,9 +1011,9 @@
|
| RawContext* parent_;
|
|
|
| // Variable length data follows here.
|
| - RawInstance* data_[0];
|
| + RawInstance** data() { OPEN_ARRAY_START(RawInstance*, RawInstance*); }
|
| RawObject** to(intptr_t num_vars) {
|
| - return reinterpret_cast<RawObject**>(&ptr()->data_[num_vars - 1]);
|
| + return reinterpret_cast<RawObject**>(&ptr()->data()[num_vars - 1]);
|
| }
|
|
|
| friend class SnapshotReader;
|
| @@ -1032,12 +1040,14 @@
|
|
|
| intptr_t num_variables_;
|
|
|
| + RawObject** from() {
|
| + return reinterpret_cast<RawObject**>(&ptr()->data()[0]);
|
| + }
|
| // Variable length data follows here.
|
| - RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->data_[0]); }
|
| - RawObject* data_[0];
|
| + RawObject** data() { OPEN_ARRAY_START(RawObject*, RawObject*); }
|
| RawObject** to(intptr_t num_vars) {
|
| - intptr_t data_length = num_vars * (sizeof(VariableDesc)/kWordSize);
|
| - return reinterpret_cast<RawObject**>(&ptr()->data_[data_length - 1]);
|
| + const intptr_t data_length = num_vars * (sizeof(VariableDesc)/kWordSize);
|
| + return reinterpret_cast<RawObject**>(&ptr()->data()[data_length - 1]);
|
| }
|
| };
|
|
|
| @@ -1306,7 +1316,7 @@
|
|
|
| // A sequence of Chunks (typedef in Bignum) representing bignum digits.
|
| // Bignum::Chunk chunks_[Utils::Abs(signed_length_)];
|
| - uint8_t data_[0];
|
| + uint8_t* data() { OPEN_ARRAY_START(uint8_t, uint8_t); }
|
|
|
| friend class SnapshotReader;
|
| };
|
| @@ -1337,7 +1347,7 @@
|
| RAW_HEAP_OBJECT_IMPLEMENTATION(OneByteString);
|
|
|
| // Variable length data follows here.
|
| - uint8_t data_[0];
|
| + uint8_t* data() { OPEN_ARRAY_START(uint8_t, uint8_t); }
|
|
|
| friend class ApiMessageReader;
|
| friend class SnapshotReader;
|
| @@ -1348,7 +1358,7 @@
|
| RAW_HEAP_OBJECT_IMPLEMENTATION(TwoByteString);
|
|
|
| // Variable length data follows here.
|
| - uint16_t data_[0];
|
| + uint16_t* data() { OPEN_ARRAY_START(uint16_t, uint16_t); }
|
|
|
| friend class SnapshotReader;
|
| };
|
| @@ -1410,10 +1420,7 @@
|
| RawTypeArguments* type_arguments_;
|
| RawSmi* length_;
|
| // Variable length data follows here.
|
| - RawObject** data() {
|
| - uword address_of_length = reinterpret_cast<uword>(&length_);
|
| - return reinterpret_cast<RawObject**>(address_of_length + kWordSize);
|
| - }
|
| + RawObject** data() { OPEN_ARRAY_START(RawObject*, RawObject*); }
|
| RawObject** to(intptr_t length) {
|
| return reinterpret_cast<RawObject**>(&ptr()->data()[length - 1]);
|
| }
|
| @@ -1510,11 +1517,10 @@
|
| protected:
|
| RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->length_); }
|
| RawSmi* length_;
|
| + // Variable length data follows here.
|
| + uint8_t* data() { OPEN_ARRAY_START(uint8_t, uint8_t); }
|
| RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->length_); }
|
|
|
| - // Variable length data follows here.
|
| - uint8_t data_[0];
|
| -
|
| friend class Api;
|
| friend class Object;
|
| friend class Instance;
|
| @@ -1604,7 +1610,7 @@
|
| intptr_t flags_; // Represents global/local, case insensitive, multiline.
|
|
|
| // Variable length data follows here.
|
| - uint8_t data_[0];
|
| + uint8_t* data() { OPEN_ARRAY_START(uint8_t, uint8_t); }
|
| };
|
|
|
|
|
|
|