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 22176089 : ACCESSORS(TemplateInfo, tag, Object, kTagOffset)
28 28430998 : ACCESSORS(TemplateInfo, serial_number, Object, kSerialNumberOffset)
29 9785351 : SMI_ACCESSORS(TemplateInfo, number_of_properties, kNumberOfPropertiesOffset)
30 16704937 : ACCESSORS(TemplateInfo, property_list, Object, kPropertyListOffset)
31 4707593 : ACCESSORS(TemplateInfo, property_accessors, Object, kPropertyAccessorsOffset)
32 :
33 20132173 : ACCESSORS(FunctionTemplateInfo, call_code, Object, kCallCodeOffset)
34 391443 : ACCESSORS(FunctionTemplateInfo, class_name, Object, kClassNameOffset)
35 3177573 : ACCESSORS(FunctionTemplateInfo, signature, Object, kSignatureOffset)
36 27097570 : ACCESSORS(FunctionTemplateInfo, shared_function_info, Object,
37 : kSharedFunctionInfoOffset)
38 47586140 : ACCESSORS(FunctionTemplateInfo, rare_data, HeapObject,
39 : kFunctionTemplateRareDataOffset)
40 18097642 : ACCESSORS(FunctionTemplateInfo, cached_property_name, Object,
41 : kCachedPropertyNameOffset)
42 7197924 : SMI_ACCESSORS(FunctionTemplateInfo, length, kLengthOffset)
43 0 : BOOL_ACCESSORS(FunctionTemplateInfo, flag, hidden_prototype,
44 : kHiddenPrototypeBit)
45 7198358 : BOOL_ACCESSORS(FunctionTemplateInfo, flag, undetectable, kUndetectableBit)
46 7310520 : BOOL_ACCESSORS(FunctionTemplateInfo, flag, needs_access_check,
47 : kNeedsAccessCheckBit)
48 3488132 : BOOL_ACCESSORS(FunctionTemplateInfo, flag, read_only_prototype,
49 : kReadOnlyPrototypeBit)
50 9768 : BOOL_ACCESSORS(FunctionTemplateInfo, flag, remove_prototype,
51 : kRemovePrototypeBit)
52 7198062 : BOOL_ACCESSORS(FunctionTemplateInfo, flag, do_not_cache, kDoNotCacheBit)
53 7198078 : BOOL_ACCESSORS(FunctionTemplateInfo, flag, accept_any_receiver,
54 : kAcceptAnyReceiver)
55 48091293 : SMI_ACCESSORS(FunctionTemplateInfo, flag, kFlagOffset)
56 :
57 : // static
58 847491 : FunctionTemplateRareData FunctionTemplateInfo::EnsureFunctionTemplateRareData(
59 : Isolate* isolate, Handle<FunctionTemplateInfo> function_template_info) {
60 : HeapObject extra = function_template_info->rare_data();
61 847491 : if (extra->IsUndefined(isolate)) {
62 569337 : 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 11972040 : RARE_ACCESSORS(prototype_template, PrototypeTemplate, Object)
84 21229828 : RARE_ACCESSORS(prototype_provider_template, PrototypeProviderTemplate, Object)
85 22095544 : RARE_ACCESSORS(parent_template, ParentTemplate, Object)
86 27063656 : RARE_ACCESSORS(named_property_handler, NamedPropertyHandler, Object)
87 24185465 : RARE_ACCESSORS(indexed_property_handler, IndexedPropertyHandler, Object)
88 15250195 : RARE_ACCESSORS(instance_template, InstanceTemplate, Object)
89 11113732 : RARE_ACCESSORS(instance_call_handler, InstanceCallHandler, Object)
90 460449 : RARE_ACCESSORS(access_check_info, AccessCheckInfo, Object)
91 : #undef RARE_ACCESSORS
92 :
93 982826 : ACCESSORS(FunctionTemplateRareData, prototype_template, Object,
94 : kPrototypeTemplateOffset)
95 224157 : ACCESSORS(FunctionTemplateRareData, prototype_provider_template, Object,
96 : kPrototypeProviderTemplateOffset)
97 508897 : ACCESSORS(FunctionTemplateRareData, parent_template, Object,
98 : kParentTemplateOffset)
99 2410567 : ACCESSORS(FunctionTemplateRareData, named_property_handler, Object,
100 : kNamedPropertyHandlerOffset)
101 1447383 : ACCESSORS(FunctionTemplateRareData, indexed_property_handler, Object,
102 : kIndexedPropertyHandlerOffset)
103 4122620 : ACCESSORS(FunctionTemplateRareData, instance_template, Object,
104 : kInstanceTemplateOffset)
105 279319 : ACCESSORS(FunctionTemplateRareData, instance_call_handler, Object,
106 : kInstanceCallHandlerOffset)
107 397142 : ACCESSORS(FunctionTemplateRareData, access_check_info, Object,
108 : kAccessCheckInfoOffset)
109 :
110 3043376 : ACCESSORS(ObjectTemplateInfo, constructor, Object, kConstructorOffset)
111 5960739 : ACCESSORS(ObjectTemplateInfo, data, Object, kDataOffset)
112 :
113 : CAST_ACCESSOR(TemplateInfo)
114 : CAST_ACCESSOR(FunctionTemplateInfo)
115 : CAST_ACCESSOR(FunctionTemplateRareData)
116 : CAST_ACCESSOR(ObjectTemplateInfo)
117 :
118 5289177 : bool FunctionTemplateInfo::instantiated() {
119 5289176 : return shared_function_info()->IsSharedFunctionInfo();
120 : }
121 :
122 103232 : bool FunctionTemplateInfo::BreakAtEntry() {
123 : Object maybe_shared = shared_function_info();
124 103232 : if (maybe_shared->IsSharedFunctionInfo()) {
125 1762 : SharedFunctionInfo shared = SharedFunctionInfo::cast(maybe_shared);
126 1762 : return shared->BreakAtEntry();
127 : }
128 : return false;
129 : }
130 :
131 : FunctionTemplateInfo FunctionTemplateInfo::GetParent(Isolate* isolate) {
132 3771411 : Object parent = GetParentTemplate();
133 : return parent->IsUndefined(isolate) ? FunctionTemplateInfo()
134 3771413 : : FunctionTemplateInfo::cast(parent);
135 : }
136 :
137 788189 : ObjectTemplateInfo ObjectTemplateInfo::GetParent(Isolate* isolate) {
138 : Object maybe_ctor = constructor();
139 788189 : if (maybe_ctor->IsUndefined(isolate)) return ObjectTemplateInfo();
140 173460 : FunctionTemplateInfo constructor = FunctionTemplateInfo::cast(maybe_ctor);
141 203 : while (true) {
142 173663 : constructor = constructor->GetParent(isolate);
143 173663 : if (constructor.is_null()) return ObjectTemplateInfo();
144 353 : 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 389292 : return EmbedderFieldCount::decode(Smi::ToInt(value));
156 : }
157 :
158 108829 : void ObjectTemplateInfo::set_embedder_field_count(int count) {
159 : DCHECK_LE(count, JSObject::kMaxEmbedderFields);
160 : return set_data(
161 326487 : 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 737395 : 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 4190 : bool FunctionTemplateInfo::IsTemplateFor(JSObject object) {
176 4190 : 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_
|