diff options
author | usa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2013-05-14 00:50:19 +0000 |
---|---|---|
committer | usa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2013-05-14 00:50:19 +0000 |
commit | 9d5681ad972f00dfdf4a375575dc04ae18f930e7 (patch) | |
tree | 49d3b966eeee24756a3a41191f98a2db066b7f87 | |
parent | 588c13973ae796a8953a9983a4d7ee5c7ecb4d8e (diff) |
merge revision(s) 39766,39769: [Backport #8101]
* time.c (GetTimeval): check if already initialized instance.
* time.c (GetNewTimeval): check if newly created instance.
* time.c (time_init_0, time_init_1, time_init_copy, time_mload): must
be newly created instance. [ruby-core:53436] [Bug #8099]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_9_3@40711 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 9 | ||||
-rw-r--r-- | test/ruby/test_time.rb | 9 | ||||
-rw-r--r-- | time.c | 42 | ||||
-rw-r--r-- | version.h | 8 |
4 files changed, 57 insertions, 11 deletions
@@ -1,3 +1,12 @@ +Tue May 14 09:36:14 2013 Nobuyoshi Nakada <nobu@ruby-lang.org> + + * time.c (GetTimeval): check if already initialized instance. + + * time.c (GetNewTimeval): check if newly created instance. + + * time.c (time_init_0, time_init_1, time_init_copy, time_mload): must + be newly created instance. [ruby-core:53436] [Bug #8099] + Thu Apr 11 11:24:42 2013 Akinori MUSHA <knu@iDaemons.org> * lib/ipaddr.rb (IPAddr#in6_addr): Fix a typo with the closing diff --git a/test/ruby/test_time.rb b/test/ruby/test_time.rb index 961c49432c..6428e3452c 100644 --- a/test/ruby/test_time.rb +++ b/test/ruby/test_time.rb @@ -378,6 +378,15 @@ class TestTime < Test::Unit::TestCase assert_kind_of(Integer, T2000.hash) end + def test_reinitialize + bug8099 = '[ruby-core:53436] [Bug #8099]' + t2000 = get_t2000 + assert_raise(TypeError, bug8099) { + t2000.send(:initialize, 2013, 03, 14) + } + assert_equal(get_t2000, t2000, bug8099) + end + def test_init_copy assert_equal(T2000, T2000.dup) assert_raise(TypeError) do @@ -1809,10 +1809,11 @@ struct time_object { int tm_got; }; -#define GetTimeval(obj, tobj) \ - TypedData_Get_Struct((obj), struct time_object, &time_data_type, (tobj)) +#define GetTimeval(obj, tobj) ((tobj) = get_timeval(obj)) +#define GetNewTimeval(obj, tobj) ((tobj) = get_new_timeval(obj)) #define IsTimeval(obj) rb_typeddata_is_kind_of((obj), &time_data_type) +#define TIME_INIT_P(tobj) ((tobj)->gmt != -1) #define TIME_UTC_P(tobj) ((tobj)->gmt == 1) #define TIME_SET_UTC(tobj) ((tobj)->gmt = 1) @@ -1875,12 +1876,35 @@ time_s_alloc(VALUE klass) struct time_object *tobj; obj = TypedData_Make_Struct(klass, struct time_object, &time_data_type, tobj); + tobj->gmt = -1; tobj->tm_got=0; tobj->timew = WINT2FIXWV(0); return obj; } +static struct time_object * +get_timeval(VALUE obj) +{ + struct time_object *tobj; + TypedData_Get_Struct(obj, struct time_object, &time_data_type, tobj); + if (!TIME_INIT_P(tobj)) { + rb_raise(rb_eTypeError, "uninitialized %"PRIiVALUE, CLASS_OF(obj)); + } + return tobj; +} + +static struct time_object * +get_new_timeval(VALUE obj) +{ + struct time_object *tobj; + TypedData_Get_Struct(obj, struct time_object, &time_data_type, tobj); + if (TIME_INIT_P(tobj)) { + rb_raise(rb_eTypeError, "already initialized %"PRIiVALUE, CLASS_OF(obj)); + } + return tobj; +} + static void time_modify(VALUE time) { @@ -1947,7 +1971,8 @@ time_init_0(VALUE time) struct timespec ts; time_modify(time); - GetTimeval(time, tobj); + GetNewTimeval(time, tobj); + tobj->gmt = 0; tobj->tm_got=0; tobj->timew = WINT2FIXWV(0); #ifdef HAVE_CLOCK_GETTIME @@ -2188,7 +2213,8 @@ time_init_1(int argc, VALUE *argv, VALUE time) validate_vtm(&vtm); time_modify(time); - GetTimeval(time, tobj); + GetNewTimeval(time, tobj); + tobj->gmt = 0; tobj->tm_got=0; tobj->timew = WINT2FIXWV(0); @@ -2304,7 +2330,8 @@ time_new_timew(VALUE klass, wideval_t timew) VALUE time = time_s_alloc(klass); struct time_object *tobj; - GetTimeval(time, tobj); + tobj = DATA_PTR(time); /* skip type check */ + tobj->gmt = 0; tobj->timew = timew; return time; @@ -3430,7 +3457,7 @@ time_init_copy(VALUE copy, VALUE time) if (copy == time) return copy; time_modify(copy); GetTimeval(time, tobj); - GetTimeval(copy, tcopy); + GetNewTimeval(copy, tcopy); MEMCPY(tcopy, tobj, struct time_object, 1); return copy; @@ -4807,7 +4834,8 @@ end_submicro: ; timew = timegmw(&vtm); } - GetTimeval(time, tobj); + GetNewTimeval(time, tobj); + tobj->gmt = 0; tobj->tm_got = 0; tobj->timew = timew; if (gmt) { @@ -1,10 +1,10 @@ #define RUBY_VERSION "1.9.3" -#define RUBY_PATCHLEVEL 415 +#define RUBY_PATCHLEVEL 416 -#define RUBY_RELEASE_DATE "2013-04-11" +#define RUBY_RELEASE_DATE "2013-05-14" #define RUBY_RELEASE_YEAR 2013 -#define RUBY_RELEASE_MONTH 4 -#define RUBY_RELEASE_DAY 11 +#define RUBY_RELEASE_MONTH 5 +#define RUBY_RELEASE_DAY 14 #include "ruby/version.h" |