summaryrefslogtreecommitdiff
path: root/eval.c
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-08-19 07:33:15 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-08-19 07:33:15 +0000
commitd73fa69935a2d6657e13bfe2d3fa266fef55614d (patch)
tree2b91232f5c6bf8601ed38337fae396d2e391a41e /eval.c
parent4c57b2b49905d652fb500249c34303d8c0571155 (diff)
* dir.c (free_dir): fix memory leak. reported by yamamoto
madoka. * eval.c (bind_eval): new method. [RCR 251] * string.c (rb_str_clear): new method. [ruby-dev:24104] * io.c (rb_io_reopen): should clear allocated OpenFile. pointed out by Guy Decoux. [ruby-core:03288] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@6794 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'eval.c')
-rw-r--r--eval.c26
1 files changed, 25 insertions, 1 deletions
diff --git a/eval.c b/eval.c
index bc17cb68de..d3472da40e 100644
--- a/eval.c
+++ b/eval.c
@@ -6380,8 +6380,14 @@ rb_obj_instance_eval(argc, argv, self)
VALUE *argv;
VALUE self;
{
- VALUE klass = rb_singleton_class(self);
+ VALUE klass;
+ if (FIXNUM_P(self) || SYMBOL_P(self)) {
+ klass = Qnil;
+ }
+ else {
+ klass = rb_singleton_class(self);
+ }
return specific_eval(argc, argv, klass, self);
}
@@ -7881,6 +7887,23 @@ rb_f_binding(self)
return bind;
}
+static VALUE
+bind_eval(argc, argv, bind)
+ int argc;
+ VALUE *argv;
+ VALUE bind;
+{
+ struct BLOCK *data;
+ VALUE args[4];
+ VALUE dummy;
+
+ rb_scan_args(argc, argv, "12", &args[0], &args[2], &args[3]);
+ args[1] = bind;
+ Data_Get_Struct(bind, struct BLOCK, data);
+
+ return rb_f_eval(argc+1, args, data->self);
+}
+
#define PROC_TSHIFT (FL_USHIFT+1)
#define PROC_TMASK (FL_USER1|FL_USER2|FL_USER3)
#define PROC_TMAX (PROC_TMASK >> PROC_TSHIFT)
@@ -9306,6 +9329,7 @@ Init_Binding()
rb_undef_alloc_func(rb_cBinding);
rb_undef_method(CLASS_OF(rb_cBinding), "new");
rb_define_method(rb_cBinding, "clone", proc_clone, 0);
+ rb_define_method(rb_cBinding, "eval", bind_eval, -1);
rb_define_global_function("binding", rb_f_binding, 0);
}