diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-06-29 01:31:37 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-06-29 01:31:37 +0000 |
commit | ac3c46901c3d1f75e5b66505056a1d1fa50e5343 (patch) | |
tree | b7a4f25583d86efe86ee2ba9bd82cbbd28f83764 /eval.c | |
parent | 63dedc7de4877eb4d7fba2716a2eeedb31efa794 (diff) | |
download | ruby-ac3c46901c3d1f75e5b66505056a1d1fa50e5343.tar.gz |
* eval.c (rb_eval_cmd, rb_thread_trap_eval): restore safe level.
* gc.c (define_final, run_final): preserve and restore safe level for
finalizers. [ruby-core:03058]
* signal.c (signal_exec, rb_trap_exit, trap): preserve and restore
safe level for signal handlers. [ruby-dev:23829]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@6541 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'eval.c')
-rw-r--r-- | eval.c | 35 |
1 files changed, 22 insertions, 13 deletions
@@ -1667,19 +1667,29 @@ jump_tag_but_local_jump(state, val) } VALUE -rb_eval_cmd(cmd, arg, tcheck) +rb_eval_cmd(cmd, arg, level) VALUE cmd, arg; - int tcheck; + int level; { int state; VALUE val = Qnil; /* OK */ struct SCOPE *saved_scope; volatile int safe = ruby_safe_level; + if (OBJ_TAINTED(cmd)) { + level = 4; + } if (TYPE(cmd) != T_STRING) { PUSH_ITER(ITER_NOT); - val = rb_funcall2(cmd, rb_intern("call"), RARRAY(arg)->len, RARRAY(arg)->ptr); + PUSH_TAG(PROT_NONE); + ruby_safe_level = level; + if ((state = EXEC_TAG()) == 0) { + val = rb_funcall2(cmd, rb_intern("call"), RARRAY(arg)->len, RARRAY(arg)->ptr); + } + ruby_safe_level = safe; + POP_TAG(); POP_ITER(); + if (state) JUMP_TAG(state); return val; } @@ -1692,9 +1702,7 @@ rb_eval_cmd(cmd, arg, tcheck) ruby_frame->self = ruby_top_self; PUSH_CREF(ruby_wrapper ? ruby_wrapper : rb_cObject); - if (tcheck && OBJ_TAINTED(cmd)) { - ruby_safe_level = 4; - } + ruby_safe_level = level; PUSH_TAG(PROT_NONE); if ((state = EXEC_TAG()) == 0) { @@ -9537,9 +9545,9 @@ thread_reset_raised() static void rb_thread_ready _((rb_thread_t)); static VALUE -rb_trap_eval(cmd, sig) +rb_trap_eval(cmd, sig, safe) VALUE cmd; - int sig; + int sig, safe; { int state; VALUE val = Qnil; /* OK */ @@ -9550,7 +9558,7 @@ rb_trap_eval(cmd, sig) PUSH_TAG(PROT_NONE); PUSH_ITER(ITER_NOT); if ((state = EXEC_TAG()) == 0) { - val = rb_eval_cmd(cmd, rb_ary_new3(1, INT2FIX(sig)), 0); + val = rb_eval_cmd(cmd, rb_ary_new3(1, INT2FIX(sig)), safe); } POP_ITER(); POP_TAG(); @@ -9760,7 +9768,7 @@ static int th_raise_argc; static VALUE th_raise_argv[2]; static NODE *th_raise_node; static VALUE th_cmd; -static int th_sig; +static int th_sig, th_safe; static char *th_signm; #define RESTORE_NORMAL 1 @@ -9852,7 +9860,7 @@ rb_thread_switch(n) rb_interrupt(); break; case RESTORE_TRAP: - rb_trap_eval(th_cmd, th_sig); + rb_trap_eval(th_cmd, th_sig, th_safe); break; case RESTORE_RAISE: ruby_frame->last_func = 0; @@ -11784,9 +11792,9 @@ rb_thread_signal_raise(sig) } void -rb_thread_trap_eval(cmd, sig) +rb_thread_trap_eval(cmd, sig, safe) VALUE cmd; - int sig; + int sig, safe; { rb_thread_critical = 0; if (!rb_thread_dead(curr_thread)) { @@ -11796,6 +11804,7 @@ rb_thread_trap_eval(cmd, sig) } th_cmd = cmd; th_sig = sig; + th_safe = safe; curr_thread = main_thread; rb_thread_restore_context(curr_thread, RESTORE_TRAP); } |