* lib/observer.rb: a patch from nornagon <nornagon@gmail.com>

merged to allow arbitrary names for update methods.
  [ruby-core:05416]

* eval.c (rb_f_fcall): new method to avoid inefficiency of
  obj.instance_eval{send(...)} tricks.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9082 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
matz 2005-09-05 08:40:27 +00:00
parent 48653d5ef0
commit df27d91fc4
6 changed files with 87 additions and 31 deletions

View File

@ -1,3 +1,15 @@
Mon Sep 5 17:03:07 2005 Yukihiro Matsumoto <matz@ruby-lang.org>
* lib/ostruct.rb: a patch from Florian Gross <florgro@gmail.com>
merged to allow recursive inspect (and to_s) for OpenStruct.
[ruby-core:05532]
Mon Sep 5 08:20:19 2005 Yukihiro Matsumoto <matz@ruby-lang.org>
* lib/observer.rb: a patch from nornagon <nornagon@gmail.com>
merged to allow arbitrary names for update methods.
[ruby-core:05416]
Mon Sep 5 07:01:12 2005 GOTOU Yuuzou <gotoyuzo@notwork.org> Mon Sep 5 07:01:12 2005 GOTOU Yuuzou <gotoyuzo@notwork.org>
* ext/openssl/openssl/lib/openssl/buffering.rb (Buffering#do_write): * ext/openssl/openssl/lib/openssl/buffering.rb (Buffering#do_write):
@ -8,6 +20,11 @@ Sun Sep 4 15:01:35 2005 Minero Aoki <aamine@loveruby.net>
* parse.y (f_arg): Ripper should not do semantic check. * parse.y (f_arg): Ripper should not do semantic check.
[ruby-dev:26948] [ruby-dev:26948]
Sat Sep 3 23:52:35 2005 Yukihiro Matsumoto <matz@ruby-lang.org>
* eval.c (rb_f_fcall): new method to avoid inefficiency of
obj.instance_eval{send(...)} tricks.
Sat Sep 3 13:59:31 2005 Tanaka Akira <akr@m17n.org> Sat Sep 3 13:59:31 2005 Tanaka Akira <akr@m17n.org>
* lib/pathname.rb (Pathname#descend): Pathname.new("./a/b/c").descend * lib/pathname.rb (Pathname#descend): Pathname.new("./a/b/c").descend
@ -3333,7 +3350,7 @@ Fri Mar 4 12:45:17 2005 Charles Mills <cmills@freeshell.org>
(rb_define_const), accessors (rb_define_attr), and makes a (rb_define_const), accessors (rb_define_attr), and makes a
couple fixes. [ruby-core:4307] couple fixes. [ruby-core:4307]
Fri Mar 4 12:45:17 2005 Florian Gro <florgro@gmail.com> Fri Mar 4 12:45:17 2005 Florian Gross <florgro@gmail.com>
* lib/rdoc/parsers/parse_rb.rb: Logic for def Builtin.method() end * lib/rdoc/parsers/parse_rb.rb: Logic for def Builtin.method() end
[ruby-core:4302] [ruby-core:4302]

View File

@ -407,7 +407,8 @@ rb_include_module(klass, module)
break; break;
} }
} }
c = RCLASS(c)->super = include_class_new(module, RCLASS(c)->super); RCLASS(c)->super = include_class_new(module, RCLASS(c)->super);
c = RCLASS(c)->super;
changed = 1; changed = 1;
skip: skip:
module = RCLASS(module)->super; module = RCLASS(module)->super;

88
eval.c
View File

