ruby-changes:59575
From: Kenta <ko1@a...>
Date: Tue, 31 Dec 2019 23:14:15 +0900 (JST)
Subject: [ruby-changes:59575] e082f41611 (master): Introduce BIGNUM_EMBED_P to check BIGNUM_EMBED_FLAG (#2802)
https://git.ruby-lang.org/ruby.git/commit/?id=e082f41611 From e082f41611755b0fde967fccf3174c90ecb8469e Mon Sep 17 00:00:00 2001 From: Kenta Murata <mrkn@u...> Date: Tue, 31 Dec 2019 22:48:23 +0900 Subject: 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 diff --git a/bignum.c b/bignum.c index 8492853..57b16e8 100644 --- a/bignum.c +++ b/bignum.c @@ -2957,7 +2957,7 @@ rb_cmpint(VALUE val, VALUE a, VALUE b) https://github.com/ruby/ruby/blob/trunk/bignum.c#L2957 } #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 https://github.com/ruby/ruby/blob/trunk/bignum.c#L2967 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) https://github.com/ruby/ruby/blob/trunk/bignum.c#L3011 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 ccece5b..a126de9 100644 --- a/gc.c +++ b/gc.c @@ -2815,7 +2815,7 @@ obj_free(rb_objspace_t *objspace, VALUE obj) https://github.com/ruby/ruby/blob/trunk/gc.c#L2815 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 c35ba9e..5083864 100644 --- a/internal/bignum.h +++ b/internal/bignum.h @@ -139,6 +139,7 @@ static inline void BIGNUM_NEGATE(VALUE b); https://github.com/ruby/ruby/blob/trunk/internal/bignum.h#L139 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) https://github.com/ruby/ruby/blob/trunk/internal/bignum.h#L208 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) https://github.com/ruby/ruby/blob/trunk/internal/bignum.h#L229 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 */ -- cgit v0.10.2 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/