• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_H_
6 #define V8_OBJECTS_TEMPLATES_H_
7 
8 #include "src/objects/struct.h"
9 #include "torque-generated/bit-fields.h"
10 
11 // Has to be the last include (doesn't have include guards):
12 #include "src/objects/object-macros.h"
13 
14 namespace v8 {
15 
16 class CFunctionInfo;
17 class StructBodyDescriptor;
18 
19 namespace internal {
20 
21 #include "torque-generated/src/objects/templates-tq.inc"
22 
23 class TemplateInfo : public TorqueGeneratedTemplateInfo<TemplateInfo, Struct> {
24  public:
25   NEVER_READ_ONLY_SPACE
26 
27   static const int kFastTemplateInstantiationsCacheSize = 1 * KB;
28 
29   // While we could grow the slow cache until we run out of memory, we put
30   // a limit on it anyway to not crash for embedders that re-create templates
31   // instead of caching them.
32   static const int kSlowTemplateInstantiationsCacheSize = 1 * MB;
33 
34   // If the serial number is set to kDoNotCache, then we should never cache this
35   // TemplateInfo.
36   static const int kDoNotCache = -1;
37   // If the serial number is set to kUncached, it means that this TemplateInfo
38   // has not been cached yet but it can be.
39   static const int kUncached = -2;
40 
41   inline bool should_cache() const;
42   inline bool is_cached() const;
43 
44   using BodyDescriptor = StructBodyDescriptor;
45 
46   TQ_OBJECT_CONSTRUCTORS(TemplateInfo)
47 };
48 
49 // Contains data members that are rarely set on a FunctionTemplateInfo.
50 class FunctionTemplateRareData
51     : public TorqueGeneratedFunctionTemplateRareData<FunctionTemplateRareData,
52                                                      Struct> {
53  public:
54   DECL_VERIFIER(FunctionTemplateRareData)
55 
56   using BodyDescriptor = StructBodyDescriptor;
57 
58   TQ_OBJECT_CONSTRUCTORS(FunctionTemplateRareData)
59 };
60 
61 // See the api-exposed FunctionTemplate for more information.
62 class FunctionTemplateInfo
63     : public TorqueGeneratedFunctionTemplateInfo<FunctionTemplateInfo,
64                                                  TemplateInfo> {
65  public:
66 #define DECL_RARE_ACCESSORS(Name, CamelName, Type)                           \
67   DECL_GETTER(Get##CamelName, Type)                                          \
68   static inline void Set##CamelName(                                         \
69       Isolate* isolate, Handle<FunctionTemplateInfo> function_template_info, \
70       Handle<Type> Name);
71 
72   // ObjectTemplateInfo or Undefined, used for the prototype property of the
73   // resulting JSFunction instance of this FunctionTemplate.
74   DECL_RARE_ACCESSORS(prototype_template, PrototypeTemplate, HeapObject)
75 
76   // In the case the prototype_template is Undefined we use the
77   // prototype_provider_template to retrieve the instance prototype. Either
78   // contains an FunctionTemplateInfo or Undefined.
79   DECL_RARE_ACCESSORS(prototype_provider_template, PrototypeProviderTemplate,
80                       HeapObject)
81 
82   // Used to create prototype chains. The parent_template's prototype is set as
83   // __proto__ of this FunctionTemplate's instance prototype. Is either a
84   // FunctionTemplateInfo or Undefined.
85   DECL_RARE_ACCESSORS(parent_template, ParentTemplate, HeapObject)
86 
87   // Returns an InterceptorInfo or Undefined for named properties.
88   DECL_RARE_ACCESSORS(named_property_handler, NamedPropertyHandler, HeapObject)
89   // Returns an InterceptorInfo or Undefined for indexed properties/elements.
90   DECL_RARE_ACCESSORS(indexed_property_handler, IndexedPropertyHandler,
91                       HeapObject)
92 
93   // An ObjectTemplateInfo that is used when instantiating the JSFunction
94   // associated with this FunctionTemplateInfo. Contains either an
95   // ObjectTemplateInfo or Undefined. A default instance_template is assigned
96   // upon first instantiation if it's Undefined.
97   DECL_RARE_ACCESSORS(instance_template, InstanceTemplate, HeapObject)
98 
99   // Either a CallHandlerInfo or Undefined. If an instance_call_handler is
100   // provided the instances created from the associated JSFunction are marked as
101   // callable.
102   DECL_RARE_ACCESSORS(instance_call_handler, InstanceCallHandler, HeapObject)
103 
104   DECL_RARE_ACCESSORS(access_check_info, AccessCheckInfo, HeapObject)
105 
106   DECL_RARE_ACCESSORS(c_function_overloads, CFunctionOverloads, FixedArray)
107 #undef DECL_RARE_ACCESSORS
108 
109   // Begin flag bits ---------------------
110   DECL_BOOLEAN_ACCESSORS(undetectable)
111 
112   // If set, object instances created by this function
113   // requires access check.
114   DECL_BOOLEAN_ACCESSORS(needs_access_check)
115 
116   DECL_BOOLEAN_ACCESSORS(read_only_prototype)
117 
118   // If set, do not create a prototype property for the associated
119   // JSFunction. This bit implies that neither the prototype_template nor the
120   // prototype_provoider_template are instantiated.
121   DECL_BOOLEAN_ACCESSORS(remove_prototype)
122 
123   // If not set an access may be performed on calling the associated JSFunction.
124   DECL_BOOLEAN_ACCESSORS(accept_any_receiver)
125 
126   // This flag is used to check that the FunctionTemplateInfo instance is not
127   // changed after it became visible to TurboFan (either set in a
128   // SharedFunctionInfo or an accessor), because TF relies on immutability to
129   // safely read concurrently.
130   DECL_BOOLEAN_ACCESSORS(published)
131 
132   // This specifies the permissable range of instance type of objects that can
133   // be allowed to be used as receivers with the given template.
134   DECL_INT16_ACCESSORS(allowed_receiver_instance_type_range_start)
135   DECL_INT16_ACCESSORS(allowed_receiver_instance_type_range_end)
136   // End flag bits ---------------------
137 
138   // Dispatched behavior.
139   DECL_PRINTER(FunctionTemplateInfo)
140 
141   inline int InstanceType() const;
142   inline void SetInstanceType(int instance_type);
143 
144   static Handle<SharedFunctionInfo> GetOrCreateSharedFunctionInfo(
145       Isolate* isolate, Handle<FunctionTemplateInfo> info,
146       MaybeHandle<Name> maybe_name);
147 
GetOrCreateSharedFunctionInfo(LocalIsolate * isolate,Handle<FunctionTemplateInfo> info,Handle<Name> maybe_name)148   static Handle<SharedFunctionInfo> GetOrCreateSharedFunctionInfo(
149       LocalIsolate* isolate, Handle<FunctionTemplateInfo> info,
150       Handle<Name> maybe_name) {
151     // We don't support streaming compilation of scripts with natives, so we
152     // don't need an off-thread implementation of this.
153     UNREACHABLE();
154   }
155 
156   // Returns parent function template or a null FunctionTemplateInfo.
157   inline FunctionTemplateInfo GetParent(Isolate* isolate);
158   // Returns true if |object| is an instance of this function template.
159   inline bool IsTemplateFor(JSObject object);
160   bool IsTemplateFor(Map map) const;
161   // Returns true if |object| is an API object and is constructed by this
162   // particular function template (skips walking up the chain of inheriting
163   // functions that is done by IsTemplateFor).
164   bool IsLeafTemplateForApiObject(Object object) const;
165   inline bool instantiated();
166 
167   bool BreakAtEntry();
168   bool HasInstanceType();
169 
170   // Helper function for cached accessors.
171   static base::Optional<Name> TryGetCachedPropertyName(Isolate* isolate,
172                                                        Object getter);
173   // Fast API overloads.
174   int GetCFunctionsCount() const;
175   Address GetCFunction(int index) const;
176   const CFunctionInfo* GetCSignature(int index) const;
177 
178   // CFunction data for a set of overloads is stored into a FixedArray, as
179   // [address_0, signature_0, ... address_n-1, signature_n-1].
180   static const int kFunctionOverloadEntrySize = 2;
181 
182   // Bit position in the flag, from least significant bit position.
183   DEFINE_TORQUE_GENERATED_FUNCTION_TEMPLATE_INFO_FLAGS()
184 
185   using BodyDescriptor = StructBodyDescriptor;
186 
187  private:
188   static constexpr int kNoJSApiObjectType = 0;
189   static inline FunctionTemplateRareData EnsureFunctionTemplateRareData(
190       Isolate* isolate, Handle<FunctionTemplateInfo> function_template_info);
191 
192   static FunctionTemplateRareData AllocateFunctionTemplateRareData(
193       Isolate* isolate, Handle<FunctionTemplateInfo> function_template_info);
194 
195   TQ_OBJECT_CONSTRUCTORS(FunctionTemplateInfo)
196 };
197 
198 class ObjectTemplateInfo
199     : public TorqueGeneratedObjectTemplateInfo<ObjectTemplateInfo,
200                                                TemplateInfo> {
201  public:
202   DECL_INT_ACCESSORS(embedder_field_count)
203   DECL_BOOLEAN_ACCESSORS(immutable_proto)
204   DECL_BOOLEAN_ACCESSORS(code_like)
205 
206   // Dispatched behavior.
207   DECL_PRINTER(ObjectTemplateInfo)
208 
209   // Starting from given object template's constructor walk up the inheritance
210   // chain till a function template that has an instance template is found.
211   inline ObjectTemplateInfo GetParent(Isolate* isolate);
212 
213   using BodyDescriptor = StructBodyDescriptor;
214 
215  private:
216   DEFINE_TORQUE_GENERATED_OBJECT_TEMPLATE_INFO_FLAGS()
217 
218   TQ_OBJECT_CONSTRUCTORS(ObjectTemplateInfo)
219 };
220 
221 }  // namespace internal
222 }  // namespace v8
223 
224 #include "src/objects/object-macros-undef.h"
225 
226 #endif  // V8_OBJECTS_TEMPLATES_H_
227