From d73fa69935a2d6657e13bfe2d3fa266fef55614d Mon Sep 17 00:00:00 2001 From: matz Date: Thu, 19 Aug 2004 07:33:15 +0000 Subject: * dir.c (free_dir): fix memory leak. reported by yamamoto madoka. * eval.c (bind_eval): new method. [RCR 251] * string.c (rb_str_clear): new method. [ruby-dev:24104] * io.c (rb_io_reopen): should clear allocated OpenFile. pointed out by Guy Decoux. [ruby-core:03288] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@6794 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 25 +++++++++++++++++++++++++ dir.c | 6 +++++- eval.c | 26 +++++++++++++++++++++++++- io.c | 13 ++++++------- string.c | 26 ++++++++++++++++++++++++++ 5 files changed, 87 insertions(+), 9 deletions(-) diff --git a/ChangeLog b/ChangeLog index 904953da7d..c2b3ee167f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Thu Aug 19 15:15:24 2004 Yukihiro Matsumoto + + * dir.c (free_dir): fix memory leak. reported by yamamoto + madoka. + Thu Aug 19 09:19:27 2004 NAKAMURA Usaku * configure.in, win32/Makefile.sub (LIBS): need to link shell32 @@ -35,6 +40,17 @@ Wed Aug 18 11:22:52 2004 Nobuyoshi Nakada * win32/win32.c (init_env): initialize HOME and USER environment variables unless set. +Wed Aug 18 10:17:21 2004 Yukihiro Matsumoto + + * eval.c (bind_eval): new method. [RCR 251] + + * string.c (rb_str_clear): new method. [ruby-dev:24104] + +Tue Aug 17 17:20:59 2004 Yukihiro Matsumoto + + * io.c (rb_io_reopen): should clear allocated OpenFile. pointed + out by Guy Decoux. [ruby-core:03288] + Tue Aug 17 01:36:32 2004 Dave Thomas * lib/rdoc/usage.rb: Remove extra indent. Tidy 'ri' option @@ -110,10 +126,19 @@ Sun Aug 8 00:43:31 2004 why the lucky stiff collections. plain scalars are trimmed if indentation follows in an ambiguous flow collection. +Sat Aug 7 03:08:21 2004 Yukihiro Matsumoto + + * process.c (proc_daemon): new method. should be modified for + platforms without /dev/null. + Sat Aug 7 00:50:01 2004 Tanaka Akira * ext/zlib/zlib.c: Zlib::GzipReader#read(0) returns "" instead of nil. +Wed Aug 4 13:26:00 2004 Yukihiro Matsumoto + + * marshal.c (r_bytes0): optimize out read(0). [ruby-talk:108276] + Tue Aug 3 13:49:12 2004 Hidetoshi NAGAI * ext/tk/lib/tk/namespace.rb: bug fix diff --git a/dir.c b/dir.c index b25c799529..c3301bc51f 100644 --- a/dir.c +++ b/dir.c @@ -349,7 +349,11 @@ static void free_dir(dir) struct dir_data *dir; { - if (dir && dir->dir) closedir(dir->dir); + if (dir) { + if (dir->dir) closedir(dir->dir); + if (dir->path) free(dir->path); + } + free(dir); } static VALUE dir_close _((VALUE)); diff --git a/eval.c b/eval.c index bc17cb68de..d3472da40e 100644 --- a/eval.c +++ b/eval.c @@ -6380,8 +6380,14 @@ rb_obj_instance_eval(argc, argv, self) VALUE *argv; VALUE self; { - VALUE klass = rb_singleton_class(self); + VALUE klass; + if (FIXNUM_P(self) || SYMBOL_P(self)) { + klass = Qnil; + } + else { + klass = rb_singleton_class(self); + } return specific_eval(argc, argv, klass, self); } @@ -7881,6 +7887,23 @@ rb_f_binding(self) return bind; } +static VALUE +bind_eval(argc, argv, bind) + int argc; + VALUE *argv; + VALUE bind; +{ + struct BLOCK *data; + VALUE args[4]; + VALUE dummy; + + rb_scan_args(argc, argv, "12", &args[0], &args[2], &args[3]); + args[1] = bind; + Data_Get_Struct(bind, struct BLOCK, data); + + return rb_f_eval(argc+1, args, data->self); +} + #define PROC_TSHIFT (FL_USHIFT+1) #define PROC_TMASK (FL_USER1|FL_USER2|FL_USER3) #define PROC_TMAX (PROC_TMASK >> PROC_TSHIFT) @@ -9306,6 +9329,7 @@ Init_Binding() rb_undef_alloc_func(rb_cBinding); rb_undef_method(CLASS_OF(rb_cBinding), "new"); rb_define_method(rb_cBinding, "clone", proc_clone, 0); + rb_define_method(rb_cBinding, "eval", bind_eval, -1); rb_define_global_function("binding", rb_f_binding, 0); } diff --git a/io.c b/io.c index 29839d376c..d64e41d683 100644 --- a/io.c +++ b/io.c @@ -235,9 +235,6 @@ rb_io_check_readable(fptr) OpenFile *fptr; { rb_io_check_closed(fptr); - if (!(fptr->mode & FMODE_READABLE)) { - rb_raise(rb_eIOError, "not opened for reading"); - } #if NEED_IO_SEEK_BETWEEN_RW if (((fptr->mode & FMODE_WBUF) || (fptr->mode & (FMODE_SYNCWRITE|FMODE_RBUF)) == FMODE_SYNCWRITE) && @@ -257,6 +254,9 @@ rb_io_check_writable(fptr) if (!(fptr->mode & FMODE_WRITABLE)) { rb_raise(rb_eIOError, "not opened for writing"); } + if (READ_DATA_BUFFERED(fptr->f)) { + rb_warn("read buffer data lost"); + } #if NEED_IO_SEEK_BETWEEN_RW if ((fptr->mode & FMODE_RBUF) && !feof(fptr->f) && !fptr->f2) { io_seek(fptr, 0, SEEK_CUR); @@ -1913,10 +1913,9 @@ rb_io_fptr_finalize(fptr) free(fptr->path); fptr->path = 0; } - if (!fptr->f && !fptr->f2) return 0; - if (fileno(fptr->f) < 3) return 0; - - rb_io_fptr_cleanup(fptr, Qtrue); + if ((fptr->f && fileno(fptr->f) > 2) || fptr->f2) { + rb_io_fptr_cleanup(fptr, Qtrue); + } free(fptr); return 1; } diff --git a/string.c b/string.c index 0b32ddeb4c..3ebf76e745 100644 --- a/string.c +++ b/string.c @@ -2212,6 +2212,31 @@ rb_str_replace(str, str2) return str; } +/* + * call-seq: + * string.clear -> string + * + * Makes string empty. + * + * a = "abcde" + * a.clear #=> "" + */ + +static VALUE +rb_str_clear(str) + VALUE str; +{ + /* rb_str_modify() */ /* no need for str_make_independent */ + if (str_independent(str)) { + free(RSTRING(str)->ptr); + } + RSTRING(str)->aux.shared = 0; + FL_UNSET(str, ELTS_SHARED|STR_ASSOC); + RSTRING(str)->ptr = 0; + RARRAY(str)->len = 0; + return str; +} + static VALUE uscore_get() { @@ -4593,6 +4618,7 @@ Init_String() rb_define_method(rb_cString, "index", rb_str_index_m, -1); rb_define_method(rb_cString, "rindex", rb_str_rindex_m, -1); rb_define_method(rb_cString, "replace", rb_str_replace, 1); + rb_define_method(rb_cString, "clear", rb_str_clear, 0); rb_define_method(rb_cString, "to_i", rb_str_to_i, -1); rb_define_method(rb_cString, "to_f", rb_str_to_f, 0); -- cgit v1.2.3