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-write-barrier-inl.h"
11 : #include "src/objects/oddball.h"
12 : #include "src/objects/shared-function-info-inl.h"
13 :
14 : // Has to be the last include (doesn't have include guards):
15 : #include "src/objects/object-macros.h"
16 :
17 : namespace v8 {
18 : namespace internal {
19 :
20 : OBJECT_CONSTRUCTORS_IMPL(TemplateInfo, Struct)
21 : OBJECT_CONSTRUCTORS_IMPL(FunctionTemplateInfo, TemplateInfo)
22 : OBJECT_CONSTRUCTORS_IMPL(ObjectTemplateInfo, TemplateInfo)
23 : OBJECT_CONSTRUCTORS_IMPL(FunctionTemplateRareData, Struct)
24 :
25 : NEVER_READ_ONLY_SPACE_IMPL(TemplateInfo)
26 :
27 22715878 : ACCESSORS(TemplateInfo, tag, Object, kTagOffset)
28 29092620 : ACCESSORS(TemplateInfo, serial_number, Object, kSerialNumberOffset)
29 10053179 : SMI_ACCESSORS(TemplateInfo, number_of_properties, kNumberOfPropertiesOffset)
30 17250563 : ACCESSORS(TemplateInfo, property_list, Object, kPropertyListOffset)
31 4814473 : ACCESSORS(TemplateInfo, property_accessors, Object, kPropertyAccessorsOffset)
32 :
33 20699129 : ACCESSORS(FunctionTemplateInfo, call_code, Object, kCallCodeOffset)
34 395391 : ACCESSORS(FunctionTemplateInfo, class_name, Object, kClassNameOffset)
35 3268305 : ACCESSORS(FunctionTemplateInfo, signature, Object, kSignatureOffset)
36 27704894 : ACCESSORS(FunctionTemplateInfo, shared_function_info, Object,
37 : kSharedFunctionInfoOffset)
38 41099528 : ACCESSORS(FunctionTemplateInfo, rare_data, HeapObject,
39 : kFunctionTemplateRareDataOffset)
40 18593804 : ACCESSORS(FunctionTemplateInfo, cached_property_name, Object,
41 : kCachedPropertyNameOffset)
42 7393197 : SMI_ACCESSORS(FunctionTemplateInfo, length, kLengthOffset)
43 0 : BOOL_ACCESSORS(FunctionTemplateInfo, flag, hidden_prototype,
44 : kHiddenPrototypeBit)
45 7393622 : BOOL_ACCESSORS(FunctionTemplateInfo, flag, undetectable, kUndetectableBit)
46 7506876 : BOOL_ACCESSORS(FunctionTemplateInfo, flag, needs_access_check,
47 : kNeedsAccessCheckBit)
48 3539762 : BOOL_ACCESSORS(FunctionTemplateInfo, flag, read_only_prototype,
49 : kReadOnlyPrototypeBit)
50 9784 : BOOL_ACCESSORS(FunctionTemplateInfo, flag, remove_prototype,
51 : kRemovePrototypeBit)
52 7393322 : BOOL_ACCESSORS(FunctionTemplateInfo, flag, do_not_cache, kDoNotCacheBit)
53 7393340 : BOOL_ACCESSORS(FunctionTemplateInfo, flag, accept_any_receiver,
54 : kAcceptAnyReceiver)
55 49269007 : SMI_ACCESSORS(FunctionTemplateInfo, flag, kFlagOffset)
56 :
57 : // static
58 857840 : FunctionTemplateRareData FunctionTemplateInfo::EnsureFunctionTemplateRareData(
59 : Isolate* isolate, Handle<FunctionTemplateInfo> function_template_info) {
60 : HeapObject extra = function_template_info->rare_data();
61 857840 : if (extra->IsUndefined(isolate)) {
62 576974 : return AllocateFunctionTemplateRareData(isolate, function_template_info);
63 : } else {
64 : return FunctionTemplateRareData::cast(extra);
65 : }
66 : }
67 :
68 : #define RARE_ACCESSORS(Name, CamelName, Type) \
69 : Type FunctionTemplateInfo::Get##CamelName() { \
70 : HeapObject extra = rare_data(); \
71 : HeapObject undefined = GetReadOnlyRoots().undefined_value(); \
72 : return extra == undefined ? undefined \
73 : : FunctionTemplateRareData::cast(extra)->Name(); \
74 : } \
75 : inline void FunctionTemplateInfo::Set##CamelName( \
76 : Isolate* isolate, Handle<FunctionTemplateInfo> function_template_info, \
77 : Handle<Type> Name) { \
78 : FunctionTemplateRareData rare_data = \
79 : EnsureFunctionTemplateRareData(isolate, function_template_info); \
80 : rare_data->set_##Name(*Name); \
81 : }
82 :
83 4238653 : RARE_ACCESSORS(prototype_template, PrototypeTemplate, Object)
84 7270743 : RARE_ACCESSORS(prototype_provider_template, PrototypeProviderTemplate, Object)
85 7561898 : RARE_ACCESSORS(parent_template, ParentTemplate, Object)
86 9281387 : RARE_ACCESSORS(named_property_handler, NamedPropertyHandler, Object)
87 8334436 : RARE_ACCESSORS(indexed_property_handler, IndexedPropertyHandler, Object)
88 5962452 : RARE_ACCESSORS(instance_template, InstanceTemplate, Object)
89 3803534 : RARE_ACCESSORS(instance_call_handler, InstanceCallHandler, Object)
90 230631 : RARE_ACCESSORS(access_check_info, AccessCheckInfo, Object)
91 : #undef RARE_ACCESSORS
92 :
93 992544 : ACCESSORS(FunctionTemplateRareData, prototype_template, Object,
94 : kPrototypeTemplateOffset)
95 226305 : ACCESSORS(FunctionTemplateRareData, prototype_provider_template, Object,
96 : kPrototypeProviderTemplateOffset)
97 513302 : ACCESSORS(FunctionTemplateRareData, parent_template, Object,
98 : kParentTemplateOffset)
99 2404533 : ACCESSORS(FunctionTemplateRareData, named_property_handler, Object,
100 : kNamedPropertyHandlerOffset)
101 1454963 : ACCESSORS(FunctionTemplateRareData, indexed_property_handler, Object,
102 : kIndexedPropertyHandlerOffset)
103 4169638 : ACCESSORS(FunctionTemplateRareData, instance_template, Object,
104 : kInstanceTemplateOffset)
105 282021 : ACCESSORS(FunctionTemplateRareData, instance_call_handler, Object,
106 : kInstanceCallHandlerOffset)
107 400950 : ACCESSORS(FunctionTemplateRareData, access_check_info, Object,
108 : kAccessCheckInfoOffset)
109 :
110 3068037 : ACCESSORS(ObjectTemplateInfo, constructor, Object, kConstructorOffset)
111 6028104 : ACCESSORS(ObjectTemplateInfo, data, Object, kDataOffset)
112 :
113 : CAST_ACCESSOR(TemplateInfo)
114 : CAST_ACCESSOR(FunctionTemplateInfo)
115 : CAST_ACCESSOR(FunctionTemplateRareData)
116 : CAST_ACCESSOR(ObjectTemplateInfo)
117 :
118 5412097 : bool FunctionTemplateInfo::instantiated() {
119 5412098 : return shared_function_info()->IsSharedFunctionInfo();
120 : }
121 :
122 702 : bool FunctionTemplateInfo::BreakAtEntry() {
123 : Object maybe_shared = shared_function_info();
124 702 : if (maybe_shared->IsSharedFunctionInfo()) {
125 524 : SharedFunctionInfo shared = SharedFunctionInfo::cast(maybe_shared);
126 524 : return shared->BreakAtEntry();
127 : }
128 : return false;
129 : }
130 :
131 : FunctionTemplateInfo FunctionTemplateInfo::GetParent(Isolate* isolate) {
132 : Object parent = GetParentTemplate();
133 : return parent->IsUndefined(isolate) ? FunctionTemplateInfo()
134 3870199 : : FunctionTemplateInfo::cast(parent);
135 : }
136 :
137 794242 : ObjectTemplateInfo ObjectTemplateInfo::GetParent(Isolate* isolate) {
138 : Object maybe_ctor = constructor();
139 794242 : if (maybe_ctor->IsUndefined(isolate)) return ObjectTemplateInfo();
140 : FunctionTemplateInfo constructor = FunctionTemplateInfo::cast(maybe_ctor);
141 : while (true) {
142 : constructor = constructor->GetParent(isolate);
143 174840 : if (constructor.is_null()) return ObjectTemplateInfo();
144 : Object maybe_obj = constructor->GetInstanceTemplate();
145 353 : if (!maybe_obj->IsUndefined(isolate)) {
146 : return ObjectTemplateInfo::cast(maybe_obj);
147 : }
148 : }
149 : return ObjectTemplateInfo();
150 : }
151 :
152 : int ObjectTemplateInfo::embedder_field_count() const {
153 : Object value = data();
154 : DCHECK(value->IsSmi());
155 393082 : return EmbedderFieldCount::decode(Smi::ToInt(value));
156 : }
157 :
158 109899 : void ObjectTemplateInfo::set_embedder_field_count(int count) {
159 : DCHECK_LE(count, JSObject::kMaxEmbedderFields);
160 : return set_data(
161 329697 : Smi::FromInt(EmbedderFieldCount::update(Smi::ToInt(data()), count)));
162 : }
163 :
164 : bool ObjectTemplateInfo::immutable_proto() const {
165 : Object value = data();
166 : DCHECK(value->IsSmi());
167 742914 : return IsImmutablePrototype::decode(Smi::ToInt(value));
168 : }
169 :
170 18 : void ObjectTemplateInfo::set_immutable_proto(bool immutable) {
171 36 : return set_data(Smi::FromInt(
172 72 : IsImmutablePrototype::update(Smi::ToInt(data()), immutable)));
173 : }
174 :
175 4167 : bool FunctionTemplateInfo::IsTemplateFor(JSObject object) {
176 4167 : return IsTemplateFor(object->map());
177 : }
178 :
179 : } // namespace internal
180 : } // namespace v8
181 :
182 : #include "src/objects/object-macros-undef.h"
183 :
184 : #endif // V8_OBJECTS_TEMPLATES_INL_H_
|