Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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/code-stubs.h" | 5 #include "src/code-stubs.h" |
| 6 | 6 |
| 7 #include <sstream> | 7 #include <sstream> |
| 8 | 8 |
| 9 #include "src/bootstrapper.h" | 9 #include "src/bootstrapper.h" |
| 10 #include "src/code-factory.h" | 10 #include "src/code-factory.h" |
| (...skipping 4645 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4656 } | 4656 } |
| 4657 | 4657 |
| 4658 assembler->Bind(&return_arg); | 4658 assembler->Bind(&return_arg); |
| 4659 assembler->Return(var_arg.value()); | 4659 assembler->Return(var_arg.value()); |
| 4660 | 4660 |
| 4661 assembler->Bind(&return_zero); | 4661 assembler->Bind(&return_zero); |
| 4662 assembler->Return(assembler->SmiConstant(Smi::FromInt(0))); | 4662 assembler->Return(assembler->SmiConstant(Smi::FromInt(0))); |
| 4663 } | 4663 } |
| 4664 } | 4664 } |
| 4665 | 4665 |
| 4666 compiler::Node* ToNameStub::Generate(CodeStubAssembler* assembler, | |
| 4667 compiler::Node* value, | |
| 4668 compiler::Node* context) { | |
| 4669 typedef CodeStubAssembler::Label Label; | |
| 4670 typedef compiler::Node Node; | |
| 4671 typedef CodeStubAssembler::Variable Variable; | |
| 4672 | |
| 4673 Label end(assembler); | |
| 4674 Variable var_result(assembler, MachineRepresentation::kTagged); | |
| 4675 | |
| 4676 Label is_number(assembler, Label::kDeferred); | |
| 4677 assembler->GotoIf(assembler->WordIsSmi(value), &is_number); | |
| 4678 | |
| 4679 Label not_name(assembler, Label::kDeferred); | |
| 4680 Node* value_instance_type = assembler->LoadInstanceType(value); | |
| 4681 assembler->GotoIf( | |
| 4682 assembler->Int32GreaterThan(value_instance_type, | |
| 4683 assembler->Int32Constant(LAST_NAME_TYPE)), | |
| 4684 ¬_name); | |
| 4685 | |
| 4686 var_result.Bind(value); | |
| 4687 assembler->Goto(&end); | |
| 4688 | |
| 4689 assembler->Bind(&is_number); | |
| 4690 { | |
| 4691 Callable callable = CodeFactory::NumberToString(assembler->isolate()); | |
| 4692 var_result.Bind(assembler->CallStub(callable, context, value)); | |
|
Benedikt Meurer
2016/09/02 04:36:25
You can tail call to the stub here.
| |
| 4693 assembler->Goto(&end); | |
| 4694 } | |
| 4695 | |
| 4696 assembler->Bind(¬_name); | |
| 4697 { | |
| 4698 assembler->GotoIf( | |
| 4699 assembler->Word32Equal(value_instance_type, | |
| 4700 assembler->Int32Constant(HEAP_NUMBER_TYPE)), | |
| 4701 &is_number); | |
| 4702 | |
| 4703 Label not_oddball(assembler, Label::kDeferred); | |
| 4704 assembler->GotoIf( | |
| 4705 assembler->Word32NotEqual(value_instance_type, | |
| 4706 assembler->Int32Constant(ODDBALL_TYPE)), | |
| 4707 ¬_oddball); | |
| 4708 | |
| 4709 var_result.Bind( | |
| 4710 assembler->LoadObjectField(value, Oddball::kToStringOffset)); | |
| 4711 assembler->Goto(&end); | |
| 4712 | |
| 4713 assembler->Bind(¬_oddball); | |
| 4714 { | |
| 4715 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.
| |
| 4716 assembler->Goto(&end); | |
| 4717 } | |
| 4718 } | |
| 4719 | |
| 4720 assembler->Bind(&end); | |
| 4721 return var_result.value(); | |
| 4722 } | |
| 4723 | |
| 4666 void StoreInterceptorStub::GenerateAssembly( | 4724 void StoreInterceptorStub::GenerateAssembly( |
| 4667 CodeStubAssembler* assembler) const { | 4725 CodeStubAssembler* assembler) const { |
| 4668 typedef compiler::Node Node; | 4726 typedef compiler::Node Node; |
| 4669 | 4727 |
| 4670 Node* receiver = assembler->Parameter(Descriptor::kReceiver); | 4728 Node* receiver = assembler->Parameter(Descriptor::kReceiver); |
| 4671 Node* name = assembler->Parameter(Descriptor::kName); | 4729 Node* name = assembler->Parameter(Descriptor::kName); |
| 4672 Node* value = assembler->Parameter(Descriptor::kValue); | 4730 Node* value = assembler->Parameter(Descriptor::kValue); |
| 4673 Node* context = assembler->Parameter(Descriptor::kContext); | 4731 Node* context = assembler->Parameter(Descriptor::kContext); |
| 4674 assembler->TailCallRuntime(Runtime::kStorePropertyWithInterceptor, context, | 4732 assembler->TailCallRuntime(Runtime::kStorePropertyWithInterceptor, context, |
| 4675 receiver, name, value); | 4733 receiver, name, value); |
| (...skipping 405 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5081 | 5139 |
| 5082 Node* has_property = GenerateHasProperty(assembler, object, key, context, | 5140 Node* has_property = GenerateHasProperty(assembler, object, key, context, |
| 5083 Runtime::kForInHasProperty); | 5141 Runtime::kForInHasProperty); |
| 5084 | 5142 |
| 5085 assembler->Branch( | 5143 assembler->Branch( |
| 5086 assembler->WordEqual(has_property, assembler->BooleanConstant(true)), | 5144 assembler->WordEqual(has_property, assembler->BooleanConstant(true)), |
| 5087 &return_to_name, &return_undefined); | 5145 &return_to_name, &return_undefined); |
| 5088 | 5146 |
| 5089 assembler->Bind(&return_to_name); | 5147 assembler->Bind(&return_to_name); |
| 5090 { | 5148 { |
| 5091 // TODO(cbruni): inline ToName here. | 5149 var_result.Bind(ToNameStub::Generate(assembler, key, context)); |
| 5092 Callable callable = CodeFactory::ToName(assembler->isolate()); | |
| 5093 var_result.Bind(assembler->CallStub(callable, context, key)); | |
| 5094 assembler->Goto(&end); | 5150 assembler->Goto(&end); |
| 5095 } | 5151 } |
| 5096 | 5152 |
| 5097 assembler->Bind(&return_undefined); | 5153 assembler->Bind(&return_undefined); |
| 5098 { | 5154 { |
| 5099 var_result.Bind(assembler->UndefinedConstant()); | 5155 var_result.Bind(assembler->UndefinedConstant()); |
| 5100 assembler->Goto(&end); | 5156 assembler->Goto(&end); |
| 5101 } | 5157 } |
| 5102 | 5158 |
| 5103 assembler->Bind(&end); | 5159 assembler->Bind(&end); |
| (...skipping 745 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5849 if (type->Is(Type::UntaggedPointer())) { | 5905 if (type->Is(Type::UntaggedPointer())) { |
| 5850 return Representation::External(); | 5906 return Representation::External(); |
| 5851 } | 5907 } |
| 5852 | 5908 |
| 5853 DCHECK(!type->Is(Type::Untagged())); | 5909 DCHECK(!type->Is(Type::Untagged())); |
| 5854 return Representation::Tagged(); | 5910 return Representation::Tagged(); |
| 5855 } | 5911 } |
| 5856 | 5912 |
| 5857 } // namespace internal | 5913 } // namespace internal |
| 5858 } // namespace v8 | 5914 } // namespace v8 |
| OLD | NEW |