#ifndef PRISM_CUSTOM_ALLOCATOR_H
#define PRISM_CUSTOM_ALLOCATOR_H
#if defined(MRC_TARGET_MRUBY)
#include "mruby.h"
extern mrb_state *global_mrb;
#define xmalloc(size) mrb_malloc(global_mrb, size)
#define xcalloc(nmemb,size) mrb_calloc(global_mrb, nmemb, size)
#define xrealloc(ptr,size) mrb_realloc(global_mrb, ptr, size)
#define xfree(ptr) mrb_free(global_mrb, ptr)
#define mrc_malloc(c,size) mrb_malloc(c->mrb, size)
#define mrc_calloc(c,nmemb,size) mrb_calloc(c->mrb, nmemb, size)
#define mrc_realloc(c,ptr,size) mrb_realloc(c->mrb, ptr, size)
#define mrc_free(c,ptr) mrb_free(c->mrb, ptr)
#elif defined(MRC_TARGET_MRUBYC)
#include "mrubyc.h"
#if defined(MRBC_ALLOC_LIBC)
#define xmalloc(size) malloc(size)
#define xcalloc(nmemb,size) calloc(nmemb, size)
#define xrealloc(nmemb,size) realloc(nmemb, size)
#define xfree(ptr) free(ptr)
#define mrc_malloc(c,size) malloc(size)
#define mrc_calloc(c,nmemb,size) calloc(nmemb, size)
#define mrc_realloc(c,ptr,size) realloc(ptr, size)
#define mrc_free(c,ptr) free(ptr)
#else
#define xmalloc(size) mrbc_raw_alloc(size)
#define xcalloc(nmemb,size) mrbc_raw_calloc(nmemb, size)
#define xrealloc(nmemb,size) mrc_raw_realloc(nmemb, size)
#define xfree(ptr) mrc_raw_free(ptr)
#define mrc_malloc(c,size) mrbc_raw_alloc(size)
#define mrc_calloc(c,nmemb,size) mrbc_raw_calloc(nmemb, size)
#define mrc_realloc(c,ptr,size) mrc_raw_realloc(ptr, size)
#define mrc_free(c,ptr) mrc_raw_free(ptr)
static inline void mrc_raw_free(void *ptr)
{
if (ptr == NULL) return;
mrbc_raw_free(ptr);
}
static inline void*
mrc_raw_realloc(void *ptr, unsigned int size)
{
if (ptr == NULL) {
return mrbc_raw_alloc(size);
} else {
return mrbc_raw_realloc(ptr, size);
}
}
#endif
#else
#define mrc_malloc(c,size) malloc(size)
#define mrc_calloc(c,nmemb,size) calloc(nmemb, size)
#define mrc_realloc(c,ptr,size) realloc(ptr, size)
#define mrc_free(c,ptr) free(ptr)
#define xmalloc(size) malloc(size)
#define xcalloc(nmemb,size) calloc(nmemb, size)
#define xrealloc(ptr,size) realloc(ptr, size)
#define xfree(ptr) free(ptr)
#endif
#endif