[#31166] is_ruby_native_thread() — Masahiro Sakai (酒井政裕) <masahiro.sakai@...>

酒井です。

16 messages 2007/07/08
[#31269] Re: is_ruby_native_thread() — Nobuyoshi Nakada <nobu@...> 2007/07/21

なかだです。

[#31270] Re: is_ruby_native_thread() — Hidetoshi NAGAI <nagai@...> 2007/07/22

永井@知能.九工大です.

[#31298] retryの使い方 — eklerni <eklerni@...>

松尾といいます。

52 messages 2007/07/25
[#31299] Re: retryの使い方 — SASADA Koichi <ko1@...> 2007/07/26

 ささだです。

[#31300] Re: retryの使い方 — eklerni <eklerni@...> 2007/07/26

松尾です、返信ありがとうございます。

[#31303] Re: retryの使い方 — Yugui <yugui@...> 2007/07/26

Yuguiといいます。

[#31306] Re: retryの使い方 — eklerni <eklerni@...> 2007/07/26

松尾といいます。

[#31308] Re: retryの使い方 — Tanaka Akira <akr@...> 2007/07/26

In article <46A909DD.1070405@for.mail-box.ne.jp>,

[#31310] Re: retryの使い方 — eklerni <eklerni@...> 2007/07/26

Tanaka Akira さんは書きました:

[#31314] Re: retryの使い方 — Tanaka Akira <akr@...> 2007/07/30

In article <46A92530.80507@for.mail-box.ne.jp>,

[#31315] Re: retryの使い方 — eklerni <eklerni@...> 2007/07/30

Tanaka Akira さんは書きました:

[#31316] Re: retryの使い方 — Tanaka Akira <akr@...> 2007/07/30

In article <46AD7A16.8080509@for.mail-box.ne.jp>,

[#31317] Re: retryの使い方 — eklerni <eklerni@...> 2007/07/31

松尾です。

[#31381] Re: retryの使い方 — SASADA Koichi <ko1@...> 2007/08/12

 ささだです。

[#31422] Re: retryの使い方 — Yukihiro Matsumoto <matz@...> 2007/08/15

まつもと ゆきひろです

[#31425] Re: retryの使い方 — Tanaka Akira <akr@...> 2007/08/15

In article <E1ILDTi-0005T6-Be@x31>,

[#31426] Re: retryの使い方 — Yukihiro Matsumoto <matz@...> 2007/08/15

まつもと ゆきひろです

[#31433] Re: retryの使い方 — Tanaka Akira <akr@...> 2007/08/16

In article <E1ILKn6-0003Nv-0f@x31>,

[#31435] Re: retryの使い方 — Yukihiro Matsumoto <matz@...> 2007/08/16

まつもと ゆきひろです

[#31447] Re: retryの使い方 — Tanaka Akira <akr@...> 2007/08/16

In article <E1ILVN9-0006xJ-7I@x31>,

[#31450] Re: retryの使い方 — Tanaka Akira <akr@...> 2007/08/17

In article <E1ILq4x-0002Bs-Lg@x31>,

[#31451] Re: retryの使い方 — Yukihiro Matsumoto <matz@...> 2007/08/17

まつもと ゆきひろです

[ruby-dev:31273] Re: (1 << 0x40000000)[0x40000000]

From: Nobuyoshi Nakada <nobu@...>
Date: 2007-07-22 18:14:55 UTC
List: ruby-dev #31273
なかだです。

At Mon, 23 Jul 2007 00:35:30 +0900,
Tanaka Akira wrote in [ruby-dev:31271]:
> 次のように、(1 << 0x40000000)[0x40000000] が 0 になります。
(以下略)


Index: trunk/bignum.c
===================================================================
--- trunk/bignum.c	(revision 12828)
+++ trunk/bignum.c	(working copy)
@@ -2062,27 +2062,37 @@ rb_big_aref(VALUE x, VALUE y)
 {
     BDIGIT *xds;
-    int shift;
-    long s1, s2;
+    BDIGIT_DBL num;
+    VALUE shift;
+    long i, s1, s2;
 
     if (TYPE(y) == T_BIGNUM) {
-	if (!RBIGNUM(y)->sign || RBIGNUM(x)->sign)
+	if (!RBIGNUM(y)->sign)
 	    return INT2FIX(0);
-	return INT2FIX(1);
+	if (RBIGNUM(bigtrunc(y))->len > SIZEOF_VALUE/SIZEOF_BDIGITS) {
+	  out_of_range:
+	    return RBIGNUM(x)->sign ? INT2FIX(0) : INT2FIX(1);
+	}
+	shift = big2ulong(y, "long", Qfalse);
+    }
+    else {
+	i = NUM2LONG(y);
+	if (i < 0) return INT2FIX(0);
+	shift = (VALUE)i;
     }
-    shift = NUM2INT(y);
-    if (shift < 0) return INT2FIX(0);
     s1 = shift/BITSPERDIG;
     s2 = shift%BITSPERDIG;
 
+    if (s1 >= RBIGNUM(x)->len) goto out_of_range;
     if (!RBIGNUM(x)->sign) {
-	if (s1 >= RBIGNUM(x)->len) return INT2FIX(1);
-	x = rb_big_clone(x);
-	get2comp(x);
+	xds = BDIGITS(x);
+	i = 0; num = 1;
+	while (num += ~xds[i], ++i <= s1) {
+	    num = BIGDN(num);
+	}
     }
     else {
-	if (s1 >= RBIGNUM(x)->len) return INT2FIX(0);
+	num = BDIGITS(x)[s1];
     }
-    xds = BDIGITS(x);
-    if (xds[s1] & (1<<s2))
+    if (num & ((BDIGIT_DBL)1<<s2))
 	return INT2FIX(1);
     return INT2FIX(0);
Index: stable/bignum.c
===================================================================
--- stable/bignum.c	(revision 12828)
+++ stable/bignum.c	(working copy)
@@ -2152,27 +2152,37 @@ rb_big_aref(x, y)
 {
     BDIGIT *xds;
-    int shift;
-    long s1, s2;
+    BDIGIT_DBL num;
+    unsigned long shift;
+    long i, s1, s2;
 
     if (TYPE(y) == T_BIGNUM) {
-	if (!RBIGNUM(y)->sign || RBIGNUM(x)->sign)
+	if (!RBIGNUM(y)->sign)
 	    return INT2FIX(0);
-	return INT2FIX(1);
+	if (RBIGNUM(bigtrunc(y))->len > SIZEOF_LONG/SIZEOF_BDIGITS) {
+	  out_of_range:
+	    return RBIGNUM(x)->sign ? INT2FIX(0) : INT2FIX(1);
+	}
+	shift = big2ulong(y, "long", Qfalse);
+    }
+    else {
+	i = NUM2LONG(y);
+	if (i < 0) return INT2FIX(0);
+	shift = (VALUE)i;
     }
-    shift = NUM2INT(y);
-    if (shift < 0) return INT2FIX(0);
     s1 = shift/BITSPERDIG;
     s2 = shift%BITSPERDIG;
 
+    if (s1 >= RBIGNUM(x)->len) goto out_of_range;
     if (!RBIGNUM(x)->sign) {
-	if (s1 >= RBIGNUM(x)->len) return INT2FIX(1);
-	x = rb_big_clone(x);
-	get2comp(x);
+	xds = BDIGITS(x);
+	i = 0; num = 1;
+	while (num += ~xds[i], ++i <= s1) {
+	    num = BIGDN(num);
+	}
     }
     else {
-	if (s1 >= RBIGNUM(x)->len) return INT2FIX(0);
+	num = BDIGITS(x)[s1];
     }
-    xds = BDIGITS(x);
-    if (xds[s1] & (1<<s2))
+    if (num & ((BDIGIT_DBL)1<<s2))
 	return INT2FIX(1);
     return INT2FIX(0);


-- 
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
    中田 伸悦

In This Thread

Prev Next