summaryrefslogtreecommitdiffhomepage
path: root/src/etc.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2013-08-15 01:33:36 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2013-08-15 01:33:36 +0900
commitb225e4cc82f0e727b6175306e530efc2a59f4e95 (patch)
treeeb8a64a304a8468ec4e033cc578c4b6531966436 /src/etc.c
parentbabc8d00865b86c77032cfe4d69ddfea3ac9f4ef (diff)
downloadmruby-b225e4cc82f0e727b6175306e530efc2a59f4e95.tar.gz
mruby-b225e4cc82f0e727b6175306e530efc2a59f4e95.zip
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
Diffstat (limited to 'src/etc.c')
-rw-r--r--src/etc.c23
1 files changed, 15 insertions, 8 deletions
diff --git a/src/etc.c b/src/etc.c
index 514b0686b..b8c6cfbb0 100644
--- a/src/etc.c
+++ b/src/etc.c
@@ -9,6 +9,7 @@
#include "error.h"
#include "mruby/numeric.h"
#include "mruby/data.h"
+#include "mruby/class.h"
struct RData*
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)
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));
}
- }
-}
+ else {
+ struct RClass *c = mrb_class(mrb, obj);
-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);
+ mrb_raisef(mrb, E_TYPE_ERROR, "uninitialized %S (expected %S)",
+ mrb_obj_value(c), mrb_str_new_cstr(mrb, type->struct_name));
+ }
+ }
}
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)) {
return NULL;
@@ -57,6 +57,13 @@ mrb_data_get_ptr(mrb_state *mrb, mrb_value obj, const mrb_data_type *type)
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_lastline_get(mrb_state *mrb)
{