summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2014-03-01 10:19:55 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2014-03-01 10:19:55 +0900
commitfca90a43c7a5c3a8e38b276bc1e139d0fb08f5e9 (patch)
tree1321254afbab2164e46ec83e3aa1f643877a7f7f /src
parent9b65a0d5722c4f23a9b3390e4d9e4277a4881dea (diff)
parentf1043ab85cf328aa62d0e4e0b5de55fd894b05fc (diff)
downloadmruby-fca90a43c7a5c3a8e38b276bc1e139d0fb08f5e9.tar.gz
mruby-fca90a43c7a5c3a8e38b276bc1e139d0fb08f5e9.zip
Merge branch 'array-shared-macro' of https://github.com/ksss/mruby into ksss-array-shared-macro
Diffstat (limited to 'src')
-rw-r--r--src/array.c23
1 files changed, 13 insertions, 10 deletions
diff --git a/src/array.c b/src/array.c
index 7a268b894..ce43a0392 100644
--- a/src/array.c
+++ b/src/array.c
@@ -15,6 +15,9 @@
#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)
+#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)
@@ -124,7 +127,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) {
@@ -146,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);
}
}
@@ -160,7 +163,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;
@@ -172,7 +175,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);
}
}
@@ -479,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++;
@@ -513,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--;
@@ -540,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;
@@ -668,7 +671,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);
}
@@ -856,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);
@@ -883,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);