Index: src/builtins/builtins-object.cc |
diff --git a/src/builtins/builtins-object.cc b/src/builtins/builtins-object.cc |
index 5a6b877ec379f6d59db02e7df6e0d7883a827848..1de47667b73255638f3b2ebb72f35d4d99cd7ab4 100644 |
--- a/src/builtins/builtins-object.cc |
+++ b/src/builtins/builtins-object.cc |
@@ -258,24 +258,6 @@ void ReturnToStringFormat(CodeStubAssembler* assembler, compiler::Node* context, |
rhs)); |
} |
-void ReturnIfPrimitive(CodeStubAssembler* assembler, |
- compiler::Node* instance_type, |
- CodeStubAssembler::Label* return_string, |
- CodeStubAssembler::Label* return_boolean, |
- CodeStubAssembler::Label* return_number) { |
- assembler->GotoIf(assembler->IsStringInstanceType(instance_type), |
- return_string); |
- |
- assembler->GotoIf(assembler->Word32Equal( |
- instance_type, assembler->Int32Constant(ODDBALL_TYPE)), |
- return_boolean); |
- |
- assembler->GotoIf( |
- assembler->Word32Equal(instance_type, |
- assembler->Int32Constant(HEAP_NUMBER_TYPE)), |
- return_number); |
-} |
- |
} // namespace |
// ES6 section 19.1.3.6 Object.prototype.toString |
@@ -292,9 +274,7 @@ void Builtins::Generate_ObjectProtoToString( |
return_api(&assembler, Label::kDeferred), return_object(&assembler), |
return_regexp(&assembler), return_function(&assembler), |
return_error(&assembler), return_date(&assembler), |
- return_string(&assembler), return_boolean(&assembler), |
- return_jsvalue(&assembler), return_jsproxy(&assembler, Label::kDeferred), |
- return_number(&assembler); |
+ return_jsvalue(&assembler), return_jsproxy(&assembler, Label::kDeferred); |
Label if_isproxy(&assembler, Label::kDeferred); |
@@ -310,11 +290,10 @@ void Builtins::Generate_ObjectProtoToString( |
assembler.GotoIf(assembler.WordEqual(receiver, assembler.NullConstant()), |
&return_null); |
- assembler.GotoIf(assembler.TaggedIsSmi(receiver), &return_number); |
+ Callable to_object = CodeFactory::ToObject(assembler.isolate()); |
+ receiver = assembler.CallStub(to_object, context, receiver); |
Node* receiver_instance_type = assembler.LoadInstanceType(receiver); |
- ReturnIfPrimitive(&assembler, receiver_instance_type, &return_string, |
- &return_boolean, &return_number); |
// for proxies, check IsArray before getting @@toStringTag |
Variable var_proxy_is_array(&assembler, MachineRepresentation::kTagged); |
@@ -389,18 +368,6 @@ void Builtins::Generate_ObjectProtoToString( |
assembler.Return(assembler.HeapConstant( |
assembler.isolate()->factory()->null_to_string())); |
- assembler.Bind(&return_number); |
- assembler.Return(assembler.HeapConstant( |
- assembler.isolate()->factory()->number_to_string())); |
- |
- assembler.Bind(&return_string); |
- assembler.Return(assembler.HeapConstant( |
- assembler.isolate()->factory()->string_to_string())); |
- |
- assembler.Bind(&return_boolean); |
- assembler.Return(assembler.HeapConstant( |
- assembler.isolate()->factory()->boolean_to_string())); |
- |
assembler.Bind(&return_arguments); |
assembler.Return(assembler.HeapConstant( |
assembler.isolate()->factory()->arguments_to_string())); |
@@ -434,12 +401,40 @@ void Builtins::Generate_ObjectProtoToString( |
assembler.Bind(&return_jsvalue); |
{ |
+ Label return_boolean(&assembler), return_number(&assembler), |
+ return_string(&assembler); |
+ |
Node* value = assembler.LoadJSValueValue(receiver); |
assembler.GotoIf(assembler.TaggedIsSmi(value), &return_number); |
- |
- ReturnIfPrimitive(&assembler, assembler.LoadInstanceType(value), |
- &return_string, &return_boolean, &return_number); |
+ Node* instance_type = assembler.LoadInstanceType(value); |
+ |
+ assembler.GotoIf(assembler.IsStringInstanceType(instance_type), |
+ &return_string); |
+ assembler.GotoIf( |
+ assembler.Word32Equal(instance_type, |
+ assembler.Int32Constant(HEAP_NUMBER_TYPE)), |
+ &return_number); |
+ assembler.GotoIf( |
+ assembler.Word32Equal(instance_type, |
+ assembler.Int32Constant(ODDBALL_TYPE)), |
+ &return_boolean); |
+ |
+ CSA_ASSERT(&assembler, |
+ assembler.Word32Equal(instance_type, |
+ assembler.Int32Constant(SYMBOL_TYPE))); |
assembler.Goto(&return_object); |
+ |
+ assembler.Bind(&return_string); |
+ assembler.Return(assembler.HeapConstant( |
+ assembler.isolate()->factory()->string_to_string())); |
+ |
+ assembler.Bind(&return_number); |
+ assembler.Return(assembler.HeapConstant( |
+ assembler.isolate()->factory()->number_to_string())); |
+ |
+ assembler.Bind(&return_boolean); |
+ assembler.Return(assembler.HeapConstant( |
+ assembler.isolate()->factory()->boolean_to_string())); |
} |
assembler.Bind(&return_jsproxy); |