Chromium Code Reviews| Index: src/code-stub-assembler.cc |
| diff --git a/src/code-stub-assembler.cc b/src/code-stub-assembler.cc |
| index 5295189a8e7816bdc7947828b3486554c0596e31..1228c43b6018310eb23698f7e166a8c935b2c568 100644 |
| --- a/src/code-stub-assembler.cc |
| +++ b/src/code-stub-assembler.cc |
| @@ -760,9 +760,8 @@ void CodeStubAssembler::BranchIfToBooleanIsTrue(Node* value, Label* if_true, |
| // types, the HeapNumber type and everything else. |
| GotoIf(Word32Equal(value_instance_type, Int32Constant(HEAP_NUMBER_TYPE)), |
| &if_valueisheapnumber); |
| - Branch( |
| - Int32LessThan(value_instance_type, Int32Constant(FIRST_NONSTRING_TYPE)), |
| - &if_valueisstring, &if_valueisother); |
| + Branch(IsStringInstanceType(value_instance_type), &if_valueisstring, |
| + &if_valueisother); |
| Bind(&if_valueisstring); |
| { |
| @@ -2083,9 +2082,8 @@ Node* CodeStubAssembler::ToThisString(Node* context, Node* value, |
| // Check if the {value} is already String. |
| Label if_valueisnotstring(this, Label::kDeferred); |
| - Branch( |
| - Int32LessThan(value_instance_type, Int32Constant(FIRST_NONSTRING_TYPE)), |
| - &if_valueisstring, &if_valueisnotstring); |
| + Branch(IsStringInstanceType(value_instance_type), &if_valueisstring, |
| + &if_valueisnotstring); |
| Bind(&if_valueisnotstring); |
| { |
| // Check if the {value} is null. |
| @@ -2178,9 +2176,7 @@ Node* CodeStubAssembler::ToThisValue(Node* context, Node* value, |
| &done_loop); |
| break; |
| case PrimitiveType::kString: |
| - GotoIf(Int32LessThan(value_instance_type, |
| - Int32Constant(FIRST_NONSTRING_TYPE)), |
| - &done_loop); |
| + GotoIf(IsStringInstanceType(value_instance_type), &done_loop); |
| break; |
| case PrimitiveType::kSymbol: |
| GotoIf(Word32Equal(value_instance_type, Int32Constant(SYMBOL_TYPE)), |
| @@ -2232,6 +2228,17 @@ Node* CodeStubAssembler::ThrowIfNotInstanceType(Node* context, Node* value, |
| return var_value_map.value(); |
| } |
| +Node* CodeStubAssembler::IsStringInstanceType(Node* instance_type) { |
| + STATIC_ASSERT(INTERNALIZED_STRING_TYPE == FIRST_TYPE); |
| + return Int32LessThan(instance_type, Int32Constant(FIRST_NONSTRING_TYPE)); |
| +} |
| + |
| +Node* CodeStubAssembler::IsJSReceiverInstanceType(Node* instance_type) { |
| + STATIC_ASSERT(LAST_JS_RECEIVER_TYPE == LAST_TYPE); |
| + return Int32GreaterThanOrEqual(instance_type, |
| + Int32Constant(FIRST_JS_RECEIVER_TYPE)); |
| +} |
| + |
| Node* CodeStubAssembler::StringCharCodeAt(Node* string, Node* index) { |
| // Translate the {index} into a Word. |
| index = SmiToWord(index); |
| @@ -2537,9 +2544,7 @@ Node* CodeStubAssembler::SubString(Node* context, Node* string, Node* from, |
| var_instance_type.Bind(instance_type); |
| // Check if {string} is a String. |
| - GotoIf(Int32GreaterThanOrEqual(instance_type, |
| - Int32Constant(FIRST_NONSTRING_TYPE)), |
| - &runtime); |
| + GotoUnless(IsStringInstanceType(instance_type), &runtime); |
| // Make sure that both from and to are non-negative smis. |
| @@ -2885,15 +2890,11 @@ Node* CodeStubAssembler::NonNumberToNumber(Node* context, Node* input) { |
| Label if_inputisstring(this), if_inputisoddball(this), |
| if_inputisreceiver(this, Label::kDeferred), |
| if_inputisother(this, Label::kDeferred); |
| - GotoIf( |
| - Int32LessThan(input_instance_type, Int32Constant(FIRST_NONSTRING_TYPE)), |
| - &if_inputisstring); |
| + GotoIf(IsStringInstanceType(input_instance_type), &if_inputisstring); |
| GotoIf(Word32Equal(input_instance_type, Int32Constant(ODDBALL_TYPE)), |
| &if_inputisoddball); |
| - STATIC_ASSERT(LAST_JS_RECEIVER_TYPE == LAST_TYPE); |
| - Branch(Int32GreaterThanOrEqual(input_instance_type, |
| - Int32Constant(FIRST_JS_RECEIVER_TYPE)), |
| - &if_inputisreceiver, &if_inputisother); |
| + Branch(IsJSReceiverInstanceType(input_instance_type), &if_inputisreceiver, |
| + &if_inputisother); |
| Bind(&if_inputisstring); |
| { |
| @@ -3103,9 +3104,7 @@ void CodeStubAssembler::TryToName(Node* key, Label* if_keyisindex, |
| if_keyisunique); |
| // Miss if |key| is not a String. |
| STATIC_ASSERT(FIRST_NAME_TYPE == FIRST_TYPE); |
|
Igor Sheludko
2016/10/05 08:02:27
You can now remove this assert from here.
|
| - GotoIf( |
| - Int32GreaterThan(key_instance_type, Int32Constant(FIRST_NONSTRING_TYPE)), |
| - if_bailout); |
| + GotoUnless(IsStringInstanceType(key_instance_type), if_bailout); |
|
jgruber
2016/10/04 13:35:54
Igor: I'm assuming the original code was bugged (s
Igor Sheludko
2016/10/05 08:02:27
FIRST_NONSTRING_TYPE is actually a SYMBOL_TYPE whi
|
| // |key| is a String. Check if it has a cached array index. |
| Node* hash = LoadNameHashField(key); |
| Node* contains_index = |
| @@ -3752,8 +3751,7 @@ void CodeStubAssembler::TryLookupElement(Node* object, Node* map, |
| { |
| AssertInstanceType(object, JS_VALUE_TYPE); |
| Node* string = LoadJSValueValue(object); |
| - Assert(Int32LessThan(LoadInstanceType(string), |
| - Int32Constant(FIRST_NONSTRING_TYPE))); |
| + Assert(IsStringInstanceType(LoadInstanceType(string))); |
| Node* length = LoadStringLength(string); |
| GotoIf(UintPtrLessThan(intptr_index, SmiUntag(length)), if_found); |
| Goto(&if_isobjectorsmi); |
| @@ -3762,8 +3760,7 @@ void CodeStubAssembler::TryLookupElement(Node* object, Node* map, |
| { |
| AssertInstanceType(object, JS_VALUE_TYPE); |
| Node* string = LoadJSValueValue(object); |
| - Assert(Int32LessThan(LoadInstanceType(string), |
| - Int32Constant(FIRST_NONSTRING_TYPE))); |
| + Assert(IsStringInstanceType(LoadInstanceType(string))); |
| Node* length = LoadStringLength(string); |
| GotoIf(UintPtrLessThan(intptr_index, SmiUntag(length)), if_found); |
| Goto(&if_isdictionary); |