# \[bug:trunk\] rb\_data\_type\_t should be extensible

**URL:** <https://www.ruby-forum.com/t/bug-trunk-rb-data-type-t-should-be-extensible/191755>\
**Category:** Development\
**Created:** [July 17, 2010, 7:10pm UTC](https://www.ruby-forum.com/t/bug-trunk-rb-data-type-t-should-be-extensible/191755 "2010-07-17T19:10:24Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![nobu](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/e9c0ed/32.png) [@nobu](https://www.ruby-forum.com/u/nobu)\
**Post date:** [July 17, 2010, 7:10pm UTC](https://www.ruby-forum.com/t/bug-trunk-rb-data-type-t-should-be-extensible/191755/1 "2010-07-17T19:10:24Z")

</div>

e$B$J$+$@$G$9!#e(B

e$B8=:\_e(Brb\_data\_type\_te$B$K$Oe(Breservede$B$,$"$j$^$9$,!“G[Ns$K$J$C$F$$$k$3$He(B  
e$B$H$=$N8e$Ke(Bdatae$B$,$”$k$3$H$N$?$a$K\<B:]$K3HD%$9$k$N$OFq$7$/$J$C$F$$e(B  
e$B$^$9!#e(B

typedef struct rb\_data\_type\_struct {  
const char \*wrap\_struct\_name;  
void (_dmark)(void_);  
void (_dfree)(void_);  
size\_t (\*dsize)(const void \*);  
void \*reserved[3];  
void \*data;  
} rb\_data\_type\_t;

static const rb\_data\_type\_t foo\_data = {  
“foo”, foo\_mark, foo\_free, foo\_size, {}, my\_data  
};

e$B$3$l$r0J2\<$N$h$&$K3HD%$7$h$&$H$9$k$He(B

typedef struct rb\_data\_type\_struct {  
const char \*wrap\_struct\_name;  
void (_dmark)(void_);  
void (_dfree)(void_);  
size\_t (\*dsize)(const void \*);  
void (\*extension)(void \*);  
void \*reserved[2];  
void \*data;  
} rb\_data\_type\_t;

e$B$3$N$h$&$K0l$D$:$l$F$7$^$$!"e(Bdatae$B$r@\_Dj$7$F$$$k\>l9g$O=q$-49$($,I,e(B  
e$BMW$K$J$j$^$9!#e(B

static const rb\_data\_type\_t foo\_data = {  
“foo”, foo\_mark, foo\_free, foo\_size, foo\_ext, {}, my\_data  
};

e$B0J2\<$N$h$&$K$9$l$P%:%l$O5/$-$^$;$s$,!"e(B

typedef struct rb\_data\_type\_struct {  
const char \*wrap\_struct\_name;  
void (_dmark)(void_);  
void (_dfree)(void_);  
size\_t (\*dsize)(const void \*);  
struct {  
void (\*extension)(void \*);  
void \*reserved[2];  
} ext;  
void \*data;  
} rb\_data\_type\_t;

static const rb\_data\_type\_t foo\_data = {  
“foo”, foo\_mark, foo\_free, foo\_size, {foo\_ext,}, my\_data  
};

e$B$J$I$H3HD%$5$l$?ItJ,$@$1$re(B{}e$B$KF~$l$J$1$l$P$J$j$^$;$s!#e(B

e$B$=$3$G!“e(Bdmarke$B$+$ie(Bdsizee$B$^$G$be(Breservede$B$H0l=o$Ke(Bstructe$B$KF~$l$F$7$^$$e(B  
e$B$?$$$H;W$$$^$9!#e(B{}e$B$,I,MW$K$J$j$^$9$,!”\>e5-$N$h$&$JITB7$$$5$O2sHre(B  
e$B$G$-$^$9$7!"%P%$%J%j8\_49@-$bJ]$?$l$^$9!#e(B

e$B9,$$e(Brb\_data\_type\_te$B$Oe(B1.9.1e$B$K$O$"$j$^$;$s!#JQ$($k$J$i:#$,:G8e$N%A%ce(B  
e$B%s%9$G$9!#$$$+$,$G$7$g$&$+!#e(B

diff --git a/cont.c b/cont.c  
index dec3b01…6065d34 100644  
— a/cont.c  
+++ b/cont.c  
@@ -375,5 +375,5 @@ cont\_save\_machine\_stack(rb\_thread\_t \*th,  
rb\_context\_t \*cont)  
static const rb\_data\_type\_t cont\_data\_type = {  
“continuation”,

- cont\_mark, cont\_free, cont\_memsize,

- {cont\_mark, cont\_free, cont\_memsize,},  
};

@@ -952,5 +952,5 @@ rb\_cont\_call(int argc, VALUE \*argv, VALUE contval)  
static const rb\_data\_type\_t fiber\_data\_type = {  
“fiber”,

- fiber\_mark, fiber\_free, fiber\_memsize,

- {fiber\_mark, fiber\_free, fiber\_memsize,},  
};

diff --git a/dir.c b/dir.c  
index cab0cdc…8ebd1de 100644  
— a/dir.c  
+++ b/dir.c  
@@ -345,5 +345,5 @@ dir\_memsize(const void \*ptr)  
static const rb\_data\_type\_t dir\_data\_type = {  
“dir”,

- dir\_mark, dir\_free, dir\_memsize

- {dir\_mark, dir\_free, dir\_memsize,},  
};

diff --git a/encoding.c b/encoding.c  
index 328e109…2fa8b71 100644  
— a/encoding.c  
+++ b/encoding.c  
@@ -60,5 +60,6 @@ enc\_memsize(const void \*p)

static const rb\_data\_type\_t encoding\_data\_type = {

- “encoding”, 0, 0, enc\_memsize,

- “encoding”,
- {0, 0, enc\_memsize,},  
};

diff --git a/enumerator.c b/enumerator.c  
index bdf3bb8…47a5c7e 100644  
— a/enumerator.c  
+++ b/enumerator.c  
@@ -132,7 +132,9 @@ enumerator\_memsize(const void \*p)  
static const rb\_data\_type\_t enumerator\_data\_type = {  
“enumerator”,

- enumerator\_mark,
- enumerator\_free,
- enumerator\_memsize,

- {
- enumerator\_mark,
- enumerator\_free,
- enumerator\_memsize,
- },  
};

@@ -813,7 +815,9 @@ yielder\_memsize(const void \*p)  
static const rb\_data\_type\_t yielder\_data\_type = {  
“yielder”,

- yielder\_mark,
- yielder\_free,
- yielder\_memsize,

- {
- yielder\_mark,
- yielder\_free,
- yielder\_memsize,
- },  
};

@@ -916,7 +920,9 @@ generator\_memsize(const void \*p)  
static const rb\_data\_type\_t generator\_data\_type = {  
“generator”,

- generator\_mark,
- generator\_free,
- generator\_memsize,

- {
- generator\_mark,
- generator\_free,
- generator\_memsize,
- },  
};

diff --git a/error.c b/error.c  
index 0e1eab0…0d8e2bd 100644  
— a/error.c  
+++ b/error.c  
@@ -816,7 +816,9 @@ name\_err\_mesg\_memsize(const void \*p)  
static const rb\_data\_type\_t name\_err\_mesg\_data\_type = {  
“name\_err\_mesg”,

- name\_err\_mesg\_mark,
- name\_err\_mesg\_free,
- name\_err\_mesg\_memsize,

- {
- name\_err\_mesg\_mark,
- name\_err\_mesg\_free,
- name\_err\_mesg\_memsize,
- },  
};

diff --git a/ext/bigdecimal/bigdecimal.c b/ext/bigdecimal/bigdecimal.c  
index 340ea8b…146145c 100644  
— a/ext/bigdecimal/bigdecimal.c  
+++ b/ext/bigdecimal/bigdecimal.c  
@@ -106,5 +106,5 @@ BigDecimal\_memsize(const void \*ptr)  
static const rb\_data\_type\_t BigDecimal\_data\_type = {  
“BigDecimal”,

- 0, BigDecimal\_delete, BigDecimal\_memsize,

- {0, BigDecimal\_delete, BigDecimal\_memsize,},  
};

diff --git a/ext/dl/cfunc.c b/ext/dl/cfunc.c  
index 536a723…7eb5860 100644  
— a/ext/dl/cfunc.c  
+++ b/ext/dl/cfunc.c  
@@ -71,5 +71,5 @@ dlcfunc\_memsize(const void \*ptr)  
const rb\_data\_type\_t dlcfunc\_data\_type = {  
“dl/cfunc”,

- 0, dlcfunc\_free, dlcfunc\_memsize,

- {0, dlcfunc\_free, dlcfunc\_memsize,},  
};

diff --git a/ext/dl/cptr.c b/ext/dl/cptr.c  
index bafbc48…68c18ec 100644  
— a/ext/dl/cptr.c  
+++ b/ext/dl/cptr.c  
@@ -44,5 +44,5 @@ dlptr\_memsize(const void \*ptr)  
static const rb\_data\_type\_t dlptr\_data\_type = {  
“dl/ptr”,

- 0, dlptr\_free, dlptr\_memsize,

- {0, dlptr\_free, dlptr\_memsize,},  
};

diff --git a/ext/dl/handle.c b/ext/dl/handle.c  
index a450e6b…ed042e1 100644  
— a/ext/dl/handle.c  
+++ b/ext/dl/handle.c  
@@ -49,5 +49,5 @@ dlhandle\_memsize(const void \*ptr)  
static const rb\_data\_type\_t dlhandle\_data\_type = {  
“dl/handle”,

- 0, dlhandle\_free, dlhandle\_memsize,

- {0, dlhandle\_free, dlhandle\_memsize,},  
};

diff --git a/ext/socket/raddrinfo.c b/ext/socket/raddrinfo.c  
index 4bc20c9…2e5f95a 100644  
— a/ext/socket/raddrinfo.c  
+++ b/ext/socket/raddrinfo.c  
@@ -535,5 +535,5 @@ addrinfo\_memsize(const void \*ptr)  
static const rb\_data\_type\_t addrinfo\_type = {  
“socket/addrinfo”,

- addrinfo\_mark, addrinfo\_free, addrinfo\_memsize,

- {addrinfo\_mark, addrinfo\_free, addrinfo\_memsize,},  
};

diff --git a/ext/stringio/stringio.c b/ext/stringio/stringio.c  
index c93ba10…4628a35 100644  
— a/ext/stringio/stringio.c  
+++ b/ext/stringio/stringio.c  
@@ -74,7 +74,9 @@ strio\_memsize(const void \*p)  
static const rb\_data\_type\_t strio\_data\_type = {  
“strio”,

- strio\_mark,
- strio\_free,
- strio\_memsize,

- {
- strio\_mark,
- strio\_free,
- strio\_memsize,
- },  
};

diff --git a/file.c b/file.c  
index 94c2468…37c9c47 100644  
— a/file.c  
+++ b/file.c  
@@ -248,5 +248,5 @@ stat\_memsize(const void \*p)  
static const rb\_data\_type\_t stat\_data\_type = {  
“stat”,

- NULL, RUBY\_TYPED\_DEFAULT\_FREE, stat\_memsize,

- {NULL, RUBY\_TYPED\_DEFAULT\_FREE, stat\_memsize,},  
};

diff --git a/gc.c b/gc.c  
index 20c34a7…f7fb399 100644  
— a/gc.c  
+++ b/gc.c  
@@ -1178,5 +1178,5 @@ rb\_objspace\_data\_type\_memsize(VALUE obj)  
{  
if (RTYPEDDATA\_P(obj)) {

- return RTYPEDDATA\_TYPE(obj)-\>dsize(RTYPEDDATA\_DATA(obj));

- return RTYPEDDATA\_TYPE(obj)-\>ext.dsize(RTYPEDDATA\_DATA(obj));  
}  
else {  
@@ -1750,5 +1750,5 @@ gc\_mark\_children(rb\_objspace\_t \*objspace, VALUE  
ptr, int lev)  
case T\_DATA:  
if (RTYPEDDATA\_P(obj)) {

- 

```
 if (obj->as.typeddata.type->dmark) 

```

(\*obj-\>as.typeddata.type-\>dmark)(DATA\_PTR(obj));

- 

```
 if (obj->as.typeddata.type->ext.dmark) 

```

(\*obj-\>as.typeddata.type-\>ext.dmark)(DATA\_PTR(obj));  
}  
else {  
@@ -2187,5 +2187,5 @@ obj\_free(rb\_objspace\_t \*objspace, VALUE obj)  
if (DATA\_PTR(obj)) {  
if (RTYPEDDATA\_P(obj)) {

- RDATA(obj)-\>dfree = RANY(obj)-\>as.typeddata.type-\>dfree;

- RDATA(obj)-\>dfree = RANY(obj)-\>as.typeddata.type-\>ext.dfree;  
}  
if ((long)RANY(obj)-\>as.data.dfree == -1) {  
@@ -2781,5 +2781,5 @@ run\_final(rb\_objspace\_t \*objspace, VALUE obj)

- free\_func = RTYPEDDATA\_TYPE(obj)-\>dfree;

- free\_func = RTYPEDDATA\_TYPE(obj)-\>ext.dfree;  
}  
else {  
@@ -2903,5 +2903,5 @@ rb\_objspace\_call\_finalizer(rb\_objspace\_t  
\*objspace)  
p-\>as.free.flags = 0;  
if (RTYPEDDATA\_P§) {

- 

```
   RDATA(p)->dfree = RANY(p)->as.typeddata.type->dfree;

```

- 

```
   RDATA(p)->dfree = RANY(p)->as.typeddata.type->ext.dfree;

```

}  
if ((long)RANY§-\>as.data.dfree == -1) {  
diff --git a/include/ruby/ruby.h b/include/ruby/ruby.h  
index 03984b4…2dba533 100644  
— a/include/ruby/ruby.h  
+++ b/include/ruby/ruby.h  
@@ -745,9 +745,11 @@ struct RData {  
typedef struct rb\_data\_type\_struct {  
const char \*wrap\_struct\_name;

- void (_dmark)(void_);
- void (_dfree)(void_);
- size\_t (\*dsize)(const void \*);
- void _reserved[3]; /_ For future extension.
- 

```
                     This array *must* be filled with ZERO. */

```

- struct {
- void (_dmark)(void_);
- void (_dfree)(void_);
- size\_t (\*dsize)(const void \*);
- void _reserved[3]; /_ For future extension.
- 

```
       This array *must* be filled with ZERO. */

```

- } ext;  
void _data; /_ This area can be used for any purpose  
by a programmer who define the type. \*/  
diff --git a/iseq.c b/iseq.c  
index ae45884…fc9b101 100644  
— a/iseq.c  
+++ b/iseq.c  
@@ -157,7 +157,9 @@ iseq\_memsize(const void \*ptr)  
static const rb\_data\_type\_t iseq\_data\_type = {  
“iseq”,

- iseq\_mark,
- iseq\_free,
- iseq\_memsize,

- {
- iseq\_mark,
- iseq\_free,
- iseq\_memsize,
- },  
};

diff --git a/marshal.c b/marshal.c  
index bf76e6d…bcbc2de 100644  
— a/marshal.c  
+++ b/marshal.c  
@@ -187,5 +187,5 @@ memsize\_dump\_arg(const void \*ptr)  
static const rb\_data\_type\_t dump\_arg\_data = {  
“dump\_arg”,

- mark\_dump\_arg, free\_dump\_arg, memsize\_dump\_arg

- {mark\_dump\_arg, free\_dump\_arg, memsize\_dump\_arg,},  
};

@@ -1000,5 +1000,5 @@ memsize\_load\_arg(const void \*ptr)  
static const rb\_data\_type\_t load\_arg\_data = {  
“load\_arg”,

- mark\_load\_arg, free\_load\_arg, memsize\_load\_arg

- {mark\_load\_arg, free\_load\_arg, memsize\_load\_arg,},  
};

diff --git a/parse.y b/parse.y  
index b9f59d4…6b4bf95 100644  
— a/parse.y  
+++ b/parse.y  
@@ -10028,7 +10028,9 @@ parser\_memsize(const void \*ptr)  
static const rb\_data\_type\_t parser\_data\_type = {  
“parser”,

- parser\_mark,
- parser\_free,
- parser\_memsize,

- {
- parser\_mark,
- parser\_free,
- parser\_memsize,
- },  
};

diff --git a/proc.c b/proc.c  
index 7df2ec8…0489dd9 100644  
— a/proc.c  
+++ b/proc.c  
@@ -72,7 +72,9 @@ proc\_memsize(const void \*ptr)  
static const rb\_data\_type\_t proc\_data\_type = {  
“proc”,

- proc\_mark,
- proc\_free,
- proc\_memsize,

- {
- proc\_mark,
- proc\_free,
- proc\_memsize,
- },  
};

@@ -269,7 +271,9 @@ binding\_memsize(const void \*ptr)  
static const rb\_data\_type\_t binding\_data\_type = {  
“binding”,

- binding\_mark,
- binding\_free,
- binding\_memsize,

- {
- binding\_mark,
- binding\_free,
- binding\_memsize,
- },  
};

@@ -883,7 +887,9 @@ bm\_memsize(const void \*ptr)  
static const rb\_data\_type\_t method\_data\_type = {  
“method”,

- bm\_mark,
- bm\_free,
- bm\_memsize,

- {
- bm\_mark,
- bm\_free,
- bm\_memsize,
- },  
};

diff --git a/random.c b/random.c  
index 333c593…72ef7c5 100644  
— a/random.c  
+++ b/random.c  
@@ -340,7 +340,9 @@ random\_memsize(const void \*ptr)  
static const rb\_data\_type\_t random\_data\_type = {  
“random”,

- random\_mark,
- random\_free,
- random\_memsize,

- {
- random\_mark,
- random\_free,
- random\_memsize,
- },  
};

diff --git a/thread.c b/thread.c  
index de60b4d…49d4d28 100644  
— a/thread.c  
+++ b/thread.c  
@@ -2825,5 +2825,5 @@ thgroup\_memsize(const void \*ptr)  
static const rb\_data\_type\_t thgroup\_data\_type = {  
“thgroup”,

- NULL, RUBY\_TYPED\_DEFAULT\_FREE, thgroup\_memsize,

- {NULL, RUBY\_TYPED\_DEFAULT\_FREE, thgroup\_memsize,},  
};

@@ -3063,5 +3063,5 @@ mutex\_memsize(const void \*ptr)  
static const rb\_data\_type\_t mutex\_data\_type = {  
“mutex”,

- mutex\_mark, mutex\_free, mutex\_memsize,

- {mutex\_mark, mutex\_free, mutex\_memsize,},  
};

@@ -3434,5 +3434,5 @@ barrier\_mark(void \*ptr)  
static const rb\_data\_type\_t barrier\_data\_type = {  
“barrier”,

- barrier\_mark, 0, 0,

- {barrier\_mark, 0, 0,},  
};

diff --git a/time.c b/time.c  
index 1abbd96…15398e9 100644  
— a/time.c  
+++ b/time.c  
@@ -1852,5 +1852,5 @@ time\_memsize(const void \*tobj)  
static const rb\_data\_type\_t time\_data\_type = {  
“time”,

- time\_mark, time\_free, time\_memsize,

- {time\_mark, time\_free, time\_memsize,},  
};

diff --git a/transcode.c b/transcode.c  
index dadb57b…c718182 100644  
— a/transcode.c  
+++ b/transcode.c  
@@ -2830,5 +2830,5 @@ econv\_memsize(const void \*ptr)  
static const rb\_data\_type\_t econv\_data\_type = {  
“econv”,

- NULL, econv\_free, econv\_memsize,

- {NULL, econv\_free, econv\_memsize,},  
};

diff --git a/variable.c b/variable.c  
index 382644b…33e6632 100644  
— a/variable.c  
+++ b/variable.c  
@@ -1419,5 +1419,5 @@ autoload\_memsize(const void \*ptr)  
static const rb\_data\_type\_t autoload\_data\_type = {  
“autoload”,

- autoload\_mark, autoload\_free, autoload\_memsize,

- {autoload\_mark, autoload\_free, autoload\_memsize,},  
};

diff --git a/vm.c b/vm.c  
index 8e93963…f8509d7 100644  
— a/vm.c  
+++ b/vm.c  
@@ -245,5 +245,5 @@ env\_memsize(const void \*ptr)  
static const rb\_data\_type\_t env\_data\_type = {  
“VM/env”,

- env\_mark, env\_free, env\_memsize,

- {env\_mark, env\_free, env\_memsize,},  
};

@@ -1570,5 +1570,5 @@ vm\_memsize(const void \*ptr)  
static const rb\_data\_type\_t vm\_data\_type = {  
“VM”,

- rb\_vm\_mark, vm\_free, vm\_memsize,

- {rb\_vm\_mark, vm\_free, vm\_memsize,},  
};

@@ -1760,7 +1760,9 @@ thread\_memsize(const void \*ptr)  
static const rb\_data\_type\_t thread\_data\_type = {  
“VM/thread”,

- rb\_thread\_mark,
- thread\_free,
- thread\_memsize,

- {
- rb\_thread\_mark,
- thread\_free,
- thread\_memsize,
- },  
};

---

<div class="post-metadata">

**Author:** ![nobu](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/e9c0ed/32.png) [@nobu](https://www.ruby-forum.com/u/nobu)\
**Post date:** [July 18, 2010, 9:24am UTC](https://www.ruby-forum.com/t/bug-trunk-rb-data-type-t-should-be-extensible/191755/2 "2010-07-18T09:24:13Z")

</div>

e$B$J$+$@$G$9!#e(B

At Sun, 18 Jul 2010 01:58:17 +0900,  
Nobuyoshi N. wrote in [ruby-dev:41862]:

> e$B$=$3$G!“e(Bdmarke$B$+$ie(Bdsizee$B$^$G$be(Breservede$B$H0l=o$Ke(Bstructe$B$KF~$l$F$7$^$$e(B  
> e$B$?$$$H;W$$$^$9!#e(B{}e$B$,I,MW$K$J$j$^$9$,!”\>e5-$N$h$&$JITB7$$$5$O2sHre(B  
> e$B$G$-$^$9$7!"%P%$%J%j8\_49@-$bJ]$?$l$^$9!#e(B
> 
> e$B9,$$e(Brb\_data\_type\_te$B$Oe(B1.9.1e$B$K$O$"$j$^$;$s!#JQ$($k$J$i:#$,:G8e$N%A%ce(B  
> e$B%s%9$G$9!#$$$+$,$G$7$g$&$+!#e(B

e$B$9$G$Ke(B[ruby-dev:40913]e$B$G!"e(B1.9.2e$B$G$O!V?($k$J%-%1%s!W$H$$$&$3$H$Ke(B  
e$B$J$C$F$$$^$7$?$M!#$H$$$&$3$H$Ge(B1.9.2e$BHG$H$N%=!\<%9%l%Y%k$G$N8\_49@-e(B  
e$B$OITMW$H$7$F9MN8$7$J$$$3$H$H$7$^$9!#e(B

---

<div class="post-metadata">

**Author:** ![nobu](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/e9c0ed/32.png) [@nobu](https://www.ruby-forum.com/u/nobu)\
**Post date:** [July 18, 2010, 9:37am UTC](https://www.ruby-forum.com/t/bug-trunk-rb-data-type-t-should-be-extensible/191755/3 "2010-07-18T09:37:41Z")

</div>

e$B%A%1%C%He(B #3583 e$B$,99?7$5$l$^$7$?!#e(B (by Nobuyoshi N.)

e$B%9%F!\<%?%9e(B Assignede$B$+$ie(BClosede$B$KJQ99e(B  
e$B?JD=e(B % 0e$B$+$ie(B100e$B$KJQ99e(B

This issue was solved with changeset r28676.  
Nobuyoshi, thank you for reporting this issue.  
Your contribution to Ruby is greatly appreciated.  
May Ruby be with you.

* * *

[http://redmine.ruby-lang.org/issues/show/3583](http://redmine.ruby-lang.org/issues/show/3583)

---

<div class="post-metadata">

**Author:** ![nobu](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/e9c0ed/32.png) [@nobu](https://www.ruby-forum.com/u/nobu)\
**Post date:** [July 18, 2010, 9:40am UTC](https://www.ruby-forum.com/t/bug-trunk-rb-data-type-t-should-be-extensible/191755/4 "2010-07-18T09:40:01Z")

</div>

e$B$=$N;]$N%3%a%s%H$re(B include/ruby.h  
e$B$KDI2C$7$F$bNI$$$G$7$g$&$+!%e(B

---

<div class="post-metadata">

**Author:** ![nobu](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/e9c0ed/32.png) [@nobu](https://www.ruby-forum.com/u/nobu)\
**Post date:** [July 19, 2010, 7:21am UTC](https://www.ruby-forum.com/t/bug-trunk-rb-data-type-t-should-be-extensible/191755/5 "2010-07-19T07:21:14Z")

</div>

e$B1sF#$G$9!#e(B

e$BDI2C$7$?$[$&$,$$$$$H;W$$$^$9!#e(B  
trunk e$B$KF~$l$Fe(B revision e$B$rEA$($F$/$@$5$$!#e(B  
e$BH?BP$,$J$1$l$Pe(B backport e$B$7$^$9!#e(B

2010e$BG/e(B7e$B7ne(B18e$BF|e(B16:39 SASADA Koichi [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):
