| OLD | NEW |
| 1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/builtins/builtins.h" | 5 #include "src/builtins/builtins.h" |
| 6 #include "src/builtins/builtins-utils.h" | 6 #include "src/builtins/builtins-utils.h" |
| 7 #include "src/code-factory.h" | 7 #include "src/code-factory.h" |
| 8 | 8 |
| 9 namespace v8 { | 9 namespace v8 { |
| 10 namespace internal { | 10 namespace internal { |
| (...skipping 10 matching lines...) Expand all Loading... |
| 21 UNREACHABLE(); | 21 UNREACHABLE(); |
| 22 return Handle<Code>::null(); | 22 return Handle<Code>::null(); |
| 23 } | 23 } |
| 24 | 24 |
| 25 namespace { | 25 namespace { |
| 26 // ES6 section 7.1.1 ToPrimitive ( input [ , PreferredType ] ) | 26 // ES6 section 7.1.1 ToPrimitive ( input [ , PreferredType ] ) |
| 27 void Generate_NonPrimitiveToPrimitive(CodeStubAssembler* assembler, | 27 void Generate_NonPrimitiveToPrimitive(CodeStubAssembler* assembler, |
| 28 ToPrimitiveHint hint) { | 28 ToPrimitiveHint hint) { |
| 29 typedef CodeStubAssembler::Label Label; | 29 typedef CodeStubAssembler::Label Label; |
| 30 typedef compiler::Node Node; | 30 typedef compiler::Node Node; |
| 31 typedef TypeConversionDescriptor Descriptor; |
| 31 | 32 |
| 32 Node* input = assembler->Parameter(0); | 33 Node* input = assembler->Parameter(Descriptor::kArgument); |
| 33 Node* context = assembler->Parameter(1); | 34 Node* context = assembler->Parameter(Descriptor::kContext); |
| 34 | 35 |
| 35 // Lookup the @@toPrimitive property on the {input}. | 36 // Lookup the @@toPrimitive property on the {input}. |
| 36 Callable callable = CodeFactory::GetProperty(assembler->isolate()); | 37 Callable callable = CodeFactory::GetProperty(assembler->isolate()); |
| 37 Node* to_primitive_symbol = | 38 Node* to_primitive_symbol = |
| 38 assembler->HeapConstant(assembler->factory()->to_primitive_symbol()); | 39 assembler->HeapConstant(assembler->factory()->to_primitive_symbol()); |
| 39 Node* exotic_to_prim = | 40 Node* exotic_to_prim = |
| 40 assembler->CallStub(callable, context, input, to_primitive_symbol); | 41 assembler->CallStub(callable, context, input, to_primitive_symbol); |
| 41 | 42 |
| 42 // Check if {exotic_to_prim} is neither null nor undefined. | 43 // Check if {exotic_to_prim} is neither null nor undefined. |
| 43 Label ordinary_to_primitive(assembler); | 44 Label ordinary_to_primitive(assembler); |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 106 void Builtins::Generate_NonPrimitiveToPrimitive_String( | 107 void Builtins::Generate_NonPrimitiveToPrimitive_String( |
| 107 CodeStubAssembler* assembler) { | 108 CodeStubAssembler* assembler) { |
| 108 Generate_NonPrimitiveToPrimitive(assembler, ToPrimitiveHint::kString); | 109 Generate_NonPrimitiveToPrimitive(assembler, ToPrimitiveHint::kString); |
| 109 } | 110 } |
| 110 | 111 |
| 111 // ES6 section 7.1.3 ToNumber ( argument ) | 112 // ES6 section 7.1.3 ToNumber ( argument ) |
| 112 void Builtins::Generate_NonNumberToNumber(CodeStubAssembler* assembler) { | 113 void Builtins::Generate_NonNumberToNumber(CodeStubAssembler* assembler) { |
| 113 typedef CodeStubAssembler::Label Label; | 114 typedef CodeStubAssembler::Label Label; |
| 114 typedef compiler::Node Node; | 115 typedef compiler::Node Node; |
| 115 typedef CodeStubAssembler::Variable Variable; | 116 typedef CodeStubAssembler::Variable Variable; |
| 117 typedef TypeConversionDescriptor Descriptor; |
| 116 | 118 |
| 117 Node* input = assembler->Parameter(0); | 119 Node* input = assembler->Parameter(Descriptor::kArgument); |
| 118 Node* context = assembler->Parameter(1); | 120 Node* context = assembler->Parameter(Descriptor::kContext); |
| 119 | 121 |
| 120 // We might need to loop once here due to ToPrimitive conversions. | 122 // We might need to loop once here due to ToPrimitive conversions. |
| 121 Variable var_input(assembler, MachineRepresentation::kTagged); | 123 Variable var_input(assembler, MachineRepresentation::kTagged); |
| 122 Label loop(assembler, &var_input); | 124 Label loop(assembler, &var_input); |
| 123 var_input.Bind(input); | 125 var_input.Bind(input); |
| 124 assembler->Goto(&loop); | 126 assembler->Goto(&loop); |
| 125 assembler->Bind(&loop); | 127 assembler->Bind(&loop); |
| 126 { | 128 { |
| 127 // Load the current {input} value (known to be a HeapObject). | 129 // Load the current {input} value (known to be a HeapObject). |
| 128 Node* input = var_input.value(); | 130 Node* input = var_input.value(); |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 217 return Handle<Code>::null(); | 219 return Handle<Code>::null(); |
| 218 } | 220 } |
| 219 | 221 |
| 220 namespace { | 222 namespace { |
| 221 // 7.1.1.1 OrdinaryToPrimitive ( O, hint ) | 223 // 7.1.1.1 OrdinaryToPrimitive ( O, hint ) |
| 222 void Generate_OrdinaryToPrimitive(CodeStubAssembler* assembler, | 224 void Generate_OrdinaryToPrimitive(CodeStubAssembler* assembler, |
| 223 OrdinaryToPrimitiveHint hint) { | 225 OrdinaryToPrimitiveHint hint) { |
| 224 typedef CodeStubAssembler::Label Label; | 226 typedef CodeStubAssembler::Label Label; |
| 225 typedef compiler::Node Node; | 227 typedef compiler::Node Node; |
| 226 typedef CodeStubAssembler::Variable Variable; | 228 typedef CodeStubAssembler::Variable Variable; |
| 229 typedef TypeConversionDescriptor Descriptor; |
| 227 | 230 |
| 228 Node* input = assembler->Parameter(0); | 231 Node* input = assembler->Parameter(Descriptor::kArgument); |
| 229 Node* context = assembler->Parameter(1); | 232 Node* context = assembler->Parameter(Descriptor::kContext); |
| 230 | 233 |
| 231 Variable var_result(assembler, MachineRepresentation::kTagged); | 234 Variable var_result(assembler, MachineRepresentation::kTagged); |
| 232 Label return_result(assembler, &var_result); | 235 Label return_result(assembler, &var_result); |
| 233 | 236 |
| 234 Handle<String> method_names[2]; | 237 Handle<String> method_names[2]; |
| 235 switch (hint) { | 238 switch (hint) { |
| 236 case OrdinaryToPrimitiveHint::kNumber: | 239 case OrdinaryToPrimitiveHint::kNumber: |
| 237 method_names[0] = assembler->factory()->valueOf_string(); | 240 method_names[0] = assembler->factory()->valueOf_string(); |
| 238 method_names[1] = assembler->factory()->toString_string(); | 241 method_names[1] = assembler->factory()->toString_string(); |
| 239 break; | 242 break; |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 297 | 300 |
| 298 void Builtins::Generate_OrdinaryToPrimitive_String( | 301 void Builtins::Generate_OrdinaryToPrimitive_String( |
| 299 CodeStubAssembler* assembler) { | 302 CodeStubAssembler* assembler) { |
| 300 Generate_OrdinaryToPrimitive(assembler, OrdinaryToPrimitiveHint::kString); | 303 Generate_OrdinaryToPrimitive(assembler, OrdinaryToPrimitiveHint::kString); |
| 301 } | 304 } |
| 302 | 305 |
| 303 // ES6 section 7.1.2 ToBoolean ( argument ) | 306 // ES6 section 7.1.2 ToBoolean ( argument ) |
| 304 void Builtins::Generate_ToBoolean(CodeStubAssembler* assembler) { | 307 void Builtins::Generate_ToBoolean(CodeStubAssembler* assembler) { |
| 305 typedef compiler::Node Node; | 308 typedef compiler::Node Node; |
| 306 typedef CodeStubAssembler::Label Label; | 309 typedef CodeStubAssembler::Label Label; |
| 310 typedef TypeConversionDescriptor Descriptor; |
| 307 | 311 |
| 308 Node* value = assembler->Parameter(0); | 312 Node* value = assembler->Parameter(Descriptor::kArgument); |
| 309 | 313 |
| 310 Label return_true(assembler), return_false(assembler); | 314 Label return_true(assembler), return_false(assembler); |
| 311 assembler->BranchIfToBooleanIsTrue(value, &return_true, &return_false); | 315 assembler->BranchIfToBooleanIsTrue(value, &return_true, &return_false); |
| 312 | 316 |
| 313 assembler->Bind(&return_true); | 317 assembler->Bind(&return_true); |
| 314 assembler->Return(assembler->BooleanConstant(true)); | 318 assembler->Return(assembler->BooleanConstant(true)); |
| 315 | 319 |
| 316 assembler->Bind(&return_false); | 320 assembler->Bind(&return_false); |
| 317 assembler->Return(assembler->BooleanConstant(false)); | 321 assembler->Return(assembler->BooleanConstant(false)); |
| 318 } | 322 } |
| 319 | 323 |
| 320 } // namespace internal | 324 } // namespace internal |
| 321 } // namespace v8 | 325 } // namespace v8 |
| OLD | NEW |