Index: src/builtins/builtins-conversion.cc |
diff --git a/src/builtins/builtins-conversion.cc b/src/builtins/builtins-conversion.cc |
index 50c34b90a3ccf6fa022a772dcda4ca3e609f05d2..0d04a02e241132e87aaea3ffb17add337002e901 100644 |
--- a/src/builtins/builtins-conversion.cc |
+++ b/src/builtins/builtins-conversion.cc |
@@ -109,6 +109,38 @@ void Builtins::Generate_NonPrimitiveToPrimitive_String( |
Generate_NonPrimitiveToPrimitive(assembler, ToPrimitiveHint::kString); |
} |
+void Builtins::Generate_StringToNumber(CodeStubAssembler* assembler) { |
+ typedef CodeStubAssembler::Label Label; |
+ typedef compiler::Node Node; |
+ typedef TypeConversionDescriptor Descriptor; |
+ |
+ Node* input = assembler->Parameter(Descriptor::kArgument); |
+ Node* context = assembler->Parameter(Descriptor::kContext); |
+ |
+ Label runtime(assembler); |
+ |
+ // Check if string has a cached array index. |
+ Node* hash = assembler->LoadNameHashField(input); |
+ Node* bit = assembler->Word32And( |
+ hash, assembler->Int32Constant(String::kContainsCachedArrayIndexMask)); |
+ assembler->GotoIf(assembler->Word32NotEqual(bit, assembler->Int32Constant(0)), |
+ &runtime); |
+ |
+ assembler->Return(assembler->SmiTag( |
+ assembler->BitFieldDecode<String::ArrayIndexValueBits>(hash))); |
+ |
+ assembler->Bind(&runtime); |
+ { |
+ // 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::kStringToNumber, context, input); |
+ assembler->Return(result); |
+ } |
+} |
+ |
// ES6 section 7.1.3 ToNumber ( argument ) |
void Builtins::Generate_NonNumberToNumber(CodeStubAssembler* assembler) { |
typedef CodeStubAssembler::Label Label; |