summaryrefslogtreecommitdiffhomepage
path: root/src/etc.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/etc.c')
-rw-r--r--src/etc.c27
1 files changed, 18 insertions, 9 deletions
diff --git a/src/etc.c b/src/etc.c
index 0b58ad67c..727915145 100644
--- a/src/etc.c
+++ b/src/etc.c
@@ -22,28 +22,37 @@ mrb_data_object_alloc(mrb_state *mrb, struct RClass *klass, void *ptr, const mrb
return data;
}
-void *
-mrb_get_datatype(mrb_state *mrb, mrb_value obj, const mrb_data_type *type)
+void
+mrb_data_check_type(mrb_state *mrb, mrb_value obj, const mrb_data_type *type)
{
if (mrb_special_const_p(obj) || (mrb_type(obj) != MRB_TT_DATA)) {
- return NULL;
+ mrb_check_type(mrb, obj, MRB_TT_DATA);
}
if (DATA_TYPE(obj) != type) {
- return NULL;
+ const mrb_data_type *t2 = DATA_TYPE(obj);
+
+ if (t2) {
+ 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));
+ }
}
+}
+
+void *
+mrb_data_check_and_get(mrb_state *mrb, mrb_value obj, const mrb_data_type *type)
+{
+ mrb_data_check_type(mrb, obj, type);
return DATA_PTR(obj);
}
void *
-mrb_check_datatype(mrb_state *mrb, mrb_value obj, const mrb_data_type *type)
+mrb_data_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)) {
- mrb_check_type(mrb, obj, MRB_TT_DATA);
+ return NULL;
}
if (DATA_TYPE(obj) != type) {
- const char *etype = DATA_TYPE(obj)->struct_name;
- mrb_raisef(mrb, E_TYPE_ERROR, "wrong argument type %S (expected %S)",
- mrb_str_new_cstr(mrb, etype), mrb_str_new_cstr(mrb, type->struct_name));
+ return NULL;
}
return DATA_PTR(obj);
}