ruby-changes:16680
From: nobu <ko1@a...>
Date: Sun, 18 Jul 2010 16:32:19 +0900 (JST)
Subject: [ruby-changes:16680] Ruby:r28676 (trunk): * include/ruby/ruby.h (rb_data_type_t): restructured.
nobu 2010-07-18 16:31:54 +0900 (Sun, 18 Jul 2010) New Revision: 28676 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=28676 Log: * include/ruby/ruby.h (rb_data_type_t): restructured. [ruby-dev:41862] add parent member. * error.c (rb_typeddata_inherited_p): new function. Modified files: trunk/ChangeLog trunk/cont.c trunk/dir.c trunk/encoding.c trunk/enumerator.c trunk/error.c trunk/ext/bigdecimal/bigdecimal.c trunk/ext/dl/cfunc.c trunk/ext/dl/cptr.c trunk/ext/dl/handle.c trunk/ext/socket/raddrinfo.c trunk/ext/stringio/stringio.c trunk/file.c trunk/gc.c trunk/include/ruby/ruby.h trunk/iseq.c trunk/marshal.c trunk/parse.y trunk/proc.c trunk/random.c trunk/thread.c trunk/time.c trunk/transcode.c trunk/variable.c trunk/vm.c Index: encoding.c =================================================================== --- encoding.c (revision 28675) +++ encoding.c (revision 28676) @@ -59,7 +59,8 @@ } static const rb_data_type_t encoding_data_type = { - "encoding", 0, 0, enc_memsize, + "encoding", + {0, 0, enc_memsize,}, }; #define is_data_encoding(obj) (RTYPEDDATA_P(obj) && RTYPEDDATA_TYPE(obj) == &encoding_data_type) Index: time.c =================================================================== --- time.c (revision 28675) +++ time.c (revision 28676) @@ -1851,7 +1851,7 @@ static const rb_data_type_t time_data_type = { "time", - time_mark, time_free, time_memsize, + {time_mark, time_free, time_memsize,}, }; static VALUE Index: include/ruby/ruby.h =================================================================== --- include/ruby/ruby.h (revision 28675) +++ include/ruby/ruby.h (revision 28676) @@ -742,16 +742,21 @@ void *data; }; -typedef struct rb_data_type_struct { +typedef struct rb_data_type_struct rb_data_type_t; + +struct rb_data_type_struct { const char *wrap_struct_name; - void (*dmark)(void*); - void (*dfree)(void*); - size_t (*dsize)(const void *); - void *reserved[3]; /* For future extension. - This array *must* be filled with ZERO. */ + struct { + void (*dmark)(void*); + void (*dfree)(void*); + size_t (*dsize)(const void *); + void *reserved[2]; /* For future extension. + This array *must* be filled with ZERO. */ + } function; + const rb_data_type_t *parent; void *data; /* This area can be used for any purpose by a programmer who define the type. */ -} rb_data_type_t; +}; struct RTypedData { struct RBasic basic; @@ -773,6 +778,7 @@ 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 *); +int rb_typeddata_inherited_p(const rb_data_type_t *child, const rb_data_type_t *parent); int rb_typeddata_is_kind_of(VALUE, const rb_data_type_t *); void *rb_check_typeddata(VALUE, const rb_data_type_t *); #define Check_TypedStruct(v,t) rb_check_typeddata((VALUE)(v),t) Index: ChangeLog =================================================================== --- ChangeLog (revision 28675) +++ ChangeLog (revision 28676) @@ -1,3 +1,10 @@ +Sun Jul 18 16:31:50 2010 Nobuyoshi Nakada <nobu@r...> + + * include/ruby/ruby.h (rb_data_type_t): restructured. [ruby-dev:41862] + add parent member. + + * error.c (rb_typeddata_inherited_p): new function. + Sun Jul 18 01:09:27 2010 Tanaka Akira <akr@f...> * ext/pathname/pathname.c (path_initialize): return a value. Index: enumerator.c =================================================================== --- enumerator.c (revision 28675) +++ enumerator.c (revision 28676) @@ -131,9 +131,11 @@ static const rb_data_type_t enumerator_data_type = { "enumerator", - enumerator_mark, - enumerator_free, - enumerator_memsize, + { + enumerator_mark, + enumerator_free, + enumerator_memsize, + }, }; static struct enumerator * @@ -812,9 +814,11 @@ static const rb_data_type_t yielder_data_type = { "yielder", - yielder_mark, - yielder_free, - yielder_memsize, + { + yielder_mark, + yielder_free, + yielder_memsize, + }, }; static struct yielder * @@ -915,9 +919,11 @@ static const rb_data_type_t generator_data_type = { "generator", - generator_mark, - generator_free, - generator_memsize, + { + generator_mark, + generator_free, + generator_memsize, + }, }; static struct generator * Index: variable.c =================================================================== --- variable.c (revision 28675) +++ variable.c (revision 28676) @@ -1418,7 +1418,7 @@ static const rb_data_type_t autoload_data_type = { "autoload", - autoload_mark, autoload_free, autoload_memsize, + {autoload_mark, autoload_free, autoload_memsize,}, }; #define check_autoload_table(av) \ Index: iseq.c =================================================================== --- iseq.c (revision 28675) +++ iseq.c (revision 28676) @@ -156,9 +156,11 @@ static const rb_data_type_t iseq_data_type = { "iseq", - iseq_mark, - iseq_free, - iseq_memsize, + { + iseq_mark, + iseq_free, + iseq_memsize, + }, }; static VALUE Index: proc.c =================================================================== --- proc.c (revision 28675) +++ proc.c (revision 28676) @@ -71,9 +71,11 @@ static const rb_data_type_t proc_data_type = { "proc", - proc_mark, - proc_free, - proc_memsize, + { + proc_mark, + proc_free, + proc_memsize, + }, }; VALUE @@ -268,9 +270,11 @@ static const rb_data_type_t binding_data_type = { "binding", - binding_mark, - binding_free, - binding_memsize, + { + binding_mark, + binding_free, + binding_memsize, + }, }; static VALUE @@ -882,9 +886,11 @@ static const rb_data_type_t method_data_type = { "method", - bm_mark, - bm_free, - bm_memsize, + { + bm_mark, + bm_free, + bm_memsize, + }, }; static inline int Index: thread.c =================================================================== --- thread.c (revision 28675) +++ thread.c (revision 28676) @@ -2824,7 +2824,7 @@ static const rb_data_type_t thgroup_data_type = { "thgroup", - NULL, RUBY_TYPED_DEFAULT_FREE, thgroup_memsize, + {NULL, RUBY_TYPED_DEFAULT_FREE, thgroup_memsize,}, }; /* @@ -3062,7 +3062,7 @@ static const rb_data_type_t mutex_data_type = { "mutex", - mutex_mark, mutex_free, mutex_memsize, + {mutex_mark, mutex_free, mutex_memsize,}, }; static VALUE @@ -3433,7 +3433,7 @@ static const rb_data_type_t barrier_data_type = { "barrier", - barrier_mark, 0, 0, + {barrier_mark, 0, 0,}, }; static VALUE Index: dir.c =================================================================== --- dir.c (revision 28675) +++ dir.c (revision 28676) @@ -344,7 +344,7 @@ static const rb_data_type_t dir_data_type = { "dir", - dir_mark, dir_free, dir_memsize + {dir_mark, dir_free, dir_memsize,}, }; static VALUE dir_close(VALUE); Index: gc.c =================================================================== --- gc.c (revision 28675) +++ gc.c (revision 28676) @@ -1177,7 +1177,7 @@ rb_objspace_data_type_memsize(VALUE obj) { if (RTYPEDDATA_P(obj)) { - return RTYPEDDATA_TYPE(obj)->dsize(RTYPEDDATA_DATA(obj)); + return RTYPEDDATA_TYPE(obj)->function.dsize(RTYPEDDATA_DATA(obj)); } else { return 0; @@ -1749,7 +1749,8 @@ case T_DATA: if (RTYPEDDATA_P(obj)) { - if (obj->as.typeddata.type->dmark) (*obj->as.typeddata.type->dmark)(DATA_PTR(obj)); + RUBY_DATA_FUNC mark_func = obj->as.typeddata.type->function.dmark; + if (mark_func) (*mark_func)(DATA_PTR(obj)); } else { if (obj->as.data.dmark) (*obj->as.data.dmark)(DATA_PTR(obj)); @@ -2186,7 +2187,7 @@ case T_DATA: if (DATA_PTR(obj)) { if (RTYPEDDATA_P(obj)) { - RDATA(obj)->dfree = RANY(obj)->as.typeddata.type->dfree; + RDATA(obj)->dfree = RANY(obj)->as.typeddata.type->function.dfree; } if ((long)RANY(obj)->as.data.dfree == -1) { xfree(DATA_PTR(obj)); @@ -2780,7 +2781,7 @@ RBASIC(obj)->klass = 0; if (RTYPEDDATA_P(obj)) { - free_func = RTYPEDDATA_TYPE(obj)->dfree; + free_func = RTYPEDDATA_TYPE(obj)->function.dfree; } else { free_func = RDATA(obj)->dfree; @@ -2902,7 +2903,7 @@ RANY(p)->as.basic.klass != rb_cThread && RANY(p)->as.basic.klass != rb_cMutex) { p->as.free.flags = 0; if (RTYPEDDATA_P(p)) { - RDATA(p)->dfree = RANY(p)->as.typeddata.type->dfree; + RDATA(p)->dfree = RANY(p)->as.typeddata.type->function.dfree; } if ((long)RANY(p)->as.data.dfree == -1) { xfree(DATA_PTR(p)); Index: parse.y =================================================================== --- parse.y (revision 28675) +++ parse.y (revision 28676) @@ -10027,9 +10027,11 @@ static const rb_data_type_t parser_data_type = { "parser", - parser_mark, - parser_free, - parser_memsize, + { + parser_mark, + parser_free, + parser_memsize, + }, }; VALUE rb_parser_get_yydebug(VALUE); Index: ext/bigdecimal/bigdecimal.c =================================================================== --- ext/bigdecimal/bigdecimal.c (revision 28675) +++ ext/bigdecimal/bigdecimal.c (revision 28676) @@ -105,7 +105,7 @@ static const rb_data_type_t BigDecimal_data_type = { "BigDecimal", - 0, BigDecimal_delete, BigDecimal_memsize, + {0, BigDecimal_delete, BigDecimal_memsize,}, }; static VALUE Index: ext/dl/cfunc.c =================================================================== --- ext/dl/cfunc.c (revision 28675) +++ ext/dl/cfunc.c (revision 28676) @@ -70,7 +70,7 @@ const rb_data_type_t dlcfunc_data_type = { "dl/cfunc", - 0, dlcfunc_free, dlcfunc_memsize, + {0, dlcfunc_free, dlcfunc_memsize,}, }; VALUE Index: ext/dl/cptr.c =================================================================== --- ext/dl/cptr.c (revision 28675) +++ ext/dl/cptr.c (revision 28676) @@ -43,7 +43,7 @@ static const rb_data_type_t dlptr_data_type = { "dl/ptr", - 0, dlptr_free, dlptr_memsize, + {0, dlptr_free, dlptr_memsize,}, }; void Index: ext/dl/handle.c =================================================================== --- ext/dl/handle.c (revision 28675) +++ ext/dl/handle.c (revision 28676) @@ -48,7 +48,7 @@ static const rb_data_type_t dlhandle_data_type = { "dl/handle", - 0, dlhandle_free, dlhandle_memsize, + {0, dlhandle_free, dlhandle_memsize,}, }; /* Index: ext/socket/raddrinfo.c =================================================================== --- ext/socket/raddrinfo.c (revision 28675) +++ ext/socket/raddrinfo.c (revision 28676) @@ -534,7 +534,7 @@ static const rb_data_type_t addrinfo_type = { "socket/addrinfo", - addrinfo_mark, addrinfo_free, addrinfo_memsize, + {addrinfo_mark, addrinfo_free, addrinfo_memsize,}, }; static VALUE Index: ext/stringio/stringio.c =================================================================== --- ext/stringio/stringio.c (revision 28675) +++ ext/stringio/stringio.c (revision 28676) @@ -73,9 +73,11 @@ static const rb_data_type_t strio_data_type = { "strio", - strio_mark, - strio_free, - strio_memsize, + { + strio_mark, + strio_free, + strio_memsize, + }, }; #define check_strio(self) ((struct StringIO*)rb_check_typeddata(self, &strio_data_type)) Index: error.c =================================================================== --- error.c (revision 28675) +++ error.c (revision 28676) @@ -351,10 +351,20 @@ } 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 @@ 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 @@ 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: */ Index: cont.c =================================================================== --- cont.c (revision 28675) +++ cont.c (revision 28676) @@ -374,7 +374,7 @@ static const rb_data_type_t cont_data_type = { "continuation", - cont_mark, cont_free, cont_memsize, + {cont_mark, cont_free, cont_memsize,}, }; static void @@ -951,7 +951,7 @@ static const rb_data_type_t fiber_data_type = { "fiber", - fiber_mark, fiber_free, fiber_memsize, + {fiber_mark, fiber_free, fiber_memsize,}, }; static VALUE Index: vm.c =================================================================== --- vm.c (revision 28675) +++ vm.c (revision 28676) @@ -244,7 +244,7 @@ static const rb_data_type_t env_data_type = { "VM/env", - env_mark, env_free, env_memsize, + {env_mark, env_free, env_memsize,}, }; static VALUE @@ -1569,7 +1569,7 @@ static const rb_data_type_t vm_data_type = { "VM", - rb_vm_mark, vm_free, vm_memsize, + {rb_vm_mark, vm_free, vm_memsize,}, }; static void @@ -1759,9 +1759,11 @@ static const rb_data_type_t thread_data_type = { "VM/thread", - rb_thread_mark, - thread_free, - thread_memsize, + { + rb_thread_mark, + thread_free, + thread_memsize, + }, }; static VALUE Index: marshal.c =================================================================== --- marshal.c (revision 28675) +++ marshal.c (revision 28676) @@ -186,7 +186,7 @@ static const rb_data_type_t dump_arg_data = { "dump_arg", - mark_dump_arg, free_dump_arg, memsize_dump_arg + {mark_dump_arg, free_dump_arg, memsize_dump_arg,}, }; static const char * @@ -999,7 +999,7 @@ static const rb_data_type_t load_arg_data = { "load_arg", - mark_load_arg, free_load_arg, memsize_load_arg + {mark_load_arg, free_load_arg, memsize_load_arg,}, }; #define r_entry(v, arg) r_entry0(v, (arg)->data->num_entries, arg) Index: file.c =================================================================== --- file.c (revision 28675) +++ file.c (revision 28676) @@ -247,7 +247,7 @@ static const rb_data_type_t stat_data_type = { "stat", - NULL, RUBY_TYPED_DEFAULT_FREE, stat_memsize, + {NULL, RUBY_TYPED_DEFAULT_FREE, stat_memsize,}, }; static VALUE Index: random.c =================================================================== --- random.c (revision 28675) +++ random.c (revision 28676) @@ -339,9 +339,11 @@ static const rb_data_type_t random_data_type = { "random", - random_mark, - random_free, - random_memsize, + { + random_mark, + random_free, + random_memsize, + }, }; static rb_random_t * Index: transcode.c =================================================================== --- transcode.c (revision 28675) +++ transcode.c (revision 28676) @@ -2829,7 +2829,7 @@ static const rb_data_type_t econv_data_type = { "econv", - NULL, econv_free, econv_memsize, + {NULL, econv_free, econv_memsize,}, }; static VALUE -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/