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/