зеркало из https://github.com/github/ruby.git
* eval.c (rb_mod_define_method): should save safe_level in the
proc object. [ruby-dev:28146] * test/drb/drbtest.rb (DRbService::self.ext_service): increase timeout limit. a patch from Kazuhiro NISHIYAMA <zn at mbf.nifty.com>. [ruby-dev:28132] * eval.c (ev_const_get): fixed a bug in constant reference during instance_eval. [yarv-dev:707] * eval.c (ev_const_defined): ditto. * lib/yaml.rb (YAML::add_domain_type): typo fixed. a patch from Joel VanderWerf <vjoel at path.berkeley.edu>. [ruby-talk:165285] [ruby-core:6995] * ext/digest/sha2/sha2.c (ULL): support AIX C. a patch from Kailden <kailden at gmail.com>. [ruby-core:06984] * ext/syck/rubyext.c (rb_syck_compile): avoid potential memory leak. * ext/syck/rubyext.c (syck_set_ivars): avoid potential memory leak by explicit symbol allocation. * lib/delegate.rb (Delegator::method_missing): should delegate block as well. * lib/cgi.rb (CGI::QueryExtension::MorphingBody): fix criteria to use Tempfile. A fix from Zev Blut <rubyzbibd at ubit.com>. [ruby-core:06076] * string.c: remove global functions work on $_. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9757 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
Родитель
e5226ea394
Коммит
de3bff164c
48
ChangeLog
48
ChangeLog
|
@ -3,6 +3,11 @@ Thu Dec 29 17:02:07 2005 Tanaka Akira <akr@m17n.org>
|
|||
* test/ruby/envutil.rb (EnvUtil.rubybin): search "ruby" instead of
|
||||
"miniruby". [ruby-dev:28140]
|
||||
|
||||
Thu Dec 29 14:35:10 2005 Yukihiro Matsumoto <matz@ruby-lang.org>
|
||||
|
||||
* eval.c (rb_mod_define_method): should save safe_level in the
|
||||
proc object. [ruby-dev:28146]
|
||||
|
||||
Thu Dec 29 11:22:34 2005 Hirokazu Yamamoto <ocean@m2.ccsnet.ne.jp>
|
||||
|
||||
* lib/generator.rb: reimplemented Generator class with Thread instead of
|
||||
|
@ -23,6 +28,12 @@ Tue Dec 27 23:59:53 2005 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
|||
|
||||
* lib/optparse.rb (CompletingHash#match): fix for 1.9.
|
||||
|
||||
Tue Dec 27 16:59:52 2005 Yukihiro Matsumoto <matz@ruby-lang.org>
|
||||
|
||||
* test/drb/drbtest.rb (DRbService::self.ext_service): increase
|
||||
timeout limit. a patch from Kazuhiro NISHIYAMA
|
||||
<zn at mbf.nifty.com>. [ruby-dev:28132]
|
||||
|
||||
Tue Dec 27 14:17:55 2005 Tanaka Akira <akr@m17n.org>
|
||||
|
||||
* configure.in: define IA64 for portability. (HP aC++/ANSI C doesn't
|
||||
|
@ -74,6 +85,22 @@ Tue Dec 27 08:22:15 2005 GOTOU Yuuzou <gotoyuzo@notwork.org>
|
|||
* ext/openssl/lib/openssl/ssl.rb (OpenSSL::SSL::SSLSocket#post_connection_chech):
|
||||
treat wildcard character in commonName. [ruby-dev:28121]
|
||||
|
||||
Mon Dec 26 08:50:36 2005 Yukihiro Matsumoto <matz@ruby-lang.org>
|
||||
|
||||
* eval.c (ev_const_get): fixed a bug in constant reference during
|
||||
instance_eval. [yarv-dev:707]
|
||||
|
||||
* eval.c (ev_const_defined): ditto.
|
||||
|
||||
* lib/yaml.rb (YAML::add_domain_type): typo fixed. a patch from
|
||||
Joel VanderWerf <vjoel at path.berkeley.edu>.
|
||||
[ruby-talk:165285] [ruby-core:6995]
|
||||
|
||||
Fri Dec 23 10:30:23 2005 Yukihiro Matsumoto <matz@ruby-lang.org>
|
||||
|
||||
* ext/digest/sha2/sha2.c (ULL): support AIX C. a patch from
|
||||
Kailden <kailden at gmail.com>. [ruby-core:06984]
|
||||
|
||||
Wed Dec 21 16:47:35 2005 Hirokazu Yamamoto <ocean@m2.ccsnet.ne.jp>
|
||||
|
||||
* file.c (w32_io_info): should return handle because FileIndex is
|
||||
|
@ -179,6 +206,14 @@ Sat Dec 17 21:50:41 2005 Hirokazu Yamamoto <ocean@m2.ccsnet.ne.jp>
|
|||
* ext/syck/rubyext.c (syck_mark_parser): should mark anchor nodes
|
||||
because they hold ruby objects. (ie: rb_syck_bad_anchor_handler)
|
||||
|
||||
Sat Dec 17 11:00:17 2005 Yukihiro Matsumoto <matz@ruby-lang.org>
|
||||
|
||||
* ext/syck/rubyext.c (rb_syck_compile): avoid potential memory
|
||||
leak.
|
||||
|
||||
* ext/syck/rubyext.c (syck_set_ivars): avoid potential memory
|
||||
leak by explicit symbol allocation.
|
||||
|
||||
Sat Dec 17 03:57:01 2005 Tanaka Akira <akr@m17n.org>
|
||||
|
||||
* bignum.c (rb_big_rshift): fix a GC problem on
|
||||
|
@ -206,6 +241,19 @@ Fri Dec 16 11:44:43 2005 Hirokazu Yamamoto <ocean@m2.ccsnet.ne.jp>
|
|||
|
||||
... these fixes won't fix [ruby-dev:27839]. more work is needed.
|
||||
|
||||
Fri Dec 16 04:38:55 2005 Yukihiro Matsumoto <matz@ruby-lang.org>
|
||||
|
||||
* lib/delegate.rb (Delegator::method_missing): should delegate
|
||||
block as well.
|
||||
|
||||
Thu Dec 15 19:57:12 2005 Yukihiro Matsumoto <matz@ruby-lang.org>
|
||||
|
||||
* lib/cgi.rb (CGI::QueryExtension::MorphingBody): fix criteria to
|
||||
use Tempfile. A fix from Zev Blut <rubyzbibd at ubit.com>.
|
||||
[ruby-core:06076]
|
||||
|
||||
* string.c: remove global functions work on $_.
|
||||
|
||||
Thu Dec 15 12:35:14 2005 Yukihiro Matsumoto <matz@ruby-lang.org>
|
||||
|
||||
* lib/tmpdir.rb: merged RDoc patch from Eric Hodel <drbrain at
|
||||
|
|
112
enum.c
112
enum.c
|
@ -570,9 +570,9 @@ all_i(VALUE i, VALUE *memo)
|
|||
* <code>all?</code> will return <code>true</code> only if none of the
|
||||
* collection members are <code>false</code> or <code>nil</code>.)
|
||||
*
|
||||
* %w{ ant bear cat}.all? {|word| word.length >= 3} #=> true
|
||||
* %w{ ant bear cat}.all? {|word| word.length >= 4} #=> false
|
||||
* [ nil, true, 99 ].all? #=> false
|
||||
* %w{ant bear cat}.all? {|word| word.length >= 3} #=> true
|
||||
* %w{ant bear cat}.all? {|word| word.length >= 4} #=> false
|
||||
* [ nil, true, 99 ].all? #=> false
|
||||
*
|
||||
*/
|
||||
|
||||
|
@ -617,9 +617,9 @@ any_i(VALUE i, VALUE *memo)
|
|||
* of the collection members is not <code>false</code> or
|
||||
* <code>nil</code>.
|
||||
*
|
||||
* %w{ ant bear cat}.any? {|word| word.length >= 3} #=> true
|
||||
* %w{ ant bear cat}.any? {|word| word.length >= 4} #=> true
|
||||
* [ nil, true, 99 ].any? #=> true
|
||||
* %w{ant bear cat}.any? {|word| word.length >= 3} #=> true
|
||||
* %w{ant bear cat}.any? {|word| word.length >= 4} #=> true
|
||||
* [ nil, true, 99 ].any? #=> true
|
||||
*
|
||||
*/
|
||||
|
||||
|
@ -632,6 +632,104 @@ enum_any(VALUE obj)
|
|||
return result;
|
||||
}
|
||||
|
||||
static VALUE
|
||||
one_iter_i(VALUE i, VALUE *memo)
|
||||
{
|
||||
if (RTEST(rb_yield(i))) {
|
||||
if (*memo == Qundef) {
|
||||
*memo = Qtrue;
|
||||
}
|
||||
else if (*memo == Qtrue) {
|
||||
*memo = Qfalse;
|
||||
}
|
||||
}
|
||||
return Qnil;
|
||||
}
|
||||
|
||||
static VALUE
|
||||
one_i(VALUE i, VALUE *memo)
|
||||
{
|
||||
if (RTEST(i)) {
|
||||
if (*memo == Qundef) {
|
||||
*memo = Qtrue;
|
||||
}
|
||||
else if (*memo == Qtrue) {
|
||||
*memo = Qfalse;
|
||||
}
|
||||
}
|
||||
return Qnil;
|
||||
}
|
||||
|
||||
/*
|
||||
* call-seq:
|
||||
* enum.one? [{|obj| block }] => true or false
|
||||
*
|
||||
* Passes each element of the collection to the given block. The method
|
||||
* returns <code>true</code> if the block returns <code>true</code>
|
||||
* exactly once. If the block is not given, <code>one?</code> will return
|
||||
* <code>true</code> only if exactly one of the collection members are
|
||||
* true.
|
||||
*
|
||||
* %w{ant bear cat}.one? {|word| word.length == 4} #=> true
|
||||
* %w{ant bear cat}.one? {|word| word.length >= 4} #=> false
|
||||
* [ nil, true, 99 ].one? #=> true
|
||||
*
|
||||
*/
|
||||
|
||||
static VALUE
|
||||
enum_one(VALUE obj)
|
||||
{
|
||||
VALUE result = Qundef;
|
||||
|
||||
rb_iterate(rb_each, obj, rb_block_given_p() ? one_iter_i : one_i, (VALUE)&result);
|
||||
if (result == Qundef) return Qfalse;
|
||||
return result;
|
||||
}
|
||||
|
||||
static VALUE
|
||||
none_iter_i(VALUE i, VALUE *memo)
|
||||
{
|
||||
if (RTEST(rb_yield(i))) {
|
||||
*memo = Qfalse;
|
||||
rb_iter_break();
|
||||
}
|
||||
return Qnil;
|
||||
}
|
||||
|
||||
static VALUE
|
||||
none_i(VALUE i, VALUE *memo)
|
||||
{
|
||||
if (RTEST(i)) {
|
||||
*memo = Qfalse;
|
||||
rb_iter_break();
|
||||
}
|
||||
return Qnil;
|
||||
}
|
||||
|
||||
/*
|
||||
* call-seq:
|
||||
* enum.none? [{|obj| block }] => true or false
|
||||
*
|
||||
* Passes each element of the collection to the given block. The method
|
||||
* returns <code>true</code> if the block never returns <code>true</code>
|
||||
* for all elements. If the block is not given, <code>one?</code> will return
|
||||
* <code>true</code> only if any of the collection members is true.
|
||||
*
|
||||
* %w{ant bear cat}.one? {|word| word.length == 4} #=> true
|
||||
* %w{ant bear cat}.one? {|word| word.length >= 4} #=> false
|
||||
* [ nil, true, 99 ].one? #=> true
|
||||
*
|
||||
*/
|
||||
|
||||
static VALUE
|
||||
enum_none(VALUE obj)
|
||||
{
|
||||
VALUE result = Qtrue;
|
||||
|
||||
rb_iterate(rb_each, obj, rb_block_given_p() ? none_iter_i : none_i, (VALUE)&result);
|
||||
return result;
|
||||
}
|
||||
|
||||
static VALUE
|
||||
min_i(VALUE i, VALUE *memo)
|
||||
{
|
||||
|
@ -998,6 +1096,8 @@ Init_Enumerable(void)
|
|||
rb_define_method(rb_mEnumerable,"partition", enum_partition, 0);
|
||||
rb_define_method(rb_mEnumerable,"all?", enum_all, 0);
|
||||
rb_define_method(rb_mEnumerable,"any?", enum_any, 0);
|
||||
rb_define_method(rb_mEnumerable,"one?", enum_one, 0);
|
||||
rb_define_method(rb_mEnumerable,"none?", enum_none, 0);
|
||||
rb_define_method(rb_mEnumerable,"min", enum_min, 0);
|
||||
rb_define_method(rb_mEnumerable,"max", enum_max, 0);
|
||||
rb_define_method(rb_mEnumerable,"min_by", enum_min_by, 0);
|
||||
|
|
35
eval.c
35
eval.c
|
@ -373,7 +373,6 @@ static ID init, eqq, each, aref, aset, match, missing;
|
|||
static ID added, singleton_added;
|
||||
static ID __id__, __send__, respond_to;
|
||||
|
||||
#define NOEX_TAINTED 8
|
||||
#define NOEX_SAFE(n) ((n) >> 4)
|
||||
#define NOEX_WITH(n, v) ((n) | (v) << 4)
|
||||
#define NOEX_WITH_SAFE(n) NOEX_WITH(n, ruby_safe_level)
|
||||
|
@ -1766,12 +1765,13 @@ ev_const_defined(NODE *cref, ID id, VALUE self)
|
|||
while (cbase && cbase->nd_next) {
|
||||
struct RClass *klass = RCLASS(cbase->nd_clss);
|
||||
|
||||
if (NIL_P(klass)) return rb_const_defined(CLASS_OF(self), id);
|
||||
if (klass->iv_tbl && st_lookup(klass->iv_tbl, id, &result)) {
|
||||
if (result == Qundef && NIL_P(rb_autoload_p((VALUE)klass, id))) {
|
||||
return Qfalse;
|
||||
if (!NIL_P(klass)) {
|
||||
if (klass->iv_tbl && st_lookup(klass->iv_tbl, id, &result)) {
|
||||
if (result == Qundef && NIL_P(rb_autoload_p((VALUE)klass, id))) {
|
||||
return Qfalse;
|
||||
}
|
||||
return Qtrue;
|
||||
}
|
||||
return Qtrue;
|
||||
}
|
||||
cbase = cbase->nd_next;
|
||||
}
|
||||
|
@ -1787,13 +1787,15 @@ ev_const_get(NODE *cref, ID id, VALUE self)
|
|||
while (cbase && cbase->nd_next) {
|
||||
VALUE klass = cbase->nd_clss;
|
||||
|
||||
if (NIL_P(klass)) return rb_const_get(CLASS_OF(self), id);
|
||||
while (RCLASS(klass)->iv_tbl && st_lookup(RCLASS(klass)->iv_tbl, id, &result)) {
|
||||
if (result == Qundef) {
|
||||
if (!RTEST(rb_autoload_load(klass, id))) break;
|
||||
continue;
|
||||
if (!NIL_P(klass)) {
|
||||
while (RCLASS(klass)->iv_tbl &&
|
||||
st_lookup(RCLASS(klass)->iv_tbl, id, &result)) {
|
||||
if (result == Qundef) {
|
||||
if (!RTEST(rb_autoload_load(klass, id))) break;
|
||||
continue;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
cbase = cbase->nd_next;
|
||||
}
|
||||
|
@ -8038,11 +8040,11 @@ bind_eval(int argc, VALUE *argv, VALUE bind)
|
|||
#define PROC_TSHIFT (FL_USHIFT+1)
|
||||
#define PROC_TMASK (FL_USER1|FL_USER2|FL_USER3)
|
||||
#define PROC_TMAX (PROC_TMASK >> PROC_TSHIFT)
|
||||
#define PROC_NOSAFE FL_USER4
|
||||
#define PROC_SAFE_SAVED FL_USER4
|
||||
|
||||
#define SAFE_LEVEL_MAX PROC_TMASK
|
||||
|
||||
#define proc_safe_level_p(data) (!(RBASIC(data)->flags & PROC_NOSAFE))
|
||||
#define proc_safe_level_p(data) (RBASIC(data)->flags & PROC_SAFE_SAVED)
|
||||
|
||||
static void
|
||||
proc_save_safe_level(VALUE data)
|
||||
|
@ -8050,6 +8052,7 @@ proc_save_safe_level(VALUE data)
|
|||
int safe = ruby_safe_level;
|
||||
if (safe > PROC_TMAX) safe = PROC_TMAX;
|
||||
FL_SET(data, (safe << PROC_TSHIFT) & PROC_TMASK);
|
||||
FL_SET(data, PROC_SAFE_SAVED);
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -8887,7 +8890,7 @@ rb_method_call(int argc, VALUE *argv, VALUE method)
|
|||
rb_raise(rb_eTypeError, "can't call unbound method; bind first");
|
||||
}
|
||||
if (OBJ_TAINTED(method)) {
|
||||
safe = NOEX_WITH(data->safe_level, 4)|NOEX_TAINTED;
|
||||
safe = NOEX_WITH(data->safe_level, 4);
|
||||
}
|
||||
else {
|
||||
safe = data->safe_level;
|
||||
|
@ -9328,7 +9331,7 @@ rb_mod_define_method(int argc, VALUE *argv, VALUE mod)
|
|||
struct BLOCK *block;
|
||||
|
||||
body = proc_clone(body);
|
||||
RBASIC(body)->flags |= PROC_NOSAFE;
|
||||
proc_save_safe_level(body);
|
||||
Data_Get_Struct(body, struct BLOCK, block);
|
||||
block->frame.callee = id;
|
||||
block->frame.this_func = id;
|
||||
|
|
|
@ -67,7 +67,7 @@ typedef uint8_t sha2_byte; /* Exactly 1 byte */
|
|||
typedef uint32_t sha2_word32; /* Exactly 4 bytes */
|
||||
typedef uint64_t sha2_word64; /* Exactly 8 bytes */
|
||||
|
||||
#if defined(__GNUC__) || defined(_HPUX_SOURCE)
|
||||
#if defined(__GNUC__) || defined(_HPUX_SOURCE) || defined(__IBMC__)
|
||||
#define ULL(number) number##ULL
|
||||
#else
|
||||
#define ULL(number) (uint64_t)(number)
|
||||
|
|
|
@ -115,14 +115,15 @@ rb_syck_compile(self, port)
|
|||
oid = syck_parse( parser );
|
||||
syck_lookup_sym( parser, oid, (char **)&sav );
|
||||
|
||||
ret = S_ALLOC_N( char, strlen( sav->buffer ) + 3 );
|
||||
bc = rb_str_new(0, strlen( sav->buffer ) + 3);
|
||||
ret = RSTRING(bc)->ptr;
|
||||
ret[0] = '\0';
|
||||
strcat( ret, "D\n" );
|
||||
strcat( ret, sav->buffer );
|
||||
|
||||
syck_free_parser( parser );
|
||||
|
||||
bc = rb_str_new2( ret ); S_FREE( ret );
|
||||
rb_str_resize( bc, strlen(ret) );
|
||||
if ( taint ) OBJ_TAINT( bc );
|
||||
return bc;
|
||||
}
|
||||
|
@ -1042,13 +1043,13 @@ syck_set_ivars( vars, obj )
|
|||
{
|
||||
VALUE ivname = rb_ary_entry( vars, 0 );
|
||||
char *ivn;
|
||||
ID ivns;
|
||||
StringValue( ivname );
|
||||
ivn = S_ALLOC_N( char, RSTRING(ivname)->len + 2 );
|
||||
ivn[0] = '@';
|
||||
ivn[1] = '\0';
|
||||
strncat( ivn, RSTRING(ivname)->ptr, RSTRING(ivname)->len );
|
||||
rb_iv_set( obj, ivn, rb_ary_entry( vars, 1 ) );
|
||||
snprintf(ivn, RSTRING(ivname)->len + 1, "@%s", RSTRING(ivname)->ptr);
|
||||
ivns = rb_intern(ivn);
|
||||
S_FREE( ivn );
|
||||
rb_ivar_set( obj, ivns, rb_ary_entry( vars, 1 ) );
|
||||
return Qnil;
|
||||
}
|
||||
|
||||
|
|
71
lib/cgi.rb
71
lib/cgi.rb
|
@ -993,22 +993,9 @@ class CGI
|
|||
|
||||
loop do
|
||||
head = nil
|
||||
if 10240 < content_length
|
||||
require "tempfile"
|
||||
body = Tempfile.new("CGI")
|
||||
else
|
||||
begin
|
||||
require "stringio"
|
||||
body = StringIO.new
|
||||
rescue LoadError
|
||||
require "tempfile"
|
||||
body = Tempfile.new("CGI")
|
||||
end
|
||||
end
|
||||
body.binmode if defined? body.binmode
|
||||
body = MorphingBody.new
|
||||
|
||||
until head and /#{boundary}(?:#{EOL}|--)/n.match(buf)
|
||||
|
||||
if (not head) and /#{EOL}#{EOL}/n.match(buf)
|
||||
buf = buf.sub(/\A((?:.|\n)*?#{EOL})#{EOL}/n) do
|
||||
head = $1.dup
|
||||
|
@ -1042,6 +1029,7 @@ class CGI
|
|||
""
|
||||
end
|
||||
|
||||
p body
|
||||
body.rewind
|
||||
|
||||
/Content-Disposition:.* filename="?([^\";]*)"?/ni.match(head)
|
||||
|
@ -1062,7 +1050,7 @@ class CGI
|
|||
end
|
||||
|
||||
/Content-Disposition:.* name="?([^\";]*)"?/ni.match(head)
|
||||
name = $1.dup
|
||||
name = ($1 || "").dup
|
||||
|
||||
if params.has_key?(name)
|
||||
params[name].push(body)
|
||||
|
@ -1102,6 +1090,59 @@ class CGI
|
|||
end
|
||||
private :read_from_cmdline
|
||||
|
||||
# A wrapper class to use a StringIO object as the body and switch
|
||||
# to a TempFile when the passed threshold is passed.
|
||||
class MorphingBody
|
||||
begin
|
||||
require "stringio"
|
||||
@@small_buffer = lambda{StringIO.new}
|
||||
rescue LoadError
|
||||
require "tempfile"
|
||||
@@small_buffer = lambda{
|
||||
n = Tempfile.new("CGI")
|
||||
n.binmode
|
||||
n
|
||||
}
|
||||
end
|
||||
|
||||
def initialize(morph_threshold = 10240)
|
||||
@threshold = morph_threshold
|
||||
@body = @@small_buffer.call
|
||||
@cur_size = 0
|
||||
@morph_check = true
|
||||
end
|
||||
|
||||
def print(data)
|
||||
if @morph_check && (@cur_size + data.size > @threshold)
|
||||
convert_body
|
||||
end
|
||||
@body.print data
|
||||
end
|
||||
def rewind
|
||||
@body.rewind
|
||||
end
|
||||
def path
|
||||
@body.path
|
||||
end
|
||||
|
||||
# returns the true body object.
|
||||
def extract
|
||||
@body
|
||||
end
|
||||
|
||||
private
|
||||
def convert_body
|
||||
new_body = TempFile.new("CGI")
|
||||
new_body.binmode if defined? @body.binmode
|
||||
new_body.binmode if defined? new_body.binmode
|
||||
|
||||
@body.rewind
|
||||
new_body.print @body.read
|
||||
@body = new_body
|
||||
@morph_check = false
|
||||
end
|
||||
end
|
||||
|
||||
# Initialize the data from the query.
|
||||
#
|
||||
# Handles multipart forms (in particular, forms that involve file uploads).
|
||||
|
|
179
lib/delegate.rb
179
lib/delegate.rb
|
@ -121,61 +121,93 @@ class Delegator
|
|||
undef_method m
|
||||
end
|
||||
|
||||
#
|
||||
# Pass in the _obj_ to delegate method calls to. All methods supported by
|
||||
# _obj_ will be delegated to.
|
||||
#
|
||||
def initialize(obj)
|
||||
__setobj__(obj)
|
||||
end
|
||||
module MethodDelegation
|
||||
#
|
||||
# Pass in the _obj_ to delegate method calls to. All methods supported by
|
||||
# _obj_ will be delegated to.
|
||||
#
|
||||
def initialize(obj)
|
||||
__setobj__(obj)
|
||||
end
|
||||
|
||||
# Handles the magic of delegation through \_\_getobj\_\_.
|
||||
def method_missing(m, *args)
|
||||
begin
|
||||
target = self.__getobj__
|
||||
unless target.respond_to?(m)
|
||||
super(m, *args)
|
||||
# Handles the magic of delegation through \_\_getobj\_\_.
|
||||
def method_missing(m, *args, &block)
|
||||
begin
|
||||
target = self.__getobj__
|
||||
unless target.respond_to?(m)
|
||||
super(m, *args, &block)
|
||||
else
|
||||
target.__send__(m, *args, &block)
|
||||
end
|
||||
rescue Exception
|
||||
$@.delete_if{|s| /^#{__FILE__}:\d+:in `method_missing'$/ =~ s} #`
|
||||
::Kernel::raise
|
||||
end
|
||||
target.__send__(m, *args)
|
||||
rescue Exception
|
||||
$@.delete_if{|s| /^#{__FILE__}:\d+:in `method_missing'$/ =~ s} #`
|
||||
::Kernel::raise
|
||||
end
|
||||
|
||||
#
|
||||
# Checks for a method provided by this the delegate object by fowarding the
|
||||
# call through \_\_getobj\_\_.
|
||||
#
|
||||
def respond_to?(m)
|
||||
return true if super
|
||||
return self.__getobj__.respond_to?(m)
|
||||
end
|
||||
|
||||
#
|
||||
# Returns true if two objects are considered same.
|
||||
#
|
||||
def ==(obj)
|
||||
return true if obj.equal?(self)
|
||||
self.__getobj__ == obj
|
||||
end
|
||||
|
||||
#
|
||||
# Returns true only if two objects are identical.
|
||||
#
|
||||
def equal?(obj)
|
||||
self.object_id == obj.object_id
|
||||
end
|
||||
|
||||
#
|
||||
# This method must be overridden by subclasses and should return the object
|
||||
# method calls are being delegated to.
|
||||
#
|
||||
def __getobj__
|
||||
raise NotImplementedError, "need to define `__getobj__'"
|
||||
end
|
||||
|
||||
#
|
||||
# This method must be overridden by subclasses and change the object delegate
|
||||
# to _obj_.
|
||||
#
|
||||
def __setobj__(obj)
|
||||
raise NotImplementedError, "need to define `__setobj__'"
|
||||
end
|
||||
|
||||
# Serialization support for the object returned by \_\_getobj\_\_.
|
||||
def marshal_dump
|
||||
__getobj__
|
||||
end
|
||||
# Reinitializes delegation from a serialized object.
|
||||
def marshal_load(obj)
|
||||
__setobj__(obj)
|
||||
end
|
||||
|
||||
# Clone support for the object returned by \_\_getobj\_\_.
|
||||
def clone
|
||||
new = super
|
||||
new.__setobj__(__getobj__.clone)
|
||||
new
|
||||
end
|
||||
# Duplication support for the object returned by \_\_getobj\_\_.
|
||||
def dup
|
||||
new = super
|
||||
new.__setobj__(__getobj__.dup)
|
||||
new
|
||||
end
|
||||
end
|
||||
|
||||
#
|
||||
# Checks for a method provided by this the delegate object by fowarding the
|
||||
# call through \_\_getobj\_\_.
|
||||
#
|
||||
def respond_to?(m)
|
||||
return true if super
|
||||
return self.__getobj__.respond_to?(m)
|
||||
end
|
||||
|
||||
#
|
||||
# This method must be overridden by subclasses and should return the object
|
||||
# method calls are being delegated to.
|
||||
#
|
||||
def __getobj__
|
||||
raise NotImplementedError, "need to define `__getobj__'"
|
||||
end
|
||||
|
||||
#
|
||||
# This method must be overridden by subclasses and change the object delegate
|
||||
# to _obj_.
|
||||
#
|
||||
def __setobj__(obj)
|
||||
raise NotImplementedError, "need to define `__setobj__'"
|
||||
end
|
||||
|
||||
# Serialization support for the object returned by \_\_getobj\_\_.
|
||||
def marshal_dump
|
||||
__getobj__
|
||||
end
|
||||
# Reinitializes delegation from a serialized object.
|
||||
def marshal_load(obj)
|
||||
__setobj__(obj)
|
||||
end
|
||||
include MethodDelegation
|
||||
end
|
||||
|
||||
#
|
||||
|
@ -208,19 +240,6 @@ class SimpleDelegator<Delegator
|
|||
raise ArgumentError, "cannot delegate to self" if self.equal?(obj)
|
||||
@_sd_obj = obj
|
||||
end
|
||||
|
||||
# Clone support for the object returned by \_\_getobj\_\_.
|
||||
def clone
|
||||
copy = super
|
||||
copy.__setobj__(__getobj__.clone)
|
||||
copy
|
||||
end
|
||||
# Duplication support for the object returned by \_\_getobj\_\_.
|
||||
def dup
|
||||
copy = super
|
||||
copy.__setobj__(__getobj__.dup)
|
||||
copy
|
||||
end
|
||||
end
|
||||
|
||||
# :stopdoc:
|
||||
|
@ -243,24 +262,12 @@ def DelegateClass(superclass)
|
|||
klass = Class.new
|
||||
methods = superclass.public_instance_methods(true)
|
||||
methods -= [
|
||||
"__id__", "object_id", "__send__", "respond_to?",
|
||||
"__id__", "object_id", "__send__", "respond_to?", "==", "equal?",
|
||||
"initialize", "method_missing", "__getobj__", "__setobj__",
|
||||
"clone", "dup", "marshal_dump", "marshal_load",
|
||||
]
|
||||
klass.module_eval {
|
||||
def initialize(obj) # :nodoc:
|
||||
@_dc_obj = obj
|
||||
end
|
||||
def method_missing(m, *args) # :nodoc:
|
||||
unless @_dc_obj.respond_to?(m)
|
||||
super(m, *args)
|
||||
end
|
||||
@_dc_obj.__send__(m, *args)
|
||||
end
|
||||
def respond_to?(m) # :nodoc:
|
||||
return true if super
|
||||
return @_dc_obj.respond_to?(m)
|
||||
end
|
||||
include Delegator::MethodDelegation
|
||||
def __getobj__ # :nodoc:
|
||||
@_dc_obj
|
||||
end
|
||||
|
@ -268,14 +275,6 @@ def DelegateClass(superclass)
|
|||
raise ArgumentError, "cannot delegate to self" if self.equal?(obj)
|
||||
@_dc_obj = obj
|
||||
end
|
||||
def clone # :nodoc:
|
||||
super
|
||||
__setobj__(__getobj__.clone)
|
||||
end
|
||||
def dup # :nodoc:
|
||||
super
|
||||
__setobj__(__getobj__.dup)
|
||||
end
|
||||
}
|
||||
for method in methods
|
||||
begin
|
||||
|
@ -309,15 +308,23 @@ if __FILE__ == $0
|
|||
p ary.class
|
||||
ary.push 25
|
||||
p ary
|
||||
ary.push 42
|
||||
ary.each {|x| p x}
|
||||
|
||||
foo = Object.new
|
||||
def foo.test
|
||||
25
|
||||
end
|
||||
def foo.iter
|
||||
yield self
|
||||
end
|
||||
def foo.error
|
||||
raise 'this is OK'
|
||||
end
|
||||
foo2 = SimpleDelegator.new(foo)
|
||||
p foo2
|
||||
foo2.instance_eval{print "foo\n"}
|
||||
p foo.test == foo2.test # => true
|
||||
p foo2.iter{[55,true]} # => true
|
||||
foo2.error # raise error!
|
||||
end
|
||||
|
|
|
@ -40,7 +40,7 @@
|
|||
#
|
||||
|
||||
unless defined? Thread
|
||||
fail "Thread not available for this ruby interpreter"
|
||||
raise "Thread not available for this ruby interpreter"
|
||||
end
|
||||
|
||||
module Sync_m
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
#
|
||||
|
||||
unless defined? Thread
|
||||
fail "Thread not available for this ruby interpreter"
|
||||
raise "Thread not available for this ruby interpreter"
|
||||
end
|
||||
|
||||
unless defined? ThreadError
|
||||
|
|
|
@ -310,7 +310,7 @@ module YAML
|
|||
#
|
||||
# Add a transfer method for a builtin type
|
||||
#
|
||||
def YAML.add_ruby_type( type, &transfer_proc )
|
||||
def YAML.add_ruby_type( type_tag, &transfer_proc )
|
||||
resolver.add_type( "tag:ruby.yaml.org,2002:#{ type_tag }", transfer_proc )
|
||||
end
|
||||
|
||||
|
|
|
@ -520,15 +520,15 @@ tmp.close
|
|||
# test redo
|
||||
$bad = false
|
||||
tmp = open("while_tmp", "r")
|
||||
while tmp.gets()
|
||||
line = $_
|
||||
gsub(/vt100/, 'VT100')
|
||||
if $_ != line
|
||||
$_.gsub!('VT100', 'Vt100')
|
||||
while line = tmp.gets()
|
||||
lastline = line
|
||||
line = line.gsub(/vt100/, 'VT100')
|
||||
if lastline != line
|
||||
line.gsub!('VT100', 'Vt100')
|
||||
redo
|
||||
end
|
||||
$bad = 1 if /vt100/ =~ $_
|
||||
$bad = 1 if /VT100/ =~ $_
|
||||
$bad = 1 if /vt100/ =~ line
|
||||
$bad = 1 if /VT100/ =~ line
|
||||
end
|
||||
test_ok(tmp.eof? && !$bad)
|
||||
tmp.close
|
||||
|
@ -1837,7 +1837,7 @@ for i in 1..5
|
|||
end
|
||||
tmp.close
|
||||
|
||||
`./miniruby -i.bak -pe 'sub(/^[0-9]+$/){$&.to_i * 5}' script_tmp`
|
||||
`./miniruby -i.bak -pe '$_.sub!(/^[0-9]+$/){$&.to_i * 5}' script_tmp`
|
||||
done = true
|
||||
tmp = open("script_tmp", "r")
|
||||
while tmp.gets
|
||||
|
|
228
string.c
228
string.c
|
@ -2168,84 +2168,6 @@ uscore_get(void)
|
|||
return line;
|
||||
}
|
||||
|
||||
/*
|
||||
* call-seq:
|
||||
* sub!(pattern, replacement) => $_ or nil
|
||||
* sub!(pattern) {|...| block } => $_ or nil
|
||||
*
|
||||
* Equivalent to <code>$_.sub!(<i>args</i>)</code>.
|
||||
*/
|
||||
|
||||
static VALUE
|
||||
rb_f_sub_bang(int argc, VALUE *argv)
|
||||
{
|
||||
return rb_str_sub_bang(argc, argv, uscore_get());
|
||||
}
|
||||
|
||||
/*
|
||||
* call-seq:
|
||||
* sub(pattern, replacement) => $_
|
||||
* sub(pattern) { block } => $_
|
||||
*
|
||||
* Equivalent to <code>$_.sub(<i>args</i>)</code>, except that
|
||||
* <code>$_</code> will be updated if substitution occurs.
|
||||
*/
|
||||
|
||||
static VALUE
|
||||
rb_f_sub(int argc, VALUE *argv)
|
||||
{
|
||||
VALUE str = rb_str_dup(uscore_get());
|
||||
|
||||
if (NIL_P(rb_str_sub_bang(argc, argv, str)))
|
||||
return str;
|
||||
rb_lastline_set(str);
|
||||
return str;
|
||||
}
|
||||
|
||||
/*
|
||||
* call-seq:
|
||||
* gsub!(pattern, replacement) => string or nil
|
||||
* gsub!(pattern) {|...| block } => string or nil
|
||||
*
|
||||
* Equivalent to <code>Kernel::gsub</code>, except <code>nil</code> is
|
||||
* returned if <code>$_</code> is not modified.
|
||||
*
|
||||
* $_ = "quick brown fox"
|
||||
* gsub! /cat/, '*' #=> nil
|
||||
* $_ #=> "quick brown fox"
|
||||
*/
|
||||
|
||||
static VALUE
|
||||
rb_f_gsub_bang(int argc, VALUE *argv)
|
||||
{
|
||||
return rb_str_gsub_bang(argc, argv, uscore_get());
|
||||
}
|
||||
|
||||
/*
|
||||
* call-seq:
|
||||
* gsub(pattern, replacement) => string
|
||||
* gsub(pattern) {|...| block } => string
|
||||
*
|
||||
* Equivalent to <code>$_.gsub...</code>, except that <code>$_</code>
|
||||
* receives the modified result.
|
||||
*
|
||||
* $_ = "quick brown fox"
|
||||
* gsub /[aeiou]/, '*' #=> "q**ck br*wn f*x"
|
||||
* $_ #=> "q**ck br*wn f*x"
|
||||
*/
|
||||
|
||||
static VALUE
|
||||
rb_f_gsub(int argc, VALUE *argv)
|
||||
{
|
||||
VALUE str = rb_str_dup(uscore_get());
|
||||
|
||||
if (NIL_P(rb_str_gsub_bang(argc, argv, str)))
|
||||
return str;
|
||||
rb_lastline_set(str);
|
||||
return str;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* call-seq:
|
||||
* str.reverse! => str
|
||||
|
@ -3437,20 +3359,6 @@ rb_str_split(VALUE str, const char *sep0)
|
|||
return rb_str_split_m(1, &sep, str);
|
||||
}
|
||||
|
||||
/*
|
||||
* call-seq:
|
||||
* split([pattern [, limit]]) => array
|
||||
*
|
||||
* Equivalent to <code>$_.split(<i>pattern</i>, <i>limit</i>)</code>.
|
||||
* See <code>String#split</code>.
|
||||
*/
|
||||
|
||||
static VALUE
|
||||
rb_f_split(int argc, VALUE *argv)
|
||||
{
|
||||
return rb_str_split_m(argc, argv, uscore_get());
|
||||
}
|
||||
|
||||
/*
|
||||
* call-seq:
|
||||
* str.each(separator=$/) {|substr| block } => str
|
||||
|
@ -3620,61 +3528,6 @@ rb_str_chop(VALUE str)
|
|||
}
|
||||
|
||||
|
||||
/*
|
||||
* call-seq:
|
||||
* chop! => $_ or nil
|
||||
*
|
||||
* Equivalent to <code>$_.chop!</code>.
|
||||
*
|
||||
* a = "now\r\n"
|
||||
* $_ = a
|
||||
* chop! #=> "now"
|
||||
* chop! #=> "no"
|
||||
* chop! #=> "n"
|
||||
* chop! #=> ""
|
||||
* chop! #=> nil
|
||||
* $_ #=> ""
|
||||
* a #=> ""
|
||||
*/
|
||||
|
||||
static VALUE
|
||||
rb_f_chop_bang(VALUE str)
|
||||
{
|
||||
return rb_str_chop_bang(uscore_get());
|
||||
}
|
||||
|
||||
/*
|
||||
* call-seq:
|
||||
* chop => string
|
||||
*
|
||||
* Equivalent to <code>($_.dup).chop!</code>, except <code>nil</code>
|
||||
* is never returned. See <code>String#chop!</code>.
|
||||
*
|
||||
* a = "now\r\n"
|
||||
* $_ = a
|
||||
* chop #=> "now"
|
||||
* $_ #=> "now"
|
||||
* chop #=> "no"
|
||||
* chop #=> "n"
|
||||
* chop #=> ""
|
||||
* chop #=> ""
|
||||
* a #=> "now\r\n"
|
||||
*/
|
||||
|
||||
static VALUE
|
||||
rb_f_chop(void)
|
||||
{
|
||||
VALUE str = uscore_get();
|
||||
|
||||
if (RSTRING(str)->len > 0) {
|
||||
str = rb_str_dup(str);
|
||||
rb_str_chop_bang(str);
|
||||
rb_lastline_set(str);
|
||||
}
|
||||
return str;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* call-seq:
|
||||
* str.chomp!(separator=$/) => str or nil
|
||||
|
@ -3780,57 +3633,6 @@ rb_str_chomp(int argc, VALUE *argv, VALUE str)
|
|||
return str;
|
||||
}
|
||||
|
||||
/*
|
||||
* call-seq:
|
||||
* chomp! => $_ or nil
|
||||
* chomp!(string) => $_ or nil
|
||||
*
|
||||
* Equivalent to <code>$_.chomp!(<em>string</em>)</code>. See
|
||||
* <code>String#chomp!</code>
|
||||
*
|
||||
* $_ = "now\n"
|
||||
* chomp! #=> "now"
|
||||
* $_ #=> "now"
|
||||
* chomp! "x" #=> nil
|
||||
* $_ #=> "now"
|
||||
*/
|
||||
|
||||
static VALUE
|
||||
rb_f_chomp_bang(int argc, VALUE *argv)
|
||||
{
|
||||
return rb_str_chomp_bang(argc, argv, uscore_get());
|
||||
}
|
||||
|
||||
/*
|
||||
* call-seq:
|
||||
* chomp => $_
|
||||
* chomp(string) => $_
|
||||
*
|
||||
* Equivalent to <code>$_ = $_.chomp(<em>string</em>)</code>. See
|
||||
* <code>String#chomp</code>.
|
||||
*
|
||||
* $_ = "now\n"
|
||||
* chomp #=> "now"
|
||||
* $_ #=> "now"
|
||||
* chomp "ow" #=> "n"
|
||||
* $_ #=> "n"
|
||||
* chomp "xxx" #=> "n"
|
||||
* $_ #=> "n"
|
||||
*/
|
||||
|
||||
static VALUE
|
||||
rb_f_chomp(int argc, VALUE *argv)
|
||||
{
|
||||
VALUE str = uscore_get();
|
||||
VALUE dup = rb_str_dup(str);
|
||||
|
||||
if (NIL_P(rb_str_chomp_bang(argc, argv, dup)))
|
||||
return str;
|
||||
rb_lastline_set(dup);
|
||||
return dup;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* call-seq:
|
||||
* str.lstrip! => self or nil
|
||||
|
@ -4075,21 +3877,6 @@ rb_str_scan(VALUE str, VALUE pat)
|
|||
return str;
|
||||
}
|
||||
|
||||
/*
|
||||
* call-seq:
|
||||
* scan(pattern) => array
|
||||
* scan(pattern) {|///| block } => $_
|
||||
*
|
||||
* Equivalent to calling <code>$_.scan</code>. See
|
||||
* <code>String#scan</code>.
|
||||
*/
|
||||
|
||||
static VALUE
|
||||
rb_f_scan(VALUE self, VALUE pat)
|
||||
{
|
||||
return rb_str_scan(uscore_get(), pat);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* call-seq:
|
||||
|
@ -4510,21 +4297,6 @@ Init_String(void)
|
|||
|
||||
rb_define_method(rb_cString, "sum", rb_str_sum, -1);
|
||||
|
||||
rb_define_global_function("sub", rb_f_sub, -1);
|
||||
rb_define_global_function("gsub", rb_f_gsub, -1);
|
||||
|
||||
rb_define_global_function("sub!", rb_f_sub_bang, -1);
|
||||
rb_define_global_function("gsub!", rb_f_gsub_bang, -1);
|
||||
|
||||
rb_define_global_function("chop", rb_f_chop, 0);
|
||||
rb_define_global_function("chop!", rb_f_chop_bang, 0);
|
||||
|
||||
rb_define_global_function("chomp", rb_f_chomp, -1);
|
||||
rb_define_global_function("chomp!", rb_f_chomp_bang, -1);
|
||||
|
||||
rb_define_global_function("split", rb_f_split, -1);
|
||||
rb_define_global_function("scan", rb_f_scan, 1);
|
||||
|
||||
rb_define_method(rb_cString, "slice", rb_str_aref_m, -1);
|
||||
rb_define_method(rb_cString, "slice!", rb_str_slice_bang, -1);
|
||||
|
||||
|
|
|
@ -31,7 +31,7 @@ class DRbService
|
|||
@server || @@server
|
||||
end
|
||||
def self.ext_service(name)
|
||||
timeout(10, RuntimeError) do
|
||||
timeout(100, RuntimeError) do
|
||||
manager.service(name)
|
||||
end
|
||||
end
|
||||
|
|
Загрузка…
Ссылка в новой задаче