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

@generateCppClass
extern class CallHandlerInfo extends Struct {
  callback: NonNullForeign|Undefined|Zero;
  js_callback: NonNullForeign|Undefined|Zero;
  data: Object;
}

bitfield struct InterceptorInfoFlags extends uint31 {
  can_intercept_symbols: bool: 1 bit;
  all_can_read: bool: 1 bit;
  non_masking: bool: 1 bit;
  named: bool: 1 bit;
  has_no_side_effect: bool: 1 bit;
}

@generateCppClass
@generatePrint
extern class InterceptorInfo extends Struct {
  getter: NonNullForeign|Zero|Undefined;
  setter: NonNullForeign|Zero|Undefined;
  query: NonNullForeign|Zero|Undefined;
  descriptor: NonNullForeign|Zero|Undefined;
  deleter: NonNullForeign|Zero|Undefined;
  enumerator: NonNullForeign|Zero|Undefined;
  definer: NonNullForeign|Zero|Undefined;
  data: Object;
  flags: SmiTagged<InterceptorInfoFlags>;
}

@generateCppClass
@generatePrint
extern class AccessCheckInfo extends Struct {
  callback: Foreign|Zero|Undefined;
  named_interceptor: InterceptorInfo|Zero|Undefined;
  indexed_interceptor: InterceptorInfo|Zero|Undefined;
  data: Object;
}

type SideEffectType extends int32 constexpr 'SideEffectType';

bitfield struct AccessorInfoFlags extends uint31 {
  all_can_read: bool: 1 bit;
  all_can_write: bool: 1 bit;
  is_special_data_property: bool: 1 bit;
  is_sloppy: bool: 1 bit;
  replace_on_access: bool: 1 bit;
  getter_side_effect_type: SideEffectType: 2 bit;
  setter_side_effect_type: SideEffectType: 2 bit;
  initial_attributes: PropertyAttributes: 3 bit;
}

@generateCppClass
@generatePrint
extern class AccessorInfo extends Struct {
  name: Name;
  flags: SmiTagged<AccessorInfoFlags>;
  expected_receiver_type: Object;
  setter: NonNullForeign|Zero;
  getter: NonNullForeign|Zero;
  // This either points at the same as above, or a trampoline in case we are
  // running with the simulator. Use these entries from generated code.
  js_getter: NonNullForeign|Zero;
  data: Object;
}
