From 3e4e90a708335b790d3dacfa0d38b9ae3e761927 Mon Sep 17 00:00:00 2001 From: ksss Date: Wed, 26 Feb 2014 21:24:05 +0900 Subject: add macro ARY_SHARED_P --- src/array.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) (limited to 'src/array.c') diff --git a/src/array.c b/src/array.c index 5ad90efff..06ea6850a 100644 --- a/src/array.c +++ b/src/array.c @@ -15,6 +15,7 @@ #define ARY_SHRINK_RATIO 5 /* must be larger than 2 */ #define ARY_C_MAX_SIZE (SIZE_MAX / sizeof(mrb_value)) #define ARY_MAX_SIZE ((ARY_C_MAX_SIZE < (size_t)MRB_INT_MAX) ? (mrb_int)ARY_C_MAX_SIZE : MRB_INT_MAX-1) +#define ARY_SHARED_P(a) ((a)->flags & MRB_ARY_SHARED) static inline mrb_value ary_elt(mrb_value ary, mrb_int offset) @@ -124,7 +125,7 @@ ary_fill_with_nil(mrb_value *ptr, mrb_int size) static void ary_modify(mrb_state *mrb, struct RArray *a) { - if (a->flags & MRB_ARY_SHARED) { + if (ARY_SHARED_P(a)) { mrb_shared_array *shared = a->aux.shared; if (shared->refcnt == 1 && a->ptr == shared->ptr) { @@ -160,7 +161,7 @@ mrb_ary_modify(mrb_state *mrb, struct RArray* a) static void ary_make_shared(mrb_state *mrb, struct RArray *a) { - if (!(a->flags & MRB_ARY_SHARED)) { + if (!ARY_SHARED_P(a)) { mrb_shared_array *shared = (mrb_shared_array *)mrb_malloc(mrb, sizeof(mrb_shared_array)); shared->refcnt = 1; @@ -481,7 +482,7 @@ mrb_ary_shift(mrb_state *mrb, mrb_value self) mrb_value val; if (a->len == 0) return mrb_nil_value(); - if (a->flags & MRB_ARY_SHARED) { + if (ARY_SHARED_P(a)) { L_SHIFT: val = a->ptr[0]; a->ptr++; @@ -515,7 +516,7 @@ mrb_ary_unshift(mrb_state *mrb, mrb_value self, mrb_value item) { struct RArray *a = mrb_ary_ptr(self); - if ((a->flags & MRB_ARY_SHARED) + if (ARY_SHARED_P(a) && a->aux.shared->refcnt == 1 /* shared only referenced from this array */ && a->ptr - a->aux.shared->ptr >= 1) /* there's room for unshifted item */ { a->ptr--; @@ -542,7 +543,7 @@ mrb_ary_unshift_m(mrb_state *mrb, mrb_value self) int len; mrb_get_args(mrb, "*", &vals, &len); - if ((a->flags & MRB_ARY_SHARED) + if (ARY_SHARED_P(a) && a->aux.shared->refcnt == 1 /* shared only referenced from this array */ && a->ptr - a->aux.shared->ptr >= len) /* there's room for unshifted item */ { a->ptr -= len; @@ -858,7 +859,7 @@ mrb_ary_first(mrb_state *mrb, mrb_value self) } if (size > a->len) size = a->len; - if (a->flags & MRB_ARY_SHARED) { + if (ARY_SHARED_P(a)) { return ary_subseq(mrb, a, 0, size); } return mrb_ary_new_from_values(mrb, size, a->ptr); @@ -885,7 +886,7 @@ mrb_ary_last(mrb_state *mrb, mrb_value self) mrb_raise(mrb, E_ARGUMENT_ERROR, "negative array size"); } if (size > a->len) size = a->len; - if ((a->flags & MRB_ARY_SHARED) || size > ARY_DEFAULT_LEN) { + if (ARY_SHARED_P(a) || size > ARY_DEFAULT_LEN) { return ary_subseq(mrb, a, a->len - size, size); } return mrb_ary_new_from_values(mrb, size, a->ptr + a->len - size); -- cgit v1.2.3 From 2f090879a59939b7169f15b6402f8e7ebab63873 Mon Sep 17 00:00:00 2001 From: ksss Date: Thu, 27 Feb 2014 00:10:42 +0900 Subject: add macro ARY_SET_SHARED --- src/array.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'src/array.c') diff --git a/src/array.c b/src/array.c index 06ea6850a..7b181d4d5 100644 --- a/src/array.c +++ b/src/array.c @@ -16,6 +16,7 @@ #define ARY_C_MAX_SIZE (SIZE_MAX / sizeof(mrb_value)) #define ARY_MAX_SIZE ((ARY_C_MAX_SIZE < (size_t)MRB_INT_MAX) ? (mrb_int)ARY_C_MAX_SIZE : MRB_INT_MAX-1) #define ARY_SHARED_P(a) ((a)->flags & MRB_ARY_SHARED) +#define ARY_SET_SHARED(a) ((a)->flags |= MRB_ARY_SHARED) static inline mrb_value ary_elt(mrb_value ary, mrb_int offset) @@ -173,7 +174,7 @@ ary_make_shared(mrb_state *mrb, struct RArray *a) } shared->len = a->len; a->aux.shared = shared; - a->flags |= MRB_ARY_SHARED; + ARY_SET_SHARED(a); } } @@ -671,7 +672,7 @@ ary_subseq(mrb_state *mrb, struct RArray *a, mrb_int beg, mrb_int len) b->len = len; b->aux.shared = a->aux.shared; b->aux.shared->refcnt++; - b->flags |= MRB_ARY_SHARED; + ARY_SET_SHARED(b); return mrb_obj_value(b); } -- cgit v1.2.3 From f1043ab85cf328aa62d0e4e0b5de55fd894b05fc Mon Sep 17 00:00:00 2001 From: ksss Date: Thu, 27 Feb 2014 00:11:40 +0900 Subject: add macro ARY_UNSET_SHARED --- src/array.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'src/array.c') diff --git a/src/array.c b/src/array.c index 7b181d4d5..6c0f59e9d 100644 --- a/src/array.c +++ b/src/array.c @@ -17,6 +17,7 @@ #define ARY_MAX_SIZE ((ARY_C_MAX_SIZE < (size_t)MRB_INT_MAX) ? (mrb_int)ARY_C_MAX_SIZE : MRB_INT_MAX-1) #define ARY_SHARED_P(a) ((a)->flags & MRB_ARY_SHARED) #define ARY_SET_SHARED(a) ((a)->flags |= MRB_ARY_SHARED) +#define ARY_UNSET_SHARED(a) ((a)->flags &= ~MRB_ARY_SHARED) static inline mrb_value ary_elt(mrb_value ary, mrb_int offset) @@ -148,7 +149,7 @@ ary_modify(mrb_state *mrb, struct RArray *a) a->aux.capa = a->len; mrb_ary_decref(mrb, shared); } - a->flags &= ~MRB_ARY_SHARED; + ARY_UNSET_SHARED(a); } } -- cgit v1.2.3