#ifndef COMMON_H
#define COMMON_H

#define SLOTMASK ~(((jsoff_t) ~0) >> 1)
#define CONSTMASK (~(((jsoff_t) ~0) >> 1) >> 1)
#define ARRMASK (~(((jsoff_t) ~0) >> 1) >> 2)
#define NONCONFIGMASK (~(((jsoff_t) ~0) >> 1) >> 3)
#define FLAGMASK (SLOTMASK | CONSTMASK | ARRMASK | NONCONFIGMASK)

typedef enum {
  SLOT_NONE = 0,
  SLOT_PID,
  SLOT_ASYNC,
  SLOT_WITH,
  SLOT_SCOPE,
  SLOT_THIS,
  SLOT_BOUND_THIS,
  SLOT_BOUND_ARGS,
  SLOT_FIELD_COUNT,
  SLOT_SOURCE,
  SLOT_FIELDS,
  SLOT_STRICT,
  SLOT_CODE,
  SLOT_CODE_LEN,
  SLOT_CFUNC,
  SLOT_CORO,
  SLOT_ARROW,
  SLOT_PROTO,
  SLOT_FUNC_PROTO,
  SLOT_ASYNC_PROTO,
  SLOT_FROZEN,
  SLOT_SEALED,
  SLOT_EXTENSIBLE,
  SLOT_BUFFER,
  SLOT_TARGET_FUNC,
  SLOT_NAME,
  SLOT_MAP,
  SLOT_SET,
  SLOT_PRIMITIVE,
  SLOT_PROXY_REF,
  SLOT_BUILTIN,
  SLOT_DATA,
  SLOT_CTOR,
  SLOT_SUPER,
  SLOT_DEFAULT_CTOR,
  SLOT_DEFAULT,
  SLOT_ERR_TYPE,
  SLOT_OBSERVABLE_SUBSCRIBER,
  SLOT_SUBSCRIPTION_OBSERVER,
  SLOT_SUBSCRIPTION_CLEANUP,
  SLOT_HOISTED_VARS,
  SLOT_HOISTED_VARS_LEN,
  SLOT_STRICT_EVAL_SCOPE,
  SLOT_MODULE_SCOPE,
  SLOT_STRICT_ARGS,
  SLOT_NO_FUNC_DECLS,
  SLOT_MAX = 255
} internal_slot_t;

typedef enum {
  BUILTIN_NONE = 0,
  BUILTIN_OBJECT = 1
} builtin_fn_id_t;

#endif
