| Index: src/builtins/builtins-conversion.cc
|
| diff --git a/src/builtins/builtins-conversion.cc b/src/builtins/builtins-conversion.cc
|
| index 0d04a02e241132e87aaea3ffb17add337002e901..9cb9eeadf7f329f9219f3ef08d7b44fff4c1a80e 100644
|
| --- a/src/builtins/builtins-conversion.cc
|
| +++ b/src/builtins/builtins-conversion.cc
|
| @@ -109,15 +109,17 @@ void Builtins::Generate_NonPrimitiveToPrimitive_String(
|
| Generate_NonPrimitiveToPrimitive(assembler, ToPrimitiveHint::kString);
|
| }
|
|
|
| -void Builtins::Generate_StringToNumber(CodeStubAssembler* assembler) {
|
| +compiler::Node* Builtins::GenerateImpl_StringToNumber(
|
| + CodeStubAssembler* assembler, compiler::Node* input,
|
| + compiler::Node* context) {
|
| typedef CodeStubAssembler::Label Label;
|
| typedef compiler::Node Node;
|
| - typedef TypeConversionDescriptor Descriptor;
|
| + typedef CodeStubAssembler::Variable Variable;
|
|
|
| - Node* input = assembler->Parameter(Descriptor::kArgument);
|
| - Node* context = assembler->Parameter(Descriptor::kContext);
|
| + Label runtime(assembler, Label::kDeferred);
|
| + Label end(assembler);
|
|
|
| - Label runtime(assembler);
|
| + Variable var_result(assembler, MachineRepresentation::kTagged);
|
|
|
| // Check if string has a cached array index.
|
| Node* hash = assembler->LoadNameHashField(input);
|
| @@ -126,8 +128,9 @@ void Builtins::Generate_StringToNumber(CodeStubAssembler* assembler) {
|
| assembler->GotoIf(assembler->Word32NotEqual(bit, assembler->Int32Constant(0)),
|
| &runtime);
|
|
|
| - assembler->Return(assembler->SmiTag(
|
| + var_result.Bind(assembler->SmiTag(
|
| assembler->BitFieldDecode<String::ArrayIndexValueBits>(hash)));
|
| + assembler->Goto(&end);
|
|
|
| assembler->Bind(&runtime);
|
| {
|
| @@ -135,10 +138,20 @@ void Builtins::Generate_StringToNumber(CodeStubAssembler* assembler) {
|
| // 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::kStringToNumber, context, input);
|
| - assembler->Return(result);
|
| + var_result.Bind(
|
| + assembler->CallRuntime(Runtime::kStringToNumber, context, input));
|
| + assembler->Goto(&end);
|
| }
|
| +
|
| + assembler->Bind(&end);
|
| + return var_result.value();
|
| +}
|
| +
|
| +void Builtins::Generate_StringToNumber(CodeStubAssembler* assembler) {
|
| + typedef TypeConversionDescriptor Descriptor;
|
| + assembler->Return(Builtins::GenerateImpl_StringToNumber(
|
| + assembler, assembler->Parameter(Descriptor::kArgument),
|
| + assembler->Parameter(Descriptor::kContext)));
|
| }
|
|
|
| // ES6 section 7.1.3 ToNumber ( argument )
|
| @@ -183,9 +196,8 @@ void Builtins::Generate_NonNumberToNumber(CodeStubAssembler* assembler) {
|
| assembler->Bind(&if_inputisstring);
|
| {
|
| // The {input} is a String, use the fast stub to convert it to a Number.
|
| - // TODO(bmeurer): Consider inlining the StringToNumber logic here.
|
| - Callable callable = CodeFactory::StringToNumber(assembler->isolate());
|
| - assembler->TailCallStub(callable, context, input);
|
| + assembler->Return(
|
| + Builtins::GenerateImpl_StringToNumber(assembler, input, context));
|
| }
|
|
|
| assembler->Bind(&if_inputisoddball);
|
|
|