* [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).