From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: X-Spam-Status: No, score=-2.1 required=3.0 tests=ALL_TRUSTED,AWL,BAYES_00 shortcircuit=no autolearn=unavailable version=3.3.2 X-Original-To: spew@80x24.org Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id 3B4451F80B; Sun, 28 Sep 2014 02:24:41 +0000 (UTC) Date: Sun, 28 Sep 2014 02:24:41 +0000 From: Eric Wong To: spew@80x24.org Subject: [PATCH] ruby.h (rb_data_type_t): dsize may be FIXNUM Message-ID: <20140928022441.GA24830@dcvr.yhbt.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline List-Id: * include/ruby/ruby.h (RUBY_TYPED_MEMSIZE_FUNC): new typedef for cast (RUBY_TYPED_FIXED_MEMSIZE): new macro to create FIXNUM for dsize * gc.c (rb_objspace_data_type_memsize): support FIXNUM as dsize * *.c: use RUBY_TYPED_FIXED_MEMSIZE where appropriate --- dir.c | 8 +------- encoding.c | 8 +------- enumerator.c | 24 +++--------------------- file.c | 8 +------- gc.c | 15 ++++++++++----- include/ruby/ruby.h | 3 +++ marshal.c | 16 ++-------------- proc.c | 24 +++--------------------- process.c | 12 +++++------- random.c | 8 +------- thread.c | 16 ++-------------- time.c | 12 +++++------- transcode.c | 8 +------- variable.c | 12 +++++------- vm_backtrace.c | 13 +++++-------- vm_trace.c | 8 +------- 16 files changed, 49 insertions(+), 146 deletions(-) diff --git a/dir.c b/dir.c index 09b78c6..3296601 100644 --- a/dir.c +++ b/dir.c @@ -372,15 +372,9 @@ dir_free(void *ptr) xfree(dir); } -static size_t -dir_memsize(const void *ptr) -{ - return ptr ? sizeof(struct dir_data) : 0; -} - static const rb_data_type_t dir_data_type = { "dir", - {dir_mark, dir_free, dir_memsize,}, + {dir_mark, dir_free, RUBY_TYPED_FIXED_MEMSIZE(struct dir_data), }, NULL, NULL, RUBY_TYPED_FREE_IMMEDIATELY }; diff --git a/encoding.c b/encoding.c index e3a0978..a7301a1 100644 --- a/encoding.c +++ b/encoding.c @@ -71,15 +71,9 @@ void rb_enc_init(void); static int load_encoding(const char *name); -static size_t -enc_memsize(const void *p) -{ - return 0; -} - static const rb_data_type_t encoding_data_type = { "encoding", - {0, 0, enc_memsize,}, + {0, 0, 0,}, NULL, NULL, RUBY_TYPED_FREE_IMMEDIATELY }; diff --git a/enumerator.c b/enumerator.c index 75de8eb..cf7a7b0 100644 --- a/enumerator.c +++ b/enumerator.c @@ -155,18 +155,12 @@ enumerator_mark(void *p) #define enumerator_free RUBY_TYPED_DEFAULT_FREE -static size_t -enumerator_memsize(const void *p) -{ - return p ? sizeof(struct enumerator) : 0; -} - static const rb_data_type_t enumerator_data_type = { "enumerator", { enumerator_mark, enumerator_free, - enumerator_memsize, + RUBY_TYPED_FIXED_MEMSIZE(struct enumerator), }, NULL, NULL, RUBY_TYPED_FREE_IMMEDIATELY }; @@ -1066,18 +1060,12 @@ yielder_mark(void *p) #define yielder_free RUBY_TYPED_DEFAULT_FREE -static size_t -yielder_memsize(const void *p) -{ - return p ? sizeof(struct yielder) : 0; -} - static const rb_data_type_t yielder_data_type = { "yielder", { yielder_mark, yielder_free, - yielder_memsize, + RUBY_TYPED_FIXED_MEMSIZE(struct yielder), }, NULL, NULL, RUBY_TYPED_FREE_IMMEDIATELY }; @@ -1173,18 +1161,12 @@ generator_mark(void *p) #define generator_free RUBY_TYPED_DEFAULT_FREE -static size_t -generator_memsize(const void *p) -{ - return p ? sizeof(struct generator) : 0; -} - static const rb_data_type_t generator_data_type = { "generator", { generator_mark, generator_free, - generator_memsize, + RUBY_TYPED_FIXED_MEMSIZE(struct generator), }, NULL, NULL, RUBY_TYPED_FREE_IMMEDIATELY }; diff --git a/file.c b/file.c index f6271a3..009456a 100644 --- a/file.c +++ b/file.c @@ -353,15 +353,9 @@ rb_file_path(VALUE obj) return rb_obj_taint(rb_str_dup(fptr->pathv)); } -static size_t -stat_memsize(const void *p) -{ - return p ? sizeof(struct stat) : 0; -} - static const rb_data_type_t stat_data_type = { "stat", - {NULL, RUBY_TYPED_DEFAULT_FREE, stat_memsize,}, + {NULL, RUBY_TYPED_DEFAULT_FREE, RUBY_TYPED_FIXED_MEMSIZE(struct stat) }, NULL, NULL, RUBY_TYPED_FREE_IMMEDIATELY }; diff --git a/gc.c b/gc.c index 5ee5bee..c369010 100644 --- a/gc.c +++ b/gc.c @@ -1702,12 +1702,17 @@ rb_data_typed_object_alloc(VALUE klass, void *datap, const rb_data_type_t *type) size_t rb_objspace_data_type_memsize(VALUE obj) { - if (RTYPEDDATA_P(obj) && RTYPEDDATA_TYPE(obj)->function.dsize) { - return RTYPEDDATA_TYPE(obj)->function.dsize(RTYPEDDATA_DATA(obj)); - } - else { - return 0; + if (RTYPEDDATA_P(obj)) { + const rb_data_type_t *type = RTYPEDDATA_TYPE(obj); + + if (type->function.dsize) { + if (FIXNUM_P((VALUE)(type->function.dsize))) { + return (size_t)FIX2UINT((VALUE)type->function.dsize); + } + return type->function.dsize(RTYPEDDATA_DATA(obj)); + } } + return 0; } const char * diff --git a/include/ruby/ruby.h b/include/ruby/ruby.h index 6a3949a..7d629d9 100644 --- a/include/ruby/ruby.h +++ b/include/ruby/ruby.h @@ -972,6 +972,7 @@ struct RTypedData { #define RUBY_DATA_FUNC(func) ((void (*)(void*))(func)) */ typedef void (*RUBY_DATA_FUNC)(void*); +typedef size_t (*RUBY_TYPED_MEMSIZE_FUNC)(const void*); 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 *); @@ -983,6 +984,8 @@ void *rb_check_typeddata(VALUE, const rb_data_type_t *); #define RUBY_NEVER_FREE ((RUBY_DATA_FUNC)0) #define RUBY_TYPED_DEFAULT_FREE RUBY_DEFAULT_FREE #define RUBY_TYPED_NEVER_FREE RUBY_NEVER_FREE +#define RUBY_TYPED_FIXED_MEMSIZE(type) \ + ((RUBY_TYPED_MEMSIZE_FUNC)INT2FIX((int)sizeof(type))) /* bits for rb_data_type_struct::flags */ #define RUBY_TYPED_FREE_IMMEDIATELY 1 /* TYPE field */ diff --git a/marshal.c b/marshal.c index 598f90f..76b87ca 100644 --- a/marshal.c +++ b/marshal.c @@ -182,15 +182,9 @@ free_dump_arg(void *ptr) xfree(ptr); } -static size_t -memsize_dump_arg(const void *ptr) -{ - return ptr ? sizeof(struct dump_arg) : 0; -} - 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, RUBY_TYPED_FIXED_MEMSIZE(struct dump_arg), }, NULL, NULL, RUBY_TYPED_FREE_IMMEDIATELY }; @@ -1057,15 +1051,9 @@ free_load_arg(void *ptr) xfree(ptr); } -static size_t -memsize_load_arg(const void *ptr) -{ - return ptr ? sizeof(struct load_arg) : 0; -} - 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, RUBY_TYPED_FIXED_MEMSIZE(struct load_arg),}, NULL, NULL, RUBY_TYPED_FREE_IMMEDIATELY }; diff --git a/proc.c b/proc.c index a3882a9..9bb3275 100644 --- a/proc.c +++ b/proc.c @@ -54,18 +54,12 @@ proc_mark(void *ptr) RUBY_MARK_LEAVE("proc"); } -static size_t -proc_memsize(const void *ptr) -{ - return sizeof(rb_proc_t); -} - static const rb_data_type_t proc_data_type = { "proc", { proc_mark, RUBY_TYPED_DEFAULT_FREE, - proc_memsize, + RUBY_TYPED_FIXED_MEMSIZE(rb_proc_t), }, NULL, NULL, RUBY_TYPED_FREE_IMMEDIATELY }; @@ -251,18 +245,12 @@ binding_mark(void *ptr) RUBY_MARK_LEAVE("binding"); } -static size_t -binding_memsize(const void *ptr) -{ - return ptr ? sizeof(rb_binding_t) : 0; -} - const rb_data_type_t ruby_binding_data_type = { "binding", { binding_mark, binding_free, - binding_memsize, + RUBY_TYPED_FIXED_MEMSIZE(rb_binding_t), }, NULL, NULL, RUBY_TYPED_FREE_IMMEDIATELY }; @@ -1147,18 +1135,12 @@ bm_free(void *ptr) xfree(ptr); } -static size_t -bm_memsize(const void *ptr) -{ - return ptr ? sizeof(struct METHOD) : 0; -} - static const rb_data_type_t method_data_type = { "method", { bm_mark, bm_free, - bm_memsize, + RUBY_TYPED_FIXED_MEMSIZE(struct METHOD), }, NULL, NULL, RUBY_TYPED_FREE_IMMEDIATELY }; diff --git a/process.c b/process.c index 1ea637a..5fd809d 100644 --- a/process.c +++ b/process.c @@ -1348,15 +1348,13 @@ mark_exec_arg(void *ptr) rb_gc_mark(eargp->chdir_dir); } -static size_t -memsize_exec_arg(const void *ptr) -{ - return sizeof(struct rb_execarg); -} - static const rb_data_type_t exec_arg_data_type = { "exec_arg", - {mark_exec_arg, RUBY_TYPED_DEFAULT_FREE, memsize_exec_arg}, + { + mark_exec_arg, + RUBY_TYPED_DEFAULT_FREE, + RUBY_TYPED_FIXED_MEMSIZE(struct rb_execarg), + }, NULL, NULL, RUBY_TYPED_FREE_IMMEDIATELY }; diff --git a/random.c b/random.c index a1deecf..290afaa 100644 --- a/random.c +++ b/random.c @@ -322,18 +322,12 @@ random_free(void *ptr) xfree(ptr); } -static size_t -random_memsize(const void *ptr) -{ - return ptr ? sizeof(rb_random_t) : 0; -} - static const rb_data_type_t random_data_type = { "random", { random_mark, random_free, - random_memsize, + RUBY_TYPED_FIXED_MEMSIZE(rb_random_t), }, NULL, NULL, RUBY_TYPED_FREE_IMMEDIATELY }; diff --git a/thread.c b/thread.c index 4365c1f..98f0077 100644 --- a/thread.c +++ b/thread.c @@ -3883,15 +3883,9 @@ struct thgroup { VALUE group; }; -static size_t -thgroup_memsize(const void *ptr) -{ - return ptr ? sizeof(struct thgroup) : 0; -} - static const rb_data_type_t thgroup_data_type = { "thgroup", - {NULL, RUBY_TYPED_DEFAULT_FREE, thgroup_memsize,}, + {NULL, RUBY_TYPED_DEFAULT_FREE, RUBY_TYPED_FIXED_MEMSIZE(struct thgroup),}, NULL, NULL, RUBY_TYPED_FREE_IMMEDIATELY }; @@ -4105,15 +4099,9 @@ mutex_free(void *ptr) ruby_xfree(ptr); } -static size_t -mutex_memsize(const void *ptr) -{ - return ptr ? sizeof(rb_mutex_t) : 0; -} - static const rb_data_type_t mutex_data_type = { "mutex", - {mutex_mark, mutex_free, mutex_memsize,}, + {mutex_mark, mutex_free, RUBY_TYPED_FIXED_MEMSIZE(rb_mutex_t),}, NULL, NULL, RUBY_TYPED_FREE_IMMEDIATELY }; diff --git a/time.c b/time.c index 06bcd11..88e227c 100644 --- a/time.c +++ b/time.c @@ -1789,15 +1789,13 @@ time_mark(void *ptr) rb_gc_mark(tobj->vtm.utc_offset); } -static size_t -time_memsize(const void *tobj) -{ - return sizeof(struct time_object); -} - static const rb_data_type_t time_data_type = { "time", - {time_mark, RUBY_TYPED_DEFAULT_FREE, time_memsize,}, + { + time_mark, + RUBY_TYPED_DEFAULT_FREE, + RUBY_TYPED_FIXED_MEMSIZE(struct time_object), + }, NULL, NULL, RUBY_TYPED_FREE_IMMEDIATELY }; diff --git a/transcode.c b/transcode.c index 32d9f8d..65a57d5 100644 --- a/transcode.c +++ b/transcode.c @@ -2913,15 +2913,9 @@ econv_free(void *ptr) rb_econv_close(ec); } -static size_t -econv_memsize(const void *ptr) -{ - return ptr ? sizeof(rb_econv_t) : 0; -} - static const rb_data_type_t econv_data_type = { "econv", - {NULL, econv_free, econv_memsize,}, + {NULL, econv_free, RUBY_TYPED_FIXED_MEMSIZE(rb_econv_t), }, NULL, NULL, RUBY_TYPED_FREE_IMMEDIATELY }; diff --git a/variable.c b/variable.c index b32a6ff..1843a3a 100644 --- a/variable.c +++ b/variable.c @@ -1584,15 +1584,13 @@ autoload_i_mark(void *ptr) rb_gc_mark(p->value); } -static size_t -autoload_i_memsize(const void *ptr) -{ - return sizeof(struct autoload_data_i); -} - static const rb_data_type_t autoload_data_i_type = { "autoload_i", - {autoload_i_mark, RUBY_TYPED_DEFAULT_FREE, autoload_i_memsize,}, + { + autoload_i_mark, + RUBY_TYPED_DEFAULT_FREE, + RUBY_TYPED_FIXED_MEMSIZE(struct autoload_data_i), + }, NULL, NULL, RUBY_TYPED_FREE_IMMEDIATELY }; diff --git a/vm_backtrace.c b/vm_backtrace.c index 9948654..16ee23d 100644 --- a/vm_backtrace.c +++ b/vm_backtrace.c @@ -91,16 +91,13 @@ location_mark_entry(rb_backtrace_location_t *fi) } } -static size_t -location_memsize(const void *ptr) -{ - /* rb_backtrace_location_t *fi = (rb_backtrace_location_t *)ptr; */ - return sizeof(rb_backtrace_location_t); -} - static const rb_data_type_t location_data_type = { "frame_info", - {location_mark, RUBY_TYPED_DEFAULT_FREE, location_memsize,}, + { + location_mark, + RUBY_TYPED_DEFAULT_FREE, + RUBY_TYPED_FIXED_MEMSIZE(rb_backtrace_location_t), + }, NULL, NULL, RUBY_TYPED_FREE_IMMEDIATELY }; diff --git a/vm_trace.c b/vm_trace.c index 65a53d4..50c6312 100644 --- a/vm_trace.c +++ b/vm_trace.c @@ -658,15 +658,9 @@ tp_mark(void *ptr) } } -static size_t -tp_memsize(const void *ptr) -{ - return sizeof(rb_tp_t); -} - static const rb_data_type_t tp_data_type = { "tracepoint", - {tp_mark, RUBY_TYPED_NEVER_FREE, tp_memsize,}, + {tp_mark, RUBY_TYPED_NEVER_FREE, RUBY_TYPED_FIXED_MEMSIZE(rb_tp_t),}, NULL, NULL, RUBY_TYPED_FREE_IMMEDIATELY }; -- EW