summaryrefslogtreecommitdiff
path: root/vm_eval.c
diff options
context:
space:
mode:
Diffstat (limited to 'vm_eval.c')
-rw-r--r--vm_eval.c57
1 files changed, 20 insertions, 37 deletions
diff --git a/vm_eval.c b/vm_eval.c
index 73739fc3a5..0abb4644f9 100644
--- a/vm_eval.c
+++ b/vm_eval.c
@@ -1860,7 +1860,7 @@ eval_string_wrap_protect(VALUE data)
{
const struct eval_string_wrap_arg *const arg = (struct eval_string_wrap_arg*)data;
rb_cref_t *cref = rb_vm_cref_new_toplevel();
- cref->klass = arg->klass;
+ cref->klass_or_self = arg->klass;
return eval_string_with_cref(arg->top_self, rb_str_new_cstr(arg->str), cref, rb_str_new_cstr("eval"), 1);
}
@@ -1922,7 +1922,7 @@ rb_eval_cmd_kw(VALUE cmd, VALUE arg, int kw_splat)
/* block eval under the class/module context */
static VALUE
-yield_under(VALUE under, VALUE self, int argc, const VALUE *argv, int kw_splat)
+yield_under(VALUE self, int singleton, int argc, const VALUE *argv, int kw_splat)
{
rb_execution_context_t *ec = GET_EC();
rb_control_frame_t *cfp = ec->cfp;
@@ -1963,7 +1963,9 @@ yield_under(VALUE under, VALUE self, int argc, const VALUE *argv, int kw_splat)
VM_FORCE_WRITE_SPECIAL_CONST(&VM_CF_LEP(ec->cfp)[VM_ENV_DATA_INDEX_SPECVAL], new_block_handler);
}
- cref = vm_cref_push(ec, under, ep, TRUE);
+ VM_ASSERT(singleton || RB_TYPE_P(self, T_MODULE) || RB_TYPE_P(self, T_CLASS));
+ cref = vm_cref_push(ec, self, ep, TRUE, singleton);
+
return vm_yield_with_cref(ec, argc, argv, kw_splat, cref, is_lambda);
}
@@ -1981,7 +1983,7 @@ rb_yield_refine_block(VALUE refinement, VALUE refinements)
struct rb_captured_block new_captured = *captured;
VALUE new_block_handler = VM_BH_FROM_ISEQ_BLOCK(&new_captured);
const VALUE *ep = captured->ep;
- rb_cref_t *cref = vm_cref_push(ec, refinement, ep, TRUE);
+ rb_cref_t *cref = vm_cref_push(ec, refinement, ep, TRUE, FALSE);
CREF_REFINEMENTS_SET(cref, refinements);
VM_FORCE_WRITE_SPECIAL_CONST(&VM_CF_LEP(ec->cfp)[VM_ENV_DATA_INDEX_SPECVAL], new_block_handler);
new_captured.self = refinement;
@@ -1991,19 +1993,20 @@ rb_yield_refine_block(VALUE refinement, VALUE refinements)
/* string eval under the class/module context */
static VALUE
-eval_under(VALUE under, VALUE self, VALUE src, VALUE file, int line)
+eval_under(VALUE self, int singleton, VALUE src, VALUE file, int line)
{
- rb_cref_t *cref = vm_cref_push(GET_EC(), under, NULL, SPECIAL_CONST_P(self) && !NIL_P(under));
+ rb_cref_t *cref = vm_cref_push(GET_EC(), self, NULL, FALSE, singleton);
SafeStringValue(src);
+
return eval_string_with_cref(self, src, cref, file, line);
}
static VALUE
-specific_eval(int argc, const VALUE *argv, VALUE klass, VALUE self, int kw_splat)
+specific_eval(int argc, const VALUE *argv, VALUE self, int singleton, int kw_splat)
{
if (rb_block_given_p()) {
rb_check_arity(argc, 0, 0);
- return yield_under(klass, self, 1, &self, kw_splat);
+ return yield_under(self, singleton, 1, &self, kw_splat);
}
else {
VALUE file = Qundef;
@@ -2019,23 +2022,7 @@ specific_eval(int argc, const VALUE *argv, VALUE klass, VALUE self, int kw_splat
file = argv[1];
if (!NIL_P(file)) StringValue(file);
}
- return eval_under(klass, self, code, file, line);
- }
-}
-
-static VALUE
-singleton_class_for_eval(VALUE self)
-{
- if (SPECIAL_CONST_P(self)) {
- return rb_special_singleton_class(self);
- }
- switch (BUILTIN_TYPE(self)) {
- case T_FLOAT: case T_BIGNUM: case T_SYMBOL:
- return Qnil;
- case T_STRING:
- if (FL_TEST_RAW(self, RSTRING_FSTR)) return Qnil;
- default:
- return rb_singleton_class(self);
+ return eval_under(self, singleton, code, file, line);
}
}
@@ -2075,15 +2062,13 @@ singleton_class_for_eval(VALUE self)
static VALUE
rb_obj_instance_eval_internal(int argc, const VALUE *argv, VALUE self)
{
- VALUE klass = singleton_class_for_eval(self);
- return specific_eval(argc, argv, klass, self, RB_PASS_CALLED_KEYWORDS);
+ return specific_eval(argc, argv, self, TRUE, RB_PASS_CALLED_KEYWORDS);
}
VALUE
rb_obj_instance_eval(int argc, const VALUE *argv, VALUE self)
{
- VALUE klass = singleton_class_for_eval(self);
- return specific_eval(argc, argv, klass, self, RB_NO_KEYWORDS);
+ return specific_eval(argc, argv, self, TRUE, RB_NO_KEYWORDS);
}
/*
@@ -2107,15 +2092,13 @@ rb_obj_instance_eval(int argc, const VALUE *argv, VALUE self)
static VALUE
rb_obj_instance_exec_internal(int argc, const VALUE *argv, VALUE self)
{
- VALUE klass = singleton_class_for_eval(self);
- return yield_under(klass, self, argc, argv, RB_PASS_CALLED_KEYWORDS);
+ return yield_under(self, TRUE, argc, argv, RB_PASS_CALLED_KEYWORDS);
}
VALUE
rb_obj_instance_exec(int argc, const VALUE *argv, VALUE self)
{
- VALUE klass = singleton_class_for_eval(self);
- return yield_under(klass, self, argc, argv, RB_NO_KEYWORDS);
+ return yield_under(self, TRUE, argc, argv, RB_NO_KEYWORDS);
}
/*
@@ -2148,13 +2131,13 @@ rb_obj_instance_exec(int argc, const VALUE *argv, VALUE self)
static VALUE
rb_mod_module_eval_internal(int argc, const VALUE *argv, VALUE mod)
{
- return specific_eval(argc, argv, mod, mod, RB_PASS_CALLED_KEYWORDS);
+ return specific_eval(argc, argv, mod, FALSE, RB_PASS_CALLED_KEYWORDS);
}
VALUE
rb_mod_module_eval(int argc, const VALUE *argv, VALUE mod)
{
- return specific_eval(argc, argv, mod, mod, RB_NO_KEYWORDS);
+ return specific_eval(argc, argv, mod, FALSE, RB_NO_KEYWORDS);
}
/*
@@ -2182,13 +2165,13 @@ rb_mod_module_eval(int argc, const VALUE *argv, VALUE mod)
static VALUE
rb_mod_module_exec_internal(int argc, const VALUE *argv, VALUE mod)
{
- return yield_under(mod, mod, argc, argv, RB_PASS_CALLED_KEYWORDS);
+ return yield_under(mod, FALSE, argc, argv, RB_PASS_CALLED_KEYWORDS);
}
VALUE
rb_mod_module_exec(int argc, const VALUE *argv, VALUE mod)
{
- return yield_under(mod, mod, argc, argv, RB_NO_KEYWORDS);
+ return yield_under(mod, FALSE, argc, argv, RB_NO_KEYWORDS);
}
/*