Skip to content

Commit

Permalink
Introduce BIGNUM_EMBED_P to check BIGNUM_EMBED_FLAG (#2802)
Browse files Browse the repository at this point in the history
* bignum.h: Add BIGNUM_EMBED_P

* bignum.c: Use macros for handling BIGNUM_EMBED_FLAG
  • Loading branch information
mrkn committed Dec 31, 2019
1 parent 4ce28b5 commit e082f41
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 9 deletions.
12 changes: 6 additions & 6 deletions bignum.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)) : \
Expand All @@ -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) {
Expand Down Expand Up @@ -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 {
Expand Down
2 changes: 1 addition & 1 deletion gc.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down
12 changes: 10 additions & 2 deletions internal/bignum.h
Original file line number Diff line number Diff line change
Expand Up @@ -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) */
Expand Down Expand Up @@ -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 {
Expand All @@ -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 */

0 comments on commit e082f41

Please sign in to comment.