// 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_INL_H_ #define V8_OBJECTS_TEMPLATES_INL_H_ #include "src/objects/templates.h" #include "src/heap/heap-inl.h" #include "src/objects/shared-function-info-inl.h" // Has to be the last include (doesn't have include guards): #include "src/objects/object-macros.h" namespace v8 { namespace internal { ACCESSORS(TemplateInfo, tag, Object, kTagOffset) ACCESSORS(TemplateInfo, serial_number, Object, kSerialNumberOffset) SMI_ACCESSORS(TemplateInfo, number_of_properties, kNumberOfProperties) ACCESSORS(TemplateInfo, property_list, Object, kPropertyListOffset) ACCESSORS(TemplateInfo, property_accessors, Object, kPropertyAccessorsOffset) ACCESSORS(FunctionTemplateInfo, call_code, Object, kCallCodeOffset) ACCESSORS(FunctionTemplateInfo, prototype_template, Object, kPrototypeTemplateOffset) ACCESSORS(FunctionTemplateInfo, prototype_provider_template, Object, kPrototypeProviderTemplateOffset) ACCESSORS(FunctionTemplateInfo, parent_template, Object, kParentTemplateOffset) ACCESSORS(FunctionTemplateInfo, named_property_handler, Object, kNamedPropertyHandlerOffset) ACCESSORS(FunctionTemplateInfo, indexed_property_handler, Object, kIndexedPropertyHandlerOffset) ACCESSORS(FunctionTemplateInfo, instance_template, Object, kInstanceTemplateOffset) ACCESSORS(FunctionTemplateInfo, class_name, Object, kClassNameOffset) ACCESSORS(FunctionTemplateInfo, signature, Object, kSignatureOffset) ACCESSORS(FunctionTemplateInfo, instance_call_handler, Object, kInstanceCallHandlerOffset) ACCESSORS(FunctionTemplateInfo, access_check_info, Object, kAccessCheckInfoOffset) ACCESSORS(FunctionTemplateInfo, shared_function_info, Object, kSharedFunctionInfoOffset) ACCESSORS(FunctionTemplateInfo, cached_property_name, Object, kCachedPropertyNameOffset) SMI_ACCESSORS(FunctionTemplateInfo, length, kLengthOffset) BOOL_ACCESSORS(FunctionTemplateInfo, flag, hidden_prototype, kHiddenPrototypeBit) BOOL_ACCESSORS(FunctionTemplateInfo, flag, undetectable, kUndetectableBit) BOOL_ACCESSORS(FunctionTemplateInfo, flag, needs_access_check, kNeedsAccessCheckBit) BOOL_ACCESSORS(FunctionTemplateInfo, flag, read_only_prototype, kReadOnlyPrototypeBit) BOOL_ACCESSORS(FunctionTemplateInfo, flag, remove_prototype, kRemovePrototypeBit) BOOL_ACCESSORS(FunctionTemplateInfo, flag, do_not_cache, kDoNotCacheBit) BOOL_ACCESSORS(FunctionTemplateInfo, flag, accept_any_receiver, kAcceptAnyReceiver) SMI_ACCESSORS(FunctionTemplateInfo, flag, kFlagOffset) ACCESSORS(ObjectTemplateInfo, constructor, Object, kConstructorOffset) ACCESSORS(ObjectTemplateInfo, data, Object, kDataOffset) CAST_ACCESSOR(TemplateInfo) CAST_ACCESSOR(FunctionTemplateInfo) CAST_ACCESSOR(ObjectTemplateInfo) bool FunctionTemplateInfo::instantiated() { return shared_function_info()->IsSharedFunctionInfo(); } bool FunctionTemplateInfo::BreakAtEntry() { Object* maybe_shared = shared_function_info(); if (maybe_shared->IsSharedFunctionInfo()) { SharedFunctionInfo* shared = SharedFunctionInfo::cast(maybe_shared); return shared->BreakAtEntry(); } return false; } FunctionTemplateInfo* FunctionTemplateInfo::GetParent(Isolate* isolate) { Object* parent = parent_template(); return parent->IsUndefined(isolate) ? nullptr : FunctionTemplateInfo::cast(parent); } ObjectTemplateInfo* ObjectTemplateInfo::GetParent(Isolate* isolate) { Object* maybe_ctor = constructor(); if (maybe_ctor->IsUndefined(isolate)) return nullptr; FunctionTemplateInfo* constructor = FunctionTemplateInfo::cast(maybe_ctor); while (true) { constructor = constructor->GetParent(isolate); if (constructor == nullptr) return nullptr; Object* maybe_obj = constructor->instance_template(); if (!maybe_obj->IsUndefined(isolate)) { return ObjectTemplateInfo::cast(maybe_obj); } } return nullptr; } int ObjectTemplateInfo::embedder_field_count() const { Object* value = data(); DCHECK(value->IsSmi()); return EmbedderFieldCount::decode(Smi::ToInt(value)); } void ObjectTemplateInfo::set_embedder_field_count(int count) { DCHECK_LE(count, JSObject::kMaxEmbedderFields); return set_data( Smi::FromInt(EmbedderFieldCount::update(Smi::ToInt(data()), count))); } bool ObjectTemplateInfo::immutable_proto() const { Object* value = data(); DCHECK(value->IsSmi()); return IsImmutablePrototype::decode(Smi::ToInt(value)); } void ObjectTemplateInfo::set_immutable_proto(bool immutable) { return set_data(Smi::FromInt( IsImmutablePrototype::update(Smi::ToInt(data()), immutable))); } bool FunctionTemplateInfo::IsTemplateFor(JSObject* object) { return IsTemplateFor(object->map()); } } // namespace internal } // namespace v8 #include "src/objects/object-macros-undef.h" #endif // V8_OBJECTS_TEMPLATES_INL_H_