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
This commit is contained in:
nobu 2013-09-25 07:58:49 +00:00
Родитель b328a43fa6
Коммит d700d34043
4 изменённых файлов: 88 добавлений и 77 удалений

Просмотреть файл

@ -1,3 +1,11 @@
Wed Sep 25 16:58:33 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
* 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 <ko1@atdot.net>
* test/rdoc/test_rdoc_generator_darkfish.rb: add a guard for windows.

Просмотреть файл

@ -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)

Просмотреть файл

@ -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);

Просмотреть файл

@ -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);
}