From c99247143e484e4739ab2c495656925424165495 Mon Sep 17 00:00:00 2001 From: shyouhei Date: Wed, 8 Mar 2017 04:50:22 +0000 Subject: 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. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@57807 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- include/ruby/ruby.h | 29 +++++++++++++---------------- 1 file changed, 13 insertions(+), 16 deletions(-) (limited to 'include') diff --git a/include/ruby/ruby.h b/include/ruby/ruby.h index 212ba82dd7..f99264f105 100644 --- a/include/ruby/ruby.h +++ b/include/ruby/ruby.h @@ -1505,15 +1505,14 @@ rb_integer_type_p(VALUE obj) #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) 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) 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) -- cgit v1.2.3