diff options
Diffstat (limited to 'include')
-rw-r--r-- | include/ruby/ruby.h | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/include/ruby/ruby.h b/include/ruby/ruby.h index 7da0b9e908..9da3f5b9fd 100644 --- a/include/ruby/ruby.h +++ b/include/ruby/ruby.h @@ -735,14 +735,34 @@ struct RData { void *data; }; +typedef struct rb_data_type_struct { + const char *name; + void (*dmark)(void*); + void (*dfree)(void*); + size_t (*dsize)(void *); + void *ary[4]; /* for extension */ +} rb_data_type_t; + +struct RTypedData { + struct RBasic basic; + const rb_data_type_t *type; + VALUE typed_flag; /* 1 or not */ + void *data; +}; + #define DATA_PTR(dta) (RDATA(dta)->data) +#define RTYPEDDATA_P(v) (RTYPEDDATA(v)->typed_flag == 1) +#define RTYPEDDATA_TYPE(v) (RTYPEDDATA(v)->type) +#define RTYPEDDATA_DATA(v) (RTYPEDDATA(v)->data) + /* #define RUBY_DATA_FUNC(func) ((void (*)(void*))func) */ typedef void (*RUBY_DATA_FUNC)(void*); VALUE rb_data_object_alloc(VALUE,void*,RUBY_DATA_FUNC,RUBY_DATA_FUNC); +VALUE rb_data_typed_object_alloc(VALUE klass, void *datap, const rb_data_type_t *); #define Data_Wrap_Struct(klass,mark,free,sval)\ rb_data_object_alloc(klass,sval,(RUBY_DATA_FUNC)mark,(RUBY_DATA_FUNC)free) @@ -753,6 +773,15 @@ VALUE rb_data_object_alloc(VALUE,void*,RUBY_DATA_FUNC,RUBY_DATA_FUNC); Data_Wrap_Struct(klass,mark,free,sval)\ ) +#define Data_Wrap_TypedStruct(klass,data_type,sval)\ + rb_data_typed_object_alloc(klass,sval,data_type) + +#define Data_Make_TypedStruct(klass, type, data_type, sval) (\ + sval = ALLOC(type),\ + memset(sval, 0, sizeof(type)),\ + Data_Wrap_TypedStruct(klass,data_type,sval)\ +) + #define Data_Get_Struct(obj,type,sval) do {\ Check_Type(obj, T_DATA); \ sval = (type*)DATA_PTR(obj);\ @@ -826,6 +855,7 @@ struct RBignum { #define RARRAY(obj) (R_CAST(RArray)(obj)) #define RHASH(obj) (R_CAST(RHash)(obj)) #define RDATA(obj) (R_CAST(RData)(obj)) +#define RTYPEDDATA(obj) (R_CAST(RTypedData)(obj)) #define RSTRUCT(obj) (R_CAST(RStruct)(obj)) #define RBIGNUM(obj) (R_CAST(RBignum)(obj)) #define RFILE(obj) (R_CAST(RFile)(obj)) |