diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-06-19 04:27:08 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-06-19 04:27:08 +0000 |
commit | 33b85912480abe4dbf28bdbd596d84f5efc3245d (patch) | |
tree | 4cf1e7be89f670cb30023a2aab14f6f129d32a40 /eval.c | |
parent | 934064ba5ac136bcfeb1b32c76bd064044156dfc (diff) | |
download | ruby-33b85912480abe4dbf28bdbd596d84f5efc3245d.tar.gz |
* 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: svn+ssh://ci.ruby-lang.org/ruby/trunk@6477 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'eval.c')
-rw-r--r-- | eval.c | 9 |
1 files changed, 7 insertions, 2 deletions
@@ -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; |