なかだです。

2001/01/04の変更でInteger("0x ")がエラーにならなくなってますが、
これは意図的でしょうか。これはどう見てもエラーじゃないかと思え
るのですが。

Index: bignum.c
===================================================================
RCS file: /cvs/ruby/src/ruby/bignum.c,v
retrieving revision 1.49
retrieving revision 1.50
diff -u -2 -p -I$Author -I$Date -Irb_raise -Irb_invalid_str -r1.49 -r1.50
--- bignum.c	2001/12/27 09:53:54	1.49
+++ bignum.c	2002/01/04 14:14:34	1.50
@@ -253,6 +253,6 @@ rb_cstr2inum(str, base)
 	if (*end == '_') goto bigparse;
 	if (badcheck) {
-	    if (end == str) goto bad; /* no number */
 	    while (*end && ISSPACE(*end)) end++;
+	    if (end == str) goto bad; /* no number */
 	    if (*end) {		      /* trailing garbage */
 	      bad:

それともう一つ、Float("0x_0")みたいのもエラーになりません。数字
に挟まれた"_"だけ無視するようにしたほうがいいのでは。


Index: object.c =================================================================== RCS file: /cvs/ruby/src/ruby/object.c,v retrieving revision 1.67 diff -u -2 -p -r1.67 object.c --- object.c 2002/01/11 09:18:50 1.67 +++ object.c 2002/01/14 15:20:41 @@ -967,5 +967,4 @@ rb_Float(val) q = p = StringValuePtr(val); while (*p && ISSPACE(*p)) p++; - again: d = strtod(p, &end); if (p == end) { @@ -976,10 +975,17 @@ rb_Float(val) if (*end == '_') { char *buf = ALLOCA_N(char, strlen(p)); - char *n = buf, *last; + char *n = buf, *last = p; + while (p < end) *n++ = *p++; while (*p) { - if (*p == '_') { + if (*p == '_' && (n > buf && ISDIGIT(n[-1]))) { + /* remove underscores between digits */ last = ++p; - continue; + while (*p == '_') ++p; + if (!ISDIGIT(*p)) { + while (last < p) *n++ = *last++; + continue; + } + last = p; } *n++ = *p++; @@ -990,5 +996,6 @@ rb_Float(val) *n = '\0'; p = buf; - goto again; + d = strtod(p, &end); + if (p == end) goto bad; } while (*end && ISSPACE(*end)) end++;
-- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