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 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
144 void Builtins::Generate_ToNumber(CodeStubAssembler* assembler) { | 144 void Builtins::Generate_ToNumber(CodeStubAssembler* assembler) { |
145 typedef compiler::Node Node; | 145 typedef compiler::Node Node; |
146 typedef TypeConversionDescriptor Descriptor; | 146 typedef TypeConversionDescriptor Descriptor; |
147 | 147 |
148 Node* input = assembler->Parameter(Descriptor::kArgument); | 148 Node* input = assembler->Parameter(Descriptor::kArgument); |
149 Node* context = assembler->Parameter(Descriptor::kContext); | 149 Node* context = assembler->Parameter(Descriptor::kContext); |
150 | 150 |
151 assembler->Return(assembler->ToNumber(context, input)); | 151 assembler->Return(assembler->ToNumber(context, input)); |
152 } | 152 } |
153 | 153 |
154 void Builtins::Generate_ToString(CodeStubAssembler* assembler) { | |
155 typedef CodeStubAssembler::Label Label; | |
156 typedef compiler::Node Node; | |
157 typedef TypeConversionDescriptor Descriptor; | |
158 | |
159 Node* input = assembler->Parameter(Descriptor::kArgument); | |
160 Node* context = assembler->Parameter(Descriptor::kContext); | |
161 | |
162 Label is_number(assembler); | |
163 Label runtime(assembler); | |
164 | |
165 assembler->GotoIf(assembler->WordIsSmi(input), &runtime); | |
Benedikt Meurer
2016/09/29 11:18:18
Smis should go to NumberToString stub, i.e. jump t
| |
166 | |
167 Node* input_map = assembler->LoadMap(input); | |
168 Node* input_instance_type = assembler->LoadMapInstanceType(input_map); | |
169 | |
170 Label not_string(assembler); | |
171 assembler->GotoIf( | |
172 assembler->Int32GreaterThanOrEqual( | |
173 input_instance_type, assembler->Int32Constant(FIRST_NONSTRING_TYPE)), | |
174 ¬_string); | |
175 assembler->Return(input); | |
176 | |
177 Label not_heap_number(assembler); | |
178 | |
179 assembler->Bind(¬_string); | |
180 { | |
181 assembler->GotoUnless( | |
182 assembler->IntPtrEqual(input_map, assembler->HeapNumberMapConstant()), | |
Benedikt Meurer
2016/09/29 11:18:18
s/IntPtrEqual/WordEqual/
| |
183 ¬_heap_number); | |
184 assembler->Goto(&is_number); | |
185 } | |
186 | |
187 assembler->Bind(&is_number); | |
188 { | |
189 Callable callable = CodeFactory::NumberToString(assembler->isolate()); | |
Benedikt Meurer
2016/09/29 11:18:18
Add TODO here to inline NumberToString once that's
| |
190 assembler->Return(assembler->CallStub(callable, context, input)); | |
191 } | |
192 | |
193 assembler->Bind(¬_heap_number); | |
194 { | |
195 assembler->GotoIf( | |
196 assembler->Word32NotEqual(input_instance_type, | |
197 assembler->Int32Constant(ODDBALL_TYPE)), | |
198 &runtime); | |
199 assembler->Return( | |
200 assembler->LoadObjectField(input, Oddball::kToStringOffset)); | |
201 } | |
202 | |
203 assembler->Bind(&runtime); | |
204 { | |
205 assembler->Return( | |
206 assembler->CallRuntime(Runtime::kToString, context, input)); | |
207 } | |
208 } | |
209 | |
154 Handle<Code> Builtins::OrdinaryToPrimitive(OrdinaryToPrimitiveHint hint) { | 210 Handle<Code> Builtins::OrdinaryToPrimitive(OrdinaryToPrimitiveHint hint) { |
155 switch (hint) { | 211 switch (hint) { |
156 case OrdinaryToPrimitiveHint::kNumber: | 212 case OrdinaryToPrimitiveHint::kNumber: |
157 return OrdinaryToPrimitive_Number(); | 213 return OrdinaryToPrimitive_Number(); |
158 case OrdinaryToPrimitiveHint::kString: | 214 case OrdinaryToPrimitiveHint::kString: |
159 return OrdinaryToPrimitive_String(); | 215 return OrdinaryToPrimitive_String(); |
160 } | 216 } |
161 UNREACHABLE(); | 217 UNREACHABLE(); |
162 return Handle<Code>::null(); | 218 return Handle<Code>::null(); |
163 } | 219 } |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
259 | 315 |
260 assembler->Bind(&return_true); | 316 assembler->Bind(&return_true); |
261 assembler->Return(assembler->BooleanConstant(true)); | 317 assembler->Return(assembler->BooleanConstant(true)); |
262 | 318 |
263 assembler->Bind(&return_false); | 319 assembler->Bind(&return_false); |
264 assembler->Return(assembler->BooleanConstant(false)); | 320 assembler->Return(assembler->BooleanConstant(false)); |
265 } | 321 } |
266 | 322 |
267 } // namespace internal | 323 } // namespace internal |
268 } // namespace v8 | 324 } // namespace v8 |
OLD | NEW |