summaryrefslogtreecommitdiff
path: root/vm_eval.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-08-06 15:31:13 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-08-06 15:31:13 +0000
commit28827e61d153e39ad3fe1e6fecbf27c09140fe75 (patch)
tree898387ecb8856fbaa33e2345b1fa4292f7522d61 /vm_eval.c
parent353833c466f30accbc96c5121d2b9487db411e2a (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.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/vm_eval.c b/vm_eval.c
index d1bc93b697..216607e439 100644
--- a/vm_eval.c
+++ b/vm_eval.c
@@ -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);