redesign mruby/data.h API; use DATA_PTR() for raw data pointer, DATA_GET_PTR()...

redesign mruby/data.h API; use DATA_PTR() for raw data pointer, DATA_GET_PTR() to type safe retrieval (TypeError will be raised), DATA_CHECK_GET_PTR() to get nil if type mismatched
parent babc8d00
...@@ -39,7 +39,12 @@ struct RData *mrb_data_object_alloc(mrb_state *mrb, struct RClass* klass, void * ...@@ -39,7 +39,12 @@ struct RData *mrb_data_object_alloc(mrb_state *mrb, struct RClass* klass, void *
#define DATA_TYPE(d) (RDATA(d)->type) #define DATA_TYPE(d) (RDATA(d)->type)
void mrb_data_check_type(mrb_state *mrb, mrb_value, const mrb_data_type*); void mrb_data_check_type(mrb_state *mrb, mrb_value, const mrb_data_type*);
void *mrb_data_get_ptr(mrb_state *mrb, mrb_value, const mrb_data_type*); void *mrb_data_get_ptr(mrb_state *mrb, mrb_value, const mrb_data_type*);
void *mrb_data_check_and_get(mrb_state *mrb, mrb_value, const mrb_data_type*); #define DATA_GET_PTR(mrb,obj,dtype,type) (type*)mrb_data_get_ptr(mrb,obj,dtype)
void *mrb_data_check_get_ptr(mrb_state *mrb, mrb_value, const mrb_data_type*);
#define DATA_CHECK_GET_PTR(mrb,obj,dtype,type) (type*)mrb_data_check_get_ptr(mrb,obj,dtype)
/* obsolete functions and macros */
#define mrb_data_check_and_get(mrb,obj,dtype) mrb_data_get_ptr(mrb,obj,dtype)
#define mrb_get_datatype(mrb,val,type) mrb_data_get_ptr(mrb, val, type) #define mrb_get_datatype(mrb,val,type) mrb_data_get_ptr(mrb, val, type)
#define mrb_check_datatype(mrb,val,type) mrb_data_check_and_get(mrb, val, type) #define mrb_check_datatype(mrb,val,type) mrb_data_check_and_get(mrb, val, type)
#define Data_Get_Struct(mrb,obj,type,sval) do {\ #define Data_Get_Struct(mrb,obj,type,sval) do {\
......
...@@ -30,9 +30,7 @@ static mt_state *mrb_mt_get_context(mrb_state *mrb, mrb_value self) ...@@ -30,9 +30,7 @@ static mt_state *mrb_mt_get_context(mrb_state *mrb, mrb_value self)
mrb_value context; mrb_value context;
context = mrb_iv_get(mrb, self, mrb_intern2(mrb, MT_STATE_KEY, MT_STATE_KEY_CSTR_LEN)); context = mrb_iv_get(mrb, self, mrb_intern2(mrb, MT_STATE_KEY, MT_STATE_KEY_CSTR_LEN));
t = (mt_state*)mrb_data_get_ptr(mrb, context, &mt_state_type); t = DATA_GET_PTR(mrb, context, &mt_state_type, mt_state);
if (!t)
mrb_raise(mrb, E_RUNTIME_ERROR, "mt_state get from mrb_iv_get failed");
return t; return t;
} }
...@@ -228,4 +226,3 @@ void mrb_mruby_random_gem_init(mrb_state *mrb) ...@@ -228,4 +226,3 @@ void mrb_mruby_random_gem_init(mrb_state *mrb)
void mrb_mruby_random_gem_final(mrb_state *mrb) void mrb_mruby_random_gem_final(mrb_state *mrb)
{ {
} }
This diff is collapsed.
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include "error.h" #include "error.h"
#include "mruby/numeric.h" #include "mruby/numeric.h"
#include "mruby/data.h" #include "mruby/data.h"
#include "mruby/class.h"
struct RData* struct RData*
mrb_data_object_alloc(mrb_state *mrb, struct RClass *klass, void *ptr, const mrb_data_type *type) mrb_data_object_alloc(mrb_state *mrb, struct RClass *klass, void *ptr, const mrb_data_type *type)
...@@ -35,18 +36,17 @@ mrb_data_check_type(mrb_state *mrb, mrb_value obj, const mrb_data_type *type) ...@@ -35,18 +36,17 @@ mrb_data_check_type(mrb_state *mrb, mrb_value obj, const mrb_data_type *type)
mrb_raisef(mrb, E_TYPE_ERROR, "wrong argument type %S (expected %S)", mrb_raisef(mrb, E_TYPE_ERROR, "wrong argument type %S (expected %S)",
mrb_str_new_cstr(mrb, t2->struct_name), mrb_str_new_cstr(mrb, type->struct_name)); mrb_str_new_cstr(mrb, t2->struct_name), mrb_str_new_cstr(mrb, type->struct_name));
} }
} else {
} struct RClass *c = mrb_class(mrb, obj);
void * mrb_raisef(mrb, E_TYPE_ERROR, "uninitialized %S (expected %S)",
mrb_data_check_and_get(mrb_state *mrb, mrb_value obj, const mrb_data_type *type) mrb_obj_value(c), mrb_str_new_cstr(mrb, type->struct_name));
{ }
mrb_data_check_type(mrb, obj, type); }
return DATA_PTR(obj);
} }
void * void *
mrb_data_get_ptr(mrb_state *mrb, mrb_value obj, const mrb_data_type *type) mrb_data_check_get_ptr(mrb_state *mrb, mrb_value obj, const mrb_data_type *type)
{ {
if (mrb_special_const_p(obj) || (mrb_type(obj) != MRB_TT_DATA)) { if (mrb_special_const_p(obj) || (mrb_type(obj) != MRB_TT_DATA)) {
return NULL; return NULL;
...@@ -57,6 +57,13 @@ mrb_data_get_ptr(mrb_state *mrb, mrb_value obj, const mrb_data_type *type) ...@@ -57,6 +57,13 @@ mrb_data_get_ptr(mrb_state *mrb, mrb_value obj, const mrb_data_type *type)
return DATA_PTR(obj); return DATA_PTR(obj);
} }
void *
mrb_data_get_ptr(mrb_state *mrb, mrb_value obj, const mrb_data_type *type)
{
mrb_data_check_type(mrb, obj, type);
return DATA_PTR(obj);
}
mrb_value mrb_value
mrb_lastline_get(mrb_state *mrb) mrb_lastline_get(mrb_state *mrb)
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment