static VALUE rb_obj_instance_exec(VALUE self, SEL sel, int argc, VALUE *argv) { VALUE klass; if (SPECIAL_CONST_P(self)) { klass = 0; } else { klass = rb_singleton_class(self); } return rb_vm_yield_under(klass, self, argc, argv); }
static VALUE specific_eval(int argc, VALUE *argv, VALUE klass, VALUE self) { VALUE retval; // XXX: not exception-safe const long old_version = RCLASS_VERSION(klass); if (rb_block_given_p()) { if (argc > 0) { rb_raise(rb_eArgError, "wrong number of arguments (%d for 0)", argc); } rb_vm_set_current_scope(klass, SCOPE_PUBLIC); retval = rb_vm_yield_under(klass, self, 1, &self); } else { const char *file = "(eval)"; int line = 1; if (argc == 0) { rb_raise(rb_eArgError, "block not supplied"); } if (rb_safe_level() >= 4) { StringValue(argv[0]); } else { SafeStringValue(argv[0]); } if (argc > 3) { const char *name = rb_id2name(rb_frame_callee()); rb_raise(rb_eArgError, "wrong number of arguments: %s(src) or %s{..}", name, name); } if (argc > 2) { line = NUM2INT(argv[2]); } if (argc > 1) { file = StringValuePtr(argv[1]); } rb_vm_set_current_scope(klass, SCOPE_PUBLIC); retval = eval_under(self, klass, argv[0], Qnil, file, line); } RCLASS_SET_VERSION(klass, old_version); return retval; }
static VALUE rb_obj_instance_exec(VALUE self, SEL sel, int argc, VALUE *argv) { VALUE klass; if (SPECIAL_CONST_P(self)) { klass = Qnil; } else { klass = rb_singleton_class(self); } if (!rb_block_given_p()) { rb_raise(rb_eLocalJumpError, "no block given"); } return rb_vm_yield_under(klass, self, argc, argv); }
static VALUE specific_eval(int argc, VALUE *argv, VALUE klass, VALUE self) { if (rb_block_given_p()) { if (argc > 0) { rb_raise(rb_eArgError, "wrong number of arguments (%d for 0)", argc); } return rb_vm_yield_under(klass, self, 0, NULL); } else { const char *file = "(eval)"; int line = 1; if (argc == 0) { rb_raise(rb_eArgError, "block not supplied"); } if (rb_safe_level() >= 4) { StringValue(argv[0]); } else { SafeStringValue(argv[0]); } if (argc > 3) { const char *name = rb_id2name(rb_frame_callee()); rb_raise(rb_eArgError, "wrong number of arguments: %s(src) or %s{..}", name, name); } if (argc > 2) { line = NUM2INT(argv[2]); } if (argc > 1) { file = StringValuePtr(argv[1]); } return eval_string(self, klass, argv[0], Qnil, file, line); } }
VALUE rb_mod_module_exec(VALUE mod, SEL sel, int argc, VALUE *argv) { return rb_vm_yield_under(mod, mod, argc, argv); }