ruby-changes:5111
From: knu <ko1@a...>
Date: Mon, 26 May 2008 12:13:10 +0900 (JST)
Subject: [ruby-changes:5111] Ruby:r16606 (ruby_1_8_7): Merge from ruby_1_8.
knu 2008-05-26 12:12:58 +0900 (Mon, 26 May 2008)
New Revision: 16606
Modified files:
branches/ruby_1_8_7/ChangeLog
branches/ruby_1_8_7/eval.c
branches/ruby_1_8_7/marshal.c
Log:
Merge from ruby_1_8.
http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8_7/marshal.c?r1=16606&r2=16605&diff_format=u
http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8_7/eval.c?r1=16606&r2=16605&diff_format=u
http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8_7/ChangeLog?r1=16606&r2=16605&diff_format=u
Index: ruby_1_8_7/ChangeLog
===================================================================
--- ruby_1_8_7/ChangeLog (revision 16605)
+++ ruby_1_8_7/ChangeLog (revision 16606)
@@ -1,3 +1,11 @@
+Mon May 26 12:12:26 2008 Akinori MUSHA <knu@i...>
+
+ * marshal.c (dump_ensure, load_ensure): should return values.
+
+ * eval.c (yield_under, yield_under_i, yield_args_under_i)
+ (specific_eval, rb_obj_instance_exec, Init_eval): Implement
+ Object#instance_exec(), a 1.9 feature.
+
Mon May 26 11:53:21 2008 Akinori MUSHA <knu@i...>
* eval.c (rb_yield_0, proc_invoke, proc_arity): allow passing a
Index: ruby_1_8_7/marshal.c
===================================================================
--- ruby_1_8_7/marshal.c (revision 16605)
+++ ruby_1_8_7/marshal.c (revision 16606)
@@ -703,7 +703,7 @@
dump_ensure(arg)
struct dump_arg *arg;
{
- if (RBASIC(arg->str)->klass) return; /* ignore reentrant */
+ if (RBASIC(arg->str)->klass) return 0; /* ignore reentrant */
st_free_table(arg->symbols);
st_free_table(arg->data);
if (arg->taint) {
@@ -1388,7 +1388,7 @@
load_ensure(arg)
struct load_arg *arg;
{
- if (RBASIC(arg->data)->klass) return; /* ignore reentrant */
+ if (RBASIC(arg->data)->klass) return 0; /* ignore reentrant */
st_free_table(arg->symbols);
return 0;
}
Index: ruby_1_8_7/eval.c
===================================================================
--- ruby_1_8_7/eval.c (revision 16605)
+++ ruby_1_8_7/eval.c (revision 16606)
@@ -6746,12 +6746,28 @@
return rb_yield_0(self, self, ruby_class, YIELD_PUBLIC_DEF, Qfalse);
}
+static VALUE
+yield_args_under_i(vinfo)
+ VALUE vinfo;
+{
+ VALUE *info = (VALUE *)vinfo;
+
+ return rb_yield_0(info[0], info[1], ruby_class, YIELD_PUBLIC_DEF, Qtrue);
+}
+
/* block eval under the class/module context */
static VALUE
-yield_under(under, self)
- VALUE under, self;
+yield_under(under, self, args)
+ VALUE under, self, args;
{
- return exec_under(yield_under_i, under, 0, self);
+ if (args == Qundef) {
+ return exec_under(yield_under_i, under, 0, self);
+ }
+ else {
+ VALUE info[2] = { args, self };
+
+ return exec_under(yield_args_under_i, under, 0, (VALUE)info);
+ }
}
static VALUE
@@ -6764,7 +6780,7 @@
if (argc > 0) {
rb_raise(rb_eArgError, "wrong number of arguments (%d for 0)", argc);
}
- return yield_under(klass, self);
+ return yield_under(klass, self, Qundef);
}
else {
char *file = "(eval)";
@@ -6836,6 +6852,41 @@
/*
* call-seq:
+ * obj.instance_exec(arg...) {|var...| block } => obj
+ *
+ * Executes the given block within the context of the receiver
+ * (_obj_). In order to set the context, the variable +self+ is set
+ * to _obj_ while the code is executing, giving the code access to
+ * _obj_'s instance variables. Arguments are passed as block parameters.
+ *
+ * class KlassWithSecret
+ * def initialize
+ * @secret = 99
+ * end
+ * end
+ * k = KlassWithSecret.new
+ * k.instance_exec(5) {|x| @secret+x } #=> 104
+ */
+
+VALUE
+rb_obj_instance_exec(argc, argv, self)
+ int argc;
+ VALUE *argv;
+ VALUE self;
+{
+ VALUE klass;
+
+ if (SPECIAL_CONST_P(self)) {
+ klass = Qnil;
+ }
+ else {
+ klass = rb_singleton_class(self);
+ }
+ return yield_under(klass, self, rb_ary_new4(argc, argv));
+}
+
+/*
+ * call-seq:
* mod.class_eval(string [, filename [, lineno]]) => obj
* mod.module_eval {|| block } => obj
*
@@ -8120,6 +8171,7 @@
rb_define_method(rb_mKernel, "send", rb_f_send, -1);
rb_define_method(rb_mKernel, "__send__", rb_f_send, -1);
rb_define_method(rb_mKernel, "instance_eval", rb_obj_instance_eval, -1);
+ rb_define_method(rb_mKernel, "instance_exec", rb_obj_instance_exec, -1);
rb_define_private_method(rb_cModule, "append_features", rb_mod_append_features, 1);
rb_define_private_method(rb_cModule, "extend_object", rb_mod_extend_object, 1);
--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/