aboutsummaryrefslogtreecommitdiffstats
path: root/array.c
diff options
context:
space:
mode:
authorYusuke Endoh <mame@ruby-lang.org>2019-07-20 09:08:34 +0900
committerYusuke Endoh <mame@ruby-lang.org>2019-07-20 09:08:34 +0900
commit77bb79b8cf69f6504bf0abe2e07a1a631cc4ef32 (patch)
tree56c811054daf0d6e898ffece322f6b3e05007ab3 /array.c
parentd304f77c585c42a2e8b008d170ac153b7d8e5243 (diff)
downloadruby-77bb79b8cf69f6504bf0abe2e07a1a631cc4ef32.tar.gz
array.c: factor out a complex condition of assert
ARY_SHARED_P and ARY_EMBED_P included: assert(!FL_TEST((ary), ELTS_SHARED) || !FL_TEST((ary), RARRAY_EMBED_FLAG)), The two predicate macros are used in many other assert conditions, which caused memory bloat during C compilation. This change factors out the assertion above to a function. Now gcc consumes 160 MB instead of 250 MB to compile array.c.
Diffstat (limited to 'array.c')
-rw-r--r--array.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/array.c b/array.c
index 0c5ea0acfe..7989adeada 100644
--- a/array.c
+++ b/array.c
@@ -40,14 +40,20 @@ should_be_T_ARRAY(VALUE ary)
return RB_TYPE_P(ary, T_ARRAY);
}
+static int
+should_not_be_shared_and_embedded(VALUE ary)
+{
+ return !FL_TEST((ary), ELTS_SHARED) || !FL_TEST((ary), RARRAY_EMBED_FLAG);
+}
+
#define ARY_SHARED_P(ary) \
(assert(should_be_T_ARRAY((VALUE)(ary))), \
- assert(!FL_TEST((ary), ELTS_SHARED) || !FL_TEST((ary), RARRAY_EMBED_FLAG)), \
+ assert(should_not_be_shared_and_embedded((VALUE)ary)), \
FL_TEST_RAW((ary),ELTS_SHARED)!=0)
#define ARY_EMBED_P(ary) \
(assert(should_be_T_ARRAY((VALUE)(ary))), \
- assert(!FL_TEST((ary), ELTS_SHARED) || !FL_TEST((ary), RARRAY_EMBED_FLAG)), \
+ assert(should_not_be_shared_and_embedded((VALUE)ary)), \
FL_TEST_RAW((ary), RARRAY_EMBED_FLAG) != 0)
#define ARY_HEAP_PTR(a) (assert(!ARY_EMBED_P(a)), RARRAY(a)->as.heap.ptr)