From d700d340437a4cfba215e51b9045460900c62c3a Mon Sep 17 00:00:00 2001 From: nobu Date: Wed, 25 Sep 2013 07:58:49 +0000 Subject: internal.h: move inline functions * internal.h (rb_float_value, rb_float_new): move inline functions from ruby/ruby.h. * numeric.c (rb_float_value, rb_float_new): define external functions for extension libraries. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@43042 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 8 ++++++ include/ruby/ruby.h | 79 ++--------------------------------------------------- internal.h | 64 +++++++++++++++++++++++++++++++++++++++++++ numeric.c | 14 ++++++++++ 4 files changed, 88 insertions(+), 77 deletions(-) diff --git a/ChangeLog b/ChangeLog index 782eb40537..4ef6448df1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +Wed Sep 25 16:58:33 2013 Nobuyoshi Nakada + + * internal.h (rb_float_value, rb_float_new): move inline functions + from ruby/ruby.h. + + * numeric.c (rb_float_value, rb_float_new): define external functions + for extension libraries. + Wed Sep 25 15:37:02 2013 Koichi Sasada * test/rdoc/test_rdoc_generator_darkfish.rb: add a guard for windows. diff --git a/include/ruby/ruby.h b/include/ruby/ruby.h index cb432538b1..7ab224639a 100644 --- a/include/ruby/ruby.h +++ b/include/ruby/ruby.h @@ -805,85 +805,10 @@ struct RFloat { double float_value; }; +double rb_float_value(VALUE); +VALUE rb_float_new(double); VALUE rb_float_new_in_heap(double); -#if USE_FLONUM -#define RUBY_BIT_ROTL(v, n) (((v) << (n)) | ((v) >> ((sizeof(v) * 8) - n))) -#define RUBY_BIT_ROTR(v, n) (((v) >> (n)) | ((v) << ((sizeof(v) * 8) - n))) - -static inline double -rb_float_value(VALUE v) -{ - if (FLONUM_P(v)) { - if (v != (VALUE)0x8000000000000002) { /* LIKELY */ - union { - double d; - VALUE v; - } t; - - VALUE b63 = (v >> 63); - /* e: xx1... -> 011... */ - /* xx0... -> 100... */ - /* ^b63 */ - t.v = RUBY_BIT_ROTR((2 - b63) | (v & ~0x03), 3); - return t.d; - } - else { - return 0.0; - } - } - else { - return ((struct RFloat *)v)->float_value; - } -} - -static inline VALUE -rb_float_new(double d) -{ - union { - double d; - VALUE v; - } t; - int bits; - - t.d = d; - bits = (int)((VALUE)(t.v >> 60) & 0x7); - /* bits contains 3 bits of b62..b60. */ - /* bits - 3 = */ - /* b011 -> b000 */ - /* b100 -> b001 */ - - if (t.v != 0x3000000000000000 /* 1.72723e-77 */ && - !((bits-3) & ~0x01)) { - return (RUBY_BIT_ROTL(t.v, 3) & ~(VALUE)0x01) | 0x02; - } - else { - if (t.v == (VALUE)0) { - /* +0.0 */ - return 0x8000000000000002; - } - else { - /* out of range */ - return rb_float_new_in_heap(d); - } - } -} - -#else /* USE_FLONUM */ - -static inline double -rb_float_value(VALUE v) -{ - return ((struct RFloat *)v)->float_value; -} - -static inline VALUE -rb_float_new(double d) -{ - return rb_float_new_in_heap(d); -} -#endif - #define RFLOAT_VALUE(v) rb_float_value(v) #define DBL2NUM(dbl) rb_float_new(dbl) diff --git a/internal.h b/internal.h index 424f6f5d8f..7c5a42a521 100644 --- a/internal.h +++ b/internal.h @@ -478,6 +478,70 @@ int rb_num_negative_p(VALUE); VALUE rb_int_succ(VALUE num); VALUE rb_int_pred(VALUE num); +#if USE_FLONUM +#define RUBY_BIT_ROTL(v, n) (((v) << (n)) | ((v) >> ((sizeof(v) * 8) - n))) +#define RUBY_BIT_ROTR(v, n) (((v) >> (n)) | ((v) << ((sizeof(v) * 8) - n))) +#endif + +static inline double +rb_float_value_inline(VALUE v) +{ +#if USE_FLONUM + if (FLONUM_P(v)) { + if (v != (VALUE)0x8000000000000002) { /* LIKELY */ + union { + double d; + VALUE v; + } t; + + VALUE b63 = (v >> 63); + /* e: xx1... -> 011... */ + /* xx0... -> 100... */ + /* ^b63 */ + t.v = RUBY_BIT_ROTR((2 - b63) | (v & ~0x03), 3); + return t.d; + } + else { + return 0.0; + } + } +#endif + return ((struct RFloat *)v)->float_value; +} + +static inline VALUE +rb_float_new_inline(double d) +{ +#if USE_FLONUM + union { + double d; + VALUE v; + } t; + int bits; + + t.d = d; + bits = (int)((VALUE)(t.v >> 60) & 0x7); + /* bits contains 3 bits of b62..b60. */ + /* bits - 3 = */ + /* b011 -> b000 */ + /* b100 -> b001 */ + + if (t.v != 0x3000000000000000 /* 1.72723e-77 */ && + !((bits-3) & ~0x01)) { + return (RUBY_BIT_ROTL(t.v, 3) & ~(VALUE)0x01) | 0x02; + } + else if (t.v == (VALUE)0) { + /* +0.0 */ + return 0x8000000000000002; + } + /* out of range */ +#endif + return rb_float_new_in_heap(d); +} + +#define rb_float_value(v) rb_float_value_inline(v) +#define rb_float_new(d) rb_float_new_inline(d) + /* object.c */ VALUE rb_obj_equal(VALUE obj1, VALUE obj2); diff --git a/numeric.c b/numeric.c index aefaa72174..6979b21b65 100644 --- a/numeric.c +++ b/numeric.c @@ -4063,3 +4063,17 @@ Init_Numeric(void) sym_to = ID2SYM(rb_intern("to")); sym_by = ID2SYM(rb_intern("by")); } + +#undef rb_float_value +double +rb_float_value(VALUE v) +{ + return rb_float_value_inline(v); +} + +#undef rb_float_new +VALUE +rb_float_new(double d) +{ + return rb_float_new_inline(d); +} -- cgit v1.2.3