diff --git a/ChangeLog b/ChangeLog index 5a796b4d15..f4fbf1a6ab 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Tue Jun 27 23:03:49 2006 Yukihiro Matsumoto + + * string.c: RDoc update for =~ method. a patch from Alex Young + . [ruby-core:08068] + Tue Jun 27 22:47:18 2006 Hidetoshi NAGAI * ext/tk/tcltklib.c: forgot to update TCLTKLIB_RELEASE_DATE. @@ -5,6 +10,17 @@ Tue Jun 27 22:47:18 2006 Hidetoshi NAGAI * ext/tk/lib/tk.rb (tk_tcl2ruby): [bug fix] somtimes fail to convert a tcl string to a ruby object if the tcl string includes "\n". +Tue Jun 27 20:05:14 2006 Yukihiro Matsumoto + + * io.c (pipe_open): backout unnecessary fix on 2006-06-26. + [ruby-dev:28865] + + * eval.c (rb_yield_0): exact argument number check now done only + for lambda Proc. + + * eval.c (rb_yield_0): add check for number of arguments, if + there's one lambda block parameter. + Tue Jun 27 16:04:05 2006 WATANABE Hirofumi * win32/win32.h: define isascii on MinGW for msvcrt compatibility. diff --git a/eval.c b/eval.c index cca4c44c61..c08b98128f 100644 --- a/eval.c +++ b/eval.c @@ -1047,7 +1047,7 @@ static NODE *compile(VALUE, const char*, int); static VALUE rb_yield_0(VALUE, VALUE, VALUE, int); -#define YIELD_EXACT_ARGS 1 +#define YIELD_ARY_ARGS 1 #define YIELD_PUBLIC_DEF 4 #define YIELD_FUNC_AVALUE 1 #define YIELD_FUNC_SVALUE 2 @@ -4667,7 +4667,7 @@ rb_yield_0(VALUE val, VALUE self, VALUE klass /* OK */, int flags) int old_vmode; struct FRAME frame; NODE *cnode = ruby_current_node; - int pcall = flags & YIELD_EXACT_ARGS, lambda; + int ary_args = flags & YIELD_ARY_ARGS, lambda; int state, broken = 0; rb_need_block(); @@ -4701,16 +4701,20 @@ rb_yield_0(VALUE val, VALUE self, VALUE klass /* OK */, int flags) node = block->body; var = block->var; lambda = block->flags & BLOCK_LAMBDA; - if (var) { PUSH_TAG(PROT_NONE); if ((state = EXEC_TAG()) == 0) { NODE *bvar = NULL; block_var: if (var == (NODE*)1) { /* no parameter || */ - if (pcall && RARRAY(val)->len != 0) { - rb_raise(rb_eArgError, "wrong number of arguments (%ld for 0)", - RARRAY(val)->len); + if (lambda && val != Qundef) { + if (TYPE(val) != T_ARRAY) { + rb_raise(rb_eArgError, "wrong number of arguments (1 for 0)"); + } + else if (RARRAY(val)->len != 0) { + rb_raise(rb_eArgError, "wrong number of arguments (%ld for 0)", + RARRAY(val)->len); + } } } else if (var == (NODE*)2) { @@ -4725,7 +4729,7 @@ rb_yield_0(VALUE val, VALUE self, VALUE klass /* OK */, int flags) goto block_var; } else if (nd_type(var) == NODE_ARGS) { - val = svalue_to_avalue(val); + if (!ary_args) val = svalue_to_avalue(val); formal_assign(self, var, RARRAY(val)->len, RARRAY(val)->ptr, 0); } else if (nd_type(var) == NODE_BLOCK) { @@ -4736,16 +4740,25 @@ rb_yield_0(VALUE val, VALUE self, VALUE klass /* OK */, int flags) goto block_var; } else if (nd_type(var) == NODE_MASGN) { - massign(self, var, val, pcall); + massign(self, var, val, lambda); } else { - if (pcall) { - if (RARRAY(val)->len == 0) - val = Qnil; - else - val = RARRAY(val)->ptr[0]; + if (lambda) { + if (val == Qundef) { + rb_raise(rb_eArgError, "wrong number of arguments (0 for 1)"); + } + if (TYPE(val) == T_ARRAY && RARRAY(val)->len != 1) { + rb_raise(rb_eArgError, "wrong number of arguments (%ld for 1)", + RARRAY(val)->len); + } } - assign(self, var, val, pcall); + if (ary_args) { + if (RARRAY(val)->len == 0) + val = Qnil; + else + val = RARRAY(val)->ptr[0]; + } + assign(self, var, val, lambda); } if (bvar) { VALUE blk; @@ -4759,7 +4772,7 @@ rb_yield_0(VALUE val, VALUE self, VALUE klass /* OK */, int flags) POP_TAG(); if (state) goto pop_state; } - else if (pcall && RARRAY(val)->len != 0 && + else if (lambda && RARRAY(val)->len != 0 && (!node || nd_type(node) != NODE_IFUNC || node->nd_cfnc != bmcall)) { rb_raise(rb_eArgError, "wrong number of arguments (%ld for 0)", @@ -8357,7 +8370,7 @@ proc_invoke(VALUE proc, VALUE args /* OK */, VALUE self, VALUE klass, int call) VALUE bvar = Qnil; Data_Get_Struct(proc, struct BLOCK, data); - pcall = call ? YIELD_EXACT_ARGS : 0; + pcall = call ? YIELD_ARY_ARGS : 0; lambda = data->flags & BLOCK_LAMBDA; if (rb_block_given_p() && ruby_frame->callee) { if (klass != ruby_frame->this_class) @@ -8481,7 +8494,7 @@ rb_proc_yield(int argc, VALUE *argv, VALUE proc) { switch (argc) { case 0: - return proc_invoke(proc, Qnil, Qundef, 0, 0); + return proc_invoke(proc, Qundef, Qundef, 0, 0); case 1: return proc_invoke(proc, argv[0], Qundef, 0, 0); default: diff --git a/ext/socket/socket.c b/ext/socket/socket.c index 48f6cd033a..113b60c0cd 100644 --- a/ext/socket/socket.c +++ b/ext/socket/socket.c @@ -2927,8 +2927,7 @@ sock_accept_nonblock(sock) * * Socket#accept */ static VALUE -sock_sysaccept(sock) - VALUE sock; +sock_sysaccept(VALUE sock) { OpenFile *fptr; VALUE sock2; diff --git a/io.c b/io.c index 8927fad927..e8007819b2 100644 --- a/io.c +++ b/io.c @@ -3029,14 +3029,8 @@ pipe_open(int argc, VALUE *argv, const char *mode) /* parent */ if (pid == -1) { int e = errno; - if ((modef & FMODE_READABLE)) { - close(arg.pair[0]); - close(arg.pair[1]); - } - if ((modef & FMODE_WRITABLE)) { - close(arg.pair[0]); - close(arg.pair[1]); - } + close(arg.pair[0]); + close(arg.pair[1]); errno = e; rb_sys_fail(cmd); } diff --git a/string.c b/string.c index 136235580c..96f93808c3 100644 --- a/string.c +++ b/string.c @@ -1241,13 +1241,11 @@ rb_str_rindex_m(int argc, VALUE *argv, VALUE str) * str =~ obj => fixnum or nil * * Match---If obj is a Regexp, use it as a pattern to match - * against str. If obj is a String, look for it in - * str (similar to String#index). Returns the position the - * match starts, or nil if there is no match. Otherwise, invokes + * against str,and returns the position the match starts, or + * nil if there is no match. Otherwise, invokes * obj.=~, passing str as an argument. The default * =~ in Object returns false. * - * "cat o' 9 tails" =~ '\d' #=> nil * "cat o' 9 tails" =~ /\d/ #=> 7 * "cat o' 9 tails" =~ 9 #=> false */