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

extern class ScopeInfo extends FixedArray;

const kScopeInfoFlagsIndex:
    constexpr int32 generates 'ScopeInfo::Fields::kFlags';

operator '.flags' macro LoadScopeInfoFlags(implicit context: Context)(
    scopeInfo: ScopeInfo): ScopeFlags {
  return Convert<ScopeFlags>(
      UnsafeCast<Smi>(scopeInfo.objects[kScopeInfoFlagsIndex]));
}

type ScopeType extends uint32 constexpr 'ScopeType';
type VariableAllocationInfo extends uint32
constexpr 'VariableAllocationInfo';

// Properties of scopes.
bitfield struct ScopeFlags extends uint32 {
  scope_type: ScopeType: 4 bit;
  sloppy_eval_can_extend_vars: bool: 1 bit;
  language_mode: LanguageMode: 1 bit;
  declaration_scope: bool: 1 bit;
  receiver_variable: VariableAllocationInfo: 2 bit;
  has_class_brand: bool: 1 bit;
  has_saved_class_variable_index: bool: 1 bit;
  has_new_target: bool: 1 bit;
  // TODO(cbruni): Combine with function variable field when only storing the
  // function name.
  function_variable: VariableAllocationInfo: 2 bit;
  has_inferred_function_name: bool: 1 bit;
  is_asm_module: bool: 1 bit;
  has_simple_parameters: bool: 1 bit;
  function_kind: FunctionKind: 5 bit;
  has_outer_scope_info: bool: 1 bit;
  is_debug_evaluate_scope: bool: 1 bit;
  force_context_allocation: bool: 1 bit;
  private_name_lookup_skips_outer_class: bool: 1 bit;
  has_context_extension_slot: bool: 1 bit;
  is_repl_mode_scope: bool: 1 bit;
  has_locals_block_list: bool: 1 bit;
}