mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
gc.c: reduce EXEC_TAGs
* gc.c (run_finalizer): set and restore safe level here to reduce nested EXEC_TAGs. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@51291 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
ca5cfbe1ab
commit
e9e08a5b10
2 changed files with 21 additions and 18 deletions
|
@ -1,3 +1,8 @@
|
|||
Sat Jul 18 19:52:17 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||
|
||||
* gc.c (run_finalizer): set and restore safe level here to reduce
|
||||
nested EXEC_TAGs.
|
||||
|
||||
Sat Jul 18 18:45:22 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||
|
||||
* eval.c (ruby_cleanup): error_handle() returns exit status to the
|
||||
|
|
34
gc.c
34
gc.c
|
@ -2551,34 +2551,32 @@ static VALUE
|
|||
run_single_final(VALUE arg)
|
||||
{
|
||||
VALUE *args = (VALUE *)arg;
|
||||
rb_eval_cmd(args[0], args[1], (int)args[2]);
|
||||
return Qnil;
|
||||
|
||||
return rb_check_funcall(args[0], idCall, 1, args+1);
|
||||
}
|
||||
|
||||
static void
|
||||
run_finalizer(rb_objspace_t *objspace, VALUE obj, VALUE table)
|
||||
{
|
||||
long i;
|
||||
int status;
|
||||
VALUE args[3];
|
||||
VALUE objid = nonspecial_obj_id(obj);
|
||||
VALUE args[2];
|
||||
const int safe = rb_safe_level();
|
||||
const VALUE errinfo = rb_errinfo();
|
||||
|
||||
if (RARRAY_LEN(table) > 0) {
|
||||
args[1] = rb_obj_freeze(rb_ary_new3(1, objid));
|
||||
}
|
||||
else {
|
||||
args[1] = 0;
|
||||
}
|
||||
args[1] = nonspecial_obj_id(obj);
|
||||
|
||||
args[2] = (VALUE)rb_safe_level();
|
||||
for (i=0; i<RARRAY_LEN(table); i++) {
|
||||
VALUE final = RARRAY_AREF(table, i);
|
||||
args[0] = RARRAY_AREF(final, 1);
|
||||
args[2] = FIX2INT(RARRAY_AREF(final, 0));
|
||||
status = 0;
|
||||
const VALUE final = RARRAY_AREF(table, i);
|
||||
const VALUE cmd = RARRAY_AREF(final, 1);
|
||||
const int level = OBJ_TAINTED(cmd) ?
|
||||
RUBY_SAFE_LEVEL_MAX : FIX2INT(RARRAY_AREF(final, 0));
|
||||
int status = 0;
|
||||
|
||||
args[0] = cmd;
|
||||
rb_set_safe_level_force(level);
|
||||
rb_protect(run_single_final, (VALUE)args, &status);
|
||||
if (status)
|
||||
rb_set_errinfo(Qnil);
|
||||
rb_set_safe_level_force(safe);
|
||||
rb_set_errinfo(errinfo);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue