diff options
Diffstat (limited to 'deps/v8/src/builtins/builtins-conversion-gen.cc')
-rw-r--r-- | deps/v8/src/builtins/builtins-conversion-gen.cc | 97 |
1 files changed, 74 insertions, 23 deletions
diff --git a/deps/v8/src/builtins/builtins-conversion-gen.cc b/deps/v8/src/builtins/builtins-conversion-gen.cc index 5fe2cb03bd..9edeb56e1e 100644 --- a/deps/v8/src/builtins/builtins-conversion-gen.cc +++ b/deps/v8/src/builtins/builtins-conversion-gen.cc @@ -2,28 +2,16 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "src/builtins/builtins-conversion-gen.h" + #include "src/builtins/builtins-utils-gen.h" #include "src/builtins/builtins.h" #include "src/code-factory.h" -#include "src/code-stub-assembler.h" #include "src/objects-inl.h" namespace v8 { namespace internal { -class ConversionBuiltinsAssembler : public CodeStubAssembler { - public: - explicit ConversionBuiltinsAssembler(compiler::CodeAssemblerState* state) - : CodeStubAssembler(state) {} - - protected: - void Generate_NonPrimitiveToPrimitive(Node* context, Node* input, - ToPrimitiveHint hint); - - void Generate_OrdinaryToPrimitive(Node* context, Node* input, - OrdinaryToPrimitiveHint hint); -}; - // ES6 section 7.1.1 ToPrimitive ( input [ , PreferredType ] ) void ConversionBuiltinsAssembler::Generate_NonPrimitiveToPrimitive( Node* context, Node* input, ToPrimitiveHint hint) { @@ -136,6 +124,56 @@ TF_BUILTIN(ToString, CodeStubAssembler) { Return(ToString(context, input)); } +// ES6 section 7.1.1 ToPrimitive( argument, "default" ) followed by +// ES6 section 7.1.12 ToString ( argument ) +compiler::Node* ConversionBuiltinsAssembler::ToPrimitiveToString( + Node* context, Node* input, Variable* feedback) { + Label is_string(this), to_primitive(this, Label::kDeferred), + to_string(this, Label::kDeferred), done(this); + VARIABLE(result, MachineRepresentation::kTagged, input); + + GotoIf(TaggedIsSmi(input), &to_string); + GotoIf(IsString(input), &is_string); + BranchIfJSReceiver(input, &to_primitive, &to_string); + + BIND(&to_primitive); + { + Callable callable = CodeFactory::NonPrimitiveToPrimitive(isolate()); + result.Bind(CallStub(callable, context, input)); + Goto(&to_string); + } + + BIND(&to_string); + { + if (feedback) { + feedback->Bind(SmiConstant(BinaryOperationFeedback::kAny)); + } + result.Bind(CallBuiltin(Builtins::kToString, context, result.value())); + Goto(&done); + } + + BIND(&is_string); + { + if (feedback) { + feedback->Bind( + SelectSmiConstant(WordEqual(input, EmptyStringConstant()), + BinaryOperationFeedback::kString, + BinaryOperationFeedback::kNonEmptyString)); + } + Goto(&done); + } + + BIND(&done); + return result.value(); +} + +TF_BUILTIN(ToPrimitiveToString, ConversionBuiltinsAssembler) { + Node* context = Parameter(Descriptor::kContext); + Node* input = Parameter(Descriptor::kArgument); + + Return(ToPrimitiveToString(context, input)); +} + // 7.1.1.1 OrdinaryToPrimitive ( O, hint ) void ConversionBuiltinsAssembler::Generate_OrdinaryToPrimitive( Node* context, Node* input, OrdinaryToPrimitiveHint hint) { @@ -221,6 +259,22 @@ TF_BUILTIN(ToBoolean, CodeStubAssembler) { Return(BooleanConstant(false)); } +// ES6 section 7.1.2 ToBoolean ( argument ) +// Requires parameter on stack so that it can be used as a continuation from a +// LAZY deopt. +TF_BUILTIN(ToBooleanLazyDeoptContinuation, CodeStubAssembler) { + Node* value = Parameter(Descriptor::kArgument); + + Label return_true(this), return_false(this); + BranchIfToBooleanIsTrue(value, &return_true, &return_false); + + BIND(&return_true); + Return(BooleanConstant(true)); + + BIND(&return_false); + Return(BooleanConstant(false)); +} + TF_BUILTIN(ToLength, CodeStubAssembler) { Node* context = Parameter(Descriptor::kContext); @@ -247,8 +301,7 @@ TF_BUILTIN(ToLength, CodeStubAssembler) { // Check if {len} is a HeapNumber. Label if_lenisheapnumber(this), if_lenisnotheapnumber(this, Label::kDeferred); - Branch(IsHeapNumberMap(LoadMap(len)), &if_lenisheapnumber, - &if_lenisnotheapnumber); + Branch(IsHeapNumber(len), &if_lenisheapnumber, &if_lenisnotheapnumber); BIND(&if_lenisheapnumber); { @@ -273,8 +326,7 @@ TF_BUILTIN(ToLength, CodeStubAssembler) { BIND(&if_lenisnotheapnumber); { // Need to convert {len} to a Number first. - Callable callable = CodeFactory::NonNumberToNumber(isolate()); - var_len.Bind(CallStub(callable, context, len)); + var_len.Bind(CallBuiltin(Builtins::kNonNumberToNumber, context, len)); Goto(&loop); } @@ -285,7 +337,7 @@ TF_BUILTIN(ToLength, CodeStubAssembler) { Return(NumberConstant(kMaxSafeInteger)); BIND(&return_zero); - Return(SmiConstant(Smi::kZero)); + Return(SmiConstant(0)); } } @@ -337,7 +389,7 @@ TF_BUILTIN(ToObject, CodeStubAssembler) { LoadObjectField(constructor, JSFunction::kPrototypeOrInitialMapOffset); Node* js_value = Allocate(JSValue::kSize); StoreMapNoWriteBarrier(js_value, initial_map); - StoreObjectFieldRoot(js_value, JSValue::kPropertiesOffset, + StoreObjectFieldRoot(js_value, JSValue::kPropertiesOrHashOffset, Heap::kEmptyFixedArrayRootIndex); StoreObjectFieldRoot(js_value, JSObject::kElementsOffset, Heap::kEmptyFixedArrayRootIndex); @@ -345,9 +397,8 @@ TF_BUILTIN(ToObject, CodeStubAssembler) { Return(js_value); BIND(&if_noconstructor); - TailCallRuntime( - Runtime::kThrowUndefinedOrNullToObject, context, - HeapConstant(factory()->NewStringFromAsciiChecked("ToObject", TENURED))); + TailCallRuntime(Runtime::kThrowUndefinedOrNullToObject, context, + StringConstant("ToObject")); BIND(&if_jsreceiver); Return(object); |