[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]