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

ruby-changes:22283

From: nobu <ko1@a...>
Date: Wed, 18 Jan 2012 18:07:00 +0900 (JST)
Subject: [ruby-changes:22283] nobu:r34332 (trunk): * ext/curses/curses.c (cWindow, cMouseEvent): made typed data.

nobu	2012-01-18 18:06:48 +0900 (Wed, 18 Jan 2012)

  New Revision: 34332

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

  Log:
    * ext/curses/curses.c (cWindow, cMouseEvent): made typed data.

  Modified files:
    trunk/ChangeLog
    trunk/ext/curses/curses.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 34331)
+++ ChangeLog	(revision 34332)
@@ -1,3 +1,7 @@
+Wed Jan 18 18:06:45 2012  Nobuyoshi Nakada  <nobu@r...>
+
+	* ext/curses/curses.c (cWindow, cMouseEvent): made typed data.
+
 Wed Jan 18 12:49:15 2012  Aaron Patterson <aaron@t...>
 
 	* ext/psych/lib/psych/visitors/to_ruby.rb: Added support for loading
Index: ext/curses/curses.c
===================================================================
--- ext/curses/curses.c	(revision 34331)
+++ ext/curses/curses.c	(revision 34332)
@@ -87,18 +87,34 @@
 #define GetWINDOW(obj, winp) do {\
     if (!OBJ_TAINTED(obj) && rb_safe_level() >= 4)\
 	rb_raise(rb_eSecurityError, "Insecure: operation on untainted window");\
-    Data_Get_Struct((obj), struct windata, (winp));\
+    TypedData_Get_Struct((obj), struct windata, &windata_type, (winp));\
     if ((winp)->window == 0) no_window();\
 } while (0)
 
 static void
-free_window(struct windata *winp)
+window_free(void *p)
 {
+    struct windata *winp = p;
     if (winp->window && winp->window != stdscr) delwin(winp->window);
     winp->window = 0;
     xfree(winp);
 }
 
+static size_t
+window_memsize(const void *p)
+{
+    const struct windata *winp = p;
+    size_t size = sizeof(*winp);
+    if (!winp) return 0;
+    if (winp->window && winp->window != stdscr) size += sizeof(winp->window);
+    return size;
+}
+
+static const rb_data_type_t windata_type = {
+    "windata",
+    {0, window_free, window_memsize,}
+};
+
 static VALUE
 prep_window(VALUE class, WINDOW *window)
 {
@@ -110,7 +126,7 @@
     }
 
     obj = rb_obj_alloc(class);
-    Data_Get_Struct(obj, struct windata, winp);
+    TypedData_Get_Struct(obj, struct windata, &windata_type, winp);
     winp->window = window;
 
     return obj;
@@ -1241,17 +1257,33 @@
 #define GetMOUSE(obj, data) do {\
     if (!OBJ_TAINTED(obj) && rb_safe_level() >= 4)\
 	rb_raise(rb_eSecurityError, "Insecure: operation on untainted mouse");\
-    Data_Get_Struct((obj), struct mousedata, (data));\
+    TypedData_Get_Struct((obj), struct mousedata, &mousedata_type, (data));\
     if ((data)->mevent == 0) no_mevent();\
 } while (0)
 
 static void
-curses_mousedata_free(struct mousedata *mdata)
+curses_mousedata_free(void *p)
 {
+    struct mousedata *mdata = p;
     if (mdata->mevent)
 	xfree(mdata->mevent);
 }
 
+static size_t
+curses_mousedata_memsize(const void *p)
+{
+    const struct mousedata *mdata = p;
+    size_t size = sizeof(*mdata);
+    if (!mdata) return 0;
+    if (mdata->mevent) size += sizeof(mdata->mevent);
+    return size;
+}
+
+static const rb_data_type_t mousedata_type = {
+    "mousedata",
+    {0, curses_mousedata_free, curses_mousedata_memsize,}
+};
+
 /*
  * Document-method: Curses.getmouse
  *
@@ -1268,8 +1300,8 @@
     VALUE val;
 
     curses_stdscr();
-    val = Data_Make_Struct(cMouseEvent,struct mousedata,
-			   0,curses_mousedata_free,mdata);
+    val = TypedData_Make_Struct(cMouseEvent,struct mousedata,
+				&mousedata_type,mdata);
     mdata->mevent = (MEVENT*)xmalloc(sizeof(MEVENT));
     return (getmouse(mdata->mevent) == OK) ? val : Qnil;
 }
@@ -1438,7 +1470,7 @@
 {
     struct windata *winp;
 
-    return Data_Make_Struct(class, struct windata, 0, free_window, winp);
+    return TypedData_Make_Struct(class, struct windata, &windata_type, winp);
 }
 
 /*
@@ -1460,7 +1492,7 @@
 
     rb_secure(4);
     curses_init_screen();
-    Data_Get_Struct(obj, struct windata, winp);
+    TypedData_Get_Struct(obj, struct windata, &windata_type, winp);
     if (winp->window) delwin(winp->window);
     window = newwin(NUM2INT(h), NUM2INT(w), NUM2INT(top), NUM2INT(left));
     wclear(window);
@@ -2459,15 +2491,6 @@
 /*--------------------------- class Pad ----------------------------*/
 
 #ifdef HAVE_NEWPAD
-/* returns a Curses::Pad object */
-static VALUE
-pad_s_allocate(VALUE class)
-{
-    struct windata *padp;
-
-    return Data_Make_Struct(class, struct windata, 0, free_window, padp);
-}
-
 /*
  * Document-method: Curses::Pad.new
  *
@@ -2486,7 +2509,7 @@
 
     rb_secure(4);
     curses_init_screen();
-    Data_Get_Struct(obj, struct windata, padp);
+    TypedData_Get_Struct(obj, struct windata, &windata_type, padp);
     if (padp->window) delwin(padp->window);
     window = newpad(NUM2INT(h), NUM2INT(w));
     wclear(window);
@@ -2495,8 +2518,11 @@
     return obj;
 }
 
+#if 1
+#define pad_subpad window_subwin
+#else
 /*
- * Document-method: Curses::Pad.subwin
+ * Document-method: Curses::Pad.subpad
  * call-seq:
  *   subpad(height, width, begin_x, begin_y)
  *
@@ -2522,6 +2548,7 @@
 
     return pad;
 }
+#endif
 
 /*
  * Document-method: Curses::Pad.refresh
@@ -2835,7 +2862,7 @@
      *
      */
     cPad = rb_define_class_under(mCurses, "Pad", cWindow);
-    rb_define_alloc_func(cPad, pad_s_allocate);
+    /* inherits alloc_func from cWindow */
     rb_define_method(cPad, "initialize", pad_initialize, 2);
     rb_define_method(cPad, "subpad", pad_subpad, 4);
     rb_define_method(cPad, "refresh", pad_refresh, 6);

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

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