diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-07-18 07:31:54 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-07-18 07:31:54 +0000 |
commit | 25b9eb5e5746665ca098f7117ba207692b2bd78d (patch) | |
tree | 11dd64192d263971587945bc2f3c7e257f7edddc /error.c | |
parent | ad654fe58e0355096fba7e1ae5b5f06eea62c200 (diff) | |
download | ruby-25b9eb5e5746665ca098f7117ba207692b2bd78d.tar.gz |
* 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.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: */ |