summaryrefslogtreecommitdiffstats
path: root/array.c
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2000-06-22 08:29:58 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2000-06-22 08:29:58 +0000
commit623f789e46a571d4d18ba5a7ae5fd657e5d34a0f (patch)
tree10e665c60414c3070ce957e5c534e30ed499bc2d /array.c
parent2c4dd0158164639963d6957bb20a5606a807c5a6 (diff)
downloadruby-623f789e46a571d4d18ba5a7ae5fd657e5d34a0f.tar.gz
ruby-623f789e46a571d4d18ba5a7ae5fd657e5d34a0f.tar.xz
ruby-623f789e46a571d4d18ba5a7ae5fd657e5d34a0f.zip
2000-06-22
git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@775 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'array.c')
-rw-r--r--array.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/array.c b/array.c
index d8dc37195..f2089996e 100644
--- a/array.c
+++ b/array.c
@@ -680,9 +680,13 @@ static VALUE
rb_ary_dup(ary)
VALUE ary;
{
+ VALUE klass = CLASS_OF(ary);
VALUE dup;
- dup = rb_ary_s_create(RARRAY(ary)->len, RARRAY(ary)->ptr, CLASS_OF(ary));
+ while (TYPE(klass) == T_ICLASS || FL_TEST(klass, FL_SINGLETON)) {
+ klass = (VALUE)RCLASS(klass)->super;
+ }
+ dup = rb_ary_s_create(RARRAY(ary)->len, RARRAY(ary)->ptr, klass);
if (OBJ_TAINTED(ary)) OBJ_TAINT(dup);
return dup;
}