Index: runtime/vm/raw_object.h |
=================================================================== |
--- runtime/vm/raw_object.h (revision 40039) |
+++ runtime/vm/raw_object.h (working copy) |
@@ -889,16 +889,17 @@ |
// Compilation timestamp. |
int64_t compile_timestamp_; |
- intptr_t pointer_offsets_length_; |
+ |
+ // state_bits_ is a bitfield with three fields: |
+ // The optimized bit, the alive bit, and a count of the number of pointer |
+ // offsets. |
// Alive: If true, the embedded object pointers will be visited during GC. |
- // This field cannot be shorter because of alignment issues on x64 |
- // architectures. |
- intptr_t state_bits_; // state, is_optimized, is_alive. |
+ int32_t state_bits_; |
// PC offsets for code patching. |
- intptr_t entry_patch_pc_offset_; |
- intptr_t patch_code_pc_offset_; |
- intptr_t lazy_deopt_pc_offset_; |
+ int32_t entry_patch_pc_offset_; |
+ int32_t patch_code_pc_offset_; |
+ int32_t lazy_deopt_pc_offset_; |
// Variable length data follows here. |
int32_t* data() { OPEN_ARRAY_START(int32_t, int32_t); } |
@@ -920,7 +921,7 @@ |
RawObject** to() { |
return reinterpret_cast<RawObject**>(&ptr()->object_pool_); |
} |
- intptr_t size_; |
+ int32_t size_; |
// Variable length data follows here. |
uint8_t* data() { OPEN_ARRAY_START(uint8_t, uint8_t); } |
@@ -1012,8 +1013,8 @@ |
static const intptr_t kFullRecSize; |
static const intptr_t kCompressedRecSize; |
- intptr_t record_size_in_bytes_; |
- intptr_t length_; // Number of descriptors. |
+ int32_t record_size_in_bytes_; |
+ int32_t length_; // Number of descriptors. |
// Variable length data follows here. |
uint8_t* data() { OPEN_ARRAY_START(uint8_t, intptr_t); } |
@@ -1032,12 +1033,16 @@ |
class RawStackmap : public RawObject { |
RAW_HEAP_OBJECT_IMPLEMENTATION(Stackmap); |
- // TODO(kmillikin): We need a small number of bits to encode the register |
- // count. Consider packing them in with the length. |
- intptr_t length_; // Length of payload, in bits. |
- intptr_t register_bit_count_; // Live register bits, included in length_. |
+ // Regarding changing this to a bitfield: ARM64 requires register_bit_count_ |
+ // to be as large as 96, meaning 7 bits, leaving 25 bits for the length, or |
+ // as large as ~33 million entries. If that is sufficient, then these two |
+ // fields can be merged into a BitField. |
+ int32_t length_; // Length of payload, in bits. |
+ int32_t register_bit_count_; // Live register bits, included in length_. |
- uword pc_; // PC corresponding to this stack map representation. |
+ // Offset from code entry point corresponding to this stack map |
+ // representation. |
+ uint32_t pc_offset_; |
// Variable length data follows here (bitmap of the stack layout). |
uint8_t* data() { OPEN_ARRAY_START(uint8_t, uint8_t); } |
@@ -1054,21 +1059,49 @@ |
kSavedCurrentContext |
}; |
+ enum { |
+ kKindPos = 0, |
+ kKindSize = 8, |
+ kIndexPos = kKindPos + kKindSize, |
+ // Since there are 24 bits for the stack slot index, Functions can have |
+ // only ~16.7 million stack slots. |
+ kPayloadSize = sizeof(int32_t) * kBitsPerByte, |
+ kIndexSize = kPayloadSize - kIndexPos, |
+ kIndexBias = 1 << (kIndexSize - 1), |
+ kMaxIndex = (1 << (kIndexSize - 1)) - 1, |
+ }; |
+ |
+ class IndexBits : public BitField<int32_t, kIndexPos, kIndexSize> {}; |
+ class KindBits : public BitField<int8_t, kKindPos, kKindSize>{}; |
+ |
struct VarInfo { |
- intptr_t index; // Slot index on stack or in context. |
- intptr_t begin_pos; // Token position of scope start. |
- intptr_t end_pos; // Token position of scope end. |
- int16_t scope_id; // Scope to which the variable belongs. |
- int8_t kind; // Entry kind of type VarInfoKind. |
+ int32_t index_kind; // Bitfield for slot index on stack or in context, |
+ // and Entry kind of type VarInfoKind. |
+ int32_t begin_pos; // Token position of scope start. |
+ int32_t end_pos; // Token position of scope end. |
+ int16_t scope_id; // Scope to which the variable belongs. |
+ |
+ VarInfoKind kind() const { |
+ return static_cast<VarInfoKind>(KindBits::decode(index_kind)); |
+ } |
+ void set_kind(VarInfoKind kind) { |
+ index_kind = KindBits::update(kind, index_kind); |
+ } |
+ int32_t index() const { |
+ return IndexBits::decode(index_kind) - kIndexBias; |
+ } |
+ void set_index(int32_t index) { |
+ index_kind = IndexBits::update(index + kIndexBias, index_kind); |
+ } |
}; |
private: |
RAW_HEAP_OBJECT_IMPLEMENTATION(LocalVarDescriptors); |
- intptr_t length_; // Number of descriptors. |
RawArray* names_; // Array of [length_] variable names. |
+ int32_t length_; // Number of descriptors. |
// Variable info with [length_] entries. |
- VarInfo* data() { OPEN_ARRAY_START(VarInfo, intptr_t); } |
+ VarInfo* data() { OPEN_ARRAY_START(VarInfo, int32_t); } |
}; |
@@ -1087,7 +1120,7 @@ |
RAW_HEAP_OBJECT_IMPLEMENTATION(ExceptionHandlers); |
// Number of exception handler entries. |
- intptr_t length_; |
+ int32_t length_; |
// Array with [length_] entries. Each entry is an array of all handled |
// exception types. |
@@ -1113,7 +1146,7 @@ |
class RawContext : public RawObject { |
RAW_HEAP_OBJECT_IMPLEMENTATION(Context); |
- intptr_t num_variables_; |
+ int32_t num_variables_; |
Isolate* isolate_; |
RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->parent_); } |
@@ -1132,7 +1165,7 @@ |
class RawContextScope : public RawObject { |
RAW_HEAP_OBJECT_IMPLEMENTATION(ContextScope); |
- // TODO(iposva): Switch to convential enum offset based structure to avoid |
+ // TODO(iposva): Switch to conventional enum offset based structure to avoid |
// alignment mishaps. |
struct VariableDesc { |
RawSmi* token_pos; |
@@ -1147,7 +1180,7 @@ |
RawSmi* context_level; |
}; |
- intptr_t num_variables_; |
+ int32_t num_variables_; |
RawObject** from() { |
return reinterpret_cast<RawObject**>(&ptr()->data()[0]); |
@@ -1416,12 +1449,12 @@ |
// Actual length in chunks at the time of allocation (later we may |
// clamp the operational length but we need to maintain a consistent |
// object length so that the object can be traversed during GC). |
- intptr_t allocated_length_; |
+ int32_t allocated_length_; |
// Operational length in chunks of the bigint object, clamping can |
// cause this length to be reduced. If the signed_length_ is |
// negative then the number is negative. |
- intptr_t signed_length_; |
+ int32_t signed_length_; |
// A sequence of Chunks (typedef in Bignum) representing bignum digits. |
// Bignum::Chunk chunks_[Utils::Abs(signed_length_)]; |
@@ -1734,8 +1767,10 @@ |
return reinterpret_cast<RawObject**>(&ptr()->pattern_); |
} |
- intptr_t type_; // Uninitialized, simple or complex. |
- intptr_t flags_; // Represents global/local, case insensitive, multiline. |
+ // A bitfield with two fields: |
+ // type: Uninitialized, simple or complex. |
+ // flags: Represents global/local, case insensitive, multiline. |
+ int8_t type_flags_; |
// Variable length data follows here. |
uint8_t* data() { OPEN_ARRAY_START(uint8_t, uint8_t); } |