summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorwhy <why@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-01-28 16:59:00 +0000
committerwhy <why@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-01-28 16:59:00 +0000
commit877408163a4d8725c24073784a5fee8511fdeb1e (patch)
treea876dcfc037d9e67715eaefa388ab6fe8e489aee
parent46f6b2026802fcd227beaac78c8d29378a96dceb (diff)
* ext/syck/rubyext.c: usec round-tripping skew. [ruby-core:2305]
* lib/yaml/rubytypes.rb: character Range now round-trips. [ruby-core:2306] * test/yaml/test_yaml.rb: add Time and Range tests. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@5573 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog8
-rw-r--r--ext/syck/rubyext.c37
-rw-r--r--lib/yaml/rubytypes.rb2
-rw-r--r--test/yaml/test_yaml.rb36
4 files changed, 66 insertions, 17 deletions
diff --git a/ChangeLog b/ChangeLog
index cddbea83efa..a7907ee6d5f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+Thu Jan 29 01:56:02 2004 why the lucky stiff <why@ruby-lang.org>
+
+ * ext/syck/rubyext.c: usec round-tripping skew. [ruby-core:2305]
+
+ * lib/yaml/rubytypes.rb: character Range now round-trips. [ruby-core:2306]
+
+ * test/yaml/test_yaml.rb: add Time and Range tests.
+
Thu Jan 29 00:00:46 2004 Kouhei Sutou <kou@cozmixng.org>
* lib/rss: rss/parser.rb is always required.
diff --git a/ext/syck/rubyext.c b/ext/syck/rubyext.c
index 36ef177ae9d..a903f41341c 100644
--- a/ext/syck/rubyext.c
+++ b/ext/syck/rubyext.c
@@ -198,7 +198,8 @@ rb_syck_mktime(str)
{
VALUE time;
char *ptr = str;
- VALUE year, mon, day, hour, min, sec, usec;
+ VALUE year, mon, day, hour, min, sec;
+ long usec;
/* Year*/
ptr[4] = '\0';
@@ -233,23 +234,23 @@ rb_syck_mktime(str)
ptr += 2;
if ( *ptr == '.' )
{
- usec = INT2FIX( strtod( ptr, NULL ) * 1000000 );
+ char *padded = syck_strndup( "000000", 6 );
+ char *end = ptr + 1;
+ while ( isdigit( *end ) ) end++;
+ MEMCPY(padded, ptr + 1, char, end - (ptr + 1));
+ usec = strtol(padded, NULL, 10);
}
else
{
- usec = INT2FIX( 0 );
+ usec = 0;
}
- /* Make UTC time*/
- time = rb_funcall(rb_cTime, s_utc, 7, year, mon, day, hour, min, sec, usec);
-
/* Time Zone*/
while ( *ptr != 'Z' && *ptr != '+' && *ptr != '-' && *ptr != '\0' ) ptr++;
if ( *ptr == '-' || *ptr == '+' )
{
- double tz_offset = 0;
- double utc_time = 0;
- tz_offset += strtod(ptr, NULL) * 3600;
+ time_t tz_offset = strtol(ptr, NULL, 10) * 3600;
+ time_t tmp;
while ( *ptr != ':' && *ptr != '\0' ) ptr++;
if ( *ptr == ':' )
@@ -257,21 +258,25 @@ rb_syck_mktime(str)
ptr += 1;
if ( tz_offset < 0 )
{
- tz_offset -= strtod(ptr, NULL) * 60;
+ tz_offset -= strtol(ptr, NULL, 10) * 60;
}
else
{
- tz_offset += strtod(ptr, NULL) * 60;
+ tz_offset += strtol(ptr, NULL, 10) * 60;
}
}
/* Make TZ time*/
- utc_time = NUM2DBL(rb_funcall(time, s_to_f, 0));
- utc_time -= tz_offset;
- time = rb_funcall(rb_cTime, s_at, 1, rb_float_new(utc_time));
- }
+ time = rb_funcall(rb_cTime, s_utc, 6, year, mon, day, hour, min, sec);
+ tmp = NUM2LONG(rb_funcall(time, s_to_i, 0)) - tz_offset;
+ return rb_funcall(rb_cTime, s_at, 2, LONG2NUM(tmp), LONG2NUM(usec));
+ }
+ else
+ {
+ /* Make UTC time*/
+ return rb_funcall(rb_cTime, s_utc, 7, year, mon, day, hour, min, sec, LONG2NUM(usec));
- return time;
+ }
}
/*
diff --git a/lib/yaml/rubytypes.rb b/lib/yaml/rubytypes.rb
index 0e5d5b17d62..ac772bc0739 100644
--- a/lib/yaml/rubytypes.rb
+++ b/lib/yaml/rubytypes.rb
@@ -353,7 +353,7 @@ class Range
def to_yaml( opts = {} )
YAML::quick_emit( nil, opts ) { |out|
out << "!ruby/range "
- self.inspect.to_yaml( :Emitter => out )
+ self.to_s.to_yaml( :Emitter => out )
}
end
end
diff --git a/test/yaml/test_yaml.rb b/test/yaml/test_yaml.rb
index cdd678cf81b..642ebc558fe 100644
--- a/test/yaml/test_yaml.rb
+++ b/test/yaml/test_yaml.rb
@@ -1051,6 +1051,28 @@ EOY
)
end
+ #
+ # Test of Ranges
+ #
+ def test_ranges
+
+ # Simple numeric
+ assert_to_yaml( 1..3, <<EOY )
+--- !ruby/range 1..3
+EOY
+
+ # Simple alphabetic
+ assert_to_yaml( 'a'..'z', <<EOY )
+--- !ruby/range a..z
+EOY
+
+ # Float
+ assert_to_yaml( 10.5...30.3, <<EOY )
+--- !ruby/range 10.5...30.3
+EOY
+
+ end
+
def test_ruby_struct
# Ruby structures
book_struct = Struct::new( "BookStruct", :author, :title, :year, :isbn )
@@ -1160,6 +1182,20 @@ EOY
end
#
+ # Test Time.now cycle
+ #
+ def test_time_now_cycle
+ #
+ # From Minero Aoki [ruby-core:2305]
+ #
+ require 'yaml'
+ t = Time.now
+ 5.times do
+ assert_equals( t, YAML.load( YAML.dump( t ) ) )
+ end
+ end
+
+ #
# Circular references
#
def test_circular_references