From 7bb9cc23a143a512ca97a21345ac98542e26d091 Mon Sep 17 00:00:00 2001 From: nobu Date: Tue, 7 Jul 2009 04:44:54 +0000 Subject: * error.c (rb_check_typed_struct): new function to check typed struct. * include/ruby/ruby.h (Check_TypedStruct, Data_Get_TypedStruct): new macro to check typed struct. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@23981 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- error.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'error.c') diff --git a/error.c b/error.c index bfa3a950db..04ea58de11 100644 --- a/error.c +++ b/error.c @@ -316,6 +316,26 @@ rb_check_type(VALUE x, int t) } } +void * +rb_check_typed_struct(VALUE obj, const rb_data_type_t *data_type) +{ + const char *etype; + static const char mesg[] = "wrong argument type %s (expected %s)"; + + if (SPECIAL_CONST_P(obj) || BUILTIN_TYPE(obj) != T_DATA) { + Check_Type(obj, T_DATA); + } + if (!RTYPEDDATA_P(obj)) { + etype = rb_obj_classname(obj); + rb_raise(rb_eTypeError, mesg, etype, data_type->name); + } + else if (RTYPEDDATA_TYPE(obj) != data_type) { + etype = RTYPEDDATA_TYPE(obj)->name; + rb_raise(rb_eTypeError, mesg, etype, data_type->name); + } + return DATA_PTR(obj); +} + /* exception classes */ #include -- cgit v1.2.3