Index: src/code-stubs.cc |
diff --git a/src/code-stubs.cc b/src/code-stubs.cc |
index 2b71716dc3f037bb8eea080b80ba2f5671e7ab13..173b9a393d30947bc919f926b9c9cc5505fe9a31 100644 |
--- a/src/code-stubs.cc |
+++ b/src/code-stubs.cc |
@@ -4663,6 +4663,64 @@ void ToIntegerStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
} |
} |
+compiler::Node* ToNameStub::Generate(CodeStubAssembler* assembler, |
+ compiler::Node* value, |
+ compiler::Node* context) { |
+ typedef CodeStubAssembler::Label Label; |
+ typedef compiler::Node Node; |
+ typedef CodeStubAssembler::Variable Variable; |
+ |
+ Label end(assembler); |
+ Variable var_result(assembler, MachineRepresentation::kTagged); |
+ |
+ Label is_number(assembler, Label::kDeferred); |
+ assembler->GotoIf(assembler->WordIsSmi(value), &is_number); |
+ |
+ Label not_name(assembler, Label::kDeferred); |
+ Node* value_instance_type = assembler->LoadInstanceType(value); |
+ assembler->GotoIf( |
+ assembler->Int32GreaterThan(value_instance_type, |
+ assembler->Int32Constant(LAST_NAME_TYPE)), |
+ ¬_name); |
+ |
+ var_result.Bind(value); |
+ assembler->Goto(&end); |
+ |
+ assembler->Bind(&is_number); |
+ { |
+ Callable callable = CodeFactory::NumberToString(assembler->isolate()); |
+ var_result.Bind(assembler->CallStub(callable, context, value)); |
Benedikt Meurer
2016/09/02 04:36:25
You can tail call to the stub here.
|
+ assembler->Goto(&end); |
+ } |
+ |
+ assembler->Bind(¬_name); |
+ { |
+ assembler->GotoIf( |
+ assembler->Word32Equal(value_instance_type, |
+ assembler->Int32Constant(HEAP_NUMBER_TYPE)), |
+ &is_number); |
+ |
+ Label not_oddball(assembler, Label::kDeferred); |
+ assembler->GotoIf( |
+ assembler->Word32NotEqual(value_instance_type, |
+ assembler->Int32Constant(ODDBALL_TYPE)), |
+ ¬_oddball); |
+ |
+ var_result.Bind( |
+ assembler->LoadObjectField(value, Oddball::kToStringOffset)); |
+ assembler->Goto(&end); |
+ |
+ assembler->Bind(¬_oddball); |
+ { |
+ var_result.Bind(assembler->CallRuntime(Runtime::kToName, context, value)); |
Benedikt Meurer
2016/09/02 04:36:25
Likewise you can tail call to the runtime here.
|
+ assembler->Goto(&end); |
+ } |
+ } |
+ |
+ assembler->Bind(&end); |
+ return var_result.value(); |
+} |
+ |
void StoreInterceptorStub::GenerateAssembly( |
CodeStubAssembler* assembler) const { |
typedef compiler::Node Node; |
@@ -5088,9 +5146,7 @@ compiler::Node* ForInFilterStub::Generate(CodeStubAssembler* assembler, |
assembler->Bind(&return_to_name); |
{ |
- // TODO(cbruni): inline ToName here. |
- Callable callable = CodeFactory::ToName(assembler->isolate()); |
- var_result.Bind(assembler->CallStub(callable, context, key)); |
+ var_result.Bind(ToNameStub::Generate(assembler, key, context)); |
assembler->Goto(&end); |
} |