Line data Source code
1 : // Copyright 2018 the V8 project authors. All rights reserved.
2 : // Use of this source code is governed by a BSD-style license that can be
3 : // found in the LICENSE file.
4 :
5 : #ifndef V8_OBJECTS_TEMPLATES_INL_H_
6 : #define V8_OBJECTS_TEMPLATES_INL_H_
7 :
8 : #include "src/objects/templates.h"
9 :
10 : #include "src/heap/heap-inl.h"
11 : #include "src/objects/shared-function-info-inl.h"
12 :
13 : // Has to be the last include (doesn't have include guards):
14 : #include "src/objects/object-macros.h"
15 :
16 : namespace v8 {
17 : namespace internal {
18 :
19 : OBJECT_CONSTRUCTORS_IMPL(TemplateInfo, Struct)
20 24647248 : OBJECT_CONSTRUCTORS_IMPL(FunctionTemplateInfo, TemplateInfo)
21 4344608 : OBJECT_CONSTRUCTORS_IMPL(ObjectTemplateInfo, TemplateInfo)
22 13746428 : OBJECT_CONSTRUCTORS_IMPL(FunctionTemplateRareData, Struct)
23 :
24 : NEVER_READ_ONLY_SPACE_IMPL(TemplateInfo)
25 :
26 23045304 : ACCESSORS(TemplateInfo, tag, Object, kTagOffset)
27 40032350 : ACCESSORS(TemplateInfo, serial_number, Object, kSerialNumberOffset)
28 16778790 : SMI_ACCESSORS(TemplateInfo, number_of_properties, kNumberOfProperties)
29 29102059 : ACCESSORS(TemplateInfo, property_list, Object, kPropertyListOffset)
30 14024015 : ACCESSORS(TemplateInfo, property_accessors, Object, kPropertyAccessorsOffset)
31 :
32 25693233 : ACCESSORS(FunctionTemplateInfo, call_code, Object, kCallCodeOffset)
33 628441 : ACCESSORS(FunctionTemplateInfo, class_name, Object, kClassNameOffset)
34 7245251 : ACCESSORS(FunctionTemplateInfo, signature, Object, kSignatureOffset)
35 47456222 : ACCESSORS(FunctionTemplateInfo, shared_function_info, Object,
36 : kSharedFunctionInfoOffset)
37 141420993 : ACCESSORS(FunctionTemplateInfo, rare_data, HeapObject,
38 : kFunctionTemplateRareDataOffset)
39 18988498 : ACCESSORS(FunctionTemplateInfo, cached_property_name, Object,
40 : kCachedPropertyNameOffset)
41 11187005 : SMI_ACCESSORS(FunctionTemplateInfo, length, kLengthOffset)
42 8128317 : BOOL_ACCESSORS(FunctionTemplateInfo, flag, hidden_prototype,
43 : kHiddenPrototypeBit)
44 15121514 : BOOL_ACCESSORS(FunctionTemplateInfo, flag, undetectable, kUndetectableBit)
45 22794463 : BOOL_ACCESSORS(FunctionTemplateInfo, flag, needs_access_check,
46 : kNeedsAccessCheckBit)
47 11610788 : BOOL_ACCESSORS(FunctionTemplateInfo, flag, read_only_prototype,
48 : kReadOnlyPrototypeBit)
49 22595021 : BOOL_ACCESSORS(FunctionTemplateInfo, flag, remove_prototype,
50 : kRemovePrototypeBit)
51 7458184 : BOOL_ACCESSORS(FunctionTemplateInfo, flag, do_not_cache, kDoNotCacheBit)
52 11764624 : BOOL_ACCESSORS(FunctionTemplateInfo, flag, accept_any_receiver,
53 : kAcceptAnyReceiver)
54 120152498 : SMI_ACCESSORS(FunctionTemplateInfo, flag, kFlagOffset)
55 :
56 : // static
57 891165 : FunctionTemplateRareData FunctionTemplateInfo::EnsureFunctionTemplateRareData(
58 : Isolate* isolate, Handle<FunctionTemplateInfo> function_template_info) {
59 891165 : HeapObject extra = function_template_info->rare_data();
60 891166 : if (extra->IsUndefined(isolate)) {
61 620120 : return AllocateFunctionTemplateRareData(isolate, function_template_info);
62 : } else {
63 : return FunctionTemplateRareData::cast(extra);
64 : }
65 : }
66 :
67 : #define RARE_ACCESSORS(Name, CamelName, Type) \
68 : Type FunctionTemplateInfo::Get##CamelName() { \
69 : HeapObject extra = rare_data(); \
70 : HeapObject undefined = GetReadOnlyRoots().undefined_value(); \
71 : return extra == undefined ? undefined \
72 : : FunctionTemplateRareData::cast(extra)->Name(); \
73 : } \
74 : inline void FunctionTemplateInfo::Set##CamelName( \
75 : Isolate* isolate, Handle<FunctionTemplateInfo> function_template_info, \
76 : Handle<Type> Name) { \
77 : FunctionTemplateRareData rare_data = \
78 : EnsureFunctionTemplateRareData(isolate, function_template_info); \
79 : rare_data->set_##Name(*Name); \
80 : }
81 :
82 12759159 : RARE_ACCESSORS(prototype_template, PrototypeTemplate, Object)
83 22237364 : RARE_ACCESSORS(prototype_provider_template, PrototypeProviderTemplate, Object)
84 23356763 : RARE_ACCESSORS(parent_template, ParentTemplate, Object)
85 29592106 : RARE_ACCESSORS(named_property_handler, NamedPropertyHandler, Object)
86 25916138 : RARE_ACCESSORS(indexed_property_handler, IndexedPropertyHandler, Object)
87 17221399 : RARE_ACCESSORS(instance_template, InstanceTemplate, Object)
88 11766718 : RARE_ACCESSORS(instance_call_handler, InstanceCallHandler, Object)
89 561938 : RARE_ACCESSORS(access_check_info, AccessCheckInfo, Object)
90 : #undef RARE_ACCESSORS
91 :
92 1813002 : ACCESSORS(FunctionTemplateRareData, prototype_template, Object,
93 : kPrototypeTemplateOffset)
94 655147 : ACCESSORS(FunctionTemplateRareData, prototype_provider_template, Object,
95 : kPrototypeProviderTemplateOffset)
96 1484662 : ACCESSORS(FunctionTemplateRareData, parent_template, Object,
97 : kParentTemplateOffset)
98 6354851 : ACCESSORS(FunctionTemplateRareData, named_property_handler, Object,
99 : kNamedPropertyHandlerOffset)
100 3594615 : ACCESSORS(FunctionTemplateRareData, indexed_property_handler, Object,
101 : kIndexedPropertyHandlerOffset)
102 7071899 : ACCESSORS(FunctionTemplateRareData, instance_template, Object,
103 : kInstanceTemplateOffset)
104 814560 : ACCESSORS(FunctionTemplateRareData, instance_call_handler, Object,
105 : kInstanceCallHandlerOffset)
106 613222 : ACCESSORS(FunctionTemplateRareData, access_check_info, Object,
107 : kAccessCheckInfoOffset)
108 :
109 7631326 : ACCESSORS(ObjectTemplateInfo, constructor, Object, kConstructorOffset)
110 9471726 : ACCESSORS(ObjectTemplateInfo, data, Object, kDataOffset)
111 :
112 : CAST_ACCESSOR(TemplateInfo)
113 12323626 : CAST_ACCESSOR(FunctionTemplateInfo)
114 6873214 : CAST_ACCESSOR(FunctionTemplateRareData)
115 2172301 : CAST_ACCESSOR(ObjectTemplateInfo)
116 :
117 5650892 : bool FunctionTemplateInfo::instantiated() {
118 11301791 : return shared_function_info()->IsSharedFunctionInfo();
119 : }
120 :
121 115006 : bool FunctionTemplateInfo::BreakAtEntry() {
122 115006 : Object maybe_shared = shared_function_info();
123 115006 : if (maybe_shared->IsSharedFunctionInfo()) {
124 1762 : SharedFunctionInfo shared = SharedFunctionInfo::cast(maybe_shared);
125 1762 : return shared->BreakAtEntry();
126 : }
127 : return false;
128 : }
129 :
130 3896843 : FunctionTemplateInfo FunctionTemplateInfo::GetParent(Isolate* isolate) {
131 3896843 : Object parent = GetParentTemplate();
132 : return parent->IsUndefined(isolate) ? FunctionTemplateInfo()
133 3897543 : : FunctionTemplateInfo::cast(parent);
134 : }
135 :
136 807571 : ObjectTemplateInfo ObjectTemplateInfo::GetParent(Isolate* isolate) {
137 807571 : Object maybe_ctor = constructor();
138 807585 : if (maybe_ctor->IsUndefined(isolate)) return ObjectTemplateInfo();
139 168761 : FunctionTemplateInfo constructor = FunctionTemplateInfo::cast(maybe_ctor);
140 : while (true) {
141 168964 : constructor = constructor->GetParent(isolate);
142 168964 : if (constructor.is_null()) return ObjectTemplateInfo();
143 365 : Object maybe_obj = constructor->GetInstanceTemplate();
144 365 : if (!maybe_obj->IsUndefined(isolate)) {
145 : return ObjectTemplateInfo::cast(maybe_obj);
146 : }
147 : }
148 203 : return ObjectTemplateInfo();
149 : }
150 :
151 379230 : int ObjectTemplateInfo::embedder_field_count() const {
152 379230 : Object value = data();
153 : DCHECK(value->IsSmi());
154 758460 : return EmbedderFieldCount::decode(Smi::ToInt(value));
155 : }
156 :
157 105934 : void ObjectTemplateInfo::set_embedder_field_count(int count) {
158 : DCHECK_LE(count, JSObject::kMaxEmbedderFields);
159 : return set_data(
160 317802 : Smi::FromInt(EmbedderFieldCount::update(Smi::ToInt(data()), count)));
161 : }
162 :
163 1028857 : bool ObjectTemplateInfo::immutable_proto() const {
164 1028857 : Object value = data();
165 : DCHECK(value->IsSmi());
166 2057735 : return IsImmutablePrototype::decode(Smi::ToInt(value));
167 : }
168 :
169 18 : void ObjectTemplateInfo::set_immutable_proto(bool immutable) {
170 : return set_data(Smi::FromInt(
171 54 : IsImmutablePrototype::update(Smi::ToInt(data()), immutable)));
172 : }
173 :
174 16504 : bool FunctionTemplateInfo::IsTemplateFor(JSObject object) {
175 16504 : return IsTemplateFor(object->map());
176 : }
177 :
178 : } // namespace internal
179 : } // namespace v8
180 :
181 : #include "src/objects/object-macros-undef.h"
182 :
183 : #endif // V8_OBJECTS_TEMPLATES_INL_H_
|