summaryrefslogtreecommitdiff
path: root/error.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-07-18 07:31:54 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-07-18 07:31:54 +0000
commit25b9eb5e5746665ca098f7117ba207692b2bd78d (patch)
tree11dd64192d263971587945bc2f3c7e257f7edddc /error.c
parentad654fe58e0355096fba7e1ae5b5f06eea62c200 (diff)
* include/ruby/ruby.h (rb_data_type_t): restructured. [ruby-dev:41862]
add parent member. * error.c (rb_typeddata_inherited_p): new function. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@28676 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'error.c')
-rw-r--r--error.c22
1 files changed, 17 insertions, 5 deletions
diff --git a/error.c b/error.c
index 0e1eab0a77..479caff213 100644
--- a/error.c
+++ b/error.c
@@ -351,10 +351,20 @@ rb_check_type(VALUE x, int t)
}
int
+rb_typeddata_inherited_p(const rb_data_type_t *child, const rb_data_type_t *parent)
+{
+ while (child) {
+ if (child == parent) return 1;
+ child = child->parent;
+ }
+ return 0;
+}
+
+int
rb_typeddata_is_kind_of(VALUE obj, const rb_data_type_t *data_type)
{
if (SPECIAL_CONST_P(obj) || BUILTIN_TYPE(obj) != T_DATA ||
- !RTYPEDDATA_P(obj) || RTYPEDDATA_TYPE(obj) != data_type) {
+ !RTYPEDDATA_P(obj) || !rb_typeddata_inherited_p(RTYPEDDATA_TYPE(obj), data_type)) {
return 0;
}
return 1;
@@ -373,7 +383,7 @@ rb_check_typeddata(VALUE obj, const rb_data_type_t *data_type)
etype = rb_obj_classname(obj);
rb_raise(rb_eTypeError, mesg, etype, data_type->wrap_struct_name);
}
- else if (RTYPEDDATA_TYPE(obj) != data_type) {
+ else if (!rb_typeddata_inherited_p(RTYPEDDATA_TYPE(obj), data_type)) {
etype = RTYPEDDATA_TYPE(obj)->wrap_struct_name;
rb_raise(rb_eTypeError, mesg, etype, data_type->wrap_struct_name);
}
@@ -815,9 +825,11 @@ name_err_mesg_memsize(const void *p)
static const rb_data_type_t name_err_mesg_data_type = {
"name_err_mesg",
- name_err_mesg_mark,
- name_err_mesg_free,
- name_err_mesg_memsize,
+ {
+ name_err_mesg_mark,
+ name_err_mesg_free,
+ name_err_mesg_memsize,
+ },
};
/* :nodoc: */