Index: src/objects-inl.h |
diff --git a/src/objects-inl.h b/src/objects-inl.h |
index f3a7fd3ce72bf9feeeba4c58f0fd4280abde914b..8ef4f3c9d7dd803ead0bc7e3bd9cabc04ae120e5 100644 |
--- a/src/objects-inl.h |
+++ b/src/objects-inl.h |
@@ -2297,8 +2297,9 @@ void ConsString::set_second(String* value, WriteBarrierMode mode) { |
} |
-void ExternalString::clear_data_cache() { |
- WRITE_INTPTR_FIELD(this, kResourceDataOffset, 0); |
+bool ExternalString::is_short() { |
+ InstanceType type = map()->instance_type(); |
+ return (type & kShortExternalStringMask) == kShortExternalStringTag; |
} |
@@ -2307,19 +2308,24 @@ const ExternalAsciiString::Resource* ExternalAsciiString::resource() { |
} |
+void ExternalAsciiString::update_data_cache() { |
+ if (is_short()) return; |
+ const char** data_field = |
+ reinterpret_cast<const char**>(FIELD_ADDR(this, kResourceDataOffset)); |
+ *data_field = resource()->data(); |
+} |
+ |
+ |
void ExternalAsciiString::set_resource( |
const ExternalAsciiString::Resource* resource) { |
*reinterpret_cast<const Resource**>( |
FIELD_ADDR(this, kResourceOffset)) = resource; |
- clear_data_cache(); |
+ if (resource != NULL) update_data_cache(); |
} |
const char* ExternalAsciiString::GetChars() { |
- const char** data_field = |
- reinterpret_cast<const char**>(FIELD_ADDR(this, kResourceDataOffset)); |
- if (*data_field == NULL) *data_field = resource()->data(); |
- return *data_field; |
+ return resource()->data(); |
} |
@@ -2334,19 +2340,24 @@ const ExternalTwoByteString::Resource* ExternalTwoByteString::resource() { |
} |
+void ExternalTwoByteString::update_data_cache() { |
+ if (is_short()) return; |
+ const uint16_t** data_field = |
+ reinterpret_cast<const uint16_t**>(FIELD_ADDR(this, kResourceDataOffset)); |
+ *data_field = resource()->data(); |
+} |
+ |
+ |
void ExternalTwoByteString::set_resource( |
const ExternalTwoByteString::Resource* resource) { |
*reinterpret_cast<const Resource**>( |
FIELD_ADDR(this, kResourceOffset)) = resource; |
- clear_data_cache(); |
+ if (resource != NULL) update_data_cache(); |
} |
const uint16_t* ExternalTwoByteString::GetChars() { |
- const uint16_t** data_field = |
- reinterpret_cast<const uint16_t**>(FIELD_ADDR(this, kResourceDataOffset)); |
- if (*data_field == NULL) *data_field = resource()->data(); |
- return *data_field; |
+ return resource()->data(); |
} |