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 24187922 : OBJECT_CONSTRUCTORS_IMPL(FunctionTemplateInfo, TemplateInfo)
22 4203070 : OBJECT_CONSTRUCTORS_IMPL(ObjectTemplateInfo, TemplateInfo)
23 13586956 : OBJECT_CONSTRUCTORS_IMPL(FunctionTemplateRareData, Struct)
24 :
25 : NEVER_READ_ONLY_SPACE_IMPL(TemplateInfo)
26 :
27 21710045 : ACCESSORS(TemplateInfo, tag, Object, kTagOffset)
28 27853264 : ACCESSORS(TemplateInfo, serial_number, Object, kSerialNumberOffset)
29 16718437 : SMI_ACCESSORS(TemplateInfo, number_of_properties, kNumberOfProperties)
30 16177411 : ACCESSORS(TemplateInfo, property_list, Object, kPropertyListOffset)
31 4611405 : ACCESSORS(TemplateInfo, property_accessors, Object, kPropertyAccessorsOffset)
32 :
33 19578562 : ACCESSORS(FunctionTemplateInfo, call_code, Object, kCallCodeOffset)
34 387624 : ACCESSORS(FunctionTemplateInfo, class_name, Object, kClassNameOffset)
35 3036778 : ACCESSORS(FunctionTemplateInfo, signature, Object, kSignatureOffset)
36 26482406 : ACCESSORS(FunctionTemplateInfo, shared_function_info, Object,
37 : kSharedFunctionInfoOffset)
38 133708078 : ACCESSORS(FunctionTemplateInfo, rare_data, HeapObject,
39 : kFunctionTemplateRareDataOffset)
40 17668808 : ACCESSORS(FunctionTemplateInfo, cached_property_name, Object,
41 : kCachedPropertyNameOffset)
42 10540224 : SMI_ACCESSORS(FunctionTemplateInfo, length, kLengthOffset)
43 7706822 : BOOL_ACCESSORS(FunctionTemplateInfo, flag, hidden_prototype,
44 : kHiddenPrototypeBit)
45 14262800 : BOOL_ACCESSORS(FunctionTemplateInfo, flag, undetectable, kUndetectableBit)
46 21508160 : BOOL_ACCESSORS(FunctionTemplateInfo, flag, needs_access_check,
47 : kNeedsAccessCheckBit)
48 10693800 : BOOL_ACCESSORS(FunctionTemplateInfo, flag, read_only_prototype,
49 : kReadOnlyPrototypeBit)
50 21305046 : BOOL_ACCESSORS(FunctionTemplateInfo, flag, remove_prototype,
51 : kRemovePrototypeBit)
52 7026992 : BOOL_ACCESSORS(FunctionTemplateInfo, flag, do_not_cache, kDoNotCacheBit)
53 11522634 : BOOL_ACCESSORS(FunctionTemplateInfo, flag, accept_any_receiver,
54 : kAcceptAnyReceiver)
55 113383715 : SMI_ACCESSORS(FunctionTemplateInfo, flag, kFlagOffset)
56 :
57 : // static
58 839552 : FunctionTemplateRareData FunctionTemplateInfo::EnsureFunctionTemplateRareData(
59 : Isolate* isolate, Handle<FunctionTemplateInfo> function_template_info) {
60 839552 : HeapObject extra = function_template_info->rare_data();
61 839552 : if (extra->IsUndefined(isolate)) {
62 564226 : 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 15533785 : RARE_ACCESSORS(prototype_template, PrototypeTemplate, Object)
84 27627608 : RARE_ACCESSORS(prototype_provider_template, PrototypeProviderTemplate, Object)
85 28768382 : RARE_ACCESSORS(parent_template, ParentTemplate, Object)
86 34974871 : RARE_ACCESSORS(named_property_handler, NamedPropertyHandler, Object)
87 31330322 : RARE_ACCESSORS(indexed_property_handler, IndexedPropertyHandler, Object)
88 19559044 : RARE_ACCESSORS(instance_template, InstanceTemplate, Object)
89 14472178 : RARE_ACCESSORS(instance_call_handler, InstanceCallHandler, Object)
90 570790 : RARE_ACCESSORS(access_check_info, AccessCheckInfo, Object)
91 : #undef RARE_ACCESSORS
92 :
93 973099 : ACCESSORS(FunctionTemplateRareData, prototype_template, Object,
94 : kPrototypeTemplateOffset)
95 221791 : ACCESSORS(FunctionTemplateRareData, prototype_provider_template, Object,
96 : kPrototypeProviderTemplateOffset)
97 503229 : ACCESSORS(FunctionTemplateRareData, parent_template, Object,
98 : kParentTemplateOffset)
99 2307217 : ACCESSORS(FunctionTemplateRareData, named_property_handler, Object,
100 : kNamedPropertyHandlerOffset)
101 1392151 : ACCESSORS(FunctionTemplateRareData, indexed_property_handler, Object,
102 : kIndexedPropertyHandlerOffset)
103 4084533 : ACCESSORS(FunctionTemplateRareData, instance_template, Object,
104 : kInstanceTemplateOffset)
105 276476 : ACCESSORS(FunctionTemplateRareData, instance_call_handler, Object,
106 : kInstanceCallHandlerOffset)
107 393190 : ACCESSORS(FunctionTemplateRareData, access_check_info, Object,
108 : kAccessCheckInfoOffset)
109 :
110 3013006 : ACCESSORS(ObjectTemplateInfo, constructor, Object, kConstructorOffset)
111 6179545 : ACCESSORS(ObjectTemplateInfo, data, Object, kDataOffset)
112 :
113 : CAST_ACCESSOR(TemplateInfo)
114 12093965 : CAST_ACCESSOR(FunctionTemplateInfo)
115 6793478 : CAST_ACCESSOR(FunctionTemplateRareData)
116 2101534 : CAST_ACCESSOR(ObjectTemplateInfo)
117 :
118 5189512 : bool FunctionTemplateInfo::instantiated() {
119 10379025 : return shared_function_info()->IsSharedFunctionInfo();
120 : }
121 :
122 101999 : bool FunctionTemplateInfo::BreakAtEntry() {
123 101999 : Object maybe_shared = shared_function_info();
124 101999 : if (maybe_shared->IsSharedFunctionInfo()) {
125 1762 : SharedFunctionInfo shared = SharedFunctionInfo::cast(maybe_shared);
126 1762 : return shared->BreakAtEntry();
127 : }
128 : return false;
129 : }
130 :
131 3683735 : FunctionTemplateInfo FunctionTemplateInfo::GetParent(Isolate* isolate) {
132 3683735 : Object parent = GetParentTemplate();
133 : return parent->IsUndefined(isolate) ? FunctionTemplateInfo()
134 3684416 : : FunctionTemplateInfo::cast(parent);
135 : }
136 :
137 780469 : ObjectTemplateInfo ObjectTemplateInfo::GetParent(Isolate* isolate) {
138 780469 : Object maybe_ctor = constructor();
139 780472 : if (maybe_ctor->IsUndefined(isolate)) return ObjectTemplateInfo();
140 171222 : FunctionTemplateInfo constructor = FunctionTemplateInfo::cast(maybe_ctor);
141 : while (true) {
142 171425 : constructor = constructor->GetParent(isolate);
143 171425 : 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 203 : return ObjectTemplateInfo();
150 : }
151 :
152 385321 : int ObjectTemplateInfo::embedder_field_count() const {
153 385321 : Object value = data();
154 : DCHECK(value->IsSmi());
155 770642 : return EmbedderFieldCount::decode(Smi::ToInt(value));
156 : }
157 :
158 107755 : void ObjectTemplateInfo::set_embedder_field_count(int count) {
159 : DCHECK_LE(count, JSObject::kMaxEmbedderFields);
160 : return set_data(
161 323265 : Smi::FromInt(EmbedderFieldCount::update(Smi::ToInt(data()), count)));
162 : }
163 :
164 1005021 : bool ObjectTemplateInfo::immutable_proto() const {
165 1005021 : Object value = data();
166 : DCHECK(value->IsSmi());
167 2010042 : return IsImmutablePrototype::decode(Smi::ToInt(value));
168 : }
169 :
170 18 : void ObjectTemplateInfo::set_immutable_proto(bool immutable) {
171 : return set_data(Smi::FromInt(
172 54 : IsImmutablePrototype::update(Smi::ToInt(data()), immutable)));
173 : }
174 :
175 4088 : bool FunctionTemplateInfo::IsTemplateFor(JSObject object) {
176 4088 : 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_
|