summaryrefslogtreecommitdiffhomepage
path: root/src/array.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2014-07-06 19:30:29 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2014-07-06 19:30:29 +0900
commit1300770cec6b6a20c33dc54c9c01fc07c5097088 (patch)
tree167e781a4ec5bd4a1168a3c33f23bc80beb9ebea /src/array.c
parentc16bb3fee3ba0dfcd74b82fd2167c3fdd0593ba9 (diff)
parent6cbcbd529011439ec678f38bc2d90ed6517db82f (diff)
downloadmruby-1300770cec6b6a20c33dc54c9c01fc07c5097088.tar.gz
mruby-1300770cec6b6a20c33dc54c9c01fc07c5097088.zip
Merge pull request #2447 from take-cheeze/reduce_ary_clear_alloc
Reduce allocation in shared RArray clearing.
Diffstat (limited to 'src/array.c')
-rw-r--r--src/array.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/src/array.c b/src/array.c
index d008e52cf..74afc529a 100644
--- a/src/array.c
+++ b/src/array.c
@@ -902,10 +902,14 @@ mrb_ary_clear(mrb_state *mrb, mrb_value self)
{
struct RArray *a = mrb_ary_ptr(self);
- ary_modify(mrb, a);
+ if (ARY_SHARED_P(a)) {
+ mrb_ary_decref(mrb, a->aux.shared);
+ ARY_UNSET_SHARED_FLAG(a);
+ } else {
+ mrb_free(mrb, a->ptr);
+ }
a->len = 0;
a->aux.capa = 0;
- mrb_free(mrb, a->ptr);
a->ptr = 0;
return self;