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

ruby-changes:13057

From: nobu <ko1@a...>
Date: Wed, 9 Sep 2009 11:28:39 +0900 (JST)
Subject: [ruby-changes:13057] Ruby:r24804 (trunk): * dir.c (dir_data_type): typed.

nobu	2009-09-09 11:28:21 +0900 (Wed, 09 Sep 2009)

  New Revision: 24804

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

  Log:
    * dir.c (dir_data_type): typed.

  Modified files:
    trunk/ChangeLog
    trunk/dir.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 24803)
+++ ChangeLog	(revision 24804)
@@ -1,3 +1,7 @@
+Wed Sep  9 11:28:19 2009  Nobuyoshi Nakada  <nobu@r...>
+
+	* dir.c (dir_data_type): typed.
+
 Wed Sep  9 11:11:33 2009  Nobuyoshi Nakada  <nobu@r...>
 
 	* include/ruby/ruby.h (rb_data_type_struct): constified dsize.
Index: dir.c
===================================================================
--- dir.c	(revision 24803)
+++ dir.c	(revision 24804)
@@ -310,27 +310,40 @@
 };
 
 static void
-mark_dir(struct dir_data *dir)
+dir_mark(void *ptr)
 {
+    struct dir_data *dir = ptr;
     rb_gc_mark(dir->path);
 }
 
 static void
-free_dir(struct dir_data *dir)
+dir_free(void *ptr)
 {
+    struct dir_data *dir = ptr;
     if (dir) {
 	if (dir->dir) closedir(dir->dir);
     }
     xfree(dir);
 }
 
+static size_t
+dir_memsize(const void *ptr)
+{
+    return ptr ? sizeof(struct dir_data) : 0;
+}
+
+static const rb_data_type_t dir_data_type = {
+    "dir",
+    dir_mark, dir_free, dir_memsize
+};
+
 static VALUE dir_close(VALUE);
 
 static VALUE
 dir_s_alloc(VALUE klass)
 {
     struct dir_data *dirp;
-    VALUE obj = Data_Make_Struct(klass, struct dir_data, mark_dir, free_dir, dirp);
+    VALUE obj = TypedData_Make_Struct(klass, struct dir_data, &dir_data_type, dirp);
 
     dirp->dir = NULL;
     dirp->path = Qnil;
@@ -374,7 +387,7 @@
 
     FilePathValue(dirname);
 
-    Data_Get_Struct(dir, struct dir_data, dp);
+    TypedData_Get_Struct(dir, struct dir_data, &dir_data_type, dp);
     if (dp->dir) closedir(dp->dir);
     dp->dir = NULL;
     dp->path = Qnil;
@@ -409,7 +422,7 @@
 dir_s_open(int argc, VALUE *argv, VALUE klass)
 {
     struct dir_data *dp;
-    VALUE dir = Data_Make_Struct(klass, struct dir_data, mark_dir, free_dir, dp);
+    VALUE dir = TypedData_Make_Struct(klass, struct dir_data, &dir_data_type, dp);
 
     dir_initialize(argc, argv, dir);
     if (rb_block_given_p()) {
@@ -435,7 +448,7 @@
 
 #define GetDIR(obj, dirp) do {\
     dir_check(dir);\
-    Data_Get_Struct(obj, struct dir_data, dirp);\
+    TypedData_Get_Struct(obj, struct dir_data, &dir_data_type, dirp);	\
     if (dirp->dir == NULL) dir_closed();\
 } while (0)
 
@@ -451,7 +464,7 @@
 {
     struct dir_data *dirp;
 
-    Data_Get_Struct(dir, struct dir_data, dirp);
+    TypedData_Get_Struct(dir, struct dir_data, &dir_data_type, dirp);
     if (!NIL_P(dirp->path)) {
 	const char *c = rb_obj_classname(dir);
 	return rb_sprintf("#<%s:%s>", c, RSTRING_PTR(dirp->path));
@@ -473,7 +486,7 @@
 {
     struct dir_data *dirp;
 
-    Data_Get_Struct(dir, struct dir_data, dirp);
+    TypedData_Get_Struct(dir, struct dir_data, &dir_data_type, dirp);
     if (NIL_P(dirp->path)) return Qnil;
     return rb_str_dup(dirp->path);
 }
@@ -1758,12 +1771,9 @@
 dir_open_dir(int argc, VALUE *argv)
 {
     VALUE dir = rb_funcall2(rb_cDir, rb_intern("open"), argc, argv);
+    struct dir_data *dirp;
 
-    if (TYPE(dir) != T_DATA ||
-	RDATA(dir)->dfree != (RUBY_DATA_FUNC)free_dir) {
-	rb_raise(rb_eTypeError, "wrong argument type %s (expected Dir)",
-		 rb_obj_classname(dir));
-    }
+    TypedData_Get_Struct(dir, struct dir_data, &dir_data_type, dirp);
     return dir;
 }
 

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

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