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

ruby-changes:17534

From: naruse <ko1@a...>
Date: Wed, 20 Oct 2010 10:48:35 +0900 (JST)
Subject: [ruby-changes:17534] Ruby:r29539 (trunk): * util.c (ruby_strtod): reject 0x1.p+0. #3966

naruse	2010-10-20 10:48:24 +0900 (Wed, 20 Oct 2010)

  New Revision: 29539

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=29539

  Log:
    * util.c (ruby_strtod): reject 0x1.p+0. [ruby-dev:42432] #3966

  Modified files:
    trunk/ChangeLog
    trunk/test/ruby/test_float.rb
    trunk/util.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 29538)
+++ ChangeLog	(revision 29539)
@@ -1,3 +1,7 @@
+Wed Oct 20 10:47:21 2010  NARUSE, Yui  <naruse@r...>
+
+	* util.c (ruby_strtod): reject 0x1.p+0. [ruby-dev:42432] #3966
+
 Wed Oct 20 10:00:57 2010  NARUSE, Yui  <naruse@r...>
 
 	* vsnprintf.c (BSD_vfprintf): print floating point on "%#a".
Index: util.c
===================================================================
--- util.c	(revision 29538)
+++ util.c	(revision 29539)
@@ -2132,10 +2132,11 @@
 
 	    if (*s == '.') {
 		aadj = 1.;
-		while (*++s && (s1 = strchr(hexdigit, *s))) {
+		if (!*++s || !(s1 = strchr(hexdigit, *s))) goto ret0;
+		do {
 		    aadj /= 16;
 		    adj += aadj * ((s1 - hexdigit) & 15);
-		}
+		} while (*++s && (s1 = strchr(hexdigit, *s)));
 	    }
 
 	    if (*s == 'P' || *s == 'p') {
Index: test/ruby/test_float.rb
===================================================================
--- test/ruby/test_float.rb	(revision 29538)
+++ test/ruby/test_float.rb	(revision 29539)
@@ -88,13 +88,15 @@
     assert_raise(ArgumentError){Float("-.")}
     assert_raise(ArgumentError){Float("1e")}
     assert_raise(ArgumentError){Float("1__1")}
+    assert_raise(ArgumentError){Float("1.")}
+    assert_raise(ArgumentError){Float("1.e+00")}
+    assert_raise(ArgumentError){Float("0x1.p+0")}
     # add expected behaviour here.
     assert_equal(10, Float("1_0"))
 
     assert_equal([ 0.0].pack('G'), [Float(" 0x0p+0").to_f].pack('G'))
     assert_equal([-0.0].pack('G'), [Float("-0x0p+0").to_f].pack('G'))
     assert_equal(255.0,     Float("0Xff"))
-    assert_equal(1.0,       Float("0X1.P+0"))
     assert_equal(1024.0,    Float("0x1p10"))
     assert_equal(1024.0,    Float("0x1p+10"))
     assert_equal(0.0009765625, Float("0x1p-10"))
@@ -452,7 +454,7 @@
     assert_raise(ArgumentError) { Float('0xfp') }
     assert_raise(ArgumentError) { Float('0xf.') }
     assert_raise(ArgumentError) { Float('0xf.p') }
-    assert_equal(15, Float('0xf.p0'))
+    assert_raise(ArgumentError) { Float('0xf.p0') }
     assert_raise(ArgumentError) { Float('0xf.f') }
     assert_raise(ArgumentError) { Float('0xf.fp') }
     assert_equal(Float::INFINITY, Float('0xf.fp1000000000000000'))

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

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