@ -6062,32 +6062,14 @@ rb_apply(recv, mid, args)
return rb_call(CLASS_OF(recv), recv, mid, argc, argv, 1); return rb_call(CLASS_OF(recv), recv, mid, argc, argv, 1);
} }
/*
* call-seq:
* obj.send(symbol [, args...]) => obj
* obj.__send__(symbol [, args...]) => obj
*
* Invokes the method identified by _symbol_, passing it any
* arguments specified. You can use <code>__send__</code> if the name
* +send+ clashes with an existing method in _obj_.
*
* class Klass
* def hello(*args)
* "Hello " + args.join(' ')
* end
* end
* k = Klass.new
* k.send :hello, "gentle", "readers" #=> "Hello gentle readers"
*/
static VALUE static VALUE
rb_f_send(argc, argv, recv) send_fcall(argc, argv, recv, scope)
int argc; int argc;
VALUE *argv; VALUE *argv;
VALUE recv; VALUE recv;
int scope;
{ {
VALUE vid; VALUE vid;
int scope = (ruby_frame->flags & FRAME_FUNC) ? 1 : 0;
if (argc == 0) rb_raise(rb_eArgError, "no method name given"); if (argc == 0) rb_raise(rb_eArgError, "no method name given");
@ -6099,6 +6081,61 @@ rb_f_send(argc, argv, recv)
return vid; return vid;
} }
/*
* call-seq:
* obj.send(symbol [, args...]) => obj
* obj.__send__(symbol [, args...]) => obj
*
* Invokes the method identified by _symbol_, passing it any
* arguments specified. You can use <code>__send__</code> if the name
* +send+ clashes with an existing method in _obj_. Raises an
* NoMethodError exception for private methods except when it is
* called in function call style.
*
* class Klass
* def hello(*args)
* "Hello " + args.join(' ')
* end
* end
* k = Klass.new
* k.send :hello, "gentle", "readers" #=> "Hello gentle readers"
*
* 1.send(:puts, "foo") # NoMethodError exception
* send(:puts, "foo") # prints "foo"
*/
static VALUE
rb_f_send(argc, argv, recv)
int argc;
VALUE *argv;
VALUE recv;
{
int scope = (ruby_frame->flags & FRAME_FUNC) ? 1 : 0;
return send_fcall(argc, argv, recv, scope);
}
/*
* call-seq:
* obj.fcall(symbol [, args...]) => obj
*
* Invokes the method identified by _symbol_, passing it any
* arguments specified. Unlike send, which calls private methods only
* when it is invoked in function call style, fcall always aware of
* private methods.
*
* 1.fcall(:puts, "hello") # prints "foo"
*/
static VALUE
rb_f_fcall(argc, argv, recv)
int argc;
VALUE *argv;
VALUE recv;
{
return send_fcall(argc, argv, recv, 1);
}
VALUE VALUE
#ifdef HAVE_STDARG_PROTOTYPES #ifdef HAVE_STDARG_PROTOTYPES
rb_funcall(VALUE recv, ID mid, int n, ...) rb_funcall(VALUE recv, ID mid, int n, ...)
@ -7458,18 +7495,18 @@ rb_mod_modfunc(argc, argv, module)
*/ */
static VALUE static VALUE
rb_mod_append_features(module, include) rb_mod_append_features(module, dest)
VALUE module, include; VALUE module, dest;
{ {
switch (TYPE(include)) { switch (TYPE(dest)) {
case T_CLASS: case T_CLASS:
case T_MODULE: case T_MODULE:
break; break;
default: default:
Check_Type(include, T_CLASS); Check_Type(dest, T_CLASS);
break; break;
} }
rb_include_module(include, module); rb_include_module(dest, module);
return module; return module;
} }
@ -7907,6 +7944,7 @@ Init_eval()
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, "__send__", rb_f_send, -1); rb_define_method(rb_mKernel, "__send__", rb_f_send, -1);
rb_define_method(rb_mKernel, "fcall", rb_f_fcall, -1);
rb_define_method(rb_mKernel, "instance_eval", rb_obj_instance_eval, -1); rb_define_method(rb_mKernel, "instance_eval", rb_obj_instance_eval, -1);
rb_define_private_method(rb_cModule, "append_features", rb_mod_append_features, 1); rb_define_private_method(rb_cModule, "append_features", rb_mod_append_features, 1);

View File

@ -1186,13 +1186,13 @@ class TkFont
def dup def dup
src = self src = self
obj = super() obj = super()
obj.instance_eval{ initialize(src) } obj.fcall(:initialize, src)
obj obj
end end
def clone def clone
src = self src = self
obj = super() obj = super()
obj.instance_eval{ initialize(src) } obj.fcall(:initialize, src)
obj obj
end end
=end =end

View File

@ -78,7 +78,7 @@ module Tk
def self.new(name, keys=nil) def self.new(name, keys=nil)
unless obj = Tk_IMGTBL["::icon::#{name}"] unless obj = Tk_IMGTBL["::icon::#{name}"]
obj = allocate() obj = allocate()
obj.instance_eval{initialize(name, keys)} obj.fcall(:initialize, name, keys)
end end
obj obj
end end

View File

@ -710,7 +710,7 @@ class TkTreeCtrl_demo
systemHighlightText = @SystemHighlightText systemHighlightText = @SystemHighlightText
proc_disp_styles_in_item = proc{|item| proc_disp_styles_in_item = proc{|item|
master.instance_eval{ display_styles_in_item(item) } master.fcall(:display_styles_in_item, item)
} }
@demo_scripts.instance_eval{ @demo_scripts.instance_eval{