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

ruby-changes:27714

From: nobu <ko1@a...>
Date: Fri, 15 Mar 2013 23:07:31 +0900 (JST)
Subject: [ruby-changes:27714] nobu:r39766 (trunk): time.c: check re-initialize

nobu	2013-03-15 23:06:21 +0900 (Fri, 15 Mar 2013)

  New Revision: 39766

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

  Log:
    time.c: check re-initialize
    
    * 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 files:
    trunk/ChangeLog
    trunk/test/ruby/test_time.rb
    trunk/time.c

Index: time.c
===================================================================
--- time.c	(revision 39765)
+++ time.c	(revision 39766)
@@ -1823,10 +1823,11 @@ struct time_object { https://github.com/ruby/ruby/blob/trunk/time.c#L1823
     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)
@@ -1889,12 +1890,35 @@ time_s_alloc(VALUE klass) https://github.com/ruby/ruby/blob/trunk/time.c#L1890
     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 %"PRIsVALUE, 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 %"PRIsVALUE, CLASS_OF(obj));
+    }
+    return tobj;
+}
+
 static void
 time_modify(VALUE time)
 {
@@ -1960,7 +1984,8 @@ time_init_0(VALUE time) https://github.com/ruby/ruby/blob/trunk/time.c#L1984
     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
@@ -2203,7 +2228,8 @@ time_init_1(int argc, VALUE *argv, VALUE https://github.com/ruby/ruby/blob/trunk/time.c#L2228
     validate_vtm(&vtm);
 
     time_modify(time);
-    GetTimeval(time, tobj);
+    GetNewTimeval(time, tobj);
+    tobj->gmt = 0;
     tobj->tm_got=0;
     tobj->timew = WINT2FIXWV(0);
 
@@ -2320,7 +2346,8 @@ time_new_timew(VALUE klass, wideval_t ti https://github.com/ruby/ruby/blob/trunk/time.c#L2346
     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;
@@ -3447,7 +3474,7 @@ time_init_copy(VALUE copy, VALUE time) https://github.com/ruby/ruby/blob/trunk/time.c#L3474
 
     if (!OBJ_INIT_COPY(copy, time)) return copy;
     GetTimeval(time, tobj);
-    GetTimeval(copy, tcopy);
+    GetNewTimeval(copy, tcopy);
     MEMCPY(tcopy, tobj, struct time_object, 1);
 
     return copy;
@@ -4832,7 +4859,8 @@ end_submicro: ; https://github.com/ruby/ruby/blob/trunk/time.c#L4859
         timew = timegmw(&vtm);
     }
 
-    GetTimeval(time, tobj);
+    GetNewTimeval(time, tobj);
+    tobj->gmt = 0;
     tobj->tm_got = 0;
     tobj->timew = timew;
     if (gmt) {
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 39765)
+++ ChangeLog	(revision 39766)
@@ -1,3 +1,12 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1
+Fri Mar 15 23:06:18 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]
+
 Fri Mar 15 14:51:33 2013  Nobuyoshi Nakada  <nobu@r...>
 
 	* file.c (rb_sys_fail_path_with_func): share same function, and path
Index: test/ruby/test_time.rb
===================================================================
--- test/ruby/test_time.rb	(revision 39765)
+++ test/ruby/test_time.rb	(revision 39766)
@@ -408,6 +408,15 @@ class TestTime < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/ruby/test_time.rb#L408
     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
     t2000 = get_t2000
     assert_equal(t2000, t2000.dup)

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

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