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-utils.h" | 5 #include "src/builtins/builtins-utils.h" |
6 #include "src/builtins/builtins.h" | 6 #include "src/builtins/builtins.h" |
7 #include "src/code-factory.h" | 7 #include "src/code-factory.h" |
8 #include "src/code-stub-assembler.h" | 8 #include "src/code-stub-assembler.h" |
9 #include "src/objects-inl.h" | 9 #include "src/objects-inl.h" |
10 | 10 |
(...skipping 24 matching lines...) Expand all Loading... |
35 return Handle<Code>::null(); | 35 return Handle<Code>::null(); |
36 } | 36 } |
37 | 37 |
38 // ES6 section 7.1.1 ToPrimitive ( input [ , PreferredType ] ) | 38 // ES6 section 7.1.1 ToPrimitive ( input [ , PreferredType ] ) |
39 void ConversionBuiltinsAssembler::Generate_NonPrimitiveToPrimitive( | 39 void ConversionBuiltinsAssembler::Generate_NonPrimitiveToPrimitive( |
40 ToPrimitiveHint hint) { | 40 ToPrimitiveHint hint) { |
41 Node* input = Parameter(TypeConversionDescriptor::kArgument); | 41 Node* input = Parameter(TypeConversionDescriptor::kArgument); |
42 Node* context = Parameter(TypeConversionDescriptor::kContext); | 42 Node* context = Parameter(TypeConversionDescriptor::kContext); |
43 | 43 |
44 // Lookup the @@toPrimitive property on the {input}. | 44 // Lookup the @@toPrimitive property on the {input}. |
45 Callable callable = CodeFactory::GetProperty(isolate()); | |
46 Node* to_primitive_symbol = HeapConstant(factory()->to_primitive_symbol()); | |
47 Node* exotic_to_prim = | 45 Node* exotic_to_prim = |
48 CallStub(callable, context, input, to_primitive_symbol); | 46 GetProperty(context, input, factory()->to_primitive_symbol()); |
49 | 47 |
50 // Check if {exotic_to_prim} is neither null nor undefined. | 48 // Check if {exotic_to_prim} is neither null nor undefined. |
51 Label ordinary_to_primitive(this); | 49 Label ordinary_to_primitive(this); |
52 GotoIf(WordEqual(exotic_to_prim, NullConstant()), &ordinary_to_primitive); | 50 GotoIf(WordEqual(exotic_to_prim, NullConstant()), &ordinary_to_primitive); |
53 GotoIf(WordEqual(exotic_to_prim, UndefinedConstant()), | 51 GotoIf(WordEqual(exotic_to_prim, UndefinedConstant()), |
54 &ordinary_to_primitive); | 52 &ordinary_to_primitive); |
55 { | 53 { |
56 // Invoke the {exotic_to_prim} method on the {input} with a string | 54 // Invoke the {exotic_to_prim} method on the {input} with a string |
57 // representation of the {hint}. | 55 // representation of the {hint}. |
58 Callable callable = | 56 Callable callable = |
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
197 method_names[0] = factory()->valueOf_string(); | 195 method_names[0] = factory()->valueOf_string(); |
198 method_names[1] = factory()->toString_string(); | 196 method_names[1] = factory()->toString_string(); |
199 break; | 197 break; |
200 case OrdinaryToPrimitiveHint::kString: | 198 case OrdinaryToPrimitiveHint::kString: |
201 method_names[0] = factory()->toString_string(); | 199 method_names[0] = factory()->toString_string(); |
202 method_names[1] = factory()->valueOf_string(); | 200 method_names[1] = factory()->valueOf_string(); |
203 break; | 201 break; |
204 } | 202 } |
205 for (Handle<String> name : method_names) { | 203 for (Handle<String> name : method_names) { |
206 // Lookup the {name} on the {input}. | 204 // Lookup the {name} on the {input}. |
207 Callable callable = CodeFactory::GetProperty(isolate()); | 205 Node* method = GetProperty(context, input, name); |
208 Node* name_string = HeapConstant(name); | |
209 Node* method = CallStub(callable, context, input, name_string); | |
210 | 206 |
211 // Check if the {method} is callable. | 207 // Check if the {method} is callable. |
212 Label if_methodiscallable(this), | 208 Label if_methodiscallable(this), |
213 if_methodisnotcallable(this, Label::kDeferred); | 209 if_methodisnotcallable(this, Label::kDeferred); |
214 GotoIf(TaggedIsSmi(method), &if_methodisnotcallable); | 210 GotoIf(TaggedIsSmi(method), &if_methodisnotcallable); |
215 Node* method_map = LoadMap(method); | 211 Node* method_map = LoadMap(method); |
216 Branch(IsCallableMap(method_map), &if_methodiscallable, | 212 Branch(IsCallableMap(method_map), &if_methodiscallable, |
217 &if_methodisnotcallable); | 213 &if_methodisnotcallable); |
218 | 214 |
219 Bind(&if_methodiscallable); | 215 Bind(&if_methodiscallable); |
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
406 | 402 |
407 // ES6 section 12.5.5 typeof operator | 403 // ES6 section 12.5.5 typeof operator |
408 TF_BUILTIN(Typeof, CodeStubAssembler) { | 404 TF_BUILTIN(Typeof, CodeStubAssembler) { |
409 Node* object = Parameter(TypeofDescriptor::kObject); | 405 Node* object = Parameter(TypeofDescriptor::kObject); |
410 | 406 |
411 Return(Typeof(object)); | 407 Return(Typeof(object)); |
412 } | 408 } |
413 | 409 |
414 } // namespace internal | 410 } // namespace internal |
415 } // namespace v8 | 411 } // namespace v8 |
OLD | NEW |