summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog8
-rw-r--r--error.c20
-rw-r--r--include/ruby/ruby.h6
3 files changed, 34 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 277863bbe..220ecf470 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+Tue Jul 7 13:44:49 2009 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * 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@ruby-lang.org>
* enum.c (DEFINE_ENUMFUNCS): included function signature.
diff --git a/error.c b/error.c
index bfa3a950d..04ea58de1 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 <errno.h>
diff --git a/include/ruby/ruby.h b/include/ruby/ruby.h
index 98a2264c2..8aef106b9 100644
--- a/include/ruby/ruby.h
+++ b/include/ruby/ruby.h
@@ -764,6 +764,8 @@ typedef void (*RUBY_DATA_FUNC)(void*);
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 @@ VALUE rb_data_typed_object_alloc(VALUE klass, void *datap, const rb_data_type_t
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;