Chromium Code Reviews| Index: runtime/vm/raw_object.h |
| diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h |
| index 95288b1e1407513aceb2514fe2abea4016cd6c76..dc0aa7e7bc3a50767c89e435015ddb7879163623 100644 |
| --- a/runtime/vm/raw_object.h |
| +++ b/runtime/vm/raw_object.h |
| @@ -13,6 +13,10 @@ |
| #include "vm/token.h" |
| #include "vm/token_position.h" |
| +#if defined(ARCH_IS_64_BIT) |
| +#define HASH_IN_OBJECT_HEADER 1 |
|
Vyacheslav Egorov (Google)
2017/05/18 06:14:43
maybe this needs to go to globals.h?
erikcorry
2017/05/18 14:28:38
Done.
|
| +#endif |
| + |
| namespace dart { |
| // Macrobatics to define the Object hierarchy of VM implementation classes. |
| @@ -266,21 +270,11 @@ class RawObject { |
| kVMHeapObjectBit = 2, |
| kRememberedBit = 3, |
| kReservedTagPos = 4, // kReservedBit{100K,1M,10M} |
| -#if defined(ARCH_IS_32_BIT) |
| kReservedTagSize = 4, |
| kSizeTagPos = kReservedTagPos + kReservedTagSize, // = 8 |
| kSizeTagSize = 8, |
| kClassIdTagPos = kSizeTagPos + kSizeTagSize, // = 16 |
| kClassIdTagSize = 16, |
| -#elif defined(ARCH_IS_64_BIT) |
| - kReservedTagSize = 12, |
| - kSizeTagPos = kReservedTagPos + kReservedTagSize, // = 16 |
| - kSizeTagSize = 16, |
| - kClassIdTagPos = kSizeTagPos + kSizeTagSize, // = 32 |
| - kClassIdTagSize = 32, |
| -#else |
| -#error Unexpected architecture word size |
| -#endif |
| }; |
| COMPILE_ASSERT(kClassIdTagSize == (sizeof(classid_t) * kBitsPerByte)); |
| @@ -535,6 +529,20 @@ class RawObject { |
| ptr()->tags_ = ClassIdTag::update(new_cid, tags); |
| } |
| +#if defined(HASH_IN_OBJECT_HEADER) |
| + int32_t GetHeaderHash() const { |
| + ASSERT(IsHeapObject()); |
| + uword tags = ptr()->tags_; |
| + return tags >> 32; |
| + } |
| + |
| + void SetHeaderHash(uintptr_t hash) { |
| + ASSERT(GetHeaderHash() == 0); |
| + ASSERT(hash >> 32 == 0); |
| + ptr()->tags_ |= hash << 32ul; |
| + } |
| +#endif |
| + |
| template <class TagBitField> |
| void UpdateTagBit(bool value) { |
| uword tags = ptr()->tags_; |
| @@ -614,6 +622,7 @@ class RawObject { |
| friend class RawExternalTypedData; |
| friend class RawInstructions; |
| friend class RawInstance; |
| + friend class RawString; |
| friend class RawTypedData; |
| friend class Scavenger; |
| friend class ScavengerVisitor; |
| @@ -1820,6 +1829,17 @@ class RawInteger : public RawNumber { |
| class RawSmi : public RawInteger { |
| + public: |
| + static RawSmi* New(intptr_t value) { |
|
Vyacheslav Egorov (Google)
2017/05/18 06:14:42
It's very uncommon to have these here. Especially
erikcorry
2017/05/18 14:28:38
I managed to move them
|
| + intptr_t raw_smi = (value << kSmiTagShift) | kSmiTag; |
| + return reinterpret_cast<RawSmi*>(raw_smi); |
| + } |
| + |
| + intptr_t Value() { |
| + ASSERT(kSmiTag == 0); |
| + return reinterpret_cast<intptr_t>(this) >> kSmiTagShift; |
| + } |
| + |
| RAW_OBJECT_IMPLEMENTATION(Smi); |
| }; |
| @@ -1863,10 +1883,31 @@ class RawString : public RawInstance { |
| protected: |
| RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->length_); } |
| RawSmi* length_; |
| +#if !defined(HASH_IN_OBJECT_HEADER) |
| RawSmi* hash_; |
| RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->hash_); } |
| +#else |
| + RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->length_); } |
| +#endif |
| + |
| + private: |
| +#if defined(HASH_IN_OBJECT_HEADER) |
|
Vyacheslav Egorov (Google)
2017/05/18 06:14:43
I think this needs to go to object.h you can have
erikcorry
2017/05/18 14:28:38
Done.
|
| + uint32_t GetRawHash() const { return GetHeaderHash(); } |
| + void SetRawHash(uintptr_t hash) { |
|
Vyacheslav Egorov (Google)
2017/05/18 06:14:43
can this be uint32_t hash for consistency with Set
erikcorry
2017/05/18 14:28:38
No, then the assert doesn't work.
I want to ensur
|
| + ASSERT(hash >> 32 == 0); |
| + SetHeaderHash(hash); |
|
Vyacheslav Egorov (Google)
2017/05/18 06:14:43
I would better call is SetHashInHeader() or SetHas
erikcorry
2017/05/18 14:28:38
This no longer exists.
|
| + } |
| +#else |
| + uint32_t GetRawHash() const { return ptr()->hash_->Value(); } |
| + void SetRawHash(uint32_t hash) { ptr()->hash_ = RawSmi::New(hash); } |
| +#endif |
| friend class Library; |
| + friend class OneByteStringSerializationCluster; |
| + friend class TwoByteStringSerializationCluster; |
| + friend class OneByteStringDeserializationCluster; |
| + friend class TwoByteStringDeserializationCluster; |
| + friend class RODataSerializationCluster; |
| }; |
| @@ -2453,6 +2494,7 @@ inline intptr_t RawObject::NumberOfTypedDataClasses() { |
| return (kNullCid - kTypedDataInt8ArrayCid); |
| } |
| + |
| } // namespace dart |
| #endif // RUNTIME_VM_RAW_OBJECT_H_ |