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

ruby-changes:45734

From: shyouhei <ko1@a...>
Date: Wed, 8 Mar 2017 13:50:30 +0900 (JST)
Subject: [ruby-changes:45734] shyouhei:r57807 (trunk): re-introduce __builtin_add_overflow

shyouhei	2017-03-08 13:50:22 +0900 (Wed, 08 Mar 2017)

  New Revision: 57807

  https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=57807

  Log:
    re-introduce __builtin_add_overflow
    
    r57789 (74cdd89) was gradually "improve"d by naruse through r57793 to
    r57806, resulted in reverting the efect of r57789 while retaining its
    complexity.  I think the current situation is slightly worse than
    before (same output complicated source code).
    
    Here I introduce __builtin_add_overflow again, which (I think) is what
    naruse wanted to do in r57793.

  Modified files:
    trunk/include/ruby/ruby.h
    trunk/internal.h
    trunk/numeric.c
Index: numeric.c
===================================================================
--- numeric.c	(revision 57806)
+++ numeric.c	(revision 57807)
@@ -3007,16 +3007,15 @@ VALUE https://github.com/ruby/ruby/blob/trunk/numeric.c#L3007
 rb_num2fix(VALUE val)
 {
     long v;
-    VALUE w;
 
     if (FIXNUM_P(val)) {
 	return val;
     }
-    else if (rb_long2fix_overflow((v = rb_num2long(val)), &w)) {
-	rb_raise(rb_eRangeError, "integer %ld out of range of fixnum", v);
+    else if (rb_long_is_fixable_p(v = rb_num2long(val))) {
+	return LONG2FIX(v);
     }
     else {
-	return w;
+	rb_raise(rb_eRangeError, "integer %ld out of range of fixnum", v);
     }
 }
 
Index: include/ruby/ruby.h
===================================================================
--- include/ruby/ruby.h	(revision 57806)
+++ include/ruby/ruby.h	(revision 57807)
@@ -1505,15 +1505,14 @@ rb_integer_type_p(VALUE obj) https://github.com/ruby/ruby/blob/trunk/include/ruby/ruby.h#L1505
 #endif
 
 static inline int
-rb_long2fix_overflow(long l, VALUE *ptr)
+rb_long_is_fixable_p(long v)
 {
-    if (RB_FIXABLE(l)) {
-	*ptr = RB_LONG2FIX(l);
-	return 0;
-    }
-    else {
-	return 1;
-    }
+#ifdef HAVE_BUILTIN___BUILTIN_ADD_OVERFLOW
+    SIGNED_VALUE w;
+    return! __builtin_add_overflow(v, v, &w);
+#else
+    return RB_FIXABLE(v);
+#endif
 }
 
 #if SIZEOF_INT < SIZEOF_LONG
@@ -1523,11 +1522,10 @@ rb_long2fix_overflow(long l, VALUE *ptr) https://github.com/ruby/ruby/blob/trunk/include/ruby/ruby.h#L1522
 static inline VALUE
 rb_int2num_inline(int v)
 {
-    VALUE ret;
-    if (rb_long2fix_overflow(v, &ret))
-	return rb_int2big(v);
+    if (rb_long_is_fixable_p(v))
+	return RB_INT2FIX(v);
     else
-	return ret;
+	return rb_int2big(v);
 }
 #define RB_INT2NUM(x) rb_int2num_inline(x)
 
@@ -1547,11 +1545,10 @@ rb_uint2num_inline(unsigned int v) https://github.com/ruby/ruby/blob/trunk/include/ruby/ruby.h#L1545
 static inline VALUE
 rb_long2num_inline(long v)
 {
-    VALUE ret;
-    if (rb_long2fix_overflow(v, &ret))
-	return rb_int2big(v);
+    if (rb_long_is_fixable_p(v))
+	return RB_LONG2FIX(v);
     else
-	return ret;
+	return rb_int2big(v);
 }
 #define RB_LONG2NUM(x) rb_long2num_inline(x)
 
Index: internal.h
===================================================================
--- internal.h	(revision 57806)
+++ internal.h	(revision 57807)
@@ -368,7 +368,7 @@ ntz_intptr(uintptr_t x) https://github.com/ruby/ruby/blob/trunk/internal.h#L368
 # define DL2NUM(x) LL2NUM(x)
 #elif defined(HAVE_INT128_T)
 # define DLONG int128_t
-# define DL2NUM(x) ((RB_POSFIXABLE(x) && RB_NEGFIXABLE(x)) ? LONG2FIX(x) : rb_int128t2big(x))
+# define DL2NUM(x) (RB_FIXABLE(x) ? LONG2FIX(x) : rb_int128t2big(x))
 VALUE rb_int128t2big(int128_t n);
 #endif
 
@@ -1386,12 +1386,11 @@ rb_float_new_inline(double d) https://github.com/ruby/ruby/blob/trunk/internal.h#L1386
 static inline VALUE
 rb_dbl2ival(double d)
 {
-    VALUE val;
-    if (rb_long2fix_overflow(d, &val)) {
-	return rb_dbl2big(d);
+    if (RB_FIXABLE(d)) {
+	return LONG2FIX((long)d);
     }
     else {
-	return val;
+	return rb_dbl2big(d);
     }
 }
 

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

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