* internal.h (INTEGER_PACK_FORCE_BIGNUM): New flag constant.
* bignum.c (rb_integer_unpack): Support INTEGER_PACK_FORCE_BIGNUM. * random.c (int_pair_to_real_inclusive): Use INTEGER_PACK_FORCE_BIGNUM to use rb_big_mul instead of rb_funcall. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@41165 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
4d6ac81117
commit
0056591f50
@ -1,3 +1,12 @@
|
|||||||
|
Sat Jun 8 14:58:32 2013 Tanaka Akira <akr@fsij.org>
|
||||||
|
|
||||||
|
* internal.h (INTEGER_PACK_FORCE_BIGNUM): New flag constant.
|
||||||
|
|
||||||
|
* bignum.c (rb_integer_unpack): Support INTEGER_PACK_FORCE_BIGNUM.
|
||||||
|
|
||||||
|
* random.c (int_pair_to_real_inclusive): Use
|
||||||
|
INTEGER_PACK_FORCE_BIGNUM to use rb_big_mul instead of rb_funcall.
|
||||||
|
|
||||||
Sat Jun 8 14:17:01 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
Sat Jun 8 14:17:01 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
* configure.in: check for NET_LUID. header macro varies across
|
* configure.in: check for NET_LUID. header macro varies across
|
||||||
|
2
bignum.c
2
bignum.c
@ -932,6 +932,8 @@ rb_integer_unpack(int sign, const void *words, size_t numwords, size_t wordsize,
|
|||||||
while (dp < de)
|
while (dp < de)
|
||||||
*dp++ = 0;
|
*dp++ = 0;
|
||||||
|
|
||||||
|
if (flags & INTEGER_PACK_FORCE_BIGNUM)
|
||||||
|
return bigtrunc(result);
|
||||||
return bignorm(result);
|
return bignorm(result);
|
||||||
#undef PUSH_BITS
|
#undef PUSH_BITS
|
||||||
}
|
}
|
||||||
|
@ -55,11 +55,15 @@ extern "C" {
|
|||||||
|
|
||||||
/* "MS" in MSWORD and MSBYTE means "most significant" */
|
/* "MS" in MSWORD and MSBYTE means "most significant" */
|
||||||
/* "LS" in LSWORD and LSBYTE means "least significant" */
|
/* "LS" in LSWORD and LSBYTE means "least significant" */
|
||||||
|
/* For rb_integer_pack and rb_integer_unpack: */
|
||||||
#define INTEGER_PACK_MSWORD_FIRST 0x01
|
#define INTEGER_PACK_MSWORD_FIRST 0x01
|
||||||
#define INTEGER_PACK_LSWORD_FIRST 0x02
|
#define INTEGER_PACK_LSWORD_FIRST 0x02
|
||||||
#define INTEGER_PACK_MSBYTE_FIRST 0x10
|
#define INTEGER_PACK_MSBYTE_FIRST 0x10
|
||||||
#define INTEGER_PACK_LSBYTE_FIRST 0x20
|
#define INTEGER_PACK_LSBYTE_FIRST 0x20
|
||||||
#define INTEGER_PACK_NATIVE_BYTE_ORDER 0x40
|
#define INTEGER_PACK_NATIVE_BYTE_ORDER 0x40
|
||||||
|
/* For rb_integer_unpack: */
|
||||||
|
#define INTEGER_PACK_FORCE_BIGNUM 0x100
|
||||||
|
/* Combinations: */
|
||||||
#define INTEGER_PACK_LITTLE_ENDIAN \
|
#define INTEGER_PACK_LITTLE_ENDIAN \
|
||||||
(INTEGER_PACK_LSWORD_FIRST | \
|
(INTEGER_PACK_LSWORD_FIRST | \
|
||||||
INTEGER_PACK_LSBYTE_FIRST)
|
INTEGER_PACK_LSBYTE_FIRST)
|
||||||
|
8
random.c
8
random.c
@ -285,15 +285,17 @@ int_pair_to_real_inclusive(uint32_t a, uint32_t b)
|
|||||||
xary[0] = a;
|
xary[0] = a;
|
||||||
xary[1] = b;
|
xary[1] = b;
|
||||||
x = rb_integer_unpack(+1, xary, 2, sizeof(uint32_t), 0,
|
x = rb_integer_unpack(+1, xary, 2, sizeof(uint32_t), 0,
|
||||||
INTEGER_PACK_MSWORD_FIRST|INTEGER_PACK_NATIVE_BYTE_ORDER);
|
INTEGER_PACK_MSWORD_FIRST|INTEGER_PACK_NATIVE_BYTE_ORDER|
|
||||||
|
INTEGER_PACK_FORCE_BIGNUM);
|
||||||
|
|
||||||
/* (1 << 53) | 1 */
|
/* (1 << 53) | 1 */
|
||||||
mary[0] = 0x00200000;
|
mary[0] = 0x00200000;
|
||||||
mary[1] = 0x00000001;
|
mary[1] = 0x00000001;
|
||||||
m = rb_integer_unpack(+1, mary, 2, sizeof(uint32_t), 0,
|
m = rb_integer_unpack(+1, mary, 2, sizeof(uint32_t), 0,
|
||||||
INTEGER_PACK_MSWORD_FIRST|INTEGER_PACK_NATIVE_BYTE_ORDER);
|
INTEGER_PACK_MSWORD_FIRST|INTEGER_PACK_NATIVE_BYTE_ORDER|
|
||||||
|
INTEGER_PACK_FORCE_BIGNUM);
|
||||||
|
|
||||||
x = rb_funcall(x, '*', 1, m);
|
x = rb_big_mul(x, m);
|
||||||
if (FIXNUM_P(x)) {
|
if (FIXNUM_P(x)) {
|
||||||
#if CHAR_BIT * SIZEOF_LONG > 64
|
#if CHAR_BIT * SIZEOF_LONG > 64
|
||||||
r = (double)(FIX2ULONG(x) >> 64);
|
r = (double)(FIX2ULONG(x) >> 64);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user