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 22718624 : ACCESSORS(TemplateInfo, tag, Object, kTagOffset)
28 29092678 : ACCESSORS(TemplateInfo, serial_number, Object, kSerialNumberOffset)
29 10054132 : SMI_ACCESSORS(TemplateInfo, number_of_properties, kNumberOfPropertiesOffset)
30 17248689 : ACCESSORS(TemplateInfo, property_list, Object, kPropertyListOffset)
31 4811697 : ACCESSORS(TemplateInfo, property_accessors, Object, kPropertyAccessorsOffset)
32 :
33 20688681 : ACCESSORS(FunctionTemplateInfo, call_code, Object, kCallCodeOffset)
34 395435 : ACCESSORS(FunctionTemplateInfo, class_name, Object, kClassNameOffset)
35 3259009 : ACCESSORS(FunctionTemplateInfo, signature, Object, kSignatureOffset)
36 27708327 : ACCESSORS(FunctionTemplateInfo, shared_function_info, Object,
37 : kSharedFunctionInfoOffset)
38 41087570 : ACCESSORS(FunctionTemplateInfo, rare_data, HeapObject,
39 : kFunctionTemplateRareDataOffset)
40 18595247 : ACCESSORS(FunctionTemplateInfo, cached_property_name, Object,
41 : kCachedPropertyNameOffset)
42 7394092 : SMI_ACCESSORS(FunctionTemplateInfo, length, kLengthOffset)
43 0 : BOOL_ACCESSORS(FunctionTemplateInfo, flag, hidden_prototype,
44 : kHiddenPrototypeBit)
45 7394522 : BOOL_ACCESSORS(FunctionTemplateInfo, flag, undetectable, kUndetectableBit)
46 7507778 : BOOL_ACCESSORS(FunctionTemplateInfo, flag, needs_access_check,
47 : kNeedsAccessCheckBit)
48 3540348 : BOOL_ACCESSORS(FunctionTemplateInfo, flag, read_only_prototype,
49 : kReadOnlyPrototypeBit)
50 9784 : BOOL_ACCESSORS(FunctionTemplateInfo, flag, remove_prototype,
51 : kRemovePrototypeBit)
52 7394224 : BOOL_ACCESSORS(FunctionTemplateInfo, flag, do_not_cache, kDoNotCacheBit)
53 7394240 : BOOL_ACCESSORS(FunctionTemplateInfo, flag, accept_any_receiver,
54 : kAcceptAnyReceiver)
55 49265377 : SMI_ACCESSORS(FunctionTemplateInfo, flag, kFlagOffset)
56 :
57 : // static
58 857932 : FunctionTemplateRareData FunctionTemplateInfo::EnsureFunctionTemplateRareData(
59 : Isolate* isolate, Handle<FunctionTemplateInfo> function_template_info) {
60 : HeapObject extra = function_template_info->rare_data();
61 857932 : if (extra->IsUndefined(isolate)) {
62 577046 : 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 4239140 : RARE_ACCESSORS(prototype_template, PrototypeTemplate, Object)
84 7271618 : RARE_ACCESSORS(prototype_provider_template, PrototypeProviderTemplate, Object)
85 7562804 : RARE_ACCESSORS(parent_template, ParentTemplate, Object)
86 9272349 : RARE_ACCESSORS(named_property_handler, NamedPropertyHandler, Object)
87 8335346 : RARE_ACCESSORS(indexed_property_handler, IndexedPropertyHandler, Object)
88 5956517 : RARE_ACCESSORS(instance_template, InstanceTemplate, Object)
89 3803988 : RARE_ACCESSORS(instance_call_handler, InstanceCallHandler, Object)
90 230647 : RARE_ACCESSORS(access_check_info, AccessCheckInfo, Object)
91 : #undef RARE_ACCESSORS
92 :
93 992616 : ACCESSORS(FunctionTemplateRareData, prototype_template, Object,
94 : kPrototypeTemplateOffset)
95 226321 : ACCESSORS(FunctionTemplateRareData, prototype_provider_template, Object,
96 : kPrototypeProviderTemplateOffset)
97 513338 : ACCESSORS(FunctionTemplateRareData, parent_template, Object,
98 : kParentTemplateOffset)
99 2394641 : ACCESSORS(FunctionTemplateRareData, named_property_handler, Object,
100 : kNamedPropertyHandlerOffset)
101 1455019 : ACCESSORS(FunctionTemplateRareData, indexed_property_handler, Object,
102 : kIndexedPropertyHandlerOffset)
103 4163489 : ACCESSORS(FunctionTemplateRareData, instance_template, Object,
104 : kInstanceTemplateOffset)
105 282041 : ACCESSORS(FunctionTemplateRareData, instance_call_handler, Object,
106 : kInstanceCallHandlerOffset)
107 400978 : ACCESSORS(FunctionTemplateRareData, access_check_info, Object,
108 : kAccessCheckInfoOffset)
109 :
110 3058331 : ACCESSORS(ObjectTemplateInfo, constructor, Object, kConstructorOffset)
111 6025388 : ACCESSORS(ObjectTemplateInfo, data, Object, kDataOffset)
112 :
113 : CAST_ACCESSOR(TemplateInfo)
114 : CAST_ACCESSOR(FunctionTemplateInfo)
115 : CAST_ACCESSOR(FunctionTemplateRareData)
116 : CAST_ACCESSOR(ObjectTemplateInfo)
117 :
118 5412843 : bool FunctionTemplateInfo::instantiated() {
119 5412843 : 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 3870661 : : FunctionTemplateInfo::cast(parent);
135 : }
136 :
137 790989 : ObjectTemplateInfo ObjectTemplateInfo::GetParent(Isolate* isolate) {
138 : Object maybe_ctor = constructor();
139 790989 : if (maybe_ctor->IsUndefined(isolate)) return ObjectTemplateInfo();
140 : FunctionTemplateInfo constructor = FunctionTemplateInfo::cast(maybe_ctor);
141 : while (true) {
142 : constructor = constructor->GetParent(isolate);
143 174852 : 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 393110 : return EmbedderFieldCount::decode(Smi::ToInt(value));
156 : }
157 :
158 109907 : void ObjectTemplateInfo::set_embedder_field_count(int count) {
159 : DCHECK_LE(count, JSObject::kMaxEmbedderFields);
160 : return set_data(
161 329721 : 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 739658 : 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_
|