Chromium Code Reviews| Index: src/builtins/builtins-conversion.cc |
| diff --git a/src/builtins/builtins-conversion.cc b/src/builtins/builtins-conversion.cc |
| index 625ad87f7623a293d36b71ed1b518578691688cb..d448bb560a6d3cf6d2e5ed53ac6d180ad3b42138 100644 |
| --- a/src/builtins/builtins-conversion.cc |
| +++ b/src/builtins/builtins-conversion.cc |
| @@ -121,99 +121,24 @@ void Builtins::Generate_StringToNumber(CodeStubAssembler* assembler) { |
| // ES6 section 7.1.3 ToNumber ( argument ) |
|
Igor Sheludko
2016/09/09 11:33:15
// static
or remove it.
|
| void Builtins::Generate_NonNumberToNumber(CodeStubAssembler* assembler) { |
| - typedef CodeStubAssembler::Label Label; |
| typedef compiler::Node Node; |
| - typedef CodeStubAssembler::Variable Variable; |
| typedef TypeConversionDescriptor Descriptor; |
| Node* input = assembler->Parameter(Descriptor::kArgument); |
| Node* context = assembler->Parameter(Descriptor::kContext); |
| - // We might need to loop once here due to ToPrimitive conversions. |
| - Variable var_input(assembler, MachineRepresentation::kTagged); |
| - Label loop(assembler, &var_input); |
| - var_input.Bind(input); |
| - assembler->Goto(&loop); |
| - assembler->Bind(&loop); |
| - { |
| - // Load the current {input} value (known to be a HeapObject). |
| - Node* input = var_input.value(); |
| - |
| - // Dispatch on the {input} instance type. |
| - Node* input_instance_type = assembler->LoadInstanceType(input); |
| - Label if_inputisstring(assembler), if_inputisoddball(assembler), |
| - if_inputisreceiver(assembler, Label::kDeferred), |
| - if_inputisother(assembler, Label::kDeferred); |
| - assembler->GotoIf(assembler->Int32LessThan( |
| - input_instance_type, |
| - assembler->Int32Constant(FIRST_NONSTRING_TYPE)), |
| - &if_inputisstring); |
| - assembler->GotoIf( |
| - assembler->Word32Equal(input_instance_type, |
| - assembler->Int32Constant(ODDBALL_TYPE)), |
| - &if_inputisoddball); |
| - STATIC_ASSERT(LAST_JS_RECEIVER_TYPE == LAST_TYPE); |
| - assembler->Branch(assembler->Int32GreaterThanOrEqual( |
| - input_instance_type, |
| - assembler->Int32Constant(FIRST_JS_RECEIVER_TYPE)), |
| - &if_inputisreceiver, &if_inputisother); |
| - |
| - assembler->Bind(&if_inputisstring); |
| - { |
| - // The {input} is a String, use the fast stub to convert it to a Number. |
| - assembler->Return(assembler->StringToNumber(context, input)); |
| - } |
| + assembler->Return(assembler->NonNumberToNumber(context, input)); |
| +} |
| - assembler->Bind(&if_inputisoddball); |
| - { |
| - // The {input} is an Oddball, we just need to the Number value of it. |
| - Node* result = |
| - assembler->LoadObjectField(input, Oddball::kToNumberOffset); |
| - assembler->Return(result); |
| - } |
| +// static |
|
Igor Sheludko
2016/09/09 11:33:15
// ES6 section 7.1.3 ToNumber ( argument )
|
| +void Builtins::Generate_ToNumber(CodeStubAssembler* assembler) { |
| + typedef compiler::Node Node; |
| + typedef TypeConversionDescriptor Descriptor; |
| - assembler->Bind(&if_inputisreceiver); |
| - { |
| - // The {input} is a JSReceiver, we need to convert it to a Primitive first |
| - // using the ToPrimitive type conversion, preferably yielding a Number. |
| - Callable callable = CodeFactory::NonPrimitiveToPrimitive( |
| - assembler->isolate(), ToPrimitiveHint::kNumber); |
| - Node* result = assembler->CallStub(callable, context, input); |
| - |
| - // Check if the {result} is already a Number. |
| - Label if_resultisnumber(assembler), if_resultisnotnumber(assembler); |
| - assembler->GotoIf(assembler->WordIsSmi(result), &if_resultisnumber); |
| - Node* result_map = assembler->LoadMap(result); |
| - assembler->Branch( |
| - assembler->WordEqual(result_map, assembler->HeapNumberMapConstant()), |
| - &if_resultisnumber, &if_resultisnotnumber); |
| - |
| - assembler->Bind(&if_resultisnumber); |
| - { |
| - // The ToPrimitive conversion already gave us a Number, so we're done. |
| - assembler->Return(result); |
| - } |
| - |
| - assembler->Bind(&if_resultisnotnumber); |
| - { |
| - // We now have a Primitive {result}, but it's not yet a Number. |
| - var_input.Bind(result); |
| - assembler->Goto(&loop); |
| - } |
| - } |
| + Node* input = assembler->Parameter(Descriptor::kArgument); |
| + Node* context = assembler->Parameter(Descriptor::kContext); |
| - assembler->Bind(&if_inputisother); |
| - { |
| - // The {input} is something else (i.e. Symbol or Simd128Value), let the |
| - // runtime figure out the correct exception. |
| - // Note: We cannot tail call to the runtime here, as js-to-wasm |
| - // trampolines also use this code currently, and they declare all |
| - // outgoing parameters as untagged, while we would push a tagged |
| - // object here. |
| - Node* result = assembler->CallRuntime(Runtime::kToNumber, context, input); |
| - assembler->Return(result); |
| - } |
| - } |
| + assembler->Return(assembler->ToNumber(context, input)); |
| } |
| Handle<Code> Builtins::OrdinaryToPrimitive(OrdinaryToPrimitiveHint hint) { |