summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-08-19 07:33:15 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-08-19 07:33:15 +0000
commitd73fa69935a2d6657e13bfe2d3fa266fef55614d (patch)
tree2b91232f5c6bf8601ed38337fae396d2e391a41e
parent4c57b2b49905d652fb500249c34303d8c0571155 (diff)
* 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
-rw-r--r--ChangeLog25
-rw-r--r--dir.c6
-rw-r--r--eval.c26
-rw-r--r--io.c13
-rw-r--r--string.c26
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 <matz@ruby-lang.org>
+
+ * dir.c (free_dir): fix memory leak. reported by yamamoto
+ madoka.
+
Thu Aug 19 09:19:27 2004 NAKAMURA Usaku <usa@ruby-lang.org>
* configure.in, win32/Makefile.sub (LIBS): need to link shell32
@@ -35,6 +40,17 @@ Wed Aug 18 11:22:52 2004 Nobuyoshi Nakada <nobu@ruby-lang.org>
* win32/win32.c (init_env): initialize HOME and USER environment
variables unless set.
+Wed Aug 18 10:17:21 2004 Yukihiro Matsumoto <matz@ruby-lang.org>
+
+ * 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 <matz@ruby-lang.org>
+
+ * 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 <dave@pragprog.com>
* 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 <why@ruby-lang.org>
collections. plain scalars are trimmed if indentation follows in
an ambiguous flow collection.
+Sat Aug 7 03:08:21 2004 Yukihiro Matsumoto <matz@ruby-lang.org>
+
+ * process.c (proc_daemon): new method. should be modified for
+ platforms without /dev/null.
+
Sat Aug 7 00:50:01 2004 Tanaka Akira <akr@m17n.org>
* ext/zlib/zlib.c: Zlib::GzipReader#read(0) returns "" instead of nil.
+Wed Aug 4 13:26:00 2004 Yukihiro Matsumoto <matz@ruby-lang.org>
+
+ * marshal.c (r_bytes0): optimize out read(0). [ruby-talk:108276]
+
Tue Aug 3 13:49:12 2004 Hidetoshi NAGAI <nagai@ai.kyutech.ac.jp>
* 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);