diff options
Diffstat (limited to 'error.c')
-rw-r--r-- | error.c | 22 |
1 files changed, 17 insertions, 5 deletions
@@ -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: */ |