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/