From 6768703d24b6bb7a8b0ad8c70a43a11892c1a22c Mon Sep 17 00:00:00 2001 From: "sgjesse@chromium.org" Date: Wed, 28 Oct 2009 13:10:36 +0000 Subject: [PATCH] Derive string size constants * The maximum length of short and medium sized strings is now derived from other constants. * Remove the redundant String part of their names. Review URL: http://codereview.chromium.org/347002 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@3162 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/heap.cc | 28 ++++++++++++++-------------- src/objects-inl.h | 18 +++++++++--------- src/objects.cc | 6 +++--- src/objects.h | 14 ++++++++------ src/string-stream.cc | 2 +- test/cctest/test-api.cc | 4 ++-- 6 files changed, 37 insertions(+), 35 deletions(-) diff --git a/src/heap.cc b/src/heap.cc index 0cfbc55..ae18fbe 100644 --- a/src/heap.cc +++ b/src/heap.cc @@ -1810,10 +1810,10 @@ Object* Heap::AllocateConsString(String* first, String* second) { } Map* map; - if (length <= String::kMaxShortStringSize) { + if (length <= String::kMaxShortSize) { map = is_ascii ? short_cons_ascii_string_map() : short_cons_string_map(); - } else if (length <= String::kMaxMediumStringSize) { + } else if (length <= String::kMaxMediumSize) { map = is_ascii ? medium_cons_ascii_string_map() : medium_cons_string_map(); } else { @@ -1843,11 +1843,11 @@ Object* Heap::AllocateSlicedString(String* buffer, } Map* map; - if (length <= String::kMaxShortStringSize) { + if (length <= String::kMaxShortSize) { map = buffer->IsAsciiRepresentation() ? short_sliced_ascii_string_map() : short_sliced_string_map(); - } else if (length <= String::kMaxMediumStringSize) { + } else if (length <= String::kMaxMediumSize) { map = buffer->IsAsciiRepresentation() ? medium_sliced_ascii_string_map() : medium_sliced_string_map(); @@ -1912,9 +1912,9 @@ Object* Heap::AllocateExternalStringFromAscii( ExternalAsciiString::Resource* resource) { Map* map; int length = resource->length(); - if (length <= String::kMaxShortStringSize) { + if (length <= String::kMaxShortSize) { map = short_external_ascii_string_map(); - } else if (length <= String::kMaxMediumStringSize) { + } else if (length <= String::kMaxMediumSize) { map = medium_external_ascii_string_map(); } else { map = long_external_ascii_string_map(); @@ -2659,18 +2659,18 @@ Object* Heap::AllocateInternalSymbol(unibrow::CharacterStream* buffer, Map* map; if (is_ascii) { - if (chars <= String::kMaxShortStringSize) { + if (chars <= String::kMaxShortSize) { map = short_ascii_symbol_map(); - } else if (chars <= String::kMaxMediumStringSize) { + } else if (chars <= String::kMaxMediumSize) { map = medium_ascii_symbol_map(); } else { map = long_ascii_symbol_map(); } size = SeqAsciiString::SizeFor(chars); } else { - if (chars <= String::kMaxShortStringSize) { + if (chars <= String::kMaxShortSize) { map = short_symbol_map(); - } else if (chars <= String::kMaxMediumStringSize) { + } else if (chars <= String::kMaxMediumSize) { map = medium_symbol_map(); } else { map = long_symbol_map(); @@ -2720,9 +2720,9 @@ Object* Heap::AllocateRawAsciiString(int length, PretenureFlag pretenure) { // Determine the map based on the string's length. Map* map; - if (length <= String::kMaxShortStringSize) { + if (length <= String::kMaxShortSize) { map = short_ascii_string_map(); - } else if (length <= String::kMaxMediumStringSize) { + } else if (length <= String::kMaxMediumSize) { map = medium_ascii_string_map(); } else { map = long_ascii_string_map(); @@ -2757,9 +2757,9 @@ Object* Heap::AllocateRawTwoByteString(int length, PretenureFlag pretenure) { // Determine the map based on the string's length. Map* map; - if (length <= String::kMaxShortStringSize) { + if (length <= String::kMaxShortSize) { map = short_string_map(); - } else if (length <= String::kMaxMediumStringSize) { + } else if (length <= String::kMaxMediumSize) { map = medium_string_map(); } else { map = long_string_map(); diff --git a/src/objects-inl.h b/src/objects-inl.h index b229ed5..5907a86 100644 --- a/src/objects-inl.h +++ b/src/objects-inl.h @@ -1907,9 +1907,9 @@ void ExternalAsciiString::set_resource( Map* ExternalAsciiString::StringMap(int length) { Map* map; // Number of characters: determines the map. - if (length <= String::kMaxShortStringSize) { + if (length <= String::kMaxShortSize) { map = Heap::short_external_ascii_string_map(); - } else if (length <= String::kMaxMediumStringSize) { + } else if (length <= String::kMaxMediumSize) { map = Heap::medium_external_ascii_string_map(); } else { map = Heap::long_external_ascii_string_map(); @@ -1921,9 +1921,9 @@ Map* ExternalAsciiString::StringMap(int length) { Map* ExternalAsciiString::SymbolMap(int length) { Map* map; // Number of characters: determines the map. - if (length <= String::kMaxShortStringSize) { + if (length <= String::kMaxShortSize) { map = Heap::short_external_ascii_symbol_map(); - } else if (length <= String::kMaxMediumStringSize) { + } else if (length <= String::kMaxMediumSize) { map = Heap::medium_external_ascii_symbol_map(); } else { map = Heap::long_external_ascii_symbol_map(); @@ -1946,9 +1946,9 @@ void ExternalTwoByteString::set_resource( Map* ExternalTwoByteString::StringMap(int length) { Map* map; // Number of characters: determines the map. - if (length <= String::kMaxShortStringSize) { + if (length <= String::kMaxShortSize) { map = Heap::short_external_string_map(); - } else if (length <= String::kMaxMediumStringSize) { + } else if (length <= String::kMaxMediumSize) { map = Heap::medium_external_string_map(); } else { map = Heap::long_external_string_map(); @@ -1960,9 +1960,9 @@ Map* ExternalTwoByteString::StringMap(int length) { Map* ExternalTwoByteString::SymbolMap(int length) { Map* map; // Number of characters: determines the map. - if (length <= String::kMaxShortStringSize) { + if (length <= String::kMaxShortSize) { map = Heap::short_external_symbol_map(); - } else if (length <= String::kMaxMediumStringSize) { + } else if (length <= String::kMaxMediumSize) { map = Heap::medium_external_symbol_map(); } else { map = Heap::long_external_symbol_map(); @@ -2976,7 +2976,7 @@ StringHasher::StringHasher(int length) bool StringHasher::has_trivial_hash() { - return length_ > String::kMaxMediumStringSize; + return length_ > String::kMaxMediumSize; } diff --git a/src/objects.cc b/src/objects.cc index 28be636..b14ec5c 100644 --- a/src/objects.cc +++ b/src/objects.cc @@ -839,7 +839,7 @@ bool String::MakeExternal(v8::String::ExternalAsciiStringResource* resource) { void String::StringShortPrint(StringStream* accumulator) { int len = length(); - if (len > kMaxMediumStringSize) { + if (len > kMaxMediumSize) { accumulator->Add("", len); return; } @@ -4660,7 +4660,7 @@ static inline uint32_t HashField(uint32_t hash, bool is_array_index) { uint32_t StringHasher::GetHashField() { ASSERT(is_valid()); - if (length_ <= String::kMaxShortStringSize) { + if (length_ <= String::kMaxShortSize) { uint32_t payload; if (is_array_index()) { payload = v8::internal::HashField(array_index(), true); @@ -4669,7 +4669,7 @@ uint32_t StringHasher::GetHashField() { } return (payload & ((1 << String::kShortLengthShift) - 1)) | (length_ << String::kShortLengthShift); - } else if (length_ <= String::kMaxMediumStringSize) { + } else if (length_ <= String::kMaxMediumSize) { uint32_t payload = v8::internal::HashField(GetHash(), false); return (payload & ((1 << String::kMediumLengthShift) - 1)) | (length_ << String::kMediumLengthShift); diff --git a/src/objects.h b/src/objects.h index d21789e..61bdf44 100644 --- a/src/objects.h +++ b/src/objects.h @@ -4070,10 +4070,8 @@ class String: public HeapObject { static const int kSize = kLengthOffset + kIntSize; // Notice: kSize is not pointer-size aligned if pointers are 64-bit. - // Limits on sizes of different types of strings. - static const int kMaxShortStringSize = 63; - static const int kMaxMediumStringSize = 16383; - + // Maximum number of characters to consider when trying to convert a string + // value into an array index. static const int kMaxArrayIndexSize = 10; // Max ascii char code. @@ -4097,13 +4095,17 @@ class String: public HeapObject { // field. static const int kMaxCachedArrayIndexLength = 7; - // Shift constants for retriving length and hash code from + // Shift constants for retrieving length and hash code from // length/hash field. static const int kHashShift = kNofLengthBitFields; static const int kShortLengthShift = kHashShift + kShortStringTag; static const int kMediumLengthShift = kHashShift + kMediumStringTag; static const int kLongLengthShift = kHashShift + kLongStringTag; - // Maximal string length that can be stored in the hash/length field. + + // Maximal string length that can be stored in the hash/length field for + // different types of strings. + static const int kMaxShortSize = (1 << (32 - kShortLengthShift)) - 1; + static const int kMaxMediumSize = (1 << (32 - kMediumLengthShift)) - 1; static const int kMaxLength = (1 << (32 - kLongLengthShift)) - 1; // Limit for truncation in short printing. diff --git a/src/string-stream.cc b/src/string-stream.cc index 8c62a45..eb5d1e3 100644 --- a/src/string-stream.cc +++ b/src/string-stream.cc @@ -188,7 +188,7 @@ void StringStream::Add(Vector format, Vector elms) { void StringStream::PrintObject(Object* o) { o->ShortPrint(this); if (o->IsString()) { - if (String::cast(o)->length() <= String::kMaxMediumStringSize) { + if (String::cast(o)->length() <= String::kMaxMediumSize) { return; } } else if (o->IsNumber() || o->IsOddball()) { diff --git a/test/cctest/test-api.cc b/test/cctest/test-api.cc index e465688..83038ae 100644 --- a/test/cctest/test-api.cc +++ b/test/cctest/test-api.cc @@ -6958,7 +6958,7 @@ static void MorphAString(i::String* string, CHECK(string->map() == i::Heap::short_external_ascii_string_map() || string->map() == i::Heap::medium_external_ascii_string_map()); // Morph external string to be TwoByte string. - if (string->length() <= i::String::kMaxShortStringSize) { + if (string->length() <= i::String::kMaxShortSize) { string->set_map(i::Heap::short_external_string_map()); } else { string->set_map(i::Heap::medium_external_string_map()); @@ -6971,7 +6971,7 @@ static void MorphAString(i::String* string, CHECK(string->map() == i::Heap::short_external_string_map() || string->map() == i::Heap::medium_external_string_map()); // Morph external string to be ASCII string. - if (string->length() <= i::String::kMaxShortStringSize) { + if (string->length() <= i::String::kMaxShortSize) { string->set_map(i::Heap::short_external_ascii_string_map()); } else { string->set_map(i::Heap::medium_external_ascii_string_map()); -- 2.7.4