[前][次][番号順一覧][スレッド一覧]

ruby-changes:4176

From: ko1@a...
Date: Sun, 2 Mar 2008 00:08:31 +0900 (JST)
Subject: [ruby-changes:4176] nobu - Ruby:r15666 (trunk): * object.c (rb_cstr_to_dbl): check for successive underscores.

nobu	2008-03-02 00:08:13 +0900 (Sun, 02 Mar 2008)

  New Revision: 15666

  Modified files:
    trunk/ChangeLog
    trunk/object.c
    trunk/test/ruby/test_float.rb
    trunk/version.h

  Log:
    * object.c (rb_cstr_to_dbl): check for successive underscores.
      [ruby-dev:33952]


  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/version.h?r1=15666&r2=15665&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=15666&r2=15665&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/test/ruby/test_float.rb?r1=15666&r2=15665&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/object.c?r1=15666&r2=15665&diff_format=u

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 15665)
+++ ChangeLog	(revision 15666)
@@ -1,3 +1,8 @@
+Sun Mar  2 00:08:10 2008  Nobuyoshi Nakada  <nobu@r...>
+
+	* object.c (rb_cstr_to_dbl): check for successive underscores.
+	  [ruby-dev:33952]
+
 Sat Mar  1 17:59:01 2008  Nobuyoshi Nakada  <nobu@r...>
 
 	* io.c (struct argf): packed ARGF stuffs.
Index: object.c
===================================================================
--- object.c	(revision 15665)
+++ object.c	(revision 15666)
@@ -2042,7 +2042,7 @@
 
     if (!p) return 0.0;
     q = p;
-	while (ISSPACE(*p)) p++;
+    while (ISSPACE(*p)) p++;
     d = strtod(p, &end);
     if (errno == ERANGE) {
 	OutOfRange();
@@ -2050,8 +2050,8 @@
 	errno = 0;
     }
     if (p == end) {
+	if (badcheck) {
 	  bad:
-	if (badcheck) {
 	    rb_invalid_str(q, "Float()");
 	}
 	return d;
@@ -2060,19 +2060,24 @@
 	char buf[DBL_DIG * 4 + 10];
 	char *n = buf;
 	char *e = buf + sizeof(buf) - 1;
+	char prev = 0;
 
 	while (p < end && n < e) *n++ = *p++;
-	while (n < e && *p) {
+	while (*p) {
 	    if (*p == '_') {
 		/* remove underscores between digits */
-		if (n == buf || !ISDIGIT(n[-1])) goto bad;
-		while (*++p == '_');
-		if (!ISDIGIT(*p)) {
-		    if (badcheck) goto bad;
-		    break;
+		if (badcheck) {
+		    if (n == buf || !ISDIGIT(prev)) goto bad;
+		    ++p;
+		    if (!ISDIGIT(*p)) goto bad;
 		}
+		else {
+		    while (*++p == '_');
+		    continue;
+		}
 	    }
-	    *n++ = *p++;
+	    prev = *p++;
+	    if (n < e) *n++ = prev;
 	}
 	*n = '\0';
 	p = buf;
Index: version.h
===================================================================
--- version.h	(revision 15665)
+++ version.h	(revision 15666)
@@ -1,7 +1,7 @@
 #define RUBY_VERSION "1.9.0"
-#define RUBY_RELEASE_DATE "2008-03-01"
+#define RUBY_RELEASE_DATE "2008-03-02"
 #define RUBY_VERSION_CODE 190
-#define RUBY_RELEASE_CODE 20080301
+#define RUBY_RELEASE_CODE 20080302
 #define RUBY_PATCHLEVEL 0
 
 #define RUBY_VERSION_MAJOR 1
@@ -9,7 +9,7 @@
 #define RUBY_VERSION_TEENY 0
 #define RUBY_RELEASE_YEAR 2008
 #define RUBY_RELEASE_MONTH 3
-#define RUBY_RELEASE_DAY 1
+#define RUBY_RELEASE_DAY 2
 
 #ifdef RUBY_EXTERN
 RUBY_EXTERN const char ruby_version[];
Index: test/ruby/test_float.rb
===================================================================
--- test/ruby/test_float.rb	(revision 15665)
+++ test/ruby/test_float.rb	(revision 15666)
@@ -81,6 +81,7 @@
     assert_raise(ArgumentError){Float("-")}
     assert_raise(ArgumentError){Float("-.")}
     assert_raise(ArgumentError){Float("1e")}
+    assert_raise(ArgumentError){Float("1__1")}
     # add expected behaviour here.
   end
 

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]