dumping ground for random patches and texts
 help / color / mirror / Atom feed
* [PATCH] ruby.h (rb_data_type_t): dsize may be FIXNUM
@ 2014-09-28  2:24 Eric Wong
  0 siblings, 0 replies; only message in thread
From: Eric Wong @ 2014-09-28  2:24 UTC (permalink / raw)
  To: spew

* 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

^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2014-09-28  2:24 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-09-28  2:24 [PATCH] ruby.h (rb_data_type_t): dsize may be FIXNUM Eric Wong

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).