summaryrefslogtreecommitdiff
path: root/deps/v8/src/builtins/builtins-conversion-gen.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/builtins/builtins-conversion-gen.cc')
-rw-r--r--deps/v8/src/builtins/builtins-conversion-gen.cc97
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);