* 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
Родитель 48653d5ef0
Коммит df27d91fc4
6 изменённых файлов: 87 добавлений и 31 удалений

Просмотреть файл

@ -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>
* 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.
[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>
* 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
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
[ruby-core:4302]

Просмотреть файл

@ -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;

88
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 <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
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 <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
#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);

Просмотреть файл

@ -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

Просмотреть файл

@ -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

Просмотреть файл

@ -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{