// Copyright 2019 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.

@abstract
@generateCppClass
extern class TemplateInfo extends Struct {
  tag: Smi;
  serial_number: Smi;
  number_of_properties: Smi;
  property_list: TemplateList|Undefined;
  property_accessors: TemplateList|Undefined;
}

@generateCppClass
@generatePrint
extern class FunctionTemplateRareData extends Struct {
  // See DECL_RARE_ACCESSORS in FunctionTemplateInfo.
  prototype_template: ObjectTemplateInfo|Undefined;
  prototype_provider_template: FunctionTemplateInfo|Undefined;
  parent_template: FunctionTemplateInfo|Undefined;
  named_property_handler: InterceptorInfo|Undefined;
  indexed_property_handler: InterceptorInfo|Undefined;
  instance_template: ObjectTemplateInfo|Undefined;
  instance_call_handler: CallHandlerInfo|Undefined;
  access_check_info: AccessCheckInfo|Undefined;
  c_function: Foreign|Zero;
  c_signature: Foreign|Zero;
}

bitfield struct FunctionTemplateInfoFlags extends uint31 {
  undetectable: bool: 1 bit;
  needs_access_check: bool: 1 bit;
  read_only_prototype: bool: 1 bit;
  remove_prototype: bool: 1 bit;
  do_not_cache: bool: 1 bit;
  accept_any_receiver: bool: 1 bit;
}

@generateCppClass
extern class FunctionTemplateInfo extends TemplateInfo {
  // Handler invoked when calling an instance of this FunctionTemplateInfo.
  // Either CallHandlerInfo or Undefined.
  call_code: CallHandlerInfo|Undefined;
  class_name: String|Undefined;
  // 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 signature FunctionTemplateInfo or any of the
  // receiver's prototypes are.
  signature: FunctionTemplateInfo|Undefined;
  // If any of the setters declared by DECL_RARE_ACCESSORS are used then a
  // FunctionTemplateRareData will be stored here. Until then this contains
  // undefined.
  rare_data: FunctionTemplateRareData|Undefined;
  shared_function_info: SharedFunctionInfo|Undefined;
  // Internal field to store a flag bitfield.
  flag: SmiTagged<FunctionTemplateInfoFlags>;
  // "length" property of the final JSFunction.
  length: Smi;
  // 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.
  cached_property_name: Object;
}

bitfield struct ObjectTemplateInfoFlags extends uint31 {
  is_immutable_prototype: bool: 1 bit;
  is_code_kind: bool: 1 bit;
  embedder_field_count: int32: 28 bit;
}

@generateCppClass
extern class ObjectTemplateInfo extends TemplateInfo {
  constructor: FunctionTemplateInfo|Undefined;
  data: SmiTagged<ObjectTemplateInfoFlags>;
}
