Chromium Code Reviews| 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 |