# \[Feature: trunk\] RTypedData

**URL:** <https://www.ruby-forum.com/t/feature-trunk-rtypeddata/170262>\
**Category:** Development\
**Created:** [June 15, 2009, 5:07am UTC](https://www.ruby-forum.com/t/feature-trunk-rtypeddata/170262 "2009-06-15T05:07:59Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![SASADA\_Koichi](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/f1d935/32.png) [@SASADA\_Koichi](https://www.ruby-forum.com/u/SASADA_Koichi)\
**Post date:** [June 15, 2009, 5:07am UTC](https://www.ruby-forum.com/t/feature-trunk-rtypeddata/170262/1 "2009-06-15T05:07:59Z")

</div>

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))

---

<div class="post-metadata">

**Author:** ![SASADA\_Koichi](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/f1d935/32.png) [@SASADA\_Koichi](https://www.ruby-forum.com/u/SASADA_Koichi)\
**Post date:** [June 15, 2009, 7:10pm UTC](https://www.ruby-forum.com/t/feature-trunk-rtypeddata/170262/2 "2009-06-15T19:10:12Z")

</div>

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 [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
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

---

<div class="post-metadata">

**Author:** ![SASADA\_Koichi](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/f1d935/32.png) [@SASADA\_Koichi](https://www.ruby-forum.com/u/SASADA_Koichi)\
**Post date:** [June 16, 2009, 4:10am UTC](https://www.ruby-forum.com/t/feature-trunk-rtypeddata/170262/3 "2009-06-16T04:10:31Z")

</div>

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
