From 2fbb1dca4ef3cc85f484faeb16a0fbd1f9f27a02 Mon Sep 17 00:00:00 2001 From: nobu Date: Thu, 21 Jul 2016 21:28:34 +0000 Subject: [PATCH] gc.c: reduce EXEC_TAG * gc.c (run_finalizer): push and exec tag just once, instead of protecting for each finalizer. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@55722 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 5 ++++- gc.c | 37 +++++++++++++++++++++---------------- 2 files changed, 25 insertions(+), 17 deletions(-) diff --git a/ChangeLog b/ChangeLog index 4791195bfc..997cb93849 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,7 @@ -Fri Jul 22 06:12:51 2016 Nobuyoshi Nakada +Fri Jul 22 06:28:32 2016 Nobuyoshi Nakada + + * gc.c (run_finalizer): push and exec tag just once, instead of + protecting for each finalizer. * gc.c (gc_start_internal, rb_gc_start): set finalizing flag whenever calling deferred finalizers not to recurse. diff --git a/gc.c b/gc.c index fe2c225f23..bc55f78a50 100644 --- a/gc.c +++ b/gc.c @@ -2691,36 +2691,41 @@ rb_gc_copy_finalizer(VALUE dest, VALUE obj) } static VALUE -run_single_final(VALUE arg) +run_single_final(VALUE final, VALUE objid) { - VALUE *args = (VALUE *)arg; + const VALUE cmd = RARRAY_AREF(final, 1); + const int level = OBJ_TAINTED(cmd) ? + RUBY_SAFE_LEVEL_MAX : FIX2INT(RARRAY_AREF(final, 0)); - return rb_check_funcall(args[0], idCall, 1, args+1); + rb_set_safe_level_force(level); + return rb_check_funcall(cmd, idCall, 1, &objid); } static void run_finalizer(rb_objspace_t *objspace, VALUE obj, VALUE table) { long i; - VALUE args[2]; + int status; const int safe = rb_safe_level(); const VALUE errinfo = rb_errinfo(); + const VALUE objid = nonspecial_obj_id(obj); + rb_thread_t *const th = GET_THREAD(); + volatile long finished = 0; - args[1] = nonspecial_obj_id(obj); - - for (i=0; i