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

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

Issue 2327703003: [builtins] Migrate ToNumber to TurboFan. (Closed)
Patch Set: 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
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) {

Powered by Google App Engine
This is Rietveld 408576698