1 /*
2 ** mruby/data.h - Data class
3 **
4 ** See Copyright Notice in mruby.h
5 */
6 
7 #ifndef MRUBY_DATA_H
8 #define MRUBY_DATA_H
9 
10 #include "common.h"
11 
12 /**
13  * Custom C wrapped data.
14  *
15  * Defining Ruby wrappers around native objects.
16  */
17 MRB_BEGIN_DECL
18 
19 /**
20  * Custom data type description.
21  */
22 typedef struct mrb_data_type {
23   /** data type name */
24   const char *struct_name;
25 
26   /** data type release function pointer */
27   void (*dfree)(mrb_state *mrb, void*);
28 } mrb_data_type;
29 
30 struct RData {
31   MRB_OBJECT_HEADER;
32   struct iv_tbl *iv;
33   const mrb_data_type *type;
34   void *data;
35 };
36 
37 MRB_API struct RData *mrb_data_object_alloc(mrb_state *mrb, struct RClass* klass, void *datap, const mrb_data_type *type);
38 
39 #define Data_Wrap_Struct(mrb,klass,type,ptr)\
40   mrb_data_object_alloc(mrb,klass,ptr,type)
41 
42 #define Data_Make_Struct(mrb,klass,strct,type,sval,data_obj) do { \
43   (data_obj) = Data_Wrap_Struct(mrb,klass,type,NULL);\
44   (sval) = mrb_malloc(mrb, sizeof(strct));                     \
45   { static const strct zero = { 0 }; *(sval) = zero; };\
46   (data_obj)->data = (sval);\
47 } while (0)
48 
49 #define RDATA(obj)         ((struct RData *)(mrb_ptr(obj)))
50 #define DATA_PTR(d)        (RDATA(d)->data)
51 #define DATA_TYPE(d)       (RDATA(d)->type)
52 MRB_API void mrb_data_check_type(mrb_state *mrb, mrb_value, const mrb_data_type*);
53 MRB_API void *mrb_data_get_ptr(mrb_state *mrb, mrb_value, const mrb_data_type*);
54 #define DATA_GET_PTR(mrb,obj,dtype,type) (type*)mrb_data_get_ptr(mrb,obj,dtype)
55 MRB_API void *mrb_data_check_get_ptr(mrb_state *mrb, mrb_value, const mrb_data_type*);
56 #define DATA_CHECK_GET_PTR(mrb,obj,dtype,type) (type*)mrb_data_check_get_ptr(mrb,obj,dtype)
57 
58 /* obsolete functions and macros */
59 #define mrb_data_check_and_get(mrb,obj,dtype) mrb_data_get_ptr(mrb,obj,dtype)
60 #define mrb_get_datatype(mrb,val,type) mrb_data_get_ptr(mrb, val, type)
61 #define mrb_check_datatype(mrb,val,type) mrb_data_get_ptr(mrb, val, type)
62 #define Data_Get_Struct(mrb,obj,type,sval) do {\
63   *(void**)&sval = mrb_data_get_ptr(mrb, obj, type); \
64 } while (0)
65 
66 static inline void
mrb_data_init(mrb_value v,void * ptr,const mrb_data_type * type)67 mrb_data_init(mrb_value v, void *ptr, const mrb_data_type *type)
68 {
69   mrb_assert(mrb_type(v) == MRB_TT_DATA);
70   DATA_PTR(v) = ptr;
71   DATA_TYPE(v) = type;
72 }
73 
74 MRB_END_DECL
75 
76 #endif /* MRUBY_DATA_H */
77