| Index: src/arm/code-stubs-arm.cc
|
| diff --git a/src/arm/code-stubs-arm.cc b/src/arm/code-stubs-arm.cc
|
| index 62fcc9a981ccd5946ed7946d006d7e6d5224d4d1..a6805e7b8029750f1dfdff376b3737517005651c 100644
|
| --- a/src/arm/code-stubs-arm.cc
|
| +++ b/src/arm/code-stubs-arm.cc
|
| @@ -1535,12 +1535,13 @@ static void EmitStrictTwoHeapObjectCompare(MacroAssembler* masm,
|
| __ cmp(r3, Operand(ODDBALL_TYPE));
|
| __ b(eq, &return_not_equal);
|
|
|
| - // Now that we have the types we might as well check for symbol-symbol.
|
| - // Ensure that no non-strings have the symbol bit set.
|
| - STATIC_ASSERT(LAST_TYPE < kNotStringTag + kIsSymbolMask);
|
| - STATIC_ASSERT(kSymbolTag != 0);
|
| + // Now that we have the types we might as well check for
|
| + // internalized-internalized.
|
| + // Ensure that no non-strings have the internalized bit set.
|
| + STATIC_ASSERT(LAST_TYPE < kNotStringTag + kIsInternalizedMask);
|
| + STATIC_ASSERT(kInternalizedTag != 0);
|
| __ and_(r2, r2, Operand(r3));
|
| - __ tst(r2, Operand(kIsSymbolMask));
|
| + __ tst(r2, Operand(kIsInternalizedMask));
|
| __ b(ne, &return_not_equal);
|
| }
|
|
|
| @@ -1577,29 +1578,29 @@ static void EmitCheckForTwoHeapNumbers(MacroAssembler* masm,
|
| }
|
|
|
|
|
| -// Fast negative check for symbol-to-symbol equality.
|
| -static void EmitCheckForSymbolsOrObjects(MacroAssembler* masm,
|
| - Register lhs,
|
| - Register rhs,
|
| - Label* possible_strings,
|
| - Label* not_both_strings) {
|
| +// Fast negative check for internalized-to-internalized equality.
|
| +static void EmitCheckForInternalizedStringsOrObjects(MacroAssembler* masm,
|
| + Register lhs,
|
| + Register rhs,
|
| + Label* possible_strings,
|
| + Label* not_both_strings) {
|
| ASSERT((lhs.is(r0) && rhs.is(r1)) ||
|
| (lhs.is(r1) && rhs.is(r0)));
|
|
|
| // r2 is object type of rhs.
|
| - // Ensure that no non-strings have the symbol bit set.
|
| + // Ensure that no non-strings have the internalized bit set.
|
| Label object_test;
|
| - STATIC_ASSERT(kSymbolTag != 0);
|
| + STATIC_ASSERT(kInternalizedTag != 0);
|
| __ tst(r2, Operand(kIsNotStringMask));
|
| __ b(ne, &object_test);
|
| - __ tst(r2, Operand(kIsSymbolMask));
|
| + __ tst(r2, Operand(kIsInternalizedMask));
|
| __ b(eq, possible_strings);
|
| __ CompareObjectType(lhs, r3, r3, FIRST_NONSTRING_TYPE);
|
| __ b(ge, not_both_strings);
|
| - __ tst(r3, Operand(kIsSymbolMask));
|
| + __ tst(r3, Operand(kIsInternalizedMask));
|
| __ b(eq, possible_strings);
|
|
|
| - // Both are symbols. We already checked they weren't the same pointer
|
| + // Both are internalized. We already checked they weren't the same pointer
|
| // so they are not equal.
|
| __ mov(r0, Operand(NOT_EQUAL));
|
| __ Ret();
|
| @@ -1746,7 +1747,7 @@ static void ICCompareStub_CheckInputType(MacroAssembler* masm,
|
| __ CheckMap(input, scratch, Heap::kHeapNumberMapRootIndex, fail,
|
| DONT_DO_SMI_CHECK);
|
| }
|
| - // We could be strict about symbol/string here, but as long as
|
| + // We could be strict about internalized/non-internalized here, but as long as
|
| // hydrogen doesn't care, the stub doesn't have to care either.
|
| __ bind(&ok);
|
| }
|
| @@ -1844,27 +1845,29 @@ void ICCompareStub::GenerateGeneric(MacroAssembler* masm) {
|
| EmitStrictTwoHeapObjectCompare(masm, lhs, rhs);
|
| }
|
|
|
| - Label check_for_symbols;
|
| + Label check_for_internalized_strings;
|
| Label flat_string_check;
|
| // Check for heap-number-heap-number comparison. Can jump to slow case,
|
| // or load both doubles into r0, r1, r2, r3 and jump to the code that handles
|
| - // that case. If the inputs are not doubles then jumps to check_for_symbols.
|
| + // that case. If the inputs are not doubles then jumps to
|
| + // check_for_internalized_strings.
|
| // In this case r2 will contain the type of rhs_. Never falls through.
|
| EmitCheckForTwoHeapNumbers(masm,
|
| lhs,
|
| rhs,
|
| &both_loaded_as_doubles,
|
| - &check_for_symbols,
|
| + &check_for_internalized_strings,
|
| &flat_string_check);
|
|
|
| - __ bind(&check_for_symbols);
|
| + __ bind(&check_for_internalized_strings);
|
| // In the strict case the EmitStrictTwoHeapObjectCompare already took care of
|
| - // symbols.
|
| + // internalized strings.
|
| if (cc == eq && !strict()) {
|
| - // Returns an answer for two symbols or two detectable objects.
|
| + // Returns an answer for two internalized strings or two detectable objects.
|
| // Otherwise jumps to string case or not both strings case.
|
| // Assumes that r2 is the type of rhs_ on entry.
|
| - EmitCheckForSymbolsOrObjects(masm, lhs, rhs, &flat_string_check, &slow);
|
| + EmitCheckForInternalizedStringsOrObjects(
|
| + masm, lhs, rhs, &flat_string_check, &slow);
|
| }
|
|
|
| // Check for both being sequential ASCII strings, and inline if that is the
|
| @@ -4533,7 +4536,7 @@ void ArrayLengthStub::Generate(MacroAssembler* masm) {
|
| // -- r0 : key
|
| // -- r1 : receiver
|
| // -----------------------------------
|
| - __ cmp(r0, Operand(masm->isolate()->factory()->length_symbol()));
|
| + __ cmp(r0, Operand(masm->isolate()->factory()->length_string()));
|
| __ b(ne, &miss);
|
| receiver = r1;
|
| } else {
|
| @@ -4562,7 +4565,7 @@ void FunctionPrototypeStub::Generate(MacroAssembler* masm) {
|
| // -- r0 : key
|
| // -- r1 : receiver
|
| // -----------------------------------
|
| - __ cmp(r0, Operand(masm->isolate()->factory()->prototype_symbol()));
|
| + __ cmp(r0, Operand(masm->isolate()->factory()->prototype_string()));
|
| __ b(ne, &miss);
|
| receiver = r1;
|
| } else {
|
| @@ -4591,7 +4594,7 @@ void StringLengthStub::Generate(MacroAssembler* masm) {
|
| // -- r0 : key
|
| // -- r1 : receiver
|
| // -----------------------------------
|
| - __ cmp(r0, Operand(masm->isolate()->factory()->length_symbol()));
|
| + __ cmp(r0, Operand(masm->isolate()->factory()->length_string()));
|
| __ b(ne, &miss);
|
| receiver = r1;
|
| } else {
|
| @@ -4629,7 +4632,7 @@ void StoreArrayLengthStub::Generate(MacroAssembler* masm) {
|
| // -- r1 : key
|
| // -- r2 : receiver
|
| // -----------------------------------
|
| - __ cmp(r1, Operand(masm->isolate()->factory()->length_symbol()));
|
| + __ cmp(r1, Operand(masm->isolate()->factory()->length_string()));
|
| __ b(ne, &miss);
|
| receiver = r2;
|
| value = r0;
|
| @@ -5233,7 +5236,7 @@ void RegExpExecStub::Generate(MacroAssembler* masm) {
|
| // String is a cons string, check whether it is flat.
|
| __ bind(&cons_string);
|
| __ ldr(r0, FieldMemOperand(subject, ConsString::kSecondOffset));
|
| - __ CompareRoot(r0, Heap::kEmptyStringRootIndex);
|
| + __ CompareRoot(r0, Heap::kempty_stringRootIndex);
|
| __ b(ne, &runtime);
|
| __ ldr(subject, FieldMemOperand(subject, ConsString::kFirstOffset));
|
| // Is first part of cons or parent of slice a flat string?
|
| @@ -6078,7 +6081,7 @@ void StringHelper::GenerateCopyCharactersLong(MacroAssembler* masm,
|
| }
|
|
|
|
|
| -void StringHelper::GenerateTwoCharacterSymbolTableProbe(MacroAssembler* masm,
|
| +void StringHelper::GenerateTwoCharacterStringTableProbe(MacroAssembler* masm,
|
| Register c1,
|
| Register c2,
|
| Register scratch1,
|
| @@ -6091,7 +6094,7 @@ void StringHelper::GenerateTwoCharacterSymbolTableProbe(MacroAssembler* masm,
|
| Register scratch = scratch3;
|
|
|
| // Make sure that both characters are not digits as such strings has a
|
| - // different hash algorithm. Don't try to look for these in the symbol table.
|
| + // different hash algorithm. Don't try to look for these in the string table.
|
| Label not_array_index;
|
| __ sub(scratch, c1, Operand(static_cast<int>('0')));
|
| __ cmp(scratch, Operand(static_cast<int>('9' - '0')));
|
| @@ -6119,43 +6122,43 @@ void StringHelper::GenerateTwoCharacterSymbolTableProbe(MacroAssembler* masm,
|
| // chars: two character string, char 1 in byte 0 and char 2 in byte 1.
|
| // hash: hash of two character string.
|
|
|
| - // Load symbol table
|
| - // Load address of first element of the symbol table.
|
| - Register symbol_table = c2;
|
| - __ LoadRoot(symbol_table, Heap::kSymbolTableRootIndex);
|
| + // Load string table
|
| + // Load address of first element of the string table.
|
| + Register string_table = c2;
|
| + __ LoadRoot(string_table, Heap::kStringTableRootIndex);
|
|
|
| Register undefined = scratch4;
|
| __ LoadRoot(undefined, Heap::kUndefinedValueRootIndex);
|
|
|
| - // Calculate capacity mask from the symbol table capacity.
|
| + // Calculate capacity mask from the string table capacity.
|
| Register mask = scratch2;
|
| - __ ldr(mask, FieldMemOperand(symbol_table, SymbolTable::kCapacityOffset));
|
| + __ ldr(mask, FieldMemOperand(string_table, StringTable::kCapacityOffset));
|
| __ mov(mask, Operand(mask, ASR, 1));
|
| __ sub(mask, mask, Operand(1));
|
|
|
| - // Calculate untagged address of the first element of the symbol table.
|
| - Register first_symbol_table_element = symbol_table;
|
| - __ add(first_symbol_table_element, symbol_table,
|
| - Operand(SymbolTable::kElementsStartOffset - kHeapObjectTag));
|
| + // Calculate untagged address of the first element of the string table.
|
| + Register first_string_table_element = string_table;
|
| + __ add(first_string_table_element, string_table,
|
| + Operand(StringTable::kElementsStartOffset - kHeapObjectTag));
|
|
|
| // Registers
|
| // chars: two character string, char 1 in byte 0 and char 2 in byte 1.
|
| // hash: hash of two character string
|
| // mask: capacity mask
|
| - // first_symbol_table_element: address of the first element of
|
| - // the symbol table
|
| + // first_string_table_element: address of the first element of
|
| + // the string table
|
| // undefined: the undefined object
|
| // scratch: -
|
|
|
| - // Perform a number of probes in the symbol table.
|
| + // Perform a number of probes in the string table.
|
| const int kProbes = 4;
|
| - Label found_in_symbol_table;
|
| + Label found_in_string_table;
|
| Label next_probe[kProbes];
|
| Register candidate = scratch5; // Scratch register contains candidate.
|
| for (int i = 0; i < kProbes; i++) {
|
| - // Calculate entry in symbol table.
|
| + // Calculate entry in string table.
|
| if (i > 0) {
|
| - __ add(candidate, hash, Operand(SymbolTable::GetProbeOffset(i)));
|
| + __ add(candidate, hash, Operand(StringTable::GetProbeOffset(i)));
|
| } else {
|
| __ mov(candidate, hash);
|
| }
|
| @@ -6163,9 +6166,9 @@ void StringHelper::GenerateTwoCharacterSymbolTableProbe(MacroAssembler* masm,
|
| __ and_(candidate, candidate, Operand(mask));
|
|
|
| // Load the entry from the symble table.
|
| - STATIC_ASSERT(SymbolTable::kEntrySize == 1);
|
| + STATIC_ASSERT(StringTable::kEntrySize == 1);
|
| __ ldr(candidate,
|
| - MemOperand(first_symbol_table_element,
|
| + MemOperand(first_string_table_element,
|
| candidate,
|
| LSL,
|
| kPointerSizeLog2));
|
| @@ -6181,7 +6184,7 @@ void StringHelper::GenerateTwoCharacterSymbolTableProbe(MacroAssembler* masm,
|
| if (FLAG_debug_code) {
|
| __ LoadRoot(ip, Heap::kTheHoleValueRootIndex);
|
| __ cmp(ip, candidate);
|
| - __ Assert(eq, "oddball in symbol table is not undefined or the hole");
|
| + __ Assert(eq, "oddball in string table is not undefined or the hole");
|
| }
|
| __ jmp(&next_probe[i]);
|
|
|
| @@ -6201,7 +6204,7 @@ void StringHelper::GenerateTwoCharacterSymbolTableProbe(MacroAssembler* masm,
|
| // Assumes that word load is little endian.
|
| __ ldrh(scratch, FieldMemOperand(candidate, SeqOneByteString::kHeaderSize));
|
| __ cmp(chars, scratch);
|
| - __ b(eq, &found_in_symbol_table);
|
| + __ b(eq, &found_in_string_table);
|
| __ bind(&next_probe[i]);
|
| }
|
|
|
| @@ -6210,7 +6213,7 @@ void StringHelper::GenerateTwoCharacterSymbolTableProbe(MacroAssembler* masm,
|
|
|
| // Scratch register contains result when we fall through to here.
|
| Register result = candidate;
|
| - __ bind(&found_in_symbol_table);
|
| + __ bind(&found_in_string_table);
|
| __ Move(r0, result);
|
| }
|
|
|
| @@ -6335,7 +6338,7 @@ void SubStringStub::Generate(MacroAssembler* masm) {
|
| __ b(ne, &sliced_string);
|
| // Cons string. Check whether it is flat, then fetch first part.
|
| __ ldr(r5, FieldMemOperand(r0, ConsString::kSecondOffset));
|
| - __ CompareRoot(r5, Heap::kEmptyStringRootIndex);
|
| + __ CompareRoot(r5, Heap::kempty_stringRootIndex);
|
| __ b(ne, &runtime);
|
| __ ldr(r5, FieldMemOperand(r0, ConsString::kFirstOffset));
|
| // Update instance type.
|
| @@ -6695,8 +6698,8 @@ void StringAddStub::Generate(MacroAssembler* masm) {
|
| // Adding two lengths can't overflow.
|
| STATIC_ASSERT(String::kMaxLength < String::kMaxLength * 2);
|
| __ add(r6, r2, Operand(r3));
|
| - // Use the symbol table when adding two one character strings, as it
|
| - // helps later optimizations to return a symbol here.
|
| + // Use the string table when adding two one character strings, as it
|
| + // helps later optimizations to return a string here.
|
| __ cmp(r6, Operand(2));
|
| __ b(ne, &longer_than_two);
|
|
|
| @@ -6714,10 +6717,10 @@ void StringAddStub::Generate(MacroAssembler* masm) {
|
| __ ldrb(r2, FieldMemOperand(r0, SeqOneByteString::kHeaderSize));
|
| __ ldrb(r3, FieldMemOperand(r1, SeqOneByteString::kHeaderSize));
|
|
|
| - // Try to lookup two character string in symbol table. If it is not found
|
| + // Try to lookup two character string in string table. If it is not found
|
| // just allocate a new one.
|
| Label make_two_character_string;
|
| - StringHelper::GenerateTwoCharacterSymbolTableProbe(
|
| + StringHelper::GenerateTwoCharacterStringTableProbe(
|
| masm, r2, r3, r6, r7, r4, r5, r9, &make_two_character_string);
|
| __ IncrementCounter(counters->string_add_native(), 1, r2, r3);
|
| __ add(sp, sp, Operand(2 * kPointerSize));
|
| @@ -7058,8 +7061,8 @@ void ICCompareStub::GenerateHeapNumbers(MacroAssembler* masm) {
|
| }
|
|
|
|
|
| -void ICCompareStub::GenerateSymbols(MacroAssembler* masm) {
|
| - ASSERT(state_ == CompareIC::SYMBOL);
|
| +void ICCompareStub::GenerateInternalizedStrings(MacroAssembler* masm) {
|
| + ASSERT(state_ == CompareIC::INTERNALIZED_STRING);
|
| Label miss;
|
|
|
| // Registers containing left and right operands respectively.
|
| @@ -7071,17 +7074,17 @@ void ICCompareStub::GenerateSymbols(MacroAssembler* masm) {
|
| // Check that both operands are heap objects.
|
| __ JumpIfEitherSmi(left, right, &miss);
|
|
|
| - // Check that both operands are symbols.
|
| + // Check that both operands are internalized strings.
|
| __ ldr(tmp1, FieldMemOperand(left, HeapObject::kMapOffset));
|
| __ ldr(tmp2, FieldMemOperand(right, HeapObject::kMapOffset));
|
| __ ldrb(tmp1, FieldMemOperand(tmp1, Map::kInstanceTypeOffset));
|
| __ ldrb(tmp2, FieldMemOperand(tmp2, Map::kInstanceTypeOffset));
|
| - STATIC_ASSERT(kSymbolTag != 0);
|
| + STATIC_ASSERT(kInternalizedTag != 0);
|
| __ and_(tmp1, tmp1, Operand(tmp2));
|
| - __ tst(tmp1, Operand(kIsSymbolMask));
|
| + __ tst(tmp1, Operand(kIsInternalizedMask));
|
| __ b(eq, &miss);
|
|
|
| - // Symbols are compared by identity.
|
| + // Internalized strings are compared by identity.
|
| __ cmp(left, right);
|
| // Make sure r0 is non-zero. At this point input operands are
|
| // guaranteed to be non-zero.
|
| @@ -7133,13 +7136,13 @@ void ICCompareStub::GenerateStrings(MacroAssembler* masm) {
|
|
|
| // Handle not identical strings.
|
|
|
| - // Check that both strings are symbols. If they are, we're done
|
| + // Check that both strings are internalized strings. If they are, we're done
|
| // because we already know they are not identical.
|
| if (equality) {
|
| ASSERT(GetCondition() == eq);
|
| - STATIC_ASSERT(kSymbolTag != 0);
|
| + STATIC_ASSERT(kInternalizedTag != 0);
|
| __ and_(tmp3, tmp1, Operand(tmp2));
|
| - __ tst(tmp3, Operand(kIsSymbolMask));
|
| + __ tst(tmp3, Operand(kIsInternalizedMask));
|
| // Make sure r0 is non-zero. At this point input operands are
|
| // guaranteed to be non-zero.
|
| ASSERT(right.is(r0));
|
| @@ -7321,11 +7324,11 @@ void StringDictionaryLookupStub::GenerateNegativeLookup(MacroAssembler* masm,
|
| __ cmp(entity_name, tmp);
|
| __ b(eq, &the_hole);
|
|
|
| - // Check if the entry name is not a symbol.
|
| + // Check if the entry name is not an internalized string.
|
| __ ldr(entity_name, FieldMemOperand(entity_name, HeapObject::kMapOffset));
|
| __ ldrb(entity_name,
|
| FieldMemOperand(entity_name, Map::kInstanceTypeOffset));
|
| - __ tst(entity_name, Operand(kIsSymbolMask));
|
| + __ tst(entity_name, Operand(kIsInternalizedMask));
|
| __ b(eq, miss);
|
|
|
| __ bind(&the_hole);
|
| @@ -7494,11 +7497,11 @@ void StringDictionaryLookupStub::Generate(MacroAssembler* masm) {
|
| __ b(eq, &in_dictionary);
|
|
|
| if (i != kTotalProbes - 1 && mode_ == NEGATIVE_LOOKUP) {
|
| - // Check if the entry name is not a symbol.
|
| + // Check if the entry name is not an internalized string.
|
| __ ldr(entry_key, FieldMemOperand(entry_key, HeapObject::kMapOffset));
|
| __ ldrb(entry_key,
|
| FieldMemOperand(entry_key, Map::kInstanceTypeOffset));
|
| - __ tst(entry_key, Operand(kIsSymbolMask));
|
| + __ tst(entry_key, Operand(kIsInternalizedMask));
|
| __ b(eq, &maybe_in_dictionary);
|
| }
|
| }
|
|
|