1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* 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/trunk@20286 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
matz 2008-11-19 08:49:51 +00:00
parent b44d5711e8
commit d37f45cef9
3 changed files with 43 additions and 3 deletions

View file

@ -1,3 +1,8 @@
Wed Nov 19 17:48:05 2008 Yukihiro Matsumoto <matz@ruby-lang.org>
* 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@ruby-lang.org>
* node.h (NOEX_MODFUNC): should be include NOEX_PRIVATE.

View file

@ -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");

View file

@ -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]'