зеркало из https://github.com/github/ruby.git
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:
Родитель
b328a43fa6
Коммит
d700d34043
|
@ -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)
|
||||
|
||||
|
|
64
internal.h
64
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);
|
||||
|
||||
|
|
14
numeric.c
14
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);
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче