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>
|
Sat Jul 18 18:45:22 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
* eval.c (ruby_cleanup): error_handle() returns exit status to the
|
* 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)
|
run_single_final(VALUE arg)
|
||||||
{
|
{
|
||||||
VALUE *args = (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
|
static void
|
||||||
run_finalizer(rb_objspace_t *objspace, VALUE obj, VALUE table)
|
run_finalizer(rb_objspace_t *objspace, VALUE obj, VALUE table)
|
||||||
{
|
{
|
||||||
long i;
|
long i;
|
||||||
int status;
|
VALUE args[2];
|
||||||
VALUE args[3];
|
const int safe = rb_safe_level();
|
||||||
VALUE objid = nonspecial_obj_id(obj);
|
const VALUE errinfo = rb_errinfo();
|
||||||
|
|
||||||
if (RARRAY_LEN(table) > 0) {
|
args[1] = nonspecial_obj_id(obj);
|
||||||
args[1] = rb_obj_freeze(rb_ary_new3(1, objid));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
args[1] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
args[2] = (VALUE)rb_safe_level();
|
|
||||||
for (i=0; i<RARRAY_LEN(table); i++) {
|
for (i=0; i<RARRAY_LEN(table); i++) {
|
||||||
VALUE final = RARRAY_AREF(table, i);
|
const VALUE final = RARRAY_AREF(table, i);
|
||||||
args[0] = RARRAY_AREF(final, 1);
|
const VALUE cmd = RARRAY_AREF(final, 1);
|
||||||
args[2] = FIX2INT(RARRAY_AREF(final, 0));
|
const int level = OBJ_TAINTED(cmd) ?
|
||||||
status = 0;
|
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);
|
rb_protect(run_single_final, (VALUE)args, &status);
|
||||||
if (status)
|
rb_set_safe_level_force(safe);
|
||||||
rb_set_errinfo(Qnil);
|
rb_set_errinfo(errinfo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue