From 095cdca15b430fb5973b1540d92a29598552adba Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Fri, 18 Oct 2019 14:03:28 +0900 Subject: [PATCH] Make weakmap finalizer an ifunc lambda MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Simple comparison between proc/ifunc/method invocations: ``` proc 15.209M (± 1.6%) i/s - 76.138M in 5.007413s ifunc 15.195M (± 1.7%) i/s - 76.257M in 5.020106s method 9.836M (± 1.2%) i/s - 49.272M in 5.009984s ``` As `proc` and `ifunc` have no significant difference, chosen the latter for arity check. --- gc.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gc.c b/gc.c index b95094b385..8317b49858 100644 --- a/gc.c +++ b/gc.c @@ -10494,6 +10494,7 @@ static const rb_data_type_t weakmap_type = { }; extern const struct st_hash_type rb_hashtype_ident; +static VALUE wmap_finalize(RB_BLOCK_CALL_FUNC_ARGLIST(objid, self)); static VALUE wmap_allocate(VALUE klass) @@ -10502,7 +10503,7 @@ wmap_allocate(VALUE klass) VALUE obj = TypedData_Make_Struct(klass, struct weakmap, &weakmap_type, w); w->obj2wmap = st_init_table(&rb_hashtype_ident); w->wmap2obj = st_init_table(&rb_hashtype_ident); - w->final = rb_obj_method(obj, ID2SYM(rb_intern("finalize"))); + w->final = rb_func_lambda_new(wmap_finalize, obj, 1, 1); return obj; } @@ -10540,7 +10541,7 @@ wmap_final_func(st_data_t *key, st_data_t *value, st_data_t arg, int existing) /* :nodoc: */ static VALUE -wmap_finalize(VALUE self, VALUE objid) +wmap_finalize(RB_BLOCK_CALL_FUNC_ARGLIST(objid, self)) { st_data_t orig, wmap, data; VALUE obj, *rids, i, size; @@ -12003,7 +12004,6 @@ Init_GC(void) rb_define_method(rb_cWeakMap, "values", wmap_values, 0); rb_define_method(rb_cWeakMap, "size", wmap_size, 0); rb_define_method(rb_cWeakMap, "length", wmap_size, 0); - rb_define_private_method(rb_cWeakMap, "finalize", wmap_finalize, 1); rb_include_module(rb_cWeakMap, rb_mEnumerable); }