text: /* Copyright JS Foundation and other contributors, http://js.foundation
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *     http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  #ifndef VM_DEFINES_H
  #define VM_DEFINES_H
  
  #include "byte-code.h"
  #include "ecma-globals.h"
  
  /** \addtogroup vm Virtual machine
   * @{
   *
   * \addtogroup vm_executor Executor
   * @{
   */
  
  /**
   * Helper for += on uint16_t values.
   */
  #define VM_PLUS_EQUAL_U16(base, value) (base) = (uint16_t) ((base) + (value))
  
  /**
   * Helper for -= on uint16_t values.
   */
  #define VM_MINUS_EQUAL_U16(base, value) (base) = (uint16_t) ((base) - (value))
  
  /**
   * Flag bits of vm_frame_ctx_shared_t
   */
  typedef enum
  {
    VM_FRAME_CTX_SHARED_HAS_ARG_LIST = (1 << 0),        /**< has argument list */
    VM_FRAME_CTX_SHARED_DIRECT_EVAL = (1 << 1),         /**< direct eval call */
    VM_FRAME_CTX_SHARED_FREE_THIS = (1 << 2),           /**< free this binding */
    VM_FRAME_CTX_SHARED_FREE_LOCAL_ENV = (1 << 3),      /**< free local environment */
  #if JERRY_ESNEXT
    VM_FRAME_CTX_SHARED_NON_ARROW_FUNC = (1 << 4),      /**< non-arrow function */
    VM_FRAME_CTX_SHARED_HERITAGE_PRESENT = (1 << 5),    /**< class heritage present */
    VM_FRAME_CTX_SHARED_HAS_CLASS_FIELDS = (1 << 6),    /**< has class fields */
  #endif /* JERRY_ESNEXT */
  } vm_frame_ctx_shared_flags_t;
  
  /**
   * Shared data between the interpreter and the caller
   */
  typedef struct
  {
    const ecma_compiled_code_t *bytecode_header_p;      /**< currently executed byte-code data */
    uint32_t status_flags;                              /**< combination of vm_frame_ctx_shared_flags_t bits */
  } vm_frame_ctx_shared_t;
  
  /**
   * Shared data extended with arguments
   */
  typedef struct
  {
    vm_frame_ctx_shared_t header;                       /**< shared data header */
    ecma_object_t *function_object_p;                   /**< function obj */
    const ecma_value_t *arg_list_p;                     /**< arguments list */
    uint32_t arg_list_len;                              /**< arguments list length */
  } vm_frame_ctx_shared_args_t;
  
  #if JERRY_ESNEXT
  
  #define VM_FRAME_CTX_GET_FUNCTION_OBJECT(frame_ctx_p) \
    (((vm_frame_ctx_shared_args_t *) (frame_ctx_p)->shared_p)->function_object_p)
  
  /**
   * Shared data extended with computed class fields
   */
  typedef struct
  {
    vm_frame_ctx_shared_t header;                       /**< shared data header */
    ecma_value_t *computed_class_fields_p;              /**< names of the computed class fields */
  } vm_frame_ctx_shared_class_fields_t;
  
  /**
   * Get the computed class field
   */
  #define VM_GET_COMPUTED_CLASS_FIELDS(frame_ctx_p) \
    (((vm_frame_ctx_shared_class_fields_t *) ((frame_ctx_p)->shared_p))->computed_class_fields_p)
  
  #endif /* JERRY_ESNEXT */
  
  /**
   * Flag bits of vm_frame_ctx_t
   */
  typedef enum
  {
    VM_FRAME_CTX_DIRECT_EVAL = (1 << 1),                /**< direct eval call */
    VM_FRAME_CTX_IS_STRICT = (1 << 2),                  /**< strict mode */
  } vm_frame_ctx_flags_t;
  
  /**
   * Context of interpreter, related to a JS stack frame
   */
  typedef struct vm_frame_ctx_t
  {
    vm_frame_ctx_shared_t *shared_p;                    /**< shared information */
    const uint8_t *byte_code_p;                         /**< current byte code pointer */
    const uint8_t *byte_code_start_p;                   /**< byte code start pointer */
    ecma_value_t *stack_top_p;                          /**< stack top pointer */
    ecma_value_t *literal_start_p;                      /**< literal list start pointer */
    ecma_object_t *lex_env_p;                           /**< current lexical environment */
    struct vm_frame_ctx_t *prev_context_p;              /**< previous context */
    ecma_value_t this_binding;                          /**< this binding */
    ecma_value_t block_result;                          /**< block result */
  #if JERRY_LINE_INFO
    uint32_t current_line;                              /**< currently executed line */
  #endif /* JERRY_LINE_INFO */
    uint16_t context_depth;                             /**< current context depth */
    uint8_t status_flags;                               /**< combination of vm_frame_ctx_flags_t bits */
    uint8_t call_operation;                             /**< perform a call or construct operation */
    /* Registers start immediately after the frame context. */
  } vm_frame_ctx_t;
  
  /**
   * Get register list corresponding to the frame context.
   */
  #define VM_GET_REGISTERS(frame_ctx_p) ((ecma_value_t *) ((frame_ctx_p) + 1))
  
  /**
   * Read or write a specific register.
   */
  #define VM_GET_REGISTER(frame_ctx_p, i) (((ecma_value_t *) ((frame_ctx_p) + 1))[i])
  
  /**
   * Get the executable object.
   */
  #define VM_GET_EXECUTABLE_OBJECT(frame_ctx_p) \
    ((ecma_extended_object_t *) ((uintptr_t) (frame_ctx_p) - (uintptr_t) offsetof (vm_executable_object_t, frame_ctx)))
  
  /**
   * Generator frame context.
   */
  typedef struct
  {
    ecma_extended_object_t extended_object; /**< extended object part */
    vm_frame_ctx_shared_t shared; /**< shared part */
    vm_frame_ctx_t frame_ctx; /**< frame context part */
  } vm_executable_object_t;
  
  /**
   * Real backtrace frame data passed to the jerry_backtrace_callback_t handler.
   */
  struct jerry_backtrace_frame_internal_t
  {
    vm_frame_ctx_t *context_p; /**< context pointer */
    uint8_t frame_type; /**< frame type */
    jerry_backtrace_location_t location; /**< location information */
    ecma_value_t function; /**< function reference */
  };
  
  /**
   * @}
   * @}
   */
  
  #endif /* !VM_DEFINES_H */
  