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

ruby-changes:28659

From: usa <ko1@a...>
Date: Tue, 14 May 2013 09:50:31 +0900 (JST)
Subject: [ruby-changes:28659] usa:r40711 (ruby_1_9_3): merge revision(s) 39766,39769: [Backport #8101]

usa	2013-05-14 09:50:19 +0900 (Tue, 14 May 2013)

  New Revision: 40711

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

  Log:
    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]

  Modified directories:
    branches/ruby_1_9_3/
  Modified files:
    branches/ruby_1_9_3/ChangeLog
    branches/ruby_1_9_3/test/ruby/test_time.rb
    branches/ruby_1_9_3/time.c
    branches/ruby_1_9_3/version.h

Index: ruby_1_9_3/time.c
===================================================================
--- ruby_1_9_3/time.c	(revision 40710)
+++ ruby_1_9_3/time.c	(revision 40711)
@@ -1809,10 +1809,11 @@ struct time_object { https://github.com/ruby/ruby/blob/trunk/ruby_1_9_3/time.c#L1809
     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) https://github.com/ruby/ruby/blob/trunk/ruby_1_9_3/time.c#L1876
     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) https://github.com/ruby/ruby/blob/trunk/ruby_1_9_3/time.c#L1971
     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 https://github.com/ruby/ruby/blob/trunk/ruby_1_9_3/time.c#L2213
     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 ti https://github.com/ruby/ruby/blob/trunk/ruby_1_9_3/time.c#L2330
     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) https://github.com/ruby/ruby/blob/trunk/ruby_1_9_3/time.c#L3457
     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: ; https://github.com/ruby/ruby/blob/trunk/ruby_1_9_3/time.c#L4834
         timew = timegmw(&vtm);
     }
 
-    GetTimeval(time, tobj);
+    GetNewTimeval(time, tobj);
+    tobj->gmt = 0;
     tobj->tm_got = 0;
     tobj->timew = timew;
     if (gmt) {
Index: ruby_1_9_3/ChangeLog
===================================================================
--- ruby_1_9_3/ChangeLog	(revision 40710)
+++ ruby_1_9_3/ChangeLog	(revision 40711)
@@ -1,3 +1,12 @@ https://github.com/ruby/ruby/blob/trunk/ruby_1_9_3/ChangeLog#L1
+Tue May 14 09:36:14 2013  Nobuyoshi Nakada  <nobu@r...>
+
+	* 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@i...>
 
 	* lib/ipaddr.rb (IPAddr#in6_addr): Fix a typo with the closing
Index: ruby_1_9_3/version.h
===================================================================
--- ruby_1_9_3/version.h	(revision 40710)
+++ ruby_1_9_3/version.h	(revision 40711)
@@ -1,10 +1,10 @@ https://github.com/ruby/ruby/blob/trunk/ruby_1_9_3/version.h#L1
 #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"
 
Index: ruby_1_9_3/test/ruby/test_time.rb
===================================================================
--- ruby_1_9_3/test/ruby/test_time.rb	(revision 40710)
+++ ruby_1_9_3/test/ruby/test_time.rb	(revision 40711)
@@ -378,6 +378,15 @@ class TestTime < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/ruby_1_9_3/test/ruby/test_time.rb#L378
     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

Property changes on: ruby_1_9_3
___________________________________________________________________
Modified: svn:mergeinfo
   Merged /trunk:r39766,39769


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

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