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 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 yield_under(klass, self, Qundef); } else { const char *file = "(eval)"; int line = 1; //RHO rb_raise(rb_eNotImpError, "Not implemented: only eval of block is supported."); //RHO if (argc == 0) { rb_raise(rb_eArgError, "block not supplied"); } else { 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_under(klass, self, argv[0], file, line); } }