diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-08-06 15:31:13 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-08-06 15:31:13 +0000 |
commit | 28827e61d153e39ad3fe1e6fecbf27c09140fe75 (patch) | |
tree | 898387ecb8856fbaa33e2345b1fa4292f7522d61 /vm_eval.c | |
parent | 353833c466f30accbc96c5121d2b9487db411e2a (diff) |
method in instance_eval
* class.c (rb_special_singleton_class_of): utility function.
* vm_eval.c (eval_under): special deal for class variable scope with
instance_eval.
* vm_eval.c (rb_obj_instance_eval, rb_obj_instance_exec): allow method
definition in instance_eval of special constants. [ruby-core:28324]
[Bug #2788]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@36647 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'vm_eval.c')
-rw-r--r-- | vm_eval.c | 7 |
1 files changed, 5 insertions, 2 deletions
@@ -1320,6 +1320,9 @@ eval_under(VALUE under, VALUE self, VALUE src, const char *file, int line) { NODE *cref = vm_cref_push(GET_THREAD(), under, NOEX_PUBLIC, NULL); + if (FL_TEST(under, FL_SINGLETON) || (SPECIAL_CONST_P(self) && !NIL_P(under))) { + cref->flags |= NODE_FL_CREF_PUSHED_BY_EVAL; + } if (rb_safe_level() >= 4) { StringValue(src); } @@ -1387,7 +1390,7 @@ rb_obj_instance_eval(int argc, VALUE *argv, VALUE self) VALUE klass; if (SPECIAL_CONST_P(self)) { - klass = Qnil; + klass = rb_special_singleton_class(self); } else { klass = rb_singleton_class(self); @@ -1419,7 +1422,7 @@ rb_obj_instance_exec(int argc, VALUE *argv, VALUE self) VALUE klass; if (SPECIAL_CONST_P(self)) { - klass = Qnil; + klass = rb_special_singleton_class(self); } else { klass = rb_singleton_class(self); |