#ifndef SPVM_OBJECT_H
#define SPVM_OBJECT_H

#include "spvm_base.h"
#include "spvm_native.h"

enum {
  SPVM_OBJECT_C_CATEGORY_OBJECT,
  SPVM_OBJECT_C_CATEGORY_NUMERIC_ARRAY,
  SPVM_OBJECT_C_CATEGORY_OBJECT_ARRAY,
  SPVM_OBJECT_C_CATEGORY_VALUE_T_ARRAY,
};

// SPVM_OBJECT
struct SPVM_object {
  void* body;
  void** weaken_back_refs;
  int32_t weaken_back_refs_length;
  int32_t weaken_back_refs_capacity;
  int32_t ref_count;
  int32_t basic_type_id;
  int32_t elements_length;
  uint8_t type_dimension;
  uint8_t type_flag;
  uint8_t has_destructor;
  uint8_t in_destroy;
  uint8_t category;
};

#endif