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 |