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/