summaryrefslogtreecommitdiff
path: root/error.c
diff options
context:
space:
mode:
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: */