aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKenta Murata <mrkn@users.noreply.github.com>2019-12-31 22:48:23 +0900
committerGitHub <noreply@github.com>2019-12-31 22:48:23 +0900
commite082f41611755b0fde967fccf3174c90ecb8469e (patch)
treeea496f496836091ff4a2046613b11a112af9fb99
parent4ce28b58cbf3f3b5ab0bcd3fa4479d4f6d427158 (diff)
downloadruby-e082f41611755b0fde967fccf3174c90ecb8469e.tar.gz
Introduce BIGNUM_EMBED_P to check BIGNUM_EMBED_FLAG (#2802)
* bignum.h: Add BIGNUM_EMBED_P * bignum.c: Use macros for handling BIGNUM_EMBED_FLAG
-rw-r--r--bignum.c12
-rw-r--r--gc.c2
-rw-r--r--internal/bignum.h12
3 files changed, 17 insertions, 9 deletions
diff --git a/bignum.c b/bignum.c
index 8492853104..57b16e80e1 100644
--- a/bignum.c
+++ b/bignum.c
@@ -2957,7 +2957,7 @@ rb_cmpint(VALUE val, VALUE a, VALUE b)
}
#define BIGNUM_SET_LEN(b,l) \
- ((RBASIC(b)->flags & BIGNUM_EMBED_FLAG) ? \
+ (BIGNUM_EMBED_P(b) ? \
(void)(RBASIC(b)->flags = \
(RBASIC(b)->flags & ~BIGNUM_EMBED_LEN_MASK) | \
((l) << BIGNUM_EMBED_LEN_SHIFT)) : \
@@ -2967,19 +2967,19 @@ static void
rb_big_realloc(VALUE big, size_t len)
{
BDIGIT *ds;
- if (RBASIC(big)->flags & BIGNUM_EMBED_FLAG) {
+ if (BIGNUM_EMBED_P(big)) {
if (BIGNUM_EMBED_LEN_MAX < len) {
ds = ALLOC_N(BDIGIT, len);
MEMCPY(ds, RBIGNUM(big)->as.ary, BDIGIT, BIGNUM_EMBED_LEN_MAX);
RBIGNUM(big)->as.heap.len = BIGNUM_LEN(big);
RBIGNUM(big)->as.heap.digits = ds;
- RBASIC(big)->flags &= ~BIGNUM_EMBED_FLAG;
+ FL_UNSET_RAW(big, BIGNUM_EMBED_FLAG);
}
}
else {
if (len <= BIGNUM_EMBED_LEN_MAX) {
ds = RBIGNUM(big)->as.heap.digits;
- RBASIC(big)->flags |= BIGNUM_EMBED_FLAG;
+ FL_SET_RAW(big, BIGNUM_EMBED_FLAG);
BIGNUM_SET_LEN(big, len);
(void)VALGRIND_MAKE_MEM_UNDEFINED((void*)RBIGNUM(big)->as.ary, sizeof(RBIGNUM(big)->as.ary));
if (ds) {
@@ -3011,8 +3011,8 @@ bignew_1(VALUE klass, size_t len, int sign)
NEWOBJ_OF(big, struct RBignum, klass, T_BIGNUM | (RGENGC_WB_PROTECTED_BIGNUM ? FL_WB_PROTECTED : 0));
BIGNUM_SET_SIGN((VALUE)big, sign);
if (len <= BIGNUM_EMBED_LEN_MAX) {
- RBASIC(big)->flags |= BIGNUM_EMBED_FLAG;
- BIGNUM_SET_LEN(big, len);
+ FL_SET_RAW(big, BIGNUM_EMBED_FLAG);
+ BIGNUM_SET_LEN((VALUE)big, len);
(void)VALGRIND_MAKE_MEM_UNDEFINED((void*)RBIGNUM(big)->as.ary, sizeof(RBIGNUM(big)->as.ary));
}
else {
diff --git a/gc.c b/gc.c
index ccece5b3d1..a126de9a42 100644
--- a/gc.c
+++ b/gc.c
@@ -2815,7 +2815,7 @@ obj_free(rb_objspace_t *objspace, VALUE obj)
break;
case T_BIGNUM:
- if (!(RBASIC(obj)->flags & BIGNUM_EMBED_FLAG) && BIGNUM_DIGITS(obj)) {
+ if (!BIGNUM_EMBED_P(obj) && BIGNUM_DIGITS(obj)) {
xfree(BIGNUM_DIGITS(obj));
RB_DEBUG_COUNTER_INC(obj_bignum_ptr);
}
diff --git a/internal/bignum.h b/internal/bignum.h
index c35ba9eb47..508386452c 100644
--- a/internal/bignum.h
+++ b/internal/bignum.h
@@ -139,6 +139,7 @@ static inline void BIGNUM_NEGATE(VALUE b);
static inline size_t BIGNUM_LEN(VALUE b);
static inline BDIGIT *BIGNUM_DIGITS(VALUE b);
static inline int BIGNUM_LENINT(VALUE b);
+static inline bool BIGNUM_EMBED_P(VALUE b);
RUBY_SYMBOL_EXPORT_BEGIN
/* bignum.c (export) */
@@ -207,7 +208,7 @@ BIGNUM_NEGATE(VALUE b)
static inline size_t
BIGNUM_LEN(VALUE b)
{
- if (! FL_TEST_RAW(b, BIGNUM_EMBED_FLAG)) {
+ if (! BIGNUM_EMBED_P(b)) {
return RBIGNUM(b)->as.heap.len;
}
else {
@@ -228,11 +229,18 @@ BIGNUM_LENINT(VALUE b)
static inline BDIGIT *
BIGNUM_DIGITS(VALUE b)
{
- if (FL_TEST_RAW(b, BIGNUM_EMBED_FLAG)) {
+ if (BIGNUM_EMBED_P(b)) {
return RBIGNUM(b)->as.ary;
}
else {
return RBIGNUM(b)->as.heap.digits;
}
}
+
+static inline bool
+BIGNUM_EMBED_P(VALUE b)
+{
+ return FL_TEST_RAW(b, BIGNUM_EMBED_FLAG);
+}
+
#endif /* INTERNAL_BIGNUM_H */