Index: src/builtins/builtins-conversion.cc |
diff --git a/src/builtins/builtins-conversion.cc b/src/builtins/builtins-conversion.cc |
index 1797b2ece84944ec4053fa334f0d8c7a1fea209a..77a3e2f2eb6fdca3bc696673a31289f01a6d4986 100644 |
--- a/src/builtins/builtins-conversion.cc |
+++ b/src/builtins/builtins-conversion.cc |
@@ -129,101 +129,26 @@ void Builtins::Generate_ToName(CodeStubAssembler* assembler) { |
assembler->Return(assembler->ToName(context, input)); |
} |
-// ES6 section 7.1.3 ToNumber ( argument ) |
+// static |
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); |
- } |
+// 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) { |