From df27d91fc4de9215d6af58de191b2c105ef88678 Mon Sep 17 00:00:00 2001 From: matz Date: Mon, 5 Sep 2005 08:40:27 +0000 Subject: [PATCH] * lib/observer.rb: a patch from nornagon 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 --- ChangeLog | 19 +++++- class.c | 3 +- eval.c | 88 ++++++++++++++++++------- ext/tk/lib/tk/font.rb | 4 +- ext/tk/lib/tkextlib/ICONS/icons.rb | 2 +- ext/tk/sample/tkextlib/treectrl/demo.rb | 2 +- 6 files changed, 87 insertions(+), 31 deletions(-) diff --git a/ChangeLog b/ChangeLog index 82c0becf11..45511ac3ef 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +Mon Sep 5 17:03:07 2005 Yukihiro Matsumoto + + * lib/ostruct.rb: a patch from Florian Gross + merged to allow recursive inspect (and to_s) for OpenStruct. + [ruby-core:05532] + +Mon Sep 5 08:20:19 2005 Yukihiro Matsumoto + + * lib/observer.rb: a patch from nornagon + merged to allow arbitrary names for update methods. + [ruby-core:05416] + Mon Sep 5 07:01:12 2005 GOTOU Yuuzou * ext/openssl/openssl/lib/openssl/buffering.rb (Buffering#do_write): @@ -8,6 +20,11 @@ Sun Sep 4 15:01:35 2005 Minero Aoki * parse.y (f_arg): Ripper should not do semantic check. [ruby-dev:26948] +Sat Sep 3 23:52:35 2005 Yukihiro Matsumoto + + * 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 * lib/pathname.rb (Pathname#descend): Pathname.new("./a/b/c").descend @@ -3333,7 +3350,7 @@ Fri Mar 4 12:45:17 2005 Charles Mills (rb_define_const), accessors (rb_define_attr), and makes a couple fixes. [ruby-core:4307] -Fri Mar 4 12:45:17 2005 Florian Gro +Fri Mar 4 12:45:17 2005 Florian Gross * lib/rdoc/parsers/parse_rb.rb: Logic for def Builtin.method() end [ruby-core:4302] diff --git a/class.c b/class.c index b3cec55065..a950b44de2 100644 --- a/class.c +++ b/class.c @@ -407,7 +407,8 @@ rb_include_module(klass, module) 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; skip: module = RCLASS(module)->super; diff --git a/eval.c b/eval.c index c52d889d62..3e7504ae05 100644 --- a/eval.c +++ b/eval.c @@ -6062,32 +6062,14 @@ rb_apply(recv, mid, args) 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 __send__ 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 -rb_f_send(argc, argv, recv) +send_fcall(argc, argv, recv, scope) int argc; VALUE *argv; VALUE recv; + int scope; { VALUE vid; - int scope = (ruby_frame->flags & FRAME_FUNC) ? 1 : 0; if (argc == 0) rb_raise(rb_eArgError, "no method name given"); @@ -6099,6 +6081,61 @@ rb_f_send(argc, argv, recv) 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 __send__ 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 #ifdef HAVE_STDARG_PROTOTYPES rb_funcall(VALUE recv, ID mid, int n, ...) @@ -7458,18 +7495,18 @@ rb_mod_modfunc(argc, argv, module) */ static VALUE -rb_mod_append_features(module, include) - VALUE module, include; +rb_mod_append_features(module, dest) + VALUE module, dest; { - switch (TYPE(include)) { + switch (TYPE(dest)) { case T_CLASS: case T_MODULE: break; default: - Check_Type(include, T_CLASS); + Check_Type(dest, T_CLASS); break; } - rb_include_module(include, module); + rb_include_module(dest, 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, "fcall", rb_f_fcall, -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); diff --git a/ext/tk/lib/tk/font.rb b/ext/tk/lib/tk/font.rb index 8e63558cae..73e0ac4682 100644 --- a/ext/tk/lib/tk/font.rb +++ b/ext/tk/lib/tk/font.rb @@ -1186,13 +1186,13 @@ class TkFont def dup src = self obj = super() - obj.instance_eval{ initialize(src) } + obj.fcall(:initialize, src) obj end def clone src = self obj = super() - obj.instance_eval{ initialize(src) } + obj.fcall(:initialize, src) obj end =end diff --git a/ext/tk/lib/tkextlib/ICONS/icons.rb b/ext/tk/lib/tkextlib/ICONS/icons.rb index 8a37e35ebf..e02b579d0a 100644 --- a/ext/tk/lib/tkextlib/ICONS/icons.rb +++ b/ext/tk/lib/tkextlib/ICONS/icons.rb @@ -78,7 +78,7 @@ module Tk def self.new(name, keys=nil) unless obj = Tk_IMGTBL["::icon::#{name}"] obj = allocate() - obj.instance_eval{initialize(name, keys)} + obj.fcall(:initialize, name, keys) end obj end diff --git a/ext/tk/sample/tkextlib/treectrl/demo.rb b/ext/tk/sample/tkextlib/treectrl/demo.rb index e3d0180584..dc8cfadaf2 100644 --- a/ext/tk/sample/tkextlib/treectrl/demo.rb +++ b/ext/tk/sample/tkextlib/treectrl/demo.rb @@ -710,7 +710,7 @@ class TkTreeCtrl_demo systemHighlightText = @SystemHighlightText 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{