Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(134)

Unified Diff: src/builtins/builtins-conversion.cc

Issue 2327703003: [builtins] Migrate ToNumber to TurboFan. (Closed)
Patch Set: Rebase Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/builtins/builtins.h ('k') | src/builtins/ia32/builtins-ia32.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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) {
« no previous file with comments | « src/builtins/builtins.h ('k') | src/builtins/ia32/builtins-ia32.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698