summaryrefslogtreecommitdiff
path: root/eval.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-06-19 04:27:08 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-06-19 04:27:08 +0000
commit33b85912480abe4dbf28bdbd596d84f5efc3245d (patch)
tree4cf1e7be89f670cb30023a2aab14f6f129d32a40 /eval.c
parent934064ba5ac136bcfeb1b32c76bd064044156dfc (diff)
* 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.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/eval.c b/eval.c
index 14f651d824..b068b52c49 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;