[前][次][番号順一覧][スレッド一覧]

ruby-changes:6753

From: akr <ko1@a...>
Date: Wed, 30 Jul 2008 22:14:15 +0900 (JST)
Subject: [ruby-changes:6753] Ruby:r18269 (trunk): * dir.c (struct dir_data): change path field char * to VALUE.

akr	2008-07-30 22:13:57 +0900 (Wed, 30 Jul 2008)

  New Revision: 18269

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=18269

  Log:
    * dir.c (struct dir_data): change path field char * to VALUE.
      (mark_dir): new function for mark path field.
      (free_dir): follow the path field change.
      (dir_s_alloc): ditto.
      (dir_initialize): ditto.
      (dir_s_open): ditto.
      (dir_inspect): ditto.
      (dir_path): return (duplicate of) the path field to preserve
      encoding.  [ruby-dev:35685]

  Modified files:
    trunk/ChangeLog
    trunk/dir.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 18268)
+++ ChangeLog	(revision 18269)
@@ -1,3 +1,15 @@
+Wed Jul 30 22:08:25 2008  Tanaka Akira  <akr@f...>
+
+	* dir.c (struct dir_data): change path field char * to VALUE.
+	  (mark_dir): new function for mark path field.
+	  (free_dir): follow the path field change.
+	  (dir_s_alloc): ditto.
+	  (dir_initialize): ditto.
+	  (dir_s_open): ditto.
+	  (dir_inspect): ditto.
+	  (dir_path): return (duplicate of) the path field to preserve
+	  encoding.  [ruby-dev:35685]
+
 Wed Jul 30 22:06:56 2008  Yusuke Endoh  <mame@t...>
 
 	* string.c (sym_inspect): remove dead code.
Index: dir.c
===================================================================
--- dir.c	(revision 18268)
+++ dir.c	(revision 18269)
@@ -289,16 +289,21 @@
 
 struct dir_data {
     DIR *dir;
-    char *path;
+    VALUE path;
     rb_encoding *extenc;
 };
 
 static void
+mark_dir(struct dir_data *dir)
+{
+    rb_gc_mark(dir->path);
+}
+
+static void
 free_dir(struct dir_data *dir)
 {
     if (dir) {
 	if (dir->dir) closedir(dir->dir);
-	if (dir->path) xfree(dir->path);
     }
     xfree(dir);
 }
@@ -309,10 +314,10 @@
 dir_s_alloc(VALUE klass)
 {
     struct dir_data *dirp;
-    VALUE obj = Data_Make_Struct(klass, struct dir_data, 0, free_dir, dirp);
+    VALUE obj = Data_Make_Struct(klass, struct dir_data, mark_dir, free_dir, dirp);
 
     dirp->dir = NULL;
-    dirp->path = NULL;
+    dirp->path = Qnil;
     dirp->extenc = NULL;
 
     return obj;
@@ -357,9 +362,8 @@
 
     Data_Get_Struct(dir, struct dir_data, dp);
     if (dp->dir) closedir(dp->dir);
-    if (dp->path) xfree(dp->path);
     dp->dir = NULL;
-    dp->path = NULL;
+    dp->path = Qnil;
     dp->extenc = extencoding;
     dp->dir = opendir(RSTRING_PTR(dirname));
     if (dp->dir == NULL) {
@@ -371,7 +375,7 @@
 	    rb_sys_fail(RSTRING_PTR(dirname));
 	}
     }
-    dp->path = strdup(RSTRING_PTR(dirname));
+    dp->path = rb_str_dup_frozen(dirname);
 
     return dir;
 }
@@ -391,7 +395,7 @@
 dir_s_open(int argc, VALUE *argv, VALUE klass)
 {
     struct dir_data *dp;
-    VALUE dir = Data_Make_Struct(klass, struct dir_data, 0, free_dir, dp);
+    VALUE dir = Data_Make_Struct(klass, struct dir_data, mark_dir, free_dir, dp);
 
     dir_initialize(argc, argv, dir);
     if (rb_block_given_p()) {
@@ -440,9 +444,9 @@
     struct dir_data *dirp;
 
     Data_Get_Struct(dir, struct dir_data, dirp);
-    if (dirp->path) {
+    if (!NIL_P(dirp->path)) {
 	const char *c = rb_obj_classname(dir);
-	return rb_sprintf("#<%s:%s>", c, dirp->path);
+	return rb_sprintf("#<%s:%s>", c, RSTRING_PTR(dirp->path));
     }
     return rb_funcall(dir, rb_intern("to_s"), 0, 0);
 }
@@ -462,8 +466,8 @@
     struct dir_data *dirp;
 
     Data_Get_Struct(dir, struct dir_data, dirp);
-    if (!dirp->path) return Qnil;
-    return dir_enc_str(rb_str_new2(dirp->path), dirp);
+    if (NIL_P(dirp->path)) return Qnil;
+    return rb_str_dup(dirp->path);
 }
 
 /*

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]