From 6e22e6b73a5dab9dd94c332ba12454a35004e3c9 Mon Sep 17 00:00:00 2001 From: yugui Date: Sat, 22 Nov 2008 14:51:49 +0000 Subject: merges r20286 from trunk into ruby_1_9_1. * ext/syck/rubyext.c (rb_syck_mktime): return DateTime for a value out of range of Time. [ruby-core:19919] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_9_1@20319 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 5 +++++ ext/syck/rubyext.c | 37 ++++++++++++++++++++++++++++++++++--- test/yaml/test_yaml.rb | 4 ++++ 3 files changed, 43 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 10f00ce813..2bcccfa9de 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Wed Nov 19 17:48:05 2008 Yukihiro Matsumoto + + * ext/syck/rubyext.c (rb_syck_mktime): return DateTime for a value + out of range of Time. [ruby-core:19919] + Sat Nov 22 21:29:54 2008 Yuki Sonoda (Yugui) * test/ruby/test_method.rb (test_default_accessiblity): test case for diff --git a/ext/syck/rubyext.c b/ext/syck/rubyext.c index d5c6372076..a8f0eec978 100644 --- a/ext/syck/rubyext.c +++ b/ext/syck/rubyext.c @@ -50,11 +50,11 @@ typedef struct { * 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 @@ syck_get_hash_aref(VALUE hsh, VALUE key) /* * 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 @@ rb_syck_mktime(char *str, long len) } } +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 @@ Init_syck() 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"); diff --git a/test/yaml/test_yaml.rb b/test/yaml/test_yaml.rb index ed94705fcf..837f34722f 100644 --- a/test/yaml/test_yaml.rb +++ b/test/yaml/test_yaml.rb @@ -1306,6 +1306,10 @@ EOY 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]' -- cgit v1.2.3