From 1550277b3458f2981dac537bd55ee52f5ad5b0e3 Mon Sep 17 00:00:00 2001 From: matz Date: Mon, 1 Apr 2002 07:39:09 +0000 Subject: [PATCH] * re.c (match_setter): it's OK to assign nil to $~. * io.c (rb_io_fptr_cleanup): do not close IO created by for_fd(). * io.c (rb_io_initialize): mark IO created by for_fd * ext/socket/socket.c (bsock_s_for_fd): ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2312 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 12 ++++++++++++ io.c | 39 +++++++++++++++++++++++++-------------- re.c | 4 +++- rubyio.h | 1 + 4 files changed, 41 insertions(+), 15 deletions(-) diff --git a/ChangeLog b/ChangeLog index dfc7a58144..83abab20b6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -7,6 +7,18 @@ Mon Apr 1 15:11:40 2002 NAKAMURA Usaku * ext/tcltklib/tcltklib.c: prototypes; _timer_for_tcl() and ip_ruby(), Nobu's patch at [ruby-dev:14483]. +Mon Apr 1 10:56:40 2002 Yukihiro Matsumoto + + * re.c (match_setter): it's OK to assign nil to $~. + +Mon Apr 1 03:55:46 2002 Yukihiro Matsumoto + + * io.c (rb_io_fptr_cleanup): do not close IO created by for_fd(). + + * io.c (rb_io_initialize): mark IO created by for_fd + + * ext/socket/socket.c (bsock_s_for_fd): ditto. + Fri Mar 29 20:21:58 2002 Nobuyoshi Nakada * lib/mkmf.rb (create_makefile): default FLAGS to empty strings. diff --git a/io.c b/io.c index 682a1b44bf..df4f290871 100644 --- a/io.c +++ b/io.c @@ -1194,6 +1194,7 @@ rb_io_fptr_cleanup(fptr, fin) OpenFile *fptr; int fin; { + if (fptr->mode & FMODE_FDOPEN) return; if (fptr->finalize) { (*fptr->finalize)(fptr); } @@ -1469,7 +1470,7 @@ rb_io_mode_flags(mode) } static int -rb_io_binmode_flags(mode) +rb_io_modenum_flags(mode) int mode; { int flags; @@ -1496,7 +1497,7 @@ rb_io_binmode_flags(mode) } static int -rb_io_mode_binmode(mode) +rb_io_mode_modenum(mode) const char *mode; { int flags = 0; @@ -1534,7 +1535,7 @@ rb_io_mode_binmode(mode) } static char* -rb_io_binmode_mode(flags, mode) +rb_io_modenum_mode(flags, mode) int flags; char *mode; { @@ -1548,7 +1549,7 @@ rb_io_binmode_mode(flags, mode) *p++ = 'w'; break; case O_RDWR: - *p++ = 'w'; + *p++ = 'r'; *p++ = '+'; break; } @@ -1678,8 +1679,8 @@ rb_file_sysopen_internal(io, fname, flags, mode) MakeOpenFile(io, fptr); fd = rb_sysopen(fname, flags, mode); - m = rb_io_binmode_mode(flags, mbuf); - fptr->mode = rb_io_binmode_flags(flags); + m = rb_io_modenum_mode(flags, mbuf); + fptr->mode = rb_io_modenum_flags(flags); fptr->f = rb_fdopen(fd, m); fptr->path = strdup(fname); @@ -1923,7 +1924,7 @@ rb_io_popen(str, argc, argv, klass) mode = "r"; } else if (FIXNUM_P(pmode)) { - mode = rb_io_binmode_mode(FIX2INT(pmode), mbuf); + mode = rb_io_modenum_mode(FIX2INT(pmode), mbuf); } else { mode = StringValuePtr(pmode); @@ -1976,7 +1977,7 @@ rb_open_file(argc, argv, io) path = RSTRING(fname)->ptr; if (FIXNUM_P(vmode) || !NIL_P(perm)) { - flags = FIXNUM_P(vmode) ? NUM2INT(vmode) : rb_io_mode_binmode(StringValuePtr(vmode)); + flags = FIXNUM_P(vmode) ? NUM2INT(vmode) : rb_io_mode_modenum(StringValuePtr(vmode)); fmode = NIL_P(perm) ? 0666 : NUM2INT(perm); file = rb_file_sysopen_internal(io, path, flags, fmode); @@ -2601,15 +2602,25 @@ rb_io_initialize(argc, argv, io) { VALUE fnum, mode; OpenFile *fp; - char *m = "r"; + int fd, flags; + char mbuf[4]; - if (rb_scan_args(argc, argv, "11", &fnum, &mode) == 2) { + rb_scan_args(argc, argv, "11", &fnum, &mode); + fd = NUM2INT(fnum); + if (argc == 2) { SafeStringValue(mode); - m = RSTRING(mode)->ptr; + flags = rb_io_mode_flags(RSTRING(mode)->ptr); + } + else { +#if defined(HAVE_FCNTL) && defined(F_GETFL) + flags = fcntl(fd, F_GETFL); +#else + flags = O_RDONLY; +#endif } MakeOpenFile(io, fp); - fp->f = rb_fdopen(NUM2INT(fnum), m); - fp->mode = rb_io_mode_flags(m); + fp->mode = rb_io_modenum_flags(flags) | FMODE_FDOPEN; + fp->f = rb_fdopen(fd, rb_io_modenum_mode(flags, mbuf)); return io; } @@ -2647,7 +2658,7 @@ rb_io_s_new(argc, argv, klass) if (rb_block_given_p()) { char *cname = rb_class2name(klass); - rb_warn("%s::new() does not take block; use %::open() instead", + rb_warn("%s::new() does not take block; use %s::open() instead", cname, cname); } return rb_class_new_instance(argc, argv, klass); diff --git a/re.c b/re.c index 67ee4dfc1b..b7603e0f29 100644 --- a/re.c +++ b/re.c @@ -1392,7 +1392,9 @@ static void match_setter(val) VALUE val; { - Check_Type(val, T_MATCH); + if (!NIL_P(val)) { + Check_Type(val, T_MATCH); + } rb_backref_set(val); } diff --git a/rubyio.h b/rubyio.h index 214128449f..3599334f62 100644 --- a/rubyio.h +++ b/rubyio.h @@ -32,6 +32,7 @@ typedef struct OpenFile { #define FMODE_BINMODE 4 #define FMODE_SYNC 8 #define FMODE_WBUF 16 +#define FMODE_FDOPEN 32 #define GetOpenFile(obj,fp) rb_io_check_closed((fp) = RFILE(rb_io_taint_check(obj))->fptr)