From: nobu.nakada@... Date: 2002-01-15T21:22:03+09:00 Subject: [ruby-dev:15684] Integer()/Float() なかだです。 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はできる。 中田 伸悦