Chromium Code Reviews| Index: src/code-stub-assembler.cc |
| diff --git a/src/code-stub-assembler.cc b/src/code-stub-assembler.cc |
| index 17862fac45519286bcb2d30c51addb69ed3bcd6d..da4cc9d24f4d72db429387c6376fcc8dc666a956 100644 |
| --- a/src/code-stub-assembler.cc |
| +++ b/src/code-stub-assembler.cc |
| @@ -2915,6 +2915,26 @@ Node* CodeStubAssembler::IsString(Node* object) { |
| Int32Constant(FIRST_NONSTRING_TYPE)); |
| } |
| +Node* CodeStubAssembler::IsSymbol(Node* object) { |
| + return HasInstanceType(object, SYMBOL_TYPE); |
|
Igor Sheludko
2016/12/13 20:56:28
IsSymbolMap(LoadMap(object)) does not require load
gsathya
2016/12/13 22:01:03
Doh ofc. Changed
|
| +} |
| + |
| +Node* CodeStubAssembler::IsPrivateSymbol(Node* object) { |
| + Label out(this); |
| + Variable var_result(this, MachineType::PointerRepresentation()); |
|
Igor Sheludko
2016/12/13 20:56:28
CSA expects kWord32 nodes as a condition in Branch
gsathya
2016/12/13 22:01:04
Ah, okay. Changed.
|
| + var_result.Bind(IntPtrConstant(0)); |
|
Igor Sheludko
2016/12/13 20:56:28
Same here: Int32Constant().
gsathya
2016/12/13 22:01:03
Done.
|
| + |
| + GotoUnless(IsSymbolMap(LoadMap(object)), &out); |
|
Igor Sheludko
2016/12/13 20:56:28
IsSymbol(object)
gsathya
2016/12/13 22:01:04
Done.
|
| + Node* const flags = |
| + SmiToWord32(LoadObjectField(object, Symbol::kFlagsOffset)); |
| + const int kPrivateMask = 1 << Symbol::kPrivateBit; |
| + var_result.Bind(IsSetWord32(flags, kPrivateMask)); |
| + Goto(&out); |
| + |
| + Bind(&out); |
| + return var_result.value(); |
|
Igor Sheludko
2016/12/13 20:56:28
You may want to use Select() for this.
gsathya
2016/12/13 22:01:03
I did initially but didn't look very readable to m
|
| +} |
| + |
| Node* CodeStubAssembler::IsNativeContext(Node* object) { |
| return WordEqual(LoadMap(object), LoadRoot(Heap::kNativeContextMapRootIndex)); |
| } |
| @@ -4271,10 +4291,9 @@ void CodeStubAssembler::TryToName(Node* key, Label* if_keyisindex, |
| Goto(if_keyisindex); |
| Bind(&if_keyisnotindex); |
| - Node* key_instance_type = LoadInstanceType(key); |
| // Symbols are unique. |
| - GotoIf(Word32Equal(key_instance_type, Int32Constant(SYMBOL_TYPE)), |
| - if_keyisunique); |
| + GotoIf(IsSymbol(key), if_keyisunique); |
| + Node* key_instance_type = LoadInstanceType(key); |
|
Igor Sheludko
2016/12/13 20:56:28
On this path we are loading map twice. How about:
gsathya
2016/12/13 22:01:04
Done.
|
| // Miss if |key| is not a String. |
| STATIC_ASSERT(FIRST_NAME_TYPE == FIRST_TYPE); |
| GotoUnless(IsStringInstanceType(key_instance_type), if_bailout); |