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/