summaryrefslogtreecommitdiffhomepage
path: root/src/array.c
diff options
context:
space:
mode:
authortake_cheeze <[email protected]>2014-07-05 21:10:02 +0900
committertake_cheeze <[email protected]>2014-07-05 21:10:02 +0900
commit6cbcbd529011439ec678f38bc2d90ed6517db82f (patch)
tree167e781a4ec5bd4a1168a3c33f23bc80beb9ebea /src/array.c
parentc16bb3fee3ba0dfcd74b82fd2167c3fdd0593ba9 (diff)
downloadmruby-6cbcbd529011439ec678f38bc2d90ed6517db82f.tar.gz
mruby-6cbcbd529011439ec678f38bc2d90ed6517db82f.zip
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;