diff options
| author | ksss <[email protected]> | 2014-02-26 21:24:05 +0900 |
|---|---|---|
| committer | ksss <[email protected]> | 2014-02-26 21:40:36 +0900 |
| commit | 3e4e90a708335b790d3dacfa0d38b9ae3e761927 (patch) | |
| tree | d409da5792ec17784cdaba84ec42b5e425314dd5 | |
| parent | f3476d1dcb4bb88e246c4b1fde3275c32bcc8223 (diff) | |
| download | mruby-3e4e90a708335b790d3dacfa0d38b9ae3e761927.tar.gz mruby-3e4e90a708335b790d3dacfa0d38b9ae3e761927.zip | |
add macro ARY_SHARED_P
| -rw-r--r-- | src/array.c | 15 |
1 files changed, 8 insertions, 7 deletions
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); |
