ruby-changes:12288
From: nobu <ko1@a...>
Date: Tue, 7 Jul 2009 13:45:10 +0900 (JST)
Subject: [ruby-changes:12288] Ruby:r23981 (trunk): * error.c (rb_check_typed_struct): new function to check typed
nobu 2009-07-07 13:44:54 +0900 (Tue, 07 Jul 2009) New Revision: 23981 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=23981 Log: * 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. Modified files: trunk/ChangeLog trunk/error.c trunk/include/ruby/ruby.h Index: include/ruby/ruby.h =================================================================== --- include/ruby/ruby.h (revision 23980) +++ include/ruby/ruby.h (revision 23981) @@ -764,6 +764,8 @@ 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 *); +void *rb_check_typed_struct(VALUE, const rb_data_type_t *); +#define Check_TypedStruct(v,t) rb_check_typed_struct((VALUE)(v),t) #define Data_Wrap_Struct(klass,mark,free,sval)\ rb_data_object_alloc(klass,sval,(RUBY_DATA_FUNC)mark,(RUBY_DATA_FUNC)free) @@ -788,6 +790,10 @@ sval = (type*)DATA_PTR(obj);\ } while (0) +#define Data_Get_TypedStruct(obj,type,data_type,sval) do {\ + sval = (type*)rb_check_typed_struct(obj, data_type); \ +} while (0) + #define RSTRUCT_EMBED_LEN_MAX 3 struct RStruct { struct RBasic basic; Index: ChangeLog =================================================================== --- ChangeLog (revision 23980) +++ ChangeLog (revision 23981) @@ -1,3 +1,11 @@ +Tue Jul 7 13:44:49 2009 Nobuyoshi Nakada <nobu@r...> + + * 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. + Tue Jul 7 13:36:46 2009 Nobuyoshi Nakada <nobu@r...> * enum.c (DEFINE_ENUMFUNCS): included function signature. Index: error.c =================================================================== --- error.c (revision 23980) +++ error.c (revision 23981) @@ -316,6 +316,26 @@ } } +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 <errno.h> -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/