mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
6a6c26f530
Within the mruby source code the 'type' field is either initialized, or used in const manner. IMHO changing the type after it has been created might cause hard to track errors.
51 lines
1.3 KiB
C
51 lines
1.3 KiB
C
/*
|
|
** mruby/data.h - Data class
|
|
**
|
|
** See Copyright Notice in mruby.h
|
|
*/
|
|
|
|
#ifndef MRUBY_DATA_H
|
|
#define MRUBY_DATA_H 1
|
|
|
|
#if defined(__cplusplus)
|
|
extern "C" {
|
|
#endif
|
|
|
|
typedef struct mrb_data_type {
|
|
const char *struct_name;
|
|
void (*dfree)(mrb_state *mrb, void*);
|
|
} mrb_data_type;
|
|
|
|
struct RData {
|
|
MRB_OBJECT_HEADER;
|
|
struct iv_tbl *iv;
|
|
const mrb_data_type *type;
|
|
void *data;
|
|
};
|
|
|
|
struct RData *mrb_data_object_alloc(mrb_state *mrb, struct RClass* klass, void *datap, const mrb_data_type *type);
|
|
|
|
#define Data_Wrap_Struct(mrb,klass,type,ptr)\
|
|
mrb_data_object_alloc(mrb,klass,ptr,type)
|
|
|
|
#define Data_Make_Struct(mrb,klass,strct,type,sval,data) (\
|
|
sval = mrb_malloc(mrb, sizeof(strct)),\
|
|
{ static const strct zero = { 0 }; *sval = zero; },\
|
|
data = Data_Wrap_Struct(mrb,klass,type,sval)\
|
|
)
|
|
|
|
#define RDATA(obj) ((struct RData *)((obj).value.p))
|
|
#define DATA_PTR(d) (RDATA(d)->data)
|
|
#define DATA_TYPE(d) (RDATA(d)->type)
|
|
void *mrb_get_datatype(mrb_state *mrb, mrb_value, const mrb_data_type*);
|
|
void *mrb_check_datatype(mrb_state *mrb, mrb_value, const mrb_data_type*);
|
|
#define Data_Get_Struct(mrb,obj,type,sval) do {\
|
|
*(void**)&sval = mrb_check_datatype(mrb, obj, type); \
|
|
} while (0)
|
|
|
|
#if defined(__cplusplus)
|
|
} /* extern "C" { */
|
|
#endif
|
|
|
|
#endif /* MRUBY_DATA_H */
|