From df27e0c3649979429650b8df573656846863c837 Mon Sep 17 00:00:00 2001 From: nobu Date: Thu, 21 Jul 2016 21:28:34 +0000 Subject: 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 --- gc.c | 39 ++++++++++++++++++++++----------------- 1 file changed, 22 insertions(+), 17 deletions(-) (limited to 'gc.c') 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(); - - args[1] = nonspecial_obj_id(obj); - - for (i=0; i