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

ruby-changes:19407

From: nobu <ko1@a...>
Date: Fri, 6 May 2011 22:36:24 +0900 (JST)
Subject: [ruby-changes:19407] Ruby:r31447 (trunk): * ext/syck/rubyext.c (mktime_do): extra digits are not used.

nobu	2011-05-06 22:36:02 +0900 (Fri, 06 May 2011)

  New Revision: 31447

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

  Log:
    * ext/syck/rubyext.c (mktime_do): extra digits are not used.

  Added files:
    trunk/test/syck/test_time.rb
  Modified files:
    trunk/ChangeLog
    trunk/ext/syck/rubyext.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 31446)
+++ ChangeLog	(revision 31447)
@@ -1,3 +1,7 @@
+Fri May  6 22:35:56 2011  Nobuyoshi Nakada  <nobu@r...>
+
+	* ext/syck/rubyext.c (mktime_do): extra digits are not used.
+
 Fri May  6 17:43:07 2011  NARUSE, Yui  <naruse@r...>
 
 	* ext/syck/rubyext.c (mktime_do): remove unused variable offset.
Index: ext/syck/rubyext.c
===================================================================
--- ext/syck/rubyext.c	(revision 31446)
+++ ext/syck/rubyext.c	(revision 31447)
@@ -226,7 +226,7 @@
     VALUE hour = INT2FIX(0);
     VALUE min = INT2FIX(0);
     VALUE sec = INT2FIX(0);
-    double usec;
+    long usec;
 
     /* Year*/
     if ( ptr[0] != '\0' && len > 0 ) {
@@ -272,19 +272,19 @@
     ptr += 2;
     if ( len > ptr - str && *ptr == '.' )
     {
-        char padded[] = "000000.000000";
-        const int padding = 6;
+        char padded[] = "000000";
+        const int padding = (int)(sizeof(padded) - 1);
         const char *end = ptr + 1;
         const char *begin = end;
-        int length;
+        ptrdiff_t length;
         while ( isdigit( *end ) ) end++;
-        length = (int)(end - begin) <= padding ? (int)(end - begin) : padding;
+        if ((length = (end - begin)) > padding) length = padding;
         MEMCPY(padded, begin, char, length);
-        usec = strtod(padded, NULL);
+        usec = strtol(padded, NULL, 10);
     }
     else
     {
-        usec = 0.0;
+        usec = 0;
     }
 
     /* Time Zone*/
@@ -312,12 +312,12 @@
         time = rb_funcall(rb_cTime, s_utc, 6, year, mon, day, hour, min, sec);
         tmp = rb_funcall(time, s_to_i, 0);
         tmp = rb_funcall(tmp, '-', 1, LONG2FIX(tz_offset));
-        return rb_funcall(rb_cTime, s_at, 2, tmp, rb_float_new(usec));
+        return rb_funcall(rb_cTime, s_at, 2, tmp, LONG2NUM(usec));
     }
     else
     {
         /* Make UTC time*/
-        return rb_funcall(rb_cTime, s_utc, 7, year, mon, day, hour, min, sec, rb_float_new(usec));
+        return rb_funcall(rb_cTime, s_utc, 7, year, mon, day, hour, min, sec, LONG2NUM(usec));
     }
 }
 
Index: test/syck/test_time.rb
===================================================================
--- test/syck/test_time.rb	(revision 0)
+++ test/syck/test_time.rb	(revision 31447)
@@ -0,0 +1,24 @@
+require 'test/unit'
+require 'yaml'
+
+module Syck
+  class TestString < Test::Unit::TestCase
+    def test_usec_long
+      bug4571 = '[ruby-core:35713]'
+      assert_equal(34, YAML.load("2011-03-22t23:32:11.0000342222+01:00").usec, bug4571)
+    end
+
+    def test_usec_very_long
+      t = "2011-03-22t23:32:11.0000342"+"0"*1000+"1+01:00"
+      assert_equal(34, YAML.load(t).usec)
+    end
+
+    def test_usec_full
+      assert_equal(342222, YAML.load("2011-03-22t23:32:11.342222+01:00").usec)
+    end
+
+    def test_usec_short
+      assert_equal(330000, YAML.load("2011-03-22t23:32:11.33+01:00").usec)
+    end
+  end
+end

Property changes on: test/syck/test_time.rb
___________________________________________________________________
Added: svn:eol-style
   + LF


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

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