diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2007-01-09 15:11:01 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2007-01-09 15:11:01 +0000 |
commit | ad99f7271beeca2185ae327f1046985cd845193e (patch) | |
tree | c9f02ca6da3db7e1bd92a229d8d313eea59ea408 /array.c | |
parent | 575914cfc84a2d3d1ccd6489c58bc7d21327afec (diff) | |
download | ruby-ad99f7271beeca2185ae327f1046985cd845193e.tar.gz ruby-ad99f7271beeca2185ae327f1046985cd845193e.tar.xz ruby-ad99f7271beeca2185ae327f1046985cd845193e.zip |
* array.c (rb_ary_replace): use ptr and len of orig instead of
shared. fixed: [ruby-dev:30116]
git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@11522 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'array.c')
-rw-r--r-- | array.c | 12 |
1 files changed, 7 insertions, 5 deletions
@@ -2090,15 +2090,17 @@ rb_ary_replace(VALUE copy, VALUE orig) VALUE shared; VALUE *ptr; - rb_ary_modify(copy); - ary_iter_check(copy); orig = to_ary(orig); + rb_ary_modify_check(copy); + ary_iter_check(copy); if (copy == orig) return copy; shared = ary_make_shared(orig); - ptr = RARRAY(copy)->ptr; + if (!ARY_SHARED_P(copy)) { + ptr = RARRAY(copy)->ptr; xfree(ptr); - RARRAY(copy)->ptr = RARRAY(shared)->ptr; - RARRAY(copy)->len = RARRAY(shared)->len; + } + RARRAY(copy)->ptr = RARRAY(orig)->ptr; + RARRAY(copy)->len = RARRAY(orig)->len; RARRAY(copy)->aux.shared = shared; FL_SET(copy, ELTS_SHARED); |