[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]