| Index: src/heap.cc
|
| diff --git a/src/heap.cc b/src/heap.cc
|
| index 6637b9af65bd54fefada680625cccff304cf7905..532186a5955138da5503acb7644d144b2b22cdd2 100644
|
| --- a/src/heap.cc
|
| +++ b/src/heap.cc
|
| @@ -127,7 +127,7 @@ Heap::Heap()
|
| amount_of_external_allocated_memory_at_last_global_gc_(0),
|
| old_gen_exhausted_(false),
|
| store_buffer_rebuilder_(store_buffer()),
|
| - hidden_symbol_(NULL),
|
| + hidden_string_(NULL),
|
| global_gc_prologue_callback_(NULL),
|
| global_gc_epilogue_callback_(NULL),
|
| gc_safe_size_of_old_object_(NULL),
|
| @@ -492,10 +492,10 @@ void Heap::GarbageCollectionEpilogue() {
|
| isolate_->counters()->alive_after_last_gc()->Set(
|
| static_cast<int>(SizeOfObjects()));
|
|
|
| - isolate_->counters()->symbol_table_capacity()->Set(
|
| - symbol_table()->Capacity());
|
| + isolate_->counters()->string_table_capacity()->Set(
|
| + string_table()->Capacity());
|
| isolate_->counters()->number_of_symbols()->Set(
|
| - symbol_table()->NumberOfElements());
|
| + string_table()->NumberOfElements());
|
|
|
| if (CommittedMemory() > 0) {
|
| isolate_->counters()->external_fragmentation_total()->AddSample(
|
| @@ -705,24 +705,25 @@ void Heap::MoveElements(FixedArray* array,
|
|
|
|
|
| #ifdef VERIFY_HEAP
|
| -// Helper class for verifying the symbol table.
|
| -class SymbolTableVerifier : public ObjectVisitor {
|
| +// Helper class for verifying the string table.
|
| +class StringTableVerifier : public ObjectVisitor {
|
| public:
|
| void VisitPointers(Object** start, Object** end) {
|
| // Visit all HeapObject pointers in [start, end).
|
| for (Object** p = start; p < end; p++) {
|
| if ((*p)->IsHeapObject()) {
|
| - // Check that the symbol is actually a symbol.
|
| - CHECK((*p)->IsTheHole() || (*p)->IsUndefined() || (*p)->IsSymbol());
|
| + // Check that the string is actually internalized.
|
| + CHECK((*p)->IsTheHole() || (*p)->IsUndefined() ||
|
| + (*p)->IsInternalizedString());
|
| }
|
| }
|
| }
|
| };
|
|
|
|
|
| -static void VerifySymbolTable() {
|
| - SymbolTableVerifier verifier;
|
| - HEAP->symbol_table()->IterateElements(&verifier);
|
| +static void VerifyStringTable() {
|
| + StringTableVerifier verifier;
|
| + HEAP->string_table()->IterateElements(&verifier);
|
| }
|
| #endif // VERIFY_HEAP
|
|
|
| @@ -883,7 +884,7 @@ bool Heap::PerformGarbageCollection(GarbageCollector collector,
|
|
|
| #ifdef VERIFY_HEAP
|
| if (FLAG_verify_heap) {
|
| - VerifySymbolTable();
|
| + VerifyStringTable();
|
| }
|
| #endif
|
|
|
| @@ -1008,7 +1009,7 @@ bool Heap::PerformGarbageCollection(GarbageCollector collector,
|
|
|
| #ifdef VERIFY_HEAP
|
| if (FLAG_verify_heap) {
|
| - VerifySymbolTable();
|
| + VerifyStringTable();
|
| }
|
| #endif
|
|
|
| @@ -1625,10 +1626,11 @@ void Heap::ProcessWeakReferences(WeakObjectRetainer* retainer) {
|
| void Heap::VisitExternalResources(v8::ExternalResourceVisitor* visitor) {
|
| AssertNoAllocation no_allocation;
|
|
|
| - // Both the external string table and the symbol table may contain
|
| + // Both the external string table and the string table may contain
|
| // external strings, but neither lists them exhaustively, nor is the
|
| // intersection set empty. Therefore we iterate over the external string
|
| - // table first, ignoring symbols, and then over the symbol table.
|
| + // table first, ignoring internalized strings, and then over the
|
| + // internalized string table.
|
|
|
| class ExternalStringTableVisitorAdapter : public ObjectVisitor {
|
| public:
|
| @@ -1636,9 +1638,9 @@ void Heap::VisitExternalResources(v8::ExternalResourceVisitor* visitor) {
|
| v8::ExternalResourceVisitor* visitor) : visitor_(visitor) {}
|
| virtual void VisitPointers(Object** start, Object** end) {
|
| for (Object** p = start; p < end; p++) {
|
| - // Visit non-symbol external strings,
|
| - // since symbols are listed in the symbol table.
|
| - if (!(*p)->IsSymbol()) {
|
| + // Visit non-internalized external strings,
|
| + // since internalized strings are listed in the string table.
|
| + if (!(*p)->IsInternalizedString()) {
|
| ASSERT((*p)->IsExternalString());
|
| visitor_->VisitExternalString(Utils::ToLocal(
|
| Handle<String>(String::cast(*p))));
|
| @@ -1651,14 +1653,14 @@ void Heap::VisitExternalResources(v8::ExternalResourceVisitor* visitor) {
|
|
|
| external_string_table_.Iterate(&external_string_table_visitor);
|
|
|
| - class SymbolTableVisitorAdapter : public ObjectVisitor {
|
| + class StringTableVisitorAdapter : public ObjectVisitor {
|
| public:
|
| - explicit SymbolTableVisitorAdapter(
|
| + explicit StringTableVisitorAdapter(
|
| v8::ExternalResourceVisitor* visitor) : visitor_(visitor) {}
|
| virtual void VisitPointers(Object** start, Object** end) {
|
| for (Object** p = start; p < end; p++) {
|
| if ((*p)->IsExternalString()) {
|
| - ASSERT((*p)->IsSymbol());
|
| + ASSERT((*p)->IsInternalizedString());
|
| visitor_->VisitExternalString(Utils::ToLocal(
|
| Handle<String>(String::cast(*p))));
|
| }
|
| @@ -1666,9 +1668,9 @@ void Heap::VisitExternalResources(v8::ExternalResourceVisitor* visitor) {
|
| }
|
| private:
|
| v8::ExternalResourceVisitor* visitor_;
|
| - } symbol_table_visitor(visitor);
|
| + } string_table_visitor(visitor);
|
|
|
| - symbol_table()->IterateElements(&symbol_table_visitor);
|
| + string_table()->IterateElements(&string_table_visitor);
|
| }
|
|
|
|
|
| @@ -2278,11 +2280,11 @@ const Heap::StringTypeTable Heap::string_type_table[] = {
|
| };
|
|
|
|
|
| -const Heap::ConstantSymbolTable Heap::constant_symbol_table[] = {
|
| -#define CONSTANT_SYMBOL_ELEMENT(name, contents) \
|
| +const Heap::ConstantStringTable Heap::constant_string_table[] = {
|
| +#define CONSTANT_STRING_ELEMENT(name, contents) \
|
| {contents, k##name##RootIndex},
|
| - SYMBOL_LIST(CONSTANT_SYMBOL_ELEMENT)
|
| -#undef CONSTANT_SYMBOL_ELEMENT
|
| + INTERNALIZED_STRING_LIST(CONSTANT_STRING_ELEMENT)
|
| +#undef CONSTANT_STRING_ELEMENT
|
| };
|
|
|
|
|
| @@ -2745,17 +2747,17 @@ bool Heap::CreateInitialObjects() {
|
| set_infinity_value(HeapNumber::cast(obj));
|
|
|
| // The hole has not been created yet, but we want to put something
|
| - // predictable in the gaps in the symbol table, so lets make that Smi zero.
|
| + // predictable in the gaps in the string table, so lets make that Smi zero.
|
| set_the_hole_value(reinterpret_cast<Oddball*>(Smi::FromInt(0)));
|
|
|
| - // Allocate initial symbol table.
|
| - { MaybeObject* maybe_obj = SymbolTable::Allocate(kInitialSymbolTableSize);
|
| + // Allocate initial string table.
|
| + { MaybeObject* maybe_obj = StringTable::Allocate(kInitialStringTableSize);
|
| if (!maybe_obj->ToObject(&obj)) return false;
|
| }
|
| - // Don't use set_symbol_table() due to asserts.
|
| - roots_[kSymbolTableRootIndex] = obj;
|
| + // Don't use set_string_table() due to asserts.
|
| + roots_[kStringTableRootIndex] = obj;
|
|
|
| - // Finish initializing oddballs after creating symboltable.
|
| + // Finish initializing oddballs after creating the string table.
|
| { MaybeObject* maybe_obj =
|
| undefined_value()->Initialize("undefined",
|
| nan_value(),
|
| @@ -2811,31 +2813,25 @@ bool Heap::CreateInitialObjects() {
|
| }
|
| set_termination_exception(obj);
|
|
|
| - // Allocate the empty string.
|
| - { MaybeObject* maybe_obj = AllocateRawOneByteString(0, TENURED);
|
| - if (!maybe_obj->ToObject(&obj)) return false;
|
| - }
|
| - set_empty_string(String::cast(obj));
|
| -
|
| - for (unsigned i = 0; i < ARRAY_SIZE(constant_symbol_table); i++) {
|
| + for (unsigned i = 0; i < ARRAY_SIZE(constant_string_table); i++) {
|
| { MaybeObject* maybe_obj =
|
| - LookupUtf8Symbol(constant_symbol_table[i].contents);
|
| + InternalizeUtf8String(constant_string_table[i].contents);
|
| if (!maybe_obj->ToObject(&obj)) return false;
|
| }
|
| - roots_[constant_symbol_table[i].index] = String::cast(obj);
|
| + roots_[constant_string_table[i].index] = String::cast(obj);
|
| }
|
|
|
| - // Allocate the hidden symbol which is used to identify the hidden properties
|
| + // Allocate the hidden string which is used to identify the hidden properties
|
| // in JSObjects. The hash code has a special value so that it will not match
|
| // the empty string when searching for the property. It cannot be part of the
|
| // loop above because it needs to be allocated manually with the special
|
| - // hash code in place. The hash code for the hidden_symbol is zero to ensure
|
| + // hash code in place. The hash code for the hidden_string is zero to ensure
|
| // that it will always be at the first entry in property descriptors.
|
| - { MaybeObject* maybe_obj =
|
| - AllocateOneByteSymbol(OneByteVector("", 0), String::kEmptyStringHash);
|
| + { MaybeObject* maybe_obj = AllocateOneByteInternalizedString(
|
| + OneByteVector("", 0), String::kEmptyStringHash);
|
| if (!maybe_obj->ToObject(&obj)) return false;
|
| }
|
| - hidden_symbol_ = String::cast(obj);
|
| + hidden_string_ = String::cast(obj);
|
|
|
| // Allocate the foreign for __proto__.
|
| { MaybeObject* maybe_obj =
|
| @@ -2957,7 +2953,7 @@ bool Heap::RootCanBeWrittenAfterInitialization(Heap::RootListIndex root_index) {
|
| kConstructStubDeoptPCOffsetRootIndex,
|
| kGetterStubDeoptPCOffsetRootIndex,
|
| kSetterStubDeoptPCOffsetRootIndex,
|
| - kSymbolTableRootIndex,
|
| + kStringTableRootIndex,
|
| };
|
|
|
| for (unsigned int i = 0; i < ARRAY_SIZE(writable_roots); i++) {
|
| @@ -2973,10 +2969,10 @@ Object* RegExpResultsCache::Lookup(Heap* heap,
|
| Object* key_pattern,
|
| ResultsCacheType type) {
|
| FixedArray* cache;
|
| - if (!key_string->IsSymbol()) return Smi::FromInt(0);
|
| + if (!key_string->IsInternalizedString()) return Smi::FromInt(0);
|
| if (type == STRING_SPLIT_SUBSTRINGS) {
|
| ASSERT(key_pattern->IsString());
|
| - if (!key_pattern->IsSymbol()) return Smi::FromInt(0);
|
| + if (!key_pattern->IsInternalizedString()) return Smi::FromInt(0);
|
| cache = heap->string_split_cache();
|
| } else {
|
| ASSERT(type == REGEXP_MULTIPLE_INDICES);
|
| @@ -3007,10 +3003,10 @@ void RegExpResultsCache::Enter(Heap* heap,
|
| FixedArray* value_array,
|
| ResultsCacheType type) {
|
| FixedArray* cache;
|
| - if (!key_string->IsSymbol()) return;
|
| + if (!key_string->IsInternalizedString()) return;
|
| if (type == STRING_SPLIT_SUBSTRINGS) {
|
| ASSERT(key_pattern->IsString());
|
| - if (!key_pattern->IsSymbol()) return;
|
| + if (!key_pattern->IsInternalizedString()) return;
|
| cache = heap->string_split_cache();
|
| } else {
|
| ASSERT(type == REGEXP_MULTIPLE_INDICES);
|
| @@ -3042,14 +3038,14 @@ void RegExpResultsCache::Enter(Heap* heap,
|
| }
|
| }
|
| // If the array is a reasonably short list of substrings, convert it into a
|
| - // list of symbols.
|
| + // list of internalized strings.
|
| if (type == STRING_SPLIT_SUBSTRINGS && value_array->length() < 100) {
|
| for (int i = 0; i < value_array->length(); i++) {
|
| String* str = String::cast(value_array->get(i));
|
| - Object* symbol;
|
| - MaybeObject* maybe_symbol = heap->LookupSymbol(str);
|
| - if (maybe_symbol->ToObject(&symbol)) {
|
| - value_array->set(i, symbol);
|
| + Object* internalized_str;
|
| + MaybeObject* maybe_string = heap->InternalizeString(str);
|
| + if (maybe_string->ToObject(&internalized_str)) {
|
| + value_array->set(i, internalized_str);
|
| }
|
| }
|
| }
|
| @@ -3282,7 +3278,7 @@ MaybeObject* Heap::AllocateSharedFunctionInfo(Object* name) {
|
| Code* construct_stub =
|
| isolate_->builtins()->builtin(Builtins::kJSConstructStubGeneric);
|
| share->set_construct_stub(construct_stub);
|
| - share->set_instance_class_name(Object_symbol());
|
| + share->set_instance_class_name(Object_string());
|
| share->set_function_data(undefined_value(), SKIP_WRITE_BARRIER);
|
| share->set_script(undefined_value(), SKIP_WRITE_BARRIER);
|
| share->set_debug_info(undefined_value(), SKIP_WRITE_BARRIER);
|
| @@ -3348,12 +3344,12 @@ MUST_USE_RESULT static inline MaybeObject* MakeOrFindTwoCharacterString(
|
| Heap* heap,
|
| uint16_t c1,
|
| uint16_t c2) {
|
| - String* symbol;
|
| + String* result;
|
| // Numeric strings have a different hash algorithm not known by
|
| - // LookupTwoCharsSymbolIfExists, so we skip this step for such strings.
|
| + // LookupTwoCharsStringIfExists, so we skip this step for such strings.
|
| if ((!Between(c1, '0', '9') || !Between(c2, '0', '9')) &&
|
| - heap->symbol_table()->LookupTwoCharsSymbolIfExists(c1, c2, &symbol)) {
|
| - return symbol;
|
| + heap->string_table()->LookupTwoCharsStringIfExists(c1, c2, &result)) {
|
| + return result;
|
| // Now we know the length is 2, we might as well make use of that fact
|
| // when building the new string.
|
| } else if (static_cast<unsigned>(c1 | c2) <= String::kMaxOneByteCharCodeU) {
|
| @@ -3394,7 +3390,7 @@ MaybeObject* Heap::AllocateConsString(String* first, String* second) {
|
| int length = first_length + second_length;
|
|
|
| // Optimization for 2-byte strings often used as keys in a decompression
|
| - // dictionary. Check whether we already have the string in the symbol
|
| + // dictionary. Check whether we already have the string in the string
|
| // table to prevent creation of many unneccesary strings.
|
| if (length == 2) {
|
| uint16_t c1 = first->Get(0);
|
| @@ -3509,8 +3505,8 @@ MaybeObject* Heap::AllocateSubString(String* buffer,
|
| return LookupSingleCharacterStringFromCode(buffer->Get(start));
|
| } else if (length == 2) {
|
| // Optimization for 2-byte strings often used as keys in a decompression
|
| - // dictionary. Check whether we already have the string in the symbol
|
| - // table to prevent creation of many unneccesary strings.
|
| + // dictionary. Check whether we already have the string in the string
|
| + // table to prevent creation of many unnecessary strings.
|
| uint16_t c1 = buffer->Get(start);
|
| uint16_t c2 = buffer->Get(start + 1);
|
| return MakeOrFindTwoCharacterString(this, c1, c2);
|
| @@ -3655,7 +3651,7 @@ MaybeObject* Heap::LookupSingleCharacterStringFromCode(uint16_t code) {
|
| buffer[0] = static_cast<uint8_t>(code);
|
| Object* result;
|
| MaybeObject* maybe_result =
|
| - LookupOneByteSymbol(Vector<const uint8_t>(buffer, 1));
|
| + InternalizeOneByteString(Vector<const uint8_t>(buffer, 1));
|
|
|
| if (!maybe_result->ToObject(&result)) return maybe_result;
|
| single_character_string_cache()->set(code, result);
|
| @@ -3964,7 +3960,7 @@ MaybeObject* Heap::AllocateFunctionPrototype(JSFunction* function) {
|
| // constructor to the function.
|
| MaybeObject* maybe_failure =
|
| JSObject::cast(prototype)->SetLocalPropertyIgnoreAttributes(
|
| - constructor_symbol(), function, DONT_ENUM);
|
| + constructor_string(), function, DONT_ENUM);
|
| if (maybe_failure->IsFailure()) return maybe_failure;
|
|
|
| return prototype;
|
| @@ -4103,7 +4099,7 @@ MaybeObject* Heap::AllocateInitialMap(JSFunction* fun) {
|
| DescriptorArray::WhitenessWitness witness(descriptors);
|
| for (int i = 0; i < count; i++) {
|
| String* name = fun->shared()->GetThisPropertyAssignmentName(i);
|
| - ASSERT(name->IsSymbol());
|
| + ASSERT(name->IsInternalizedString());
|
| FieldDescriptor field(name, i, NONE, i + 1);
|
| descriptors->Set(i, &field, witness);
|
| }
|
| @@ -4533,7 +4529,8 @@ MaybeObject* Heap::ReinitializeJSReceiver(
|
| SharedFunctionInfo* shared = NULL;
|
| if (type == JS_FUNCTION_TYPE) {
|
| String* name;
|
| - maybe = LookupOneByteSymbol(STATIC_ASCII_VECTOR("<freezing call trap>"));
|
| + maybe =
|
| + InternalizeOneByteString(STATIC_ASCII_VECTOR("<freezing call trap>"));
|
| if (!maybe->To<String>(&name)) return maybe;
|
| maybe = AllocateSharedFunctionInfo(name);
|
| if (!maybe->To<SharedFunctionInfo>(&shared)) return maybe;
|
| @@ -4667,25 +4664,27 @@ MaybeObject* Heap::AllocateStringFromTwoByte(Vector<const uc16> string,
|
| }
|
|
|
|
|
| -Map* Heap::SymbolMapForString(String* string) {
|
| - // If the string is in new space it cannot be used as a symbol.
|
| +Map* Heap::InternalizedStringMapForString(String* string) {
|
| + // If the string is in new space it cannot be used as internalized.
|
| if (InNewSpace(string)) return NULL;
|
|
|
| - // Find the corresponding symbol map for strings.
|
| + // Find the corresponding internalized string map for strings.
|
| switch (string->map()->instance_type()) {
|
| - case STRING_TYPE: return symbol_map();
|
| - case ASCII_STRING_TYPE: return ascii_symbol_map();
|
| - case CONS_STRING_TYPE: return cons_symbol_map();
|
| - case CONS_ASCII_STRING_TYPE: return cons_ascii_symbol_map();
|
| - case EXTERNAL_STRING_TYPE: return external_symbol_map();
|
| - case EXTERNAL_ASCII_STRING_TYPE: return external_ascii_symbol_map();
|
| + case STRING_TYPE: return internalized_string_map();
|
| + case ASCII_STRING_TYPE: return ascii_internalized_string_map();
|
| + case CONS_STRING_TYPE: return cons_internalized_string_map();
|
| + case CONS_ASCII_STRING_TYPE: return cons_ascii_internalized_string_map();
|
| + case EXTERNAL_STRING_TYPE: return external_internalized_string_map();
|
| + case EXTERNAL_ASCII_STRING_TYPE:
|
| + return external_ascii_internalized_string_map();
|
| case EXTERNAL_STRING_WITH_ASCII_DATA_TYPE:
|
| - return external_symbol_with_ascii_data_map();
|
| - case SHORT_EXTERNAL_STRING_TYPE: return short_external_symbol_map();
|
| + return external_internalized_string_with_ascii_data_map();
|
| + case SHORT_EXTERNAL_STRING_TYPE:
|
| + return short_external_internalized_string_map();
|
| case SHORT_EXTERNAL_ASCII_STRING_TYPE:
|
| - return short_external_ascii_symbol_map();
|
| + return short_external_ascii_internalized_string_map();
|
| case SHORT_EXTERNAL_STRING_WITH_ASCII_DATA_TYPE:
|
| - return short_external_symbol_with_ascii_data_map();
|
| + return short_external_internalized_string_with_ascii_data_map();
|
| default: return NULL; // No match found.
|
| }
|
| }
|
| @@ -4739,9 +4738,8 @@ static inline void WriteTwoByteData(String* s, uint16_t* chars, int len) {
|
|
|
|
|
| template<bool is_one_byte, typename T>
|
| -MaybeObject* Heap::AllocateInternalSymbol(T t,
|
| - int chars,
|
| - uint32_t hash_field) {
|
| +MaybeObject* Heap::AllocateInternalizedStringImpl(
|
| + T t, int chars, uint32_t hash_field) {
|
| ASSERT(chars >= 0);
|
| // Compute map and object size.
|
| int size;
|
| @@ -4751,13 +4749,13 @@ MaybeObject* Heap::AllocateInternalSymbol(T t,
|
| if (chars > SeqOneByteString::kMaxLength) {
|
| return Failure::OutOfMemoryException(0x9);
|
| }
|
| - map = ascii_symbol_map();
|
| + map = ascii_internalized_string_map();
|
| size = SeqOneByteString::SizeFor(chars);
|
| } else {
|
| if (chars > SeqTwoByteString::kMaxLength) {
|
| return Failure::OutOfMemoryException(0xa);
|
| }
|
| - map = symbol_map();
|
| + map = internalized_string_map();
|
| size = SeqTwoByteString::SizeFor(chars);
|
| }
|
|
|
| @@ -4788,13 +4786,13 @@ MaybeObject* Heap::AllocateInternalSymbol(T t,
|
|
|
| // Need explicit instantiations.
|
| template
|
| -MaybeObject* Heap::AllocateInternalSymbol<true>(String*, int, uint32_t);
|
| +MaybeObject* Heap::AllocateInternalizedStringImpl<true>(String*, int, uint32_t);
|
| template
|
| -MaybeObject* Heap::AllocateInternalSymbol<false>(String*, int, uint32_t);
|
| +MaybeObject* Heap::AllocateInternalizedStringImpl<false>(
|
| + String*, int, uint32_t);
|
| template
|
| -MaybeObject* Heap::AllocateInternalSymbol<false>(Vector<const char>,
|
| - int,
|
| - uint32_t);
|
| +MaybeObject* Heap::AllocateInternalizedStringImpl<false>(
|
| + Vector<const char>, int, uint32_t);
|
|
|
|
|
| MaybeObject* Heap::AllocateRawOneByteString(int length,
|
| @@ -5665,93 +5663,93 @@ void Heap::Verify() {
|
| #endif
|
|
|
|
|
| -MaybeObject* Heap::LookupUtf8Symbol(Vector<const char> string) {
|
| - Object* symbol = NULL;
|
| +MaybeObject* Heap::InternalizeUtf8String(Vector<const char> string) {
|
| + Object* result = NULL;
|
| Object* new_table;
|
| { MaybeObject* maybe_new_table =
|
| - symbol_table()->LookupUtf8Symbol(string, &symbol);
|
| + string_table()->LookupUtf8String(string, &result);
|
| if (!maybe_new_table->ToObject(&new_table)) return maybe_new_table;
|
| }
|
| - // Can't use set_symbol_table because SymbolTable::cast knows that
|
| - // SymbolTable is a singleton and checks for identity.
|
| - roots_[kSymbolTableRootIndex] = new_table;
|
| - ASSERT(symbol != NULL);
|
| - return symbol;
|
| + // Can't use set_string_table because StringTable::cast knows that
|
| + // StringTable is a singleton and checks for identity.
|
| + roots_[kStringTableRootIndex] = new_table;
|
| + ASSERT(result != NULL);
|
| + return result;
|
| }
|
|
|
|
|
| -MaybeObject* Heap::LookupOneByteSymbol(Vector<const uint8_t> string) {
|
| - Object* symbol = NULL;
|
| +MaybeObject* Heap::InternalizeOneByteString(Vector<const uint8_t> string) {
|
| + Object* result = NULL;
|
| Object* new_table;
|
| { MaybeObject* maybe_new_table =
|
| - symbol_table()->LookupOneByteSymbol(string, &symbol);
|
| + string_table()->LookupOneByteString(string, &result);
|
| if (!maybe_new_table->ToObject(&new_table)) return maybe_new_table;
|
| }
|
| - // Can't use set_symbol_table because SymbolTable::cast knows that
|
| - // SymbolTable is a singleton and checks for identity.
|
| - roots_[kSymbolTableRootIndex] = new_table;
|
| - ASSERT(symbol != NULL);
|
| - return symbol;
|
| + // Can't use set_string_table because StringTable::cast knows that
|
| + // StringTable is a singleton and checks for identity.
|
| + roots_[kStringTableRootIndex] = new_table;
|
| + ASSERT(result != NULL);
|
| + return result;
|
| }
|
|
|
|
|
| -MaybeObject* Heap::LookupOneByteSymbol(Handle<SeqOneByteString> string,
|
| +MaybeObject* Heap::InternalizeOneByteString(Handle<SeqOneByteString> string,
|
| int from,
|
| int length) {
|
| - Object* symbol = NULL;
|
| + Object* result = NULL;
|
| Object* new_table;
|
| { MaybeObject* maybe_new_table =
|
| - symbol_table()->LookupSubStringOneByteSymbol(string,
|
| + string_table()->LookupSubStringOneByteString(string,
|
| from,
|
| length,
|
| - &symbol);
|
| + &result);
|
| if (!maybe_new_table->ToObject(&new_table)) return maybe_new_table;
|
| }
|
| - // Can't use set_symbol_table because SymbolTable::cast knows that
|
| - // SymbolTable is a singleton and checks for identity.
|
| - roots_[kSymbolTableRootIndex] = new_table;
|
| - ASSERT(symbol != NULL);
|
| - return symbol;
|
| + // Can't use set_string_table because StringTable::cast knows that
|
| + // StringTable is a singleton and checks for identity.
|
| + roots_[kStringTableRootIndex] = new_table;
|
| + ASSERT(result != NULL);
|
| + return result;
|
| }
|
|
|
|
|
| -MaybeObject* Heap::LookupTwoByteSymbol(Vector<const uc16> string) {
|
| - Object* symbol = NULL;
|
| +MaybeObject* Heap::InternalizeTwoByteString(Vector<const uc16> string) {
|
| + Object* result = NULL;
|
| Object* new_table;
|
| { MaybeObject* maybe_new_table =
|
| - symbol_table()->LookupTwoByteSymbol(string, &symbol);
|
| + string_table()->LookupTwoByteString(string, &result);
|
| if (!maybe_new_table->ToObject(&new_table)) return maybe_new_table;
|
| }
|
| - // Can't use set_symbol_table because SymbolTable::cast knows that
|
| - // SymbolTable is a singleton and checks for identity.
|
| - roots_[kSymbolTableRootIndex] = new_table;
|
| - ASSERT(symbol != NULL);
|
| - return symbol;
|
| + // Can't use set_string_table because StringTable::cast knows that
|
| + // StringTable is a singleton and checks for identity.
|
| + roots_[kStringTableRootIndex] = new_table;
|
| + ASSERT(result != NULL);
|
| + return result;
|
| }
|
|
|
|
|
| -MaybeObject* Heap::LookupSymbol(String* string) {
|
| - if (string->IsSymbol()) return string;
|
| - Object* symbol = NULL;
|
| +MaybeObject* Heap::InternalizeString(String* string) {
|
| + if (string->IsInternalizedString()) return string;
|
| + Object* result = NULL;
|
| Object* new_table;
|
| { MaybeObject* maybe_new_table =
|
| - symbol_table()->LookupString(string, &symbol);
|
| + string_table()->LookupString(string, &result);
|
| if (!maybe_new_table->ToObject(&new_table)) return maybe_new_table;
|
| }
|
| - // Can't use set_symbol_table because SymbolTable::cast knows that
|
| - // SymbolTable is a singleton and checks for identity.
|
| - roots_[kSymbolTableRootIndex] = new_table;
|
| - ASSERT(symbol != NULL);
|
| - return symbol;
|
| + // Can't use set_string_table because StringTable::cast knows that
|
| + // StringTable is a singleton and checks for identity.
|
| + roots_[kStringTableRootIndex] = new_table;
|
| + ASSERT(result != NULL);
|
| + return result;
|
| }
|
|
|
|
|
| -bool Heap::LookupSymbolIfExists(String* string, String** symbol) {
|
| - if (string->IsSymbol()) {
|
| - *symbol = string;
|
| +bool Heap::InternalizeStringIfExists(String* string, String** result) {
|
| + if (string->IsInternalizedString()) {
|
| + *result = string;
|
| return true;
|
| }
|
| - return symbol_table()->LookupSymbolIfExists(string, symbol);
|
| + return string_table()->LookupStringIfExists(string, result);
|
| }
|
|
|
|
|
| @@ -5979,8 +5977,8 @@ void Heap::IterateRoots(ObjectVisitor* v, VisitMode mode) {
|
|
|
|
|
| void Heap::IterateWeakRoots(ObjectVisitor* v, VisitMode mode) {
|
| - v->VisitPointer(reinterpret_cast<Object**>(&roots_[kSymbolTableRootIndex]));
|
| - v->Synchronize(VisitorSynchronization::kSymbolTable);
|
| + v->VisitPointer(reinterpret_cast<Object**>(&roots_[kStringTableRootIndex]));
|
| + v->Synchronize(VisitorSynchronization::kStringTable);
|
| if (mode != VISIT_ALL_IN_SCAVENGE &&
|
| mode != VISIT_ALL_IN_SWEEP_NEWSPACE) {
|
| // Scavenge collections have special processing for this.
|
| @@ -5995,8 +5993,8 @@ void Heap::IterateStrongRoots(ObjectVisitor* v, VisitMode mode) {
|
| v->VisitPointers(&roots_[0], &roots_[kStrongRootListLength]);
|
| v->Synchronize(VisitorSynchronization::kStrongRootList);
|
|
|
| - v->VisitPointer(BitCast<Object**>(&hidden_symbol_));
|
| - v->Synchronize(VisitorSynchronization::kSymbol);
|
| + v->VisitPointer(BitCast<Object**>(&hidden_string_));
|
| + v->Synchronize(VisitorSynchronization::kInternalizedString);
|
|
|
| isolate_->bootstrapper()->Iterate(v);
|
| v->Synchronize(VisitorSynchronization::kBootstrapper);
|
| @@ -7181,9 +7179,9 @@ int KeyedLookupCache::Lookup(Map* map, String* name) {
|
|
|
|
|
| void KeyedLookupCache::Update(Map* map, String* name, int field_offset) {
|
| - String* symbol;
|
| - if (HEAP->LookupSymbolIfExists(name, &symbol)) {
|
| - int index = (Hash(map, symbol) & kHashMask);
|
| + String* internalized_name;
|
| + if (HEAP->InternalizeStringIfExists(name, &internalized_name)) {
|
| + int index = (Hash(map, internalized_name) & kHashMask);
|
| // After a GC there will be free slots, so we use them in order (this may
|
| // help to get the most frequently used one in position 0).
|
| for (int i = 0; i< kEntriesPerBucket; i++) {
|
| @@ -7191,7 +7189,7 @@ void KeyedLookupCache::Update(Map* map, String* name, int field_offset) {
|
| Object* free_entry_indicator = NULL;
|
| if (key.map == free_entry_indicator) {
|
| key.map = map;
|
| - key.name = symbol;
|
| + key.name = internalized_name;
|
| field_offsets_[index + i] = field_offset;
|
| return;
|
| }
|
| @@ -7208,7 +7206,7 @@ void KeyedLookupCache::Update(Map* map, String* name, int field_offset) {
|
| // Write the new first entry.
|
| Key& key = keys_[index];
|
| key.map = map;
|
| - key.name = symbol;
|
| + key.name = internalized_name;
|
| field_offsets_[index] = field_offset;
|
| }
|
| }
|
| @@ -7341,7 +7339,7 @@ void ErrorObjectList::DeferredFormatStackTrace(Isolate* isolate) {
|
| if (nested_ || list_.is_empty() || isolate->has_pending_exception()) return;
|
| nested_ = true;
|
| HandleScope scope(isolate);
|
| - Handle<String> stack_key = isolate->factory()->stack_symbol();
|
| + Handle<String> stack_key = isolate->factory()->stack_string();
|
| int write_index = 0;
|
| int budget = kBudgetPerGC;
|
| for (int i = 0; i < list_.length(); i++) {
|
| @@ -7365,7 +7363,7 @@ void ErrorObjectList::DeferredFormatStackTrace(Isolate* isolate) {
|
| Object* getter_obj = AccessorPair::cast(callback)->getter();
|
| if (!getter_obj->IsJSFunction()) continue;
|
| getter_fun = JSFunction::cast(getter_obj);
|
| - String* key = isolate->heap()->hidden_stack_trace_symbol();
|
| + String* key = isolate->heap()->hidden_stack_trace_string();
|
| if (key != getter_fun->GetHiddenProperty(key)) continue;
|
| }
|
|
|
|
|