| Index: runtime/vm/object.h
|
| diff --git a/runtime/vm/object.h b/runtime/vm/object.h
|
| index 954db0401dcc852c3a05e96012264734fc88930f..603467775b9072d2a688818e3bf1ac6d66e6ecaa 100644
|
| --- a/runtime/vm/object.h
|
| +++ b/runtime/vm/object.h
|
| @@ -432,18 +432,6 @@ class Object {
|
| return *transition_sentinel_;
|
| }
|
|
|
| -#if defined(HASH_IN_OBJECT_HEADER)
|
| - static uint32_t GetCachedHash(const RawObject* obj) {
|
| - uword tags = obj->ptr()->tags_;
|
| - return tags >> 32;
|
| - }
|
| -
|
| - static void SetCachedHash(RawObject* obj, uintptr_t hash) {
|
| - ASSERT(hash >> 32 == 0);
|
| - obj->ptr()->tags_ |= hash << 32;
|
| - }
|
| -#endif
|
| -
|
| // Compiler's constant propagation constants.
|
| static const Instance& unknown_constant() {
|
| ASSERT(unknown_constant_ != NULL);
|
| @@ -6764,11 +6752,8 @@ class String : public Instance {
|
| // All strings share the same maximum element count to keep things
|
| // simple. We choose a value that will prevent integer overflow for
|
| // 2 byte strings, since it is the worst case.
|
| -#if defined(HASH_IN_OBJECT_HEADER)
|
| - static const intptr_t kSizeofRawString = sizeof(RawInstance) + kWordSize;
|
| -#else
|
| - static const intptr_t kSizeofRawString = sizeof(RawInstance) + 2 * kWordSize;
|
| -#endif
|
| + static const intptr_t kSizeofRawString =
|
| + sizeof(RawInstance) + (2 * kWordSize);
|
| static const intptr_t kMaxElements = kSmiMax / kTwoByteChar;
|
|
|
| class CodePointIterator : public ValueObject {
|
| @@ -6804,32 +6789,28 @@ class String : public Instance {
|
| static intptr_t length_offset() { return OFFSET_OF(RawString, length_); }
|
|
|
| intptr_t Hash() const {
|
| - intptr_t result = GetCachedHash(raw());
|
| + intptr_t result = Smi::Value(raw_ptr()->hash_);
|
| if (result != 0) {
|
| return result;
|
| }
|
| result = String::Hash(*this, 0, this->Length());
|
| - SetCachedHash(raw(), result);
|
| + this->SetHash(result);
|
| return result;
|
| }
|
|
|
| bool HasHash() const {
|
| ASSERT(Smi::New(0) == NULL);
|
| - return GetCachedHash(raw()) != 0;
|
| + return (raw_ptr()->hash_ != NULL);
|
| }
|
|
|
| -#if defined(HASH_IN_OBJECT_HEADER)
|
| - static intptr_t hash_offset() { return kInt32Size; } // Wrong for big-endian?
|
| -#else
|
| static intptr_t hash_offset() { return OFFSET_OF(RawString, hash_); }
|
| -#endif
|
| static intptr_t Hash(const String& str, intptr_t begin_index, intptr_t len);
|
| static intptr_t Hash(const char* characters, intptr_t len);
|
| static intptr_t Hash(const uint16_t* characters, intptr_t len);
|
| static intptr_t Hash(const int32_t* characters, intptr_t len);
|
| static intptr_t HashRawSymbol(const RawString* symbol) {
|
| ASSERT(symbol->IsCanonical());
|
| - intptr_t result = GetCachedHash(symbol);
|
| + intptr_t result = Smi::Value(symbol->ptr()->hash_);
|
| ASSERT(result != 0);
|
| return result;
|
| }
|
| @@ -7048,16 +7029,6 @@ class String : public Instance {
|
| intptr_t end,
|
| double* result);
|
|
|
| -#if !defined(HASH_IN_OBJECT_HEADER)
|
| - static uint32_t GetCachedHash(const RawString* obj) {
|
| - return Smi::Value(obj->ptr()->hash_);
|
| - }
|
| -
|
| - static void SetCachedHash(RawString* obj, uintptr_t hash) {
|
| - obj->ptr()->hash_ = Smi::New(hash);
|
| - }
|
| -#endif
|
| -
|
| protected:
|
| // These two operate on an array of Latin-1 encoded characters.
|
| // They are protected to avoid mistaking Latin-1 for UTF-8, but used
|
| @@ -7071,7 +7042,11 @@ class String : public Instance {
|
| StoreSmi(&raw_ptr()->length_, Smi::New(value));
|
| }
|
|
|
| - void SetHash(intptr_t value) const { SetCachedHash(raw(), value); }
|
| + void SetHash(intptr_t value) const {
|
| + // This is only safe because we create a new Smi, which does not cause
|
| + // heap allocation.
|
| + StoreSmi(&raw_ptr()->hash_, Smi::New(value));
|
| + }
|
|
|
| template <typename HandleType, typename ElementType, typename CallbackType>
|
| static void ReadFromImpl(SnapshotReader* reader,
|
| @@ -7130,12 +7105,6 @@ class OneByteString : public AllStatic {
|
| static intptr_t InstanceSize(intptr_t len) {
|
| ASSERT(sizeof(RawOneByteString) == String::kSizeofRawString);
|
| ASSERT(0 <= len && len <= kMaxElements);
|
| -#if defined(HASH_IN_OBJECT_HEADER)
|
| - // We have to pad zero-length raw strings so that they can be externalized.
|
| - // If we don't pad, then the external string object does not fit in the
|
| - // memory allocated for the raw string.
|
| - if (len == 0) return InstanceSize(1);
|
| -#endif
|
| return String::RoundedAllocationSize(sizeof(RawOneByteString) +
|
| (len * kBytesPerElement));
|
| }
|
| @@ -7269,10 +7238,6 @@ class TwoByteString : public AllStatic {
|
| static intptr_t InstanceSize(intptr_t len) {
|
| ASSERT(sizeof(RawTwoByteString) == String::kSizeofRawString);
|
| ASSERT(0 <= len && len <= kMaxElements);
|
| - // We have to pad zero-length raw strings so that they can be externalized.
|
| - // If we don't pad, then the external string object does not fit in the
|
| - // memory allocated for the raw string.
|
| - if (len == 0) return InstanceSize(1);
|
| return String::RoundedAllocationSize(sizeof(RawTwoByteString) +
|
| (len * kBytesPerElement));
|
| }
|
| @@ -8966,7 +8931,7 @@ bool String::Equals(const String& str) const {
|
|
|
|
|
| intptr_t Library::UrlHash() const {
|
| - intptr_t result = String::GetCachedHash(url());
|
| + intptr_t result = Smi::Value(url()->ptr()->hash_);
|
| ASSERT(result != 0);
|
| return result;
|
| }
|
|
|