OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 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/objects.h" | 5 #include "src/objects.h" |
6 | 6 |
7 #include <cmath> | 7 #include <cmath> |
8 #include <iomanip> | 8 #include <iomanip> |
9 #include <sstream> | 9 #include <sstream> |
10 | 10 |
(...skipping 970 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
981 if (IsHeapNumber()) { | 981 if (IsHeapNumber()) { |
982 double num = HeapNumber::cast(this)->value(); | 982 double num = HeapNumber::cast(this)->value(); |
983 if (FastI2D(FastD2I(num)) == num) { | 983 if (FastI2D(FastD2I(num)) == num) { |
984 *value = FastD2I(num); | 984 *value = FastD2I(num); |
985 return true; | 985 return true; |
986 } | 986 } |
987 } | 987 } |
988 return false; | 988 return false; |
989 } | 989 } |
990 | 990 |
991 | 991 bool FunctionTemplateInfo::IsTemplateFor(JSObject* object) { |
992 bool FunctionTemplateInfo::IsTemplateFor(Object* object) { | 992 return IsTemplateFor(object->map()); |
993 if (!object->IsHeapObject()) return false; | |
994 return IsTemplateFor(HeapObject::cast(object)->map()); | |
995 } | 993 } |
996 | 994 |
997 | 995 |
998 bool FunctionTemplateInfo::IsTemplateFor(Map* map) { | 996 bool FunctionTemplateInfo::IsTemplateFor(Map* map) { |
999 // There is a constraint on the object; check. | 997 // There is a constraint on the object; check. |
1000 if (!map->IsJSObjectMap()) return false; | 998 if (!map->IsJSObjectMap()) return false; |
1001 // Fetch the constructor function of the object. | 999 // Fetch the constructor function of the object. |
1002 Object* cons_obj = map->GetConstructor(); | 1000 Object* cons_obj = map->GetConstructor(); |
1003 if (!cons_obj->IsJSFunction()) return false; | 1001 if (!cons_obj->IsJSFunction()) return false; |
1004 JSFunction* fun = JSFunction::cast(cons_obj); | 1002 JSFunction* fun = JSFunction::cast(cons_obj); |
1005 // Iterate through the chain of inheriting function templates to | 1003 // Iterate through the chain of inheriting function templates to |
1006 // see if the required one occurs. | 1004 // see if the required one occurs. |
1007 for (Object* type = fun->shared()->function_data(); | 1005 for (Object* type = fun->shared()->function_data(); |
1008 type->IsFunctionTemplateInfo(); | 1006 type->IsFunctionTemplateInfo(); |
1009 type = FunctionTemplateInfo::cast(type)->parent_template()) { | 1007 type = FunctionTemplateInfo::cast(type)->parent_template()) { |
1010 if (type == this) return true; | 1008 if (type == this) return true; |
1011 } | 1009 } |
1012 // Didn't find the required type in the inheritance chain. | 1010 // Didn't find the required type in the inheritance chain. |
1013 return false; | 1011 return false; |
1014 } | 1012 } |
1015 | 1013 |
1016 | 1014 |
1017 // TODO(dcarney): CallOptimization duplicates this logic, merge. | |
1018 Object* FunctionTemplateInfo::GetCompatibleReceiver(Isolate* isolate, | |
1019 Object* receiver) { | |
1020 // API calls are only supported with JSObject receivers. | |
1021 if (!receiver->IsJSObject()) return isolate->heap()->null_value(); | |
1022 Object* recv_type = this->signature(); | |
1023 // No signature, return holder. | |
1024 if (recv_type->IsUndefined(isolate)) return receiver; | |
1025 FunctionTemplateInfo* signature = FunctionTemplateInfo::cast(recv_type); | |
1026 // Check the receiver. | |
1027 for (PrototypeIterator iter(isolate, JSObject::cast(receiver), | |
1028 kStartAtReceiver, | |
1029 PrototypeIterator::END_AT_NON_HIDDEN); | |
1030 !iter.IsAtEnd(); iter.Advance()) { | |
1031 if (signature->IsTemplateFor(iter.GetCurrent())) return iter.GetCurrent(); | |
1032 } | |
1033 return isolate->heap()->null_value(); | |
1034 } | |
1035 | |
1036 | |
1037 // static | 1015 // static |
1038 MaybeHandle<JSObject> JSObject::New(Handle<JSFunction> constructor, | 1016 MaybeHandle<JSObject> JSObject::New(Handle<JSFunction> constructor, |
1039 Handle<JSReceiver> new_target, | 1017 Handle<JSReceiver> new_target, |
1040 Handle<AllocationSite> site) { | 1018 Handle<AllocationSite> site) { |
1041 // If called through new, new.target can be: | 1019 // If called through new, new.target can be: |
1042 // - a subclass of constructor, | 1020 // - a subclass of constructor, |
1043 // - a proxy wrapper around constructor, or | 1021 // - a proxy wrapper around constructor, or |
1044 // - the constructor itself. | 1022 // - the constructor itself. |
1045 // If called through Reflect.construct, it's guaranteed to be a constructor. | 1023 // If called through Reflect.construct, it's guaranteed to be a constructor. |
1046 Isolate* const isolate = constructor->GetIsolate(); | 1024 Isolate* const isolate = constructor->GetIsolate(); |
(...skipping 17811 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
18858 if (cell->value() != *new_value) { | 18836 if (cell->value() != *new_value) { |
18859 cell->set_value(*new_value); | 18837 cell->set_value(*new_value); |
18860 Isolate* isolate = cell->GetIsolate(); | 18838 Isolate* isolate = cell->GetIsolate(); |
18861 cell->dependent_code()->DeoptimizeDependentCodeGroup( | 18839 cell->dependent_code()->DeoptimizeDependentCodeGroup( |
18862 isolate, DependentCode::kPropertyCellChangedGroup); | 18840 isolate, DependentCode::kPropertyCellChangedGroup); |
18863 } | 18841 } |
18864 } | 18842 } |
18865 | 18843 |
18866 } // namespace internal | 18844 } // namespace internal |
18867 } // namespace v8 | 18845 } // namespace v8 |
OLD | NEW |