[Feature: trunk] RTypedData

e$B!!$5$5$@$G$9!%e(B

e$B!!8=:!$e(BRData
e$B$K3JG<$5$l$?>pJs$O!$$=$N85$K$J$C$?7?>pJs$,$J$/$J$C$F$7$^$$e(B
e$B$^$9$,!$7?>pJs$rM[$K;}$?$;$?e(B RTypedData
e$B$r?7@
$9$k$N$O$I$&$G$7$g$&$+!%7?e(B
e$B$K$O!$=>Mh$I$$je(B mark, free
e$B4X?t$,I3$E$1$i$l$F$
$j!$$5$i$KL>A0$H%5%$%:$re(B
e$BJV$94X?t$bIU$1$F$_$^$7$?!%e(B

e$B%5%$%:$rJV$94X?t$rIU$1$k$N$,F05!$J$s$G$9$,!%e(B

e$B!!$I$&$G$7$g$&$+!%$A$g$C$HBg$-$JJQ99$G!$Nc$($P$3$l$KBP1~$7$?%=!<%9$Oe(B
1.9.1 e$B$G$O%3%s%Q%$%k$G$-$J$$%W%m%0%i%`$K$J$C$A$c$$$^$9$1$I!%e(B

1.9.1 e$BMQ$N%W%m%0%i%`$O%3%s%Q%$%k$G$-$k!%e(B

e$B!!;H$&B&$O!$e(Balloc
e$B;~$K$A$g$C$H%$%s%?!<%U%’!<%9$,JQ$o$k$@$1$G$9!%e(B

e$B!!$H$j$"$($:!$e(Bruby.h e$B$@$1!$$3$s$J46$8$H$$$&$3$H$G!%e(B

Index: include/ruby/ruby.h

— include/ruby/ruby.h (e$B%j%S%8%g%se(B 23689)
+++ include/ruby/ruby.h (e$B:n6H%3%T!<e(B)
@@ -347,6 +347,7 @@ enum ruby_value_type {
RUBY_T_SYMBOL = 0x14,
RUBY_T_FIXNUM = 0x15,

  • RUBY_T_TYPEDDATA = 0x1a,
    RUBY_T_UNDEF = 0x1b,
    RUBY_T_NODE = 0x1c,
    RUBY_T_ICLASS = 0x1d,
    @@ -373,6 +374,7 @@ enum ruby_value_type {
    #define T_TRUE RUBY_T_TRUE
    #define T_FALSE RUBY_T_FALSE
    #define T_DATA RUBY_T_DATA
    +#define T_TYPEDDATA RUBY_T_TYPEDDATA
    #define T_MATCH RUBY_T_MATCH
    #define T_SYMBOL RUBY_T_SYMBOL
    #define T_RATIONAL RUBY_T_RATIONAL
    @@ -735,7 +737,25 @@ struct RData {
    void *data;
    };

+typedef struct rb_data_type_struct {

  • const char *name;
  • void (dmark)(void);
  • void (dfree)(void);
  • size_t (*dsize)(void *);
  • void ary[4]; / for extension */
    +} rb_data_type_t;

+struct RTypedData {

  • struct RBasic basic;
  • rb_data_type_t *type;
  • VALUE dummy;
  • void *data;
    +};

#define DATA_PTR(dta) (RDATA(dta)->data)
+#define RTYPEDDATA_TYPE(v) (RTYPEDDATA(v)->type)
+#define RTYPEDDATA_DATA(v) (RTYPEDDATA(v)->data)

/*
#define RUBY_DATA_FUNC(func) ((void ()(void))func)
@@ -743,6 +763,7 @@ struct RData {
typedef void (RUBY_DATA_FUNC)(void);

VALUE rb_data_object_alloc(VALUE,void*,RUBY_DATA_FUNC,RUBY_DATA_FUNC);
+VALUE rb_data_typed_object_alloc(VALUE klass, void *datap,
rb_data_type_t *);

#define Data_Wrap_Struct(klass,mark,free,sval)\

rb_data_object_alloc(klass,sval,(RUBY_DATA_FUNC)mark,(RUBY_DATA_FUNC)free)
@@ -753,6 +774,15 @@ VALUE rb_data_object_alloc(VALUE,void*,R
Data_Wrap_Struct(klass,mark,free,sval)
)

+#define Data_Wrap_TypedStruct(klass,data_type,sval)\

  • rb_data_typed_object_alloc(klass,sval,data_type)

+#define Data_Make_TypedStruct(klass, type, data_type, sval) (\

  • sval = ALLOC(type),\
  • memset(sval, 0, sizeof(type)),\
  • Data_Wrap_TypedStruct(klass,data_type,sval)
    +)

#define Data_Get_Struct(obj,type,sval) do {
Check_Type(obj, T_DATA);
sval = (type*)DATA_PTR(obj);
@@ -826,6 +856,7 @@ struct RBignum {
#define RARRAY(obj) (R_CAST(RArray)(obj))
#define RHASH(obj) (R_CAST(RHash)(obj))
#define RDATA(obj) (R_CAST(RData)(obj))
+#define RTYPEDDATA(obj) (R_CAST(RTypedData)(obj))
#define RSTRUCT(obj) (R_CAST(RStruct)(obj))
#define RBIGNUM(obj) (R_CAST(RBignum)(obj))
#define RFILE(obj) (R_CAST(RFile)(obj))

e$B$^$D$b$He(B e$B$f$-$R$m$G$9e(B

In message “Re: [ruby-dev:38620] [Feature: trunk] RTypedData”
on Mon, 15 Jun 2009 12:07:20 +0900, SASADA Koichi [email protected]
writes:

|e$B!!8=:!$e(BRData e$B$K3JG<$5$l$?>pJs$O!$$=$N85$K$J$C$?7?>pJs$,$J$/$J$C$F$7$^$$e(B
|e$B$^$9$,!$7?>pJs$rM[$K;}$?$;$?e(B RTypedData e$B$r?7@
$9$k$N$O$I$&$G$7$g$&$+!%7?e(B
|e$B$K$O!$=>Mh$I$$je(B mark, free e$B4X?t$,I3$E$1$i$l$F$$j!$$5$i$KL>A0$H%5%$%:$re(B
|e$BJV$94X?t$bIU$1$F$_$^$7$?!%e(B
|
|# e$B%5%$%:$rJV$94X?t$rIU$1$k$N$,F05!$J$s$G$9$,!%e(B
|
|e$B!!$I$&$G$7$g$&$+!%$A$g$C$HBg$-$JJQ99$G!$Nc$($P$3$l$KBP1~$7$?%=!<%9$Oe(B
|1.9.1 e$B$G$O%3%s%Q%$%k$G$-$J$$%W%m%0%i%`$K$J$C$A$c$$$^$9$1$I!%e(B

RDatae$B$NN`;wJ*$rDI2C$9$k$h$j$b!"3F%*%V%8%'%/%H$Ke(Bmemsizee$B%a%=%Ce(B
e$B%I$rDI2C$9$kJ}$,6Z$,NI$$$h$&$K;W$$$^$9!#e(B

e$B!!$5$5$@$G$9!%e(B

Yukihiro M. wrote::

RDatae$B$NN`;wJ*$rDI2C$9$k$h$j$b!"3F%*%V%8%’%/%H$Ke(Bmemsizee$B%a%=%Ce(B
e$B%I$rDI2C$9$kJ}$,6Z$,NI$$$h$&$K;W$$$^$9!#e(B

e$B!!K\7o!$$^$D$b$H$5$s$H%A%c%C%H$G5DO@$5$;$F$b$i$C$?$s$G$9$,!$e(B

e$B!&e(BT_TYPEDDATA e$B$ONI$/$J$$e(B
e$B!&e(BRTypedData e$B$O!$$d$C$F$b0-$/$O$J$$e(B
e$B!!!&$?$H$($P!$e(Bdmark e$B$GHf3S$7$F$k$d$D$O!$e(B
e$B!!!e(Btype e$B$GHf3S$7$?$[$&$,!V$+$C$3$$$$!We(B
e$B!&e(BT_DATAe$B$N>l9g!$e(BRData e$B$Ne(B dfree e$B$r%U%i%0$K$7$F!$e(B
e$B!!e(Bdfree e$B$,B(CM$Ne(B 1 e$B$J$ie(B RTypedDatae$B!$e(B
e$B$=$&$G$J$$$J$ie(B RData e$B$H$7$F%"%/%;%9e(B

e$B$H$$$&OC$G9g0U$7$^$7$?!%e(B

e$B!!$H$/$KH?O@$,$J$$$h$&$@$C$?$i!$$3$NJ}?K$G%3%_%C%H$7$^$9!%e(B