Chromium Code Reviews| Index: src/builtins/builtins-conversion.cc |
| diff --git a/src/builtins/builtins-conversion.cc b/src/builtins/builtins-conversion.cc |
| index 77a3e2f2eb6fdca3bc696673a31289f01a6d4986..97bf9811dd8cb6762ad73feb6c9035ed736df835 100644 |
| --- a/src/builtins/builtins-conversion.cc |
| +++ b/src/builtins/builtins-conversion.cc |
| @@ -151,6 +151,62 @@ void Builtins::Generate_ToNumber(CodeStubAssembler* assembler) { |
| assembler->Return(assembler->ToNumber(context, input)); |
| } |
| +void Builtins::Generate_ToString(CodeStubAssembler* assembler) { |
| + typedef CodeStubAssembler::Label Label; |
| + typedef compiler::Node Node; |
| + typedef TypeConversionDescriptor Descriptor; |
| + |
| + Node* input = assembler->Parameter(Descriptor::kArgument); |
| + Node* context = assembler->Parameter(Descriptor::kContext); |
| + |
| + Label is_number(assembler); |
| + Label runtime(assembler); |
| + |
| + assembler->GotoIf(assembler->WordIsSmi(input), &runtime); |
|
Benedikt Meurer
2016/09/29 13:07:34
s/runtime/is_number
|
| + |
| + Node* input_map = assembler->LoadMap(input); |
| + Node* input_instance_type = assembler->LoadMapInstanceType(input_map); |
| + |
| + Label not_string(assembler); |
| + assembler->GotoIf( |
| + assembler->Int32GreaterThanOrEqual( |
| + input_instance_type, assembler->Int32Constant(FIRST_NONSTRING_TYPE)), |
| + ¬_string); |
| + assembler->Return(input); |
| + |
| + Label not_heap_number(assembler); |
| + |
| + assembler->Bind(¬_string); |
| + { |
| + assembler->GotoUnless( |
| + assembler->IntPtrEqual(input_map, assembler->HeapNumberMapConstant()), |
| + ¬_heap_number); |
| + assembler->Goto(&is_number); |
| + } |
| + |
| + assembler->Bind(&is_number); |
| + { |
| + Callable callable = CodeFactory::NumberToString(assembler->isolate()); |
| + assembler->Return(assembler->CallStub(callable, context, input)); |
| + } |
| + |
| + assembler->Bind(¬_heap_number); |
| + { |
| + assembler->GotoIf( |
| + assembler->Word32NotEqual(input_instance_type, |
| + assembler->Int32Constant(ODDBALL_TYPE)), |
| + &runtime); |
| + assembler->Return( |
| + assembler->LoadObjectField(input, Oddball::kToStringOffset)); |
| + } |
| + |
| + assembler->Bind(&runtime); |
| + { |
| + assembler->Return( |
| + assembler->CallRuntime(Runtime::kToString, context, input)); |
| + } |
| +} |
| + |
| Handle<Code> Builtins::OrdinaryToPrimitive(OrdinaryToPrimitiveHint hint) { |
| switch (hint) { |
| case OrdinaryToPrimitiveHint::kNumber: |