| Index: src/builtins/builtins-conversion.cc
|
| diff --git a/src/builtins/builtins-conversion.cc b/src/builtins/builtins-conversion.cc
|
| index 2aff1c5f070dfa413f8d37ac51fe14cc5f2078de..63cff14bba3b4ac63f8692d3232d2432d653cf9e 100644
|
| --- a/src/builtins/builtins-conversion.cc
|
| +++ b/src/builtins/builtins-conversion.cc
|
| @@ -11,6 +11,17 @@
|
| namespace v8 {
|
| namespace internal {
|
|
|
| +class ConversionBuiltinsAssembler : public CodeStubAssembler {
|
| + public:
|
| + explicit ConversionBuiltinsAssembler(compiler::CodeAssemblerState* state)
|
| + : CodeStubAssembler(state) {}
|
| +
|
| + protected:
|
| + void Generate_NonPrimitiveToPrimitive(ToPrimitiveHint hint);
|
| +
|
| + void Generate_OrdinaryToPrimitive(OrdinaryToPrimitiveHint hint);
|
| +};
|
| +
|
| Handle<Code> Builtins::NonPrimitiveToPrimitive(ToPrimitiveHint hint) {
|
| switch (hint) {
|
| case ToPrimitiveHint::kDefault:
|
| @@ -24,192 +35,140 @@ Handle<Code> Builtins::NonPrimitiveToPrimitive(ToPrimitiveHint hint) {
|
| return Handle<Code>::null();
|
| }
|
|
|
| -namespace {
|
| -
|
| // ES6 section 7.1.1 ToPrimitive ( input [ , PreferredType ] )
|
| -void Generate_NonPrimitiveToPrimitive(CodeStubAssembler* assembler,
|
| - ToPrimitiveHint hint) {
|
| - typedef CodeStubAssembler::Label Label;
|
| - typedef compiler::Node Node;
|
| - typedef TypeConversionDescriptor Descriptor;
|
| -
|
| - Node* input = assembler->Parameter(Descriptor::kArgument);
|
| - Node* context = assembler->Parameter(Descriptor::kContext);
|
| +void ConversionBuiltinsAssembler::Generate_NonPrimitiveToPrimitive(
|
| + ToPrimitiveHint hint) {
|
| + Node* input = Parameter(TypeConversionDescriptor::kArgument);
|
| + Node* context = Parameter(TypeConversionDescriptor::kContext);
|
|
|
| // Lookup the @@toPrimitive property on the {input}.
|
| - Callable callable = CodeFactory::GetProperty(assembler->isolate());
|
| - Node* to_primitive_symbol =
|
| - assembler->HeapConstant(assembler->factory()->to_primitive_symbol());
|
| + Callable callable = CodeFactory::GetProperty(isolate());
|
| + Node* to_primitive_symbol = HeapConstant(factory()->to_primitive_symbol());
|
| Node* exotic_to_prim =
|
| - assembler->CallStub(callable, context, input, to_primitive_symbol);
|
| + CallStub(callable, context, input, to_primitive_symbol);
|
|
|
| // Check if {exotic_to_prim} is neither null nor undefined.
|
| - Label ordinary_to_primitive(assembler);
|
| - assembler->GotoIf(
|
| - assembler->WordEqual(exotic_to_prim, assembler->NullConstant()),
|
| - &ordinary_to_primitive);
|
| - assembler->GotoIf(
|
| - assembler->WordEqual(exotic_to_prim, assembler->UndefinedConstant()),
|
| - &ordinary_to_primitive);
|
| + Label ordinary_to_primitive(this);
|
| + GotoIf(WordEqual(exotic_to_prim, NullConstant()), &ordinary_to_primitive);
|
| + GotoIf(WordEqual(exotic_to_prim, UndefinedConstant()),
|
| + &ordinary_to_primitive);
|
| {
|
| // Invoke the {exotic_to_prim} method on the {input} with a string
|
| // representation of the {hint}.
|
| - Callable callable = CodeFactory::Call(
|
| - assembler->isolate(), ConvertReceiverMode::kNotNullOrUndefined);
|
| - Node* hint_string = assembler->HeapConstant(
|
| - assembler->factory()->ToPrimitiveHintString(hint));
|
| - Node* result = assembler->CallJS(callable, context, exotic_to_prim, input,
|
| - hint_string);
|
| + Callable callable =
|
| + CodeFactory::Call(isolate(), ConvertReceiverMode::kNotNullOrUndefined);
|
| + Node* hint_string = HeapConstant(factory()->ToPrimitiveHintString(hint));
|
| + Node* result =
|
| + CallJS(callable, context, exotic_to_prim, input, hint_string);
|
|
|
| // Verify that the {result} is actually a primitive.
|
| - Label if_resultisprimitive(assembler),
|
| - if_resultisnotprimitive(assembler, Label::kDeferred);
|
| - assembler->GotoIf(assembler->TaggedIsSmi(result), &if_resultisprimitive);
|
| - Node* result_instance_type = assembler->LoadInstanceType(result);
|
| + Label if_resultisprimitive(this),
|
| + if_resultisnotprimitive(this, Label::kDeferred);
|
| + GotoIf(TaggedIsSmi(result), &if_resultisprimitive);
|
| + Node* result_instance_type = LoadInstanceType(result);
|
| STATIC_ASSERT(FIRST_PRIMITIVE_TYPE == FIRST_TYPE);
|
| - assembler->Branch(assembler->Int32LessThanOrEqual(
|
| - result_instance_type,
|
| - assembler->Int32Constant(LAST_PRIMITIVE_TYPE)),
|
| - &if_resultisprimitive, &if_resultisnotprimitive);
|
| + Branch(Int32LessThanOrEqual(result_instance_type,
|
| + Int32Constant(LAST_PRIMITIVE_TYPE)),
|
| + &if_resultisprimitive, &if_resultisnotprimitive);
|
|
|
| - assembler->Bind(&if_resultisprimitive);
|
| + Bind(&if_resultisprimitive);
|
| {
|
| // Just return the {result}.
|
| - assembler->Return(result);
|
| + Return(result);
|
| }
|
|
|
| - assembler->Bind(&if_resultisnotprimitive);
|
| + Bind(&if_resultisnotprimitive);
|
| {
|
| // Somehow the @@toPrimitive method on {input} didn't yield a primitive.
|
| - assembler->TailCallRuntime(Runtime::kThrowCannotConvertToPrimitive,
|
| - context);
|
| + TailCallRuntime(Runtime::kThrowCannotConvertToPrimitive, context);
|
| }
|
| }
|
|
|
| // Convert using the OrdinaryToPrimitive algorithm instead.
|
| - assembler->Bind(&ordinary_to_primitive);
|
| + Bind(&ordinary_to_primitive);
|
| {
|
| Callable callable = CodeFactory::OrdinaryToPrimitive(
|
| - assembler->isolate(), (hint == ToPrimitiveHint::kString)
|
| - ? OrdinaryToPrimitiveHint::kString
|
| - : OrdinaryToPrimitiveHint::kNumber);
|
| - assembler->TailCallStub(callable, context, input);
|
| + isolate(), (hint == ToPrimitiveHint::kString)
|
| + ? OrdinaryToPrimitiveHint::kString
|
| + : OrdinaryToPrimitiveHint::kNumber);
|
| + TailCallStub(callable, context, input);
|
| }
|
| }
|
|
|
| -} // namespace
|
| -
|
| -void Builtins::Generate_NonPrimitiveToPrimitive_Default(
|
| - compiler::CodeAssemblerState* state) {
|
| - CodeStubAssembler assembler(state);
|
| - Generate_NonPrimitiveToPrimitive(&assembler, ToPrimitiveHint::kDefault);
|
| +TF_BUILTIN(NonPrimitiveToPrimitive_Default, ConversionBuiltinsAssembler) {
|
| + Generate_NonPrimitiveToPrimitive(ToPrimitiveHint::kDefault);
|
| }
|
|
|
| -void Builtins::Generate_NonPrimitiveToPrimitive_Number(
|
| - compiler::CodeAssemblerState* state) {
|
| - CodeStubAssembler assembler(state);
|
| - Generate_NonPrimitiveToPrimitive(&assembler, ToPrimitiveHint::kNumber);
|
| +TF_BUILTIN(NonPrimitiveToPrimitive_Number, ConversionBuiltinsAssembler) {
|
| + Generate_NonPrimitiveToPrimitive(ToPrimitiveHint::kNumber);
|
| }
|
|
|
| -void Builtins::Generate_NonPrimitiveToPrimitive_String(
|
| - compiler::CodeAssemblerState* state) {
|
| - CodeStubAssembler assembler(state);
|
| - Generate_NonPrimitiveToPrimitive(&assembler, ToPrimitiveHint::kString);
|
| +TF_BUILTIN(NonPrimitiveToPrimitive_String, ConversionBuiltinsAssembler) {
|
| + Generate_NonPrimitiveToPrimitive(ToPrimitiveHint::kString);
|
| }
|
|
|
| -void Builtins::Generate_StringToNumber(compiler::CodeAssemblerState* state) {
|
| - typedef compiler::Node Node;
|
| - typedef TypeConversionDescriptor Descriptor;
|
| - CodeStubAssembler assembler(state);
|
| +TF_BUILTIN(StringToNumber, CodeStubAssembler) {
|
| + Node* input = Parameter(TypeConversionDescriptor::kArgument);
|
| + Node* context = Parameter(TypeConversionDescriptor::kContext);
|
|
|
| - Node* input = assembler.Parameter(Descriptor::kArgument);
|
| - Node* context = assembler.Parameter(Descriptor::kContext);
|
| -
|
| - assembler.Return(assembler.StringToNumber(context, input));
|
| + Return(StringToNumber(context, input));
|
| }
|
|
|
| -void Builtins::Generate_ToName(compiler::CodeAssemblerState* state) {
|
| - typedef compiler::Node Node;
|
| - typedef TypeConversionDescriptor Descriptor;
|
| - CodeStubAssembler assembler(state);
|
| -
|
| - Node* input = assembler.Parameter(Descriptor::kArgument);
|
| - Node* context = assembler.Parameter(Descriptor::kContext);
|
| +TF_BUILTIN(ToName, CodeStubAssembler) {
|
| + Node* input = Parameter(TypeConversionDescriptor::kArgument);
|
| + Node* context = Parameter(TypeConversionDescriptor::kContext);
|
|
|
| - assembler.Return(assembler.ToName(context, input));
|
| + Return(ToName(context, input));
|
| }
|
|
|
| -// static
|
| -void Builtins::Generate_NonNumberToNumber(compiler::CodeAssemblerState* state) {
|
| - typedef compiler::Node Node;
|
| - typedef TypeConversionDescriptor Descriptor;
|
| - CodeStubAssembler assembler(state);
|
| -
|
| - Node* input = assembler.Parameter(Descriptor::kArgument);
|
| - Node* context = assembler.Parameter(Descriptor::kContext);
|
| +TF_BUILTIN(NonNumberToNumber, CodeStubAssembler) {
|
| + Node* input = Parameter(TypeConversionDescriptor::kArgument);
|
| + Node* context = Parameter(TypeConversionDescriptor::kContext);
|
|
|
| - assembler.Return(assembler.NonNumberToNumber(context, input));
|
| + Return(NonNumberToNumber(context, input));
|
| }
|
|
|
| // ES6 section 7.1.3 ToNumber ( argument )
|
| -void Builtins::Generate_ToNumber(compiler::CodeAssemblerState* state) {
|
| - typedef compiler::Node Node;
|
| - typedef TypeConversionDescriptor Descriptor;
|
| - CodeStubAssembler assembler(state);
|
| +TF_BUILTIN(ToNumber, CodeStubAssembler) {
|
| + Node* input = Parameter(TypeConversionDescriptor::kArgument);
|
| + Node* context = Parameter(TypeConversionDescriptor::kContext);
|
|
|
| - Node* input = assembler.Parameter(Descriptor::kArgument);
|
| - Node* context = assembler.Parameter(Descriptor::kContext);
|
| -
|
| - assembler.Return(assembler.ToNumber(context, input));
|
| + Return(ToNumber(context, input));
|
| }
|
|
|
| -void Builtins::Generate_ToString(compiler::CodeAssemblerState* state) {
|
| - typedef CodeStubAssembler::Label Label;
|
| - typedef compiler::Node Node;
|
| - typedef TypeConversionDescriptor Descriptor;
|
| - CodeStubAssembler assembler(state);
|
| -
|
| - Node* input = assembler.Parameter(Descriptor::kArgument);
|
| - Node* context = assembler.Parameter(Descriptor::kContext);
|
| +TF_BUILTIN(ToString, CodeStubAssembler) {
|
| + Node* input = Parameter(TypeConversionDescriptor::kArgument);
|
| + Node* context = Parameter(TypeConversionDescriptor::kContext);
|
|
|
| - Label is_number(&assembler);
|
| - Label runtime(&assembler);
|
| + Label is_number(this);
|
| + Label runtime(this);
|
|
|
| - assembler.GotoIf(assembler.TaggedIsSmi(input), &is_number);
|
| + GotoIf(TaggedIsSmi(input), &is_number);
|
|
|
| - Node* input_map = assembler.LoadMap(input);
|
| - Node* input_instance_type = assembler.LoadMapInstanceType(input_map);
|
| + Node* input_map = LoadMap(input);
|
| + Node* input_instance_type = LoadMapInstanceType(input_map);
|
|
|
| - Label not_string(&assembler);
|
| - assembler.GotoIfNot(assembler.IsStringInstanceType(input_instance_type),
|
| - ¬_string);
|
| - assembler.Return(input);
|
| + Label not_string(this);
|
| + GotoIfNot(IsStringInstanceType(input_instance_type), ¬_string);
|
| + Return(input);
|
|
|
| - Label not_heap_number(&assembler);
|
| + Label not_heap_number(this);
|
|
|
| - assembler.Bind(¬_string);
|
| - {
|
| - assembler.GotoIfNot(assembler.IsHeapNumberMap(input_map), ¬_heap_number);
|
| - assembler.Goto(&is_number);
|
| - }
|
| + Bind(¬_string);
|
| + { Branch(IsHeapNumberMap(input_map), &is_number, ¬_heap_number); }
|
|
|
| - assembler.Bind(&is_number);
|
| - { assembler.Return(assembler.NumberToString(context, input)); }
|
| + Bind(&is_number);
|
| + { Return(NumberToString(context, input)); }
|
|
|
| - assembler.Bind(¬_heap_number);
|
| + Bind(¬_heap_number);
|
| {
|
| - assembler.GotoIf(
|
| - assembler.Word32NotEqual(input_instance_type,
|
| - assembler.Int32Constant(ODDBALL_TYPE)),
|
| - &runtime);
|
| - assembler.Return(
|
| - assembler.LoadObjectField(input, Oddball::kToStringOffset));
|
| + GotoIf(Word32NotEqual(input_instance_type, Int32Constant(ODDBALL_TYPE)),
|
| + &runtime);
|
| + Return(LoadObjectField(input, Oddball::kToStringOffset));
|
| }
|
|
|
| - assembler.Bind(&runtime);
|
| - {
|
| - assembler.Return(assembler.CallRuntime(Runtime::kToString, context, input));
|
| - }
|
| + Bind(&runtime);
|
| + { Return(CallRuntime(Runtime::kToString, context, input)); }
|
| }
|
|
|
| Handle<Code> Builtins::OrdinaryToPrimitive(OrdinaryToPrimitiveHint hint) {
|
| @@ -223,284 +182,234 @@ Handle<Code> Builtins::OrdinaryToPrimitive(OrdinaryToPrimitiveHint hint) {
|
| return Handle<Code>::null();
|
| }
|
|
|
| -namespace {
|
| -
|
| // 7.1.1.1 OrdinaryToPrimitive ( O, hint )
|
| -void Generate_OrdinaryToPrimitive(CodeStubAssembler* assembler,
|
| - OrdinaryToPrimitiveHint hint) {
|
| - typedef CodeStubAssembler::Label Label;
|
| - typedef compiler::Node Node;
|
| - typedef CodeStubAssembler::Variable Variable;
|
| - typedef TypeConversionDescriptor Descriptor;
|
| -
|
| - Node* input = assembler->Parameter(Descriptor::kArgument);
|
| - Node* context = assembler->Parameter(Descriptor::kContext);
|
| +void ConversionBuiltinsAssembler::Generate_OrdinaryToPrimitive(
|
| + OrdinaryToPrimitiveHint hint) {
|
| + Node* input = Parameter(TypeConversionDescriptor::kArgument);
|
| + Node* context = Parameter(TypeConversionDescriptor::kContext);
|
|
|
| - Variable var_result(assembler, MachineRepresentation::kTagged);
|
| - Label return_result(assembler, &var_result);
|
| + Variable var_result(this, MachineRepresentation::kTagged);
|
| + Label return_result(this, &var_result);
|
|
|
| Handle<String> method_names[2];
|
| switch (hint) {
|
| case OrdinaryToPrimitiveHint::kNumber:
|
| - method_names[0] = assembler->factory()->valueOf_string();
|
| - method_names[1] = assembler->factory()->toString_string();
|
| + method_names[0] = factory()->valueOf_string();
|
| + method_names[1] = factory()->toString_string();
|
| break;
|
| case OrdinaryToPrimitiveHint::kString:
|
| - method_names[0] = assembler->factory()->toString_string();
|
| - method_names[1] = assembler->factory()->valueOf_string();
|
| + method_names[0] = factory()->toString_string();
|
| + method_names[1] = factory()->valueOf_string();
|
| break;
|
| }
|
| for (Handle<String> name : method_names) {
|
| // Lookup the {name} on the {input}.
|
| - Callable callable = CodeFactory::GetProperty(assembler->isolate());
|
| - Node* name_string = assembler->HeapConstant(name);
|
| - Node* method = assembler->CallStub(callable, context, input, name_string);
|
| + Callable callable = CodeFactory::GetProperty(isolate());
|
| + Node* name_string = HeapConstant(name);
|
| + Node* method = CallStub(callable, context, input, name_string);
|
|
|
| // Check if the {method} is callable.
|
| - Label if_methodiscallable(assembler),
|
| - if_methodisnotcallable(assembler, Label::kDeferred);
|
| - assembler->GotoIf(assembler->TaggedIsSmi(method), &if_methodisnotcallable);
|
| - Node* method_map = assembler->LoadMap(method);
|
| - assembler->Branch(assembler->IsCallableMap(method_map),
|
| - &if_methodiscallable, &if_methodisnotcallable);
|
| -
|
| - assembler->Bind(&if_methodiscallable);
|
| + Label if_methodiscallable(this),
|
| + if_methodisnotcallable(this, Label::kDeferred);
|
| + GotoIf(TaggedIsSmi(method), &if_methodisnotcallable);
|
| + Node* method_map = LoadMap(method);
|
| + Branch(IsCallableMap(method_map), &if_methodiscallable,
|
| + &if_methodisnotcallable);
|
| +
|
| + Bind(&if_methodiscallable);
|
| {
|
| // Call the {method} on the {input}.
|
| Callable callable = CodeFactory::Call(
|
| - assembler->isolate(), ConvertReceiverMode::kNotNullOrUndefined);
|
| - Node* result = assembler->CallJS(callable, context, method, input);
|
| + isolate(), ConvertReceiverMode::kNotNullOrUndefined);
|
| + Node* result = CallJS(callable, context, method, input);
|
| var_result.Bind(result);
|
|
|
| // Return the {result} if it is a primitive.
|
| - assembler->GotoIf(assembler->TaggedIsSmi(result), &return_result);
|
| - Node* result_instance_type = assembler->LoadInstanceType(result);
|
| + GotoIf(TaggedIsSmi(result), &return_result);
|
| + Node* result_instance_type = LoadInstanceType(result);
|
| STATIC_ASSERT(FIRST_PRIMITIVE_TYPE == FIRST_TYPE);
|
| - assembler->GotoIf(assembler->Int32LessThanOrEqual(
|
| - result_instance_type,
|
| - assembler->Int32Constant(LAST_PRIMITIVE_TYPE)),
|
| - &return_result);
|
| + GotoIf(Int32LessThanOrEqual(result_instance_type,
|
| + Int32Constant(LAST_PRIMITIVE_TYPE)),
|
| + &return_result);
|
| }
|
|
|
| // Just continue with the next {name} if the {method} is not callable.
|
| - assembler->Goto(&if_methodisnotcallable);
|
| - assembler->Bind(&if_methodisnotcallable);
|
| + Goto(&if_methodisnotcallable);
|
| + Bind(&if_methodisnotcallable);
|
| }
|
|
|
| - assembler->TailCallRuntime(Runtime::kThrowCannotConvertToPrimitive, context);
|
| + TailCallRuntime(Runtime::kThrowCannotConvertToPrimitive, context);
|
|
|
| - assembler->Bind(&return_result);
|
| - assembler->Return(var_result.value());
|
| + Bind(&return_result);
|
| + Return(var_result.value());
|
| }
|
|
|
| -} // namespace
|
| -
|
| -void Builtins::Generate_OrdinaryToPrimitive_Number(
|
| - compiler::CodeAssemblerState* state) {
|
| - CodeStubAssembler assembler(state);
|
| - Generate_OrdinaryToPrimitive(&assembler, OrdinaryToPrimitiveHint::kNumber);
|
| +TF_BUILTIN(OrdinaryToPrimitive_Number, ConversionBuiltinsAssembler) {
|
| + Generate_OrdinaryToPrimitive(OrdinaryToPrimitiveHint::kNumber);
|
| }
|
|
|
| -void Builtins::Generate_OrdinaryToPrimitive_String(
|
| - compiler::CodeAssemblerState* state) {
|
| - CodeStubAssembler assembler(state);
|
| - Generate_OrdinaryToPrimitive(&assembler, OrdinaryToPrimitiveHint::kString);
|
| +TF_BUILTIN(OrdinaryToPrimitive_String, ConversionBuiltinsAssembler) {
|
| + Generate_OrdinaryToPrimitive(OrdinaryToPrimitiveHint::kString);
|
| }
|
|
|
| // ES6 section 7.1.2 ToBoolean ( argument )
|
| -void Builtins::Generate_ToBoolean(compiler::CodeAssemblerState* state) {
|
| - typedef compiler::Node Node;
|
| - typedef CodeStubAssembler::Label Label;
|
| - typedef TypeConversionDescriptor Descriptor;
|
| - CodeStubAssembler assembler(state);
|
| +TF_BUILTIN(ToBoolean, CodeStubAssembler) {
|
| + Node* value = Parameter(TypeConversionDescriptor::kArgument);
|
|
|
| - Node* value = assembler.Parameter(Descriptor::kArgument);
|
| + Label return_true(this), return_false(this);
|
| + BranchIfToBooleanIsTrue(value, &return_true, &return_false);
|
|
|
| - Label return_true(&assembler), return_false(&assembler);
|
| - assembler.BranchIfToBooleanIsTrue(value, &return_true, &return_false);
|
| + Bind(&return_true);
|
| + Return(BooleanConstant(true));
|
|
|
| - assembler.Bind(&return_true);
|
| - assembler.Return(assembler.BooleanConstant(true));
|
| -
|
| - assembler.Bind(&return_false);
|
| - assembler.Return(assembler.BooleanConstant(false));
|
| + Bind(&return_false);
|
| + Return(BooleanConstant(false));
|
| }
|
|
|
| -void Builtins::Generate_ToLength(compiler::CodeAssemblerState* state) {
|
| - typedef CodeStubAssembler::Label Label;
|
| - typedef compiler::Node Node;
|
| - typedef CodeStubAssembler::Variable Variable;
|
| - CodeStubAssembler assembler(state);
|
| -
|
| - Node* context = assembler.Parameter(1);
|
| +TF_BUILTIN(ToLength, CodeStubAssembler) {
|
| + Node* context = Parameter(1);
|
|
|
| // We might need to loop once for ToNumber conversion.
|
| - Variable var_len(&assembler, MachineRepresentation::kTagged);
|
| - Label loop(&assembler, &var_len);
|
| - var_len.Bind(assembler.Parameter(0));
|
| - assembler.Goto(&loop);
|
| - assembler.Bind(&loop);
|
| + Variable var_len(this, MachineRepresentation::kTagged, Parameter(0));
|
| + Label loop(this, &var_len);
|
| + Goto(&loop);
|
| + Bind(&loop);
|
| {
|
| // Shared entry points.
|
| - Label return_len(&assembler),
|
| - return_two53minus1(&assembler, Label::kDeferred),
|
| - return_zero(&assembler, Label::kDeferred);
|
| + Label return_len(this), return_two53minus1(this, Label::kDeferred),
|
| + return_zero(this, Label::kDeferred);
|
|
|
| // Load the current {len} value.
|
| Node* len = var_len.value();
|
|
|
| // Check if {len} is a positive Smi.
|
| - assembler.GotoIf(assembler.TaggedIsPositiveSmi(len), &return_len);
|
| + GotoIf(TaggedIsPositiveSmi(len), &return_len);
|
|
|
| // Check if {len} is a (negative) Smi.
|
| - assembler.GotoIf(assembler.TaggedIsSmi(len), &return_zero);
|
| + GotoIf(TaggedIsSmi(len), &return_zero);
|
|
|
| // Check if {len} is a HeapNumber.
|
| - Label if_lenisheapnumber(&assembler),
|
| - if_lenisnotheapnumber(&assembler, Label::kDeferred);
|
| - assembler.Branch(assembler.IsHeapNumberMap(assembler.LoadMap(len)),
|
| - &if_lenisheapnumber, &if_lenisnotheapnumber);
|
| + Label if_lenisheapnumber(this),
|
| + if_lenisnotheapnumber(this, Label::kDeferred);
|
| + Branch(IsHeapNumberMap(LoadMap(len)), &if_lenisheapnumber,
|
| + &if_lenisnotheapnumber);
|
|
|
| - assembler.Bind(&if_lenisheapnumber);
|
| + Bind(&if_lenisheapnumber);
|
| {
|
| // Load the floating-point value of {len}.
|
| - Node* len_value = assembler.LoadHeapNumberValue(len);
|
| + Node* len_value = LoadHeapNumberValue(len);
|
|
|
| // Check if {len} is not greater than zero.
|
| - assembler.GotoIfNot(assembler.Float64GreaterThan(
|
| - len_value, assembler.Float64Constant(0.0)),
|
| - &return_zero);
|
| + GotoIfNot(Float64GreaterThan(len_value, Float64Constant(0.0)),
|
| + &return_zero);
|
|
|
| // Check if {len} is greater than or equal to 2^53-1.
|
| - assembler.GotoIf(
|
| - assembler.Float64GreaterThanOrEqual(
|
| - len_value, assembler.Float64Constant(kMaxSafeInteger)),
|
| - &return_two53minus1);
|
| + GotoIf(Float64GreaterThanOrEqual(len_value,
|
| + Float64Constant(kMaxSafeInteger)),
|
| + &return_two53minus1);
|
|
|
| // Round the {len} towards -Infinity.
|
| - Node* value = assembler.Float64Floor(len_value);
|
| - Node* result = assembler.ChangeFloat64ToTagged(value);
|
| - assembler.Return(result);
|
| + Node* value = Float64Floor(len_value);
|
| + Node* result = ChangeFloat64ToTagged(value);
|
| + Return(result);
|
| }
|
|
|
| - assembler.Bind(&if_lenisnotheapnumber);
|
| + Bind(&if_lenisnotheapnumber);
|
| {
|
| // Need to convert {len} to a Number first.
|
| - Callable callable = CodeFactory::NonNumberToNumber(assembler.isolate());
|
| - var_len.Bind(assembler.CallStub(callable, context, len));
|
| - assembler.Goto(&loop);
|
| + Callable callable = CodeFactory::NonNumberToNumber(isolate());
|
| + var_len.Bind(CallStub(callable, context, len));
|
| + Goto(&loop);
|
| }
|
|
|
| - assembler.Bind(&return_len);
|
| - assembler.Return(var_len.value());
|
| + Bind(&return_len);
|
| + Return(var_len.value());
|
|
|
| - assembler.Bind(&return_two53minus1);
|
| - assembler.Return(assembler.NumberConstant(kMaxSafeInteger));
|
| + Bind(&return_two53minus1);
|
| + Return(NumberConstant(kMaxSafeInteger));
|
|
|
| - assembler.Bind(&return_zero);
|
| - assembler.Return(assembler.SmiConstant(Smi::kZero));
|
| + Bind(&return_zero);
|
| + Return(SmiConstant(Smi::kZero));
|
| }
|
| }
|
|
|
| -void Builtins::Generate_ToInteger(compiler::CodeAssemblerState* state) {
|
| - typedef TypeConversionDescriptor Descriptor;
|
| - CodeStubAssembler assembler(state);
|
| -
|
| - compiler::Node* input = assembler.Parameter(Descriptor::kArgument);
|
| - compiler::Node* context = assembler.Parameter(Descriptor::kContext);
|
| +TF_BUILTIN(ToInteger, CodeStubAssembler) {
|
| + Node* input = Parameter(TypeConversionDescriptor::kArgument);
|
| + Node* context = Parameter(TypeConversionDescriptor::kContext);
|
|
|
| - assembler.Return(assembler.ToInteger(context, input));
|
| + Return(ToInteger(context, input));
|
| }
|
|
|
| // ES6 section 7.1.13 ToObject (argument)
|
| -void Builtins::Generate_ToObject(compiler::CodeAssemblerState* state) {
|
| - typedef compiler::Node Node;
|
| - typedef CodeStubAssembler::Label Label;
|
| - typedef CodeStubAssembler::Variable Variable;
|
| - typedef TypeConversionDescriptor Descriptor;
|
| - CodeStubAssembler assembler(state);
|
| +TF_BUILTIN(ToObject, CodeStubAssembler) {
|
| + Label if_number(this, Label::kDeferred), if_notsmi(this), if_jsreceiver(this),
|
| + if_noconstructor(this, Label::kDeferred), if_wrapjsvalue(this);
|
|
|
| - Label if_number(&assembler, Label::kDeferred), if_notsmi(&assembler),
|
| - if_jsreceiver(&assembler), if_noconstructor(&assembler, Label::kDeferred),
|
| - if_wrapjsvalue(&assembler);
|
| + Node* object = Parameter(TypeConversionDescriptor::kArgument);
|
| + Node* context = Parameter(TypeConversionDescriptor::kContext);
|
|
|
| - Node* object = assembler.Parameter(Descriptor::kArgument);
|
| - Node* context = assembler.Parameter(Descriptor::kContext);
|
| -
|
| - Variable constructor_function_index_var(&assembler,
|
| + Variable constructor_function_index_var(this,
|
| MachineType::PointerRepresentation());
|
|
|
| - assembler.Branch(assembler.TaggedIsSmi(object), &if_number, &if_notsmi);
|
| + Branch(TaggedIsSmi(object), &if_number, &if_notsmi);
|
|
|
| - assembler.Bind(&if_notsmi);
|
| - Node* map = assembler.LoadMap(object);
|
| + Bind(&if_notsmi);
|
| + Node* map = LoadMap(object);
|
|
|
| - assembler.GotoIf(assembler.IsHeapNumberMap(map), &if_number);
|
| + GotoIf(IsHeapNumberMap(map), &if_number);
|
|
|
| - Node* instance_type = assembler.LoadMapInstanceType(map);
|
| - assembler.GotoIf(assembler.IsJSReceiverInstanceType(instance_type),
|
| - &if_jsreceiver);
|
| + Node* instance_type = LoadMapInstanceType(map);
|
| + GotoIf(IsJSReceiverInstanceType(instance_type), &if_jsreceiver);
|
|
|
| - Node* constructor_function_index =
|
| - assembler.LoadMapConstructorFunctionIndex(map);
|
| - assembler.GotoIf(assembler.WordEqual(constructor_function_index,
|
| - assembler.IntPtrConstant(
|
| - Map::kNoConstructorFunctionIndex)),
|
| - &if_noconstructor);
|
| + Node* constructor_function_index = LoadMapConstructorFunctionIndex(map);
|
| + GotoIf(WordEqual(constructor_function_index,
|
| + IntPtrConstant(Map::kNoConstructorFunctionIndex)),
|
| + &if_noconstructor);
|
| constructor_function_index_var.Bind(constructor_function_index);
|
| - assembler.Goto(&if_wrapjsvalue);
|
| + Goto(&if_wrapjsvalue);
|
|
|
| - assembler.Bind(&if_number);
|
| + Bind(&if_number);
|
| constructor_function_index_var.Bind(
|
| - assembler.IntPtrConstant(Context::NUMBER_FUNCTION_INDEX));
|
| - assembler.Goto(&if_wrapjsvalue);
|
| + IntPtrConstant(Context::NUMBER_FUNCTION_INDEX));
|
| + Goto(&if_wrapjsvalue);
|
|
|
| - assembler.Bind(&if_wrapjsvalue);
|
| - Node* native_context = assembler.LoadNativeContext(context);
|
| - Node* constructor = assembler.LoadFixedArrayElement(
|
| + Bind(&if_wrapjsvalue);
|
| + Node* native_context = LoadNativeContext(context);
|
| + Node* constructor = LoadFixedArrayElement(
|
| native_context, constructor_function_index_var.value());
|
| - Node* initial_map = assembler.LoadObjectField(
|
| - constructor, JSFunction::kPrototypeOrInitialMapOffset);
|
| - Node* js_value = assembler.Allocate(JSValue::kSize);
|
| - assembler.StoreMapNoWriteBarrier(js_value, initial_map);
|
| - assembler.StoreObjectFieldRoot(js_value, JSValue::kPropertiesOffset,
|
| - Heap::kEmptyFixedArrayRootIndex);
|
| - assembler.StoreObjectFieldRoot(js_value, JSObject::kElementsOffset,
|
| - Heap::kEmptyFixedArrayRootIndex);
|
| - assembler.StoreObjectField(js_value, JSValue::kValueOffset, object);
|
| - assembler.Return(js_value);
|
| -
|
| - assembler.Bind(&if_noconstructor);
|
| - assembler.TailCallRuntime(
|
| + Node* initial_map =
|
| + LoadObjectField(constructor, JSFunction::kPrototypeOrInitialMapOffset);
|
| + Node* js_value = Allocate(JSValue::kSize);
|
| + StoreMapNoWriteBarrier(js_value, initial_map);
|
| + StoreObjectFieldRoot(js_value, JSValue::kPropertiesOffset,
|
| + Heap::kEmptyFixedArrayRootIndex);
|
| + StoreObjectFieldRoot(js_value, JSObject::kElementsOffset,
|
| + Heap::kEmptyFixedArrayRootIndex);
|
| + StoreObjectField(js_value, JSValue::kValueOffset, object);
|
| + Return(js_value);
|
| +
|
| + Bind(&if_noconstructor);
|
| + TailCallRuntime(
|
| Runtime::kThrowUndefinedOrNullToObject, context,
|
| - assembler.HeapConstant(
|
| - assembler.factory()->NewStringFromAsciiChecked("ToObject", TENURED)));
|
| + HeapConstant(factory()->NewStringFromAsciiChecked("ToObject", TENURED)));
|
|
|
| - assembler.Bind(&if_jsreceiver);
|
| - assembler.Return(object);
|
| + Bind(&if_jsreceiver);
|
| + Return(object);
|
| }
|
|
|
| // Deprecated ES5 [[Class]] internal property (used to implement %_ClassOf).
|
| -void Builtins::Generate_ClassOf(compiler::CodeAssemblerState* state) {
|
| - typedef compiler::Node Node;
|
| - typedef TypeofDescriptor Descriptor;
|
| - CodeStubAssembler assembler(state);
|
| -
|
| - Node* object = assembler.Parameter(Descriptor::kObject);
|
| +TF_BUILTIN(ClassOf, CodeStubAssembler) {
|
| + Node* object = Parameter(TypeofDescriptor::kObject);
|
|
|
| - assembler.Return(assembler.ClassOf(object));
|
| + Return(ClassOf(object));
|
| }
|
|
|
| // ES6 section 12.5.5 typeof operator
|
| -void Builtins::Generate_Typeof(compiler::CodeAssemblerState* state) {
|
| - typedef compiler::Node Node;
|
| - typedef TypeofDescriptor Descriptor;
|
| - CodeStubAssembler assembler(state);
|
| -
|
| - Node* object = assembler.Parameter(Descriptor::kObject);
|
| - Node* context = assembler.Parameter(Descriptor::kContext);
|
| +TF_BUILTIN(Typeof, CodeStubAssembler) {
|
| + Node* object = Parameter(TypeofDescriptor::kObject);
|
| + Node* context = Parameter(TypeofDescriptor::kContext);
|
|
|
| - assembler.Return(assembler.Typeof(object, context));
|
| + Return(Typeof(object, context));
|
| }
|
|
|
| } // namespace internal
|
|
|