From 014f2164ed7031a1c31604b290d2ab0cf1deacdc Mon Sep 17 00:00:00 2001 From: matz Date: Wed, 10 May 2000 02:58:41 +0000 Subject: [PATCH] 2000-05-10 git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@684 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 11 ++++++++++- array.c | 1 + dln.c | 5 ++++- eval.c | 27 ++++++++++++++++++++++----- io.c | 14 +++++++++++--- sample/test.rb | 2 +- version.h | 4 ++-- 7 files changed, 51 insertions(+), 13 deletions(-) diff --git a/ChangeLog b/ChangeLog index 297848c3de..07fa720ced 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +Tue May 9 17:08:43 2000 Yukihiro Matsumoto + + * array.c (Init_Array): prepare 'append' as alias to `push'. + + * eval.c (massign): no longer convert nil into empty array. + + * io.c (rb_io_s_popen): optional 3rd argument to give proc, which + will be executed in spawned child process. + Mon May 8 23:47:39 2000 Katsuyuki Komatsu * eval.c (rb_callcc): prev & next should be initialized to zero. @@ -5,7 +14,7 @@ Mon May 8 23:47:39 2000 Katsuyuki Komatsu Mon May 8 23:17:36 2000 Yukihiro Matsumoto * dln.c (dln_init): remove possible buffer overrun. This is - suggested by Aleksi Niemela + suggested by Aleksi Niemela . * dln.c (init_funcname): ditto. diff --git a/array.c b/array.c index 6793fdde88..7b5ec47830 100644 --- a/array.c +++ b/array.c @@ -1601,6 +1601,7 @@ Init_Array() rb_define_method(rb_cArray, "last", rb_ary_last, 0); rb_define_method(rb_cArray, "concat", rb_ary_concat, 1); rb_define_method(rb_cArray, "<<", rb_ary_push, 1); + rb_define_method(rb_cArray, "append", rb_ary_push_m, -1); rb_define_method(rb_cArray, "push", rb_ary_push_m, -1); rb_define_method(rb_cArray, "pop", rb_ary_pop, 0); rb_define_method(rb_cArray, "shift", rb_ary_shift, 0); diff --git a/dln.c b/dln.c index beef2f74a5..3a02dbf996 100644 --- a/dln.c +++ b/dln.c @@ -1211,10 +1211,12 @@ dln_load(file) { #ifdef _WIN32 HINSTANCE handle; - char winfile[255]; + char winfile[MAXPATHLEN]; void (*init_fct)(); char buf[MAXPATHLEN]; + if (strlen(file) >= MAXPATHLEN) rb_loaderror("filename too long"); + /* Load the file as an object one */ init_funcname(buf, file); @@ -1421,6 +1423,7 @@ dln_load(file) if (err_stat != B_NO_ERROR) { char real_name[MAXPATHLEN]; + strcpy(real_name, buf); strcat(real_name, "__Fv"); err_stat = get_image_symbol(img_id, real_name, diff --git a/eval.c b/eval.c index faf41d194c..730b82e59a 100644 --- a/eval.c +++ b/eval.c @@ -3437,10 +3437,14 @@ massign(self, node, val, check) list = node->nd_head; if (TYPE(val) != T_ARRAY) { +#if 0 if (!check && NIL_P(val)) val = rb_ary_new2(0); else val = rb_ary_new3(1, val); +#else + val = rb_ary_new3(1, val); +#endif } len = RARRAY(val)->len; for (i=0; list && i= 4) { + Check_Type(src, T_STRING); + } + else { + Check_SafeStr(src); + } args[0] = self; args[1] = src; args[2] = (VALUE)file; @@ -6632,6 +6641,7 @@ rb_thread_schedule() thread_t next; /* OK */ thread_t th; thread_t curr; + int found = 0; select_err: rb_thread_pending = 0; @@ -6646,6 +6656,14 @@ rb_thread_schedule() curr = curr->prev; } + FOREACH_THREAD_FROM(curr, th) { + if (th->status == THREAD_RUNNABLE || th->status == THREAD_TO_KILL) { + found = 1; + break; + } + } + END_FOREACH_FROM(curr, th); + if (num_waiting_on_join) { FOREACH_THREAD_FROM(curr, th) { if ((th->wait_for&WAIT_JOIN) && rb_thread_dead(th->join)) { @@ -6653,6 +6671,7 @@ rb_thread_schedule() th->wait_for &= ~WAIT_JOIN; th->status = THREAD_RUNNABLE; num_waiting_on_join--; + found = 1; } } END_FOREACH_FROM(curr, th); @@ -6662,7 +6681,7 @@ rb_thread_schedule() fd_set readfds; struct timeval delay_tv, *delay_ptr; double delay, now; /* OK */ - int n, max, found; + int n, max; do { max = 0; @@ -6765,13 +6784,11 @@ rb_thread_schedule() th->thread, th->status, th->wait_for, th==main_thread?"(main)":"", th->file, th->line); - if (th->status == THREAD_STOPPED) { - next = th; - } } END_FOREACH_FROM(curr, th); /* raise fatal error to main thread */ rb_thread_deadlock(); + next = main_thread; rb_thread_ready(next); next->gid = 0; next->status = THREAD_TO_KILL; diff --git a/io.c b/io.c index 5beae00bcb..380e7d4115 100644 --- a/io.c +++ b/io.c @@ -1557,9 +1557,9 @@ rb_io_s_popen(argc, argv, self) VALUE self; { char *mode; - VALUE pname, pmode, port; + VALUE pname, pmode, port, proc; - if (rb_scan_args(argc, argv, "11", &pname, &pmode) == 1) { + if (rb_scan_args(argc, argv, "12", &pname, &pmode, &proc) == 1) { mode = "r"; } else { @@ -1573,7 +1573,12 @@ rb_io_s_popen(argc, argv, self) Check_SafeStr(pname); port = pipe_open(RSTRING(pname)->ptr, mode); if (NIL_P(port)) { - rb_yield(port); + if (!NIL_P(proc)) { + rb_eval_cmd(proc, rb_ary_new2(0)); + } + else { + rb_yield(port); + } } else if (rb_iterator_p()) { return rb_ensure(rb_yield, port, rb_io_close, port); @@ -2275,6 +2280,9 @@ rb_io_initialize(argc, argv, io) fp->f = rb_fdopen(NUM2INT(fnum), m); fp->mode = rb_io_mode_flags(m); + if (rb_iterator_p()) { + return rb_ensure(rb_yield, io, rb_io_close, io); + } return io; } diff --git a/sample/test.rb b/sample/test.rb index 9d77647cf7..bc97882e6c 100644 --- a/sample/test.rb +++ b/sample/test.rb @@ -726,7 +726,7 @@ ok(a == [1, 2, 3]) ok(a == [4]) *a = nil -ok(a == []) +ok(a == [nil]) check "call" def aaa(a, b=100, *rest) diff --git a/version.h b/version.h index e25e82e93c..91f95200f3 100644 --- a/version.h +++ b/version.h @@ -1,4 +1,4 @@ #define RUBY_VERSION "1.5.3" -#define RUBY_RELEASE_DATE "2000-05-09" +#define RUBY_RELEASE_DATE "2000-05-10" #define RUBY_VERSION_CODE 153 -#define RUBY_RELEASE_CODE 20000509 +#define RUBY_RELEASE_CODE 20000510