// Copyright 2018 the V8 project authors. All rights reserved.
|
// Use of this source code is governed by a BSD-style license that can be
|
// found in the LICENSE file.
|
|
#ifndef V8_OBJECTS_TEMPLATES_H_
|
#define V8_OBJECTS_TEMPLATES_H_
|
|
#include "src/objects.h"
|
|
// Has to be the last include (doesn't have include guards):
|
#include "src/objects/object-macros.h"
|
|
namespace v8 {
|
namespace internal {
|
|
class TemplateInfo : public Struct, public NeverReadOnlySpaceObject {
|
public:
|
using NeverReadOnlySpaceObject::GetHeap;
|
using NeverReadOnlySpaceObject::GetIsolate;
|
|
DECL_ACCESSORS(tag, Object)
|
DECL_ACCESSORS(serial_number, Object)
|
DECL_INT_ACCESSORS(number_of_properties)
|
DECL_ACCESSORS(property_list, Object)
|
DECL_ACCESSORS(property_accessors, Object)
|
|
DECL_VERIFIER(TemplateInfo)
|
|
DECL_CAST(TemplateInfo)
|
|
static const int kTagOffset = HeapObject::kHeaderSize;
|
static const int kSerialNumberOffset = kTagOffset + kPointerSize;
|
static const int kNumberOfProperties = kSerialNumberOffset + kPointerSize;
|
static const int kPropertyListOffset = kNumberOfProperties + kPointerSize;
|
static const int kPropertyAccessorsOffset =
|
kPropertyListOffset + kPointerSize;
|
static const int kHeaderSize = kPropertyAccessorsOffset + kPointerSize;
|
|
static const int kFastTemplateInstantiationsCacheSize = 1 * KB;
|
|
// While we could grow the slow cache until we run out of memory, we put
|
// a limit on it anyway to not crash for embedders that re-create templates
|
// instead of caching them.
|
static const int kSlowTemplateInstantiationsCacheSize = 1 * MB;
|
|
private:
|
DISALLOW_IMPLICIT_CONSTRUCTORS(TemplateInfo);
|
};
|
|
// See the api-exposed FunctionTemplate for more information.
|
class FunctionTemplateInfo : public TemplateInfo {
|
public:
|
// Handler invoked when calling an instance of this FunctionTemplateInfo.
|
// Either CallInfoHandler or Undefined.
|
DECL_ACCESSORS(call_code, Object)
|
|
// ObjectTemplateInfo or Undefined, used for the prototype property of the
|
// resulting JSFunction instance of this FunctionTemplate.
|
DECL_ACCESSORS(prototype_template, Object)
|
|
// In the case the prototype_template is Undefined we use the
|
// protoype_provider_template to retrieve the instance prototype. Either
|
// contains an ObjectTemplateInfo or Undefined.
|
DECL_ACCESSORS(prototype_provider_template, Object)
|
|
// Used to create protoype chains. The parent_template's prototype is set as
|
// __proto__ of this FunctionTemplate's instance prototype. Is either a
|
// FunctionTemplateInfo or Undefined.
|
DECL_ACCESSORS(parent_template, Object)
|
|
// Returns an InterceptorInfo or Undefined for named properties.
|
DECL_ACCESSORS(named_property_handler, Object)
|
// Returns an InterceptorInfo or Undefined for indexed properties/elements.
|
DECL_ACCESSORS(indexed_property_handler, Object)
|
|
// An ObjectTemplateInfo that is used when instantiating the JSFunction
|
// associated with this FunctionTemplateInfo. Contains either an
|
// ObjectTemplateInfo or Undefined. A default instance_template is assigned
|
// upon first instantiation if it's Undefined.
|
DECL_ACCESSORS(instance_template, Object)
|
|
DECL_ACCESSORS(class_name, Object)
|
|
// If the signature is a FunctionTemplateInfo it is used to check whether the
|
// receiver calling the associated JSFunction is a compatible receiver, i.e.
|
// it is an instance of the signare FunctionTemplateInfo or any of the
|
// receiver's prototypes are.
|
DECL_ACCESSORS(signature, Object)
|
|
// Either a CallHandlerInfo or Undefined. If an instance_call_handler is
|
// provided the instances created from the associated JSFunction are marked as
|
// callable.
|
DECL_ACCESSORS(instance_call_handler, Object)
|
|
DECL_ACCESSORS(access_check_info, Object)
|
DECL_ACCESSORS(shared_function_info, Object)
|
|
// Internal field to store a flag bitfield.
|
DECL_INT_ACCESSORS(flag)
|
|
// "length" property of the final JSFunction.
|
DECL_INT_ACCESSORS(length)
|
|
// Either the_hole or a private symbol. Used to cache the result on
|
// the receiver under the the cached_property_name when this
|
// FunctionTemplateInfo is used as a getter.
|
DECL_ACCESSORS(cached_property_name, Object)
|
|
// Begin flag bits ---------------------
|
DECL_BOOLEAN_ACCESSORS(hidden_prototype)
|
DECL_BOOLEAN_ACCESSORS(undetectable)
|
|
// If set, object instances created by this function
|
// requires access check.
|
DECL_BOOLEAN_ACCESSORS(needs_access_check)
|
|
DECL_BOOLEAN_ACCESSORS(read_only_prototype)
|
|
// If set, do not create a prototype property for the associated
|
// JSFunction. This bit implies that neither the prototype_template nor the
|
// prototype_provoider_template are instantiated.
|
DECL_BOOLEAN_ACCESSORS(remove_prototype)
|
|
// If set, do not attach a serial number to this FunctionTemplate and thus do
|
// not keep an instance boilerplate around.
|
DECL_BOOLEAN_ACCESSORS(do_not_cache)
|
|
// If not set an access may be performed on calling the associated JSFunction.
|
DECL_BOOLEAN_ACCESSORS(accept_any_receiver)
|
// End flag bits ---------------------
|
|
DECL_CAST(FunctionTemplateInfo)
|
|
// Dispatched behavior.
|
DECL_PRINTER(FunctionTemplateInfo)
|
DECL_VERIFIER(FunctionTemplateInfo)
|
|
static const int kInvalidSerialNumber = 0;
|
|
static const int kCallCodeOffset = TemplateInfo::kHeaderSize;
|
static const int kPrototypeTemplateOffset = kCallCodeOffset + kPointerSize;
|
static const int kPrototypeProviderTemplateOffset =
|
kPrototypeTemplateOffset + kPointerSize;
|
static const int kParentTemplateOffset =
|
kPrototypeProviderTemplateOffset + kPointerSize;
|
static const int kNamedPropertyHandlerOffset =
|
kParentTemplateOffset + kPointerSize;
|
static const int kIndexedPropertyHandlerOffset =
|
kNamedPropertyHandlerOffset + kPointerSize;
|
static const int kInstanceTemplateOffset =
|
kIndexedPropertyHandlerOffset + kPointerSize;
|
static const int kClassNameOffset = kInstanceTemplateOffset + kPointerSize;
|
static const int kSignatureOffset = kClassNameOffset + kPointerSize;
|
static const int kInstanceCallHandlerOffset = kSignatureOffset + kPointerSize;
|
static const int kAccessCheckInfoOffset =
|
kInstanceCallHandlerOffset + kPointerSize;
|
static const int kSharedFunctionInfoOffset =
|
kAccessCheckInfoOffset + kPointerSize;
|
static const int kFlagOffset = kSharedFunctionInfoOffset + kPointerSize;
|
static const int kLengthOffset = kFlagOffset + kPointerSize;
|
static const int kCachedPropertyNameOffset = kLengthOffset + kPointerSize;
|
static const int kSize = kCachedPropertyNameOffset + kPointerSize;
|
|
static Handle<SharedFunctionInfo> GetOrCreateSharedFunctionInfo(
|
Isolate* isolate, Handle<FunctionTemplateInfo> info,
|
MaybeHandle<Name> maybe_name);
|
// Returns parent function template or null.
|
inline FunctionTemplateInfo* GetParent(Isolate* isolate);
|
// Returns true if |object| is an instance of this function template.
|
inline bool IsTemplateFor(JSObject* object);
|
bool IsTemplateFor(Map* map);
|
inline bool instantiated();
|
|
inline bool BreakAtEntry();
|
|
// Helper function for cached accessors.
|
static MaybeHandle<Name> TryGetCachedPropertyName(Isolate* isolate,
|
Handle<Object> getter);
|
|
private:
|
// Bit position in the flag, from least significant bit position.
|
static const int kHiddenPrototypeBit = 0;
|
static const int kUndetectableBit = 1;
|
static const int kNeedsAccessCheckBit = 2;
|
static const int kReadOnlyPrototypeBit = 3;
|
static const int kRemovePrototypeBit = 4;
|
static const int kDoNotCacheBit = 5;
|
static const int kAcceptAnyReceiver = 6;
|
|
DISALLOW_IMPLICIT_CONSTRUCTORS(FunctionTemplateInfo);
|
};
|
|
class ObjectTemplateInfo : public TemplateInfo {
|
public:
|
DECL_ACCESSORS(constructor, Object)
|
DECL_ACCESSORS(data, Object)
|
DECL_INT_ACCESSORS(embedder_field_count)
|
DECL_BOOLEAN_ACCESSORS(immutable_proto)
|
|
DECL_CAST(ObjectTemplateInfo)
|
|
// Dispatched behavior.
|
DECL_PRINTER(ObjectTemplateInfo)
|
DECL_VERIFIER(ObjectTemplateInfo)
|
|
static const int kConstructorOffset = TemplateInfo::kHeaderSize;
|
// LSB is for immutable_proto, higher bits for embedder_field_count
|
static const int kDataOffset = kConstructorOffset + kPointerSize;
|
static const int kSize = kDataOffset + kPointerSize;
|
|
// Starting from given object template's constructor walk up the inheritance
|
// chain till a function template that has an instance template is found.
|
inline ObjectTemplateInfo* GetParent(Isolate* isolate);
|
|
private:
|
class IsImmutablePrototype : public BitField<bool, 0, 1> {};
|
class EmbedderFieldCount
|
: public BitField<int, IsImmutablePrototype::kNext, 29> {};
|
};
|
|
} // namespace internal
|
} // namespace v8
|
|
#include "src/objects/object-macros-undef.h"
|
|
#endif // V8_OBJECTS_TEMPLATES_H_
|