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

ruby-changes:8750

From: matz <ko1@a...>
Date: Wed, 19 Nov 2008 17:50:14 +0900 (JST)
Subject: [ruby-changes:8750] Ruby:r20286 (trunk): * ext/syck/rubyext.c (rb_syck_mktime): return DateTime for a value

matz	2008-11-19 17:49:51 +0900 (Wed, 19 Nov 2008)

  New Revision: 20286

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

  Log:
    * ext/syck/rubyext.c (rb_syck_mktime): return DateTime for a value
      out of range of Time.   [ruby-core:19919]

  Modified files:
    trunk/ChangeLog
    trunk/ext/syck/rubyext.c
    trunk/test/yaml/test_yaml.rb

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 20285)
+++ ChangeLog	(revision 20286)
@@ -1,3 +1,8 @@
+Wed Nov 19 17:48:05 2008  Yukihiro Matsumoto  <matz@r...>
+
+	* ext/syck/rubyext.c (rb_syck_mktime): return DateTime for a value
+	  out of range of Time.   [ruby-core:19919]
+
 Wed Nov 19 14:14:38 2008  Yukihiro Matsumoto  <matz@r...>
 
 	* node.h (NOEX_MODFUNC): should be include NOEX_PRIVATE. 
Index: ext/syck/rubyext.c
===================================================================
--- ext/syck/rubyext.c	(revision 20285)
+++ ext/syck/rubyext.c	(revision 20286)
@@ -50,11 +50,11 @@
  * symbols and constants
  */
 static ID s_new, s_utc, s_at, s_to_f, s_to_i, s_read, s_binmode, s_call, s_cmp, s_transfer, s_update, s_dup, s_haskey, s_match, s_keys, s_unpack, s_tr_bang, s_default_set, s_tag_read_class, s_tag_subclasses, s_resolver, s_push, s_emitter, s_level, s_detect_implicit, s_node_import, s_out, s_input, s_intern, s_transform, s_yaml_new, s_yaml_initialize, s_node_export, s_to_yaml, s_write, s_set_resolver, s_each;
-static ID s_tags, s_kind, s_name, s_options, s_type_id, s_type_id_set, s_style, s_style_set, s_value, s_value_set;
+static ID s_tags, s_kind, s_name, s_options, s_type_id, s_type_id_set, s_style, s_style_set, s_value, s_value_set, s_parse;
 static VALUE sym_model, sym_generic, sym_input, sym_bytecode;
 static VALUE sym_scalar, sym_seq, sym_map;
 static VALUE sym_1quote, sym_2quote, sym_fold, sym_literal, sym_plain, sym_inline;
-static VALUE cDate, cNode, cMap, cSeq, cScalar, cOut, cParser, cResolver, cPrivateType, cDomainType, cYObject, cBadAlias, cDefaultKey, cMergeKey, cEmitter;
+static VALUE cDate, cNode, cMap, cSeq, cScalar, cOut, cParser, cResolver, cPrivateType, cDomainType, cYObject, cBadAlias, cDefaultKey, cMergeKey, cEmitter, cDateTime;
 static VALUE oDefaultResolver, oGenericResolver;
 
 /*
@@ -207,10 +207,17 @@
 /*
  * creating timestamps
  */
+struct mktime_arg {
+    char *str;
+    long len;
+};
+
 SYMID
-rb_syck_mktime(char *str, long len)
+mktime_do(struct mktime_arg *arg)
 {
     VALUE time;
+    char *str = arg->str;
+    long len = arg->len;
     char *ptr = str;
     VALUE year = INT2FIX(0);
     VALUE mon = INT2FIX(0);
@@ -312,6 +319,29 @@
     }
 }
 
+SYMID
+mktime_r(struct mktime_arg *arg)
+{
+    if (!cDateTime) {
+        /*
+         * Load Date module
+         */
+        rb_require("date");
+        cDateTime = rb_const_get(rb_cObject, rb_intern("DateTime"));
+    }
+    return rb_funcall(cDateTime, s_parse, 1, rb_str_new(arg->str, arg->len));
+}
+
+SYMID
+rb_syck_mktime(char *str, long len)
+{
+    struct mktime_arg a;
+
+    a.str = str;
+    a.len = len;
+    return rb_rescue2(mktime_do, (VALUE)&a, mktime_r, (VALUE)&a, rb_eArgError, NULL);
+}
+
 /*
  * handles merging of an array of hashes
  * (see http://www.yaml.org/type/merge/)
@@ -2112,6 +2142,7 @@
     s_yaml_new = rb_intern("yaml_new");
     s_yaml_initialize = rb_intern("yaml_initialize");
     s_each = rb_intern("each");
+    s_parse = rb_intern("parse");
 
     s_tags = rb_intern("@tags");
     s_name = rb_intern("@name");
Index: test/yaml/test_yaml.rb
===================================================================
--- test/yaml/test_yaml.rb	(revision 20285)
+++ test/yaml/test_yaml.rb	(revision 20286)
@@ -1306,6 +1306,10 @@
       raise "id collision in ordered map" if omap.to_yaml =~ /id\d+/
     end
 
+    def test_date_out_of_range
+      assert_nothing_raised{YAML::load('1900-01-01T00:00:00+00:00')}
+    end
+
     def test_normal_exit
       YAML.load("2000-01-01 00:00:00.#{"0"*1000} +00:00\n")
       # '[ruby-core:13735]'

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

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