From 0b3c0368eaf7e5c416ae046b2c93ba6f729363af Mon Sep 17 00:00:00 2001 From: nobu Date: Sat, 19 Jun 2004 04:27:08 +0000 Subject: * eval.c (proc_set_safe_level, proc_invoke, rb_mod_define_method): not set $SAFE for methods defined from Proc. [ruby-dev:23697] git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@6477 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- eval.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) (limited to 'eval.c') diff --git a/eval.c b/eval.c index 14f651d82..b068b52c4 100644 --- a/eval.c +++ b/eval.c @@ -7877,9 +7877,12 @@ rb_f_binding(self) #define PROC_TSHIFT (FL_USHIFT+1) #define PROC_TMASK (FL_USER1|FL_USER2|FL_USER3) #define PROC_TMAX (PROC_TMASK >> PROC_TSHIFT) +#define PROC_NOSAFE FL_USER4 #define SAFE_LEVEL_MAX PROC_TMASK +#define proc_safe_level_p(data) (!(RBASIC(data)->flags & PROC_NOSAFE)) + static void proc_save_safe_level(data) VALUE data; @@ -7900,6 +7903,7 @@ static void proc_set_safe_level(data) VALUE data; { + if (!proc_safe_level_p(data)) return; ruby_safe_level = proc_get_safe_level(data); } @@ -8081,7 +8085,7 @@ proc_invoke(proc, args, self, klass) ruby_block = old_block; ruby_wrapper = old_wrapper; ruby_dyna_vars = old_dvars; - ruby_safe_level = safe; + if (proc_safe_level_p(proc)) ruby_safe_level = safe; switch (state) { case 0: @@ -8428,7 +8432,7 @@ block_pass(self, node) POP_TAG(); POP_ITER(); ruby_block = old_block; - ruby_safe_level = safe; + if (proc_safe_level_p(proc)) ruby_safe_level = safe; switch (state) {/* escape from orphan block */ case 0: @@ -9147,6 +9151,7 @@ rb_mod_define_method(argc, argv, mod) struct BLOCK *block; body = proc_clone(body); + RBASIC(body)->flags |= PROC_NOSAFE; Data_Get_Struct(body, struct BLOCK, block); block->frame.last_func = id; block->frame.orig_func = id; -- cgit