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 3880 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3891 descriptor->Initialize( | 3891 descriptor->Initialize( |
3892 Runtime::FunctionForId(Runtime::kGrowArrayElements)->entry); | 3892 Runtime::FunctionForId(Runtime::kGrowArrayElements)->entry); |
3893 } | 3893 } |
3894 | 3894 |
3895 | 3895 |
3896 void TypeofStub::GenerateAheadOfTime(Isolate* isolate) { | 3896 void TypeofStub::GenerateAheadOfTime(Isolate* isolate) { |
3897 TypeofStub stub(isolate); | 3897 TypeofStub stub(isolate); |
3898 stub.GetCode(); | 3898 stub.GetCode(); |
3899 } | 3899 } |
3900 | 3900 |
3901 void HasPropertyStub::GenerateAssembly(CodeStubAssembler* assembler) const { | |
3902 typedef compiler::Node Node; | |
3903 typedef CodeStubAssembler::Label Label; | |
3904 typedef CodeStubAssembler::Variable Variable; | |
3905 | |
3906 Node* key = assembler->Parameter(0); | |
3907 Node* object = assembler->Parameter(1); | |
3908 Node* context = assembler->Parameter(2); | |
3909 | |
3910 Label call_runtime(assembler), return_true(assembler), | |
3911 return_false(assembler); | |
3912 | |
3913 // Ensure object is JSReceiver, otherwise call runtime to throw error. | |
3914 Label if_objectisnotsmi(assembler); | |
3915 assembler->Branch(assembler->WordIsSmi(object), &call_runtime, | |
3916 &if_objectisnotsmi); | |
3917 assembler->Bind(&if_objectisnotsmi); | |
3918 | |
3919 Node* map = assembler->LoadMap(object); | |
3920 Node* instance_type = assembler->LoadMapInstanceType(map); | |
3921 { | |
3922 Label if_objectisreceiver(assembler); | |
3923 STATIC_ASSERT(LAST_JS_RECEIVER_TYPE == LAST_TYPE); | |
3924 assembler->Branch( | |
3925 assembler->Int32GreaterThanOrEqual( | |
3926 instance_type, assembler->Int32Constant(FIRST_JS_RECEIVER_TYPE)), | |
3927 &if_objectisreceiver, &call_runtime); | |
3928 assembler->Bind(&if_objectisreceiver); | |
Toon Verwaest
2016/04/20 10:00:04
I don't think you need this here. TryToName etc al
Igor Sheludko
2016/04/20 13:14:56
I guess you meant TryLookupProperty and TryLookupE
| |
3929 } | |
3930 | |
3931 Variable var_index(assembler, MachineRepresentation::kWord32); | |
3932 | |
3933 Label keyisindex(assembler), if_iskeyunique(assembler); | |
3934 assembler->TryToName(key, &keyisindex, &var_index, &if_iskeyunique, | |
3935 &call_runtime); | |
3936 | |
3937 assembler->Bind(&if_iskeyunique); | |
3938 { | |
3939 Variable var_object(assembler, MachineRepresentation::kTagged); | |
3940 Variable var_map(assembler, MachineRepresentation::kTagged); | |
3941 Variable var_instance_type(assembler, MachineRepresentation::kWord8); | |
3942 | |
3943 Variable* merged_variables[] = {&var_object, &var_map, &var_instance_type}; | |
3944 Label loop(assembler, arraysize(merged_variables), merged_variables); | |
3945 var_object.Bind(object); | |
3946 var_map.Bind(map); | |
3947 var_instance_type.Bind(instance_type); | |
3948 assembler->Goto(&loop); | |
3949 assembler->Bind(&loop); | |
3950 { | |
3951 Label next_proto(assembler); | |
3952 assembler->TryLookupProperty(var_object.value(), var_map.value(), | |
3953 var_instance_type.value(), key, &return_true, | |
3954 &next_proto, &call_runtime); | |
3955 assembler->Bind(&next_proto); | |
3956 | |
3957 Node* proto = assembler->LoadMapPrototype(var_map.value()); | |
3958 | |
3959 Label if_not_null(assembler); | |
3960 assembler->Branch(assembler->WordEqual(proto, assembler->NullConstant()), | |
3961 &return_false, &if_not_null); | |
3962 assembler->Bind(&if_not_null); | |
3963 | |
3964 Node* map = assembler->LoadMap(proto); | |
3965 Node* instance_type = assembler->LoadMapInstanceType(map); | |
3966 | |
3967 var_object.Bind(proto); | |
3968 var_map.Bind(map); | |
3969 var_instance_type.Bind(instance_type); | |
3970 assembler->Goto(&loop); | |
3971 } | |
3972 } | |
3973 assembler->Bind(&keyisindex); | |
3974 { | |
3975 Variable var_object(assembler, MachineRepresentation::kTagged); | |
3976 Variable var_map(assembler, MachineRepresentation::kTagged); | |
3977 Variable var_instance_type(assembler, MachineRepresentation::kWord8); | |
3978 | |
3979 Variable* merged_variables[] = {&var_object, &var_map, &var_instance_type}; | |
3980 Label loop(assembler, arraysize(merged_variables), merged_variables); | |
3981 var_object.Bind(object); | |
3982 var_map.Bind(map); | |
3983 var_instance_type.Bind(instance_type); | |
3984 assembler->Goto(&loop); | |
3985 assembler->Bind(&loop); | |
3986 { | |
3987 Label next_proto(assembler); | |
3988 assembler->TryLookupElement(var_object.value(), var_map.value(), | |
3989 var_instance_type.value(), var_index.value(), | |
3990 &return_true, &next_proto, &call_runtime); | |
3991 assembler->Bind(&next_proto); | |
3992 | |
3993 Node* proto = assembler->LoadMapPrototype(var_map.value()); | |
3994 | |
3995 Label if_not_null(assembler); | |
3996 assembler->Branch(assembler->WordEqual(proto, assembler->NullConstant()), | |
3997 &return_false, &if_not_null); | |
3998 assembler->Bind(&if_not_null); | |
3999 | |
4000 Node* map = assembler->LoadMap(proto); | |
4001 Node* instance_type = assembler->LoadMapInstanceType(map); | |
4002 | |
4003 var_object.Bind(proto); | |
4004 var_map.Bind(map); | |
4005 var_instance_type.Bind(instance_type); | |
4006 assembler->Goto(&loop); | |
4007 } | |
4008 } | |
4009 assembler->Bind(&return_true); | |
4010 assembler->Return(assembler->BooleanConstant(true)); | |
4011 | |
4012 assembler->Bind(&return_false); | |
4013 assembler->Return(assembler->BooleanConstant(false)); | |
4014 | |
4015 assembler->Bind(&call_runtime); | |
4016 assembler->TailCallRuntime(Runtime::kHasProperty, context, key, object); | |
4017 } | |
3901 | 4018 |
3902 void CreateAllocationSiteStub::GenerateAheadOfTime(Isolate* isolate) { | 4019 void CreateAllocationSiteStub::GenerateAheadOfTime(Isolate* isolate) { |
3903 CreateAllocationSiteStub stub(isolate); | 4020 CreateAllocationSiteStub stub(isolate); |
3904 stub.GetCode(); | 4021 stub.GetCode(); |
3905 } | 4022 } |
3906 | 4023 |
3907 | 4024 |
3908 void CreateWeakCellStub::GenerateAheadOfTime(Isolate* isolate) { | 4025 void CreateWeakCellStub::GenerateAheadOfTime(Isolate* isolate) { |
3909 CreateWeakCellStub stub(isolate); | 4026 CreateWeakCellStub stub(isolate); |
3910 stub.GetCode(); | 4027 stub.GetCode(); |
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
4096 if (type->Is(Type::UntaggedPointer())) { | 4213 if (type->Is(Type::UntaggedPointer())) { |
4097 return Representation::External(); | 4214 return Representation::External(); |
4098 } | 4215 } |
4099 | 4216 |
4100 DCHECK(!type->Is(Type::Untagged())); | 4217 DCHECK(!type->Is(Type::Untagged())); |
4101 return Representation::Tagged(); | 4218 return Representation::Tagged(); |
4102 } | 4219 } |
4103 | 4220 |
4104 } // namespace internal | 4221 } // namespace internal |
4105 } // namespace v8 | 4222 } // namespace v8 |
OLD | NEW |