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

ruby-changes:12236

From: akr <ko1@a...>
Date: Wed, 1 Jul 2009 21:12:11 +0900 (JST)
Subject: [ruby-changes:12236] Ruby:r23924 (trunk): * include/ruby/intern.h (rb_time_num_new): declared.

akr	2009-07-01 21:11:53 +0900 (Wed, 01 Jul 2009)

  New Revision: 23924

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

  Log:
    * include/ruby/intern.h (rb_time_num_new): declared.
    * time.c (nsec2timev): extracted from time_new_internal.
      (time_new_internal): change argument to VALUE.
      (rb_time_new): follow the argument change.
      (rb_time_nano_new): ditto.
      (rb_time_num_new): new function.
    
    * ext/socket/ancdata.c (ancillary_timestamp): use rb_time_num_new to
      represent struct bintime preciously.

  Modified files:
    trunk/ChangeLog
    trunk/ext/socket/ancdata.c
    trunk/include/ruby/intern.h
    trunk/test/socket/test_socket.rb
    trunk/time.c

Index: time.c
===================================================================
--- time.c	(revision 23923)
+++ time.c	(revision 23924)
@@ -51,6 +51,7 @@
 static long obj2long(VALUE obj);
 static VALUE obj2vint(VALUE obj);
 static int month_arg(VALUE arg);
+static void validate_utc_offset(VALUE utc_offset);
 static void validate_vtm(struct vtm *vtm);
 
 static VALUE time_gmtime(VALUE);
@@ -1451,18 +1452,24 @@
     *nsecp = nsec;
 }
 
+static VALUE nsec2timev(time_t sec, long nsec)
+{
+    struct timespec ts;
+    time_overflow_p(&sec, &nsec);
+    ts.tv_sec = sec;
+    ts.tv_nsec = nsec;
+    return timespec2timev(&ts);
+}
+
 static VALUE
-time_new_internal(VALUE klass, time_t sec, long nsec)
+time_new_internal(VALUE klass, VALUE timev)
 {
     VALUE time = time_s_alloc(klass);
     struct time_object *tobj;
     struct timespec ts;
 
     GetTimeval(time, tobj);
-    time_overflow_p(&sec, &nsec);
-    ts.tv_sec = sec;
-    ts.tv_nsec = nsec;
-    tobj->timev = timespec2timev(&ts);
+    tobj->timev = num_exact(timev);
 
     return time;
 }
@@ -1470,15 +1477,30 @@
 VALUE
 rb_time_new(time_t sec, long usec)
 {
-    return time_new_internal(rb_cTime, sec, usec * 1000);
+    return time_new_internal(rb_cTime, nsec2timev(sec, usec * 1000));
 }
 
 VALUE
 rb_time_nano_new(time_t sec, long nsec)
 {
-    return time_new_internal(rb_cTime, sec, nsec);
+    return time_new_internal(rb_cTime, nsec2timev(sec, nsec));
 }
 
+VALUE
+rb_time_num_new(VALUE timev, VALUE off)
+{
+    VALUE time = time_new_internal(rb_cTime, timev);
+
+    if (!NIL_P(off)) {
+        off = utc_offset_arg(off);
+        validate_utc_offset(off);
+        time_set_utc_offset(time, off);
+        return time;
+    }
+
+    return time;
+}
+
 static VALUE
 time_new_timev(VALUE klass, VALUE timev)
 {
Index: include/ruby/intern.h
===================================================================
--- include/ruby/intern.h	(revision 23923)
+++ include/ruby/intern.h	(revision 23924)
@@ -745,6 +745,7 @@
 /* time.c */
 VALUE rb_time_new(time_t, long);
 VALUE rb_time_nano_new(time_t, long);
+VALUE rb_time_num_new(VALUE, VALUE);
 /* variable.c */
 VALUE rb_mod_name(VALUE);
 VALUE rb_class_path(VALUE);
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 23923)
+++ ChangeLog	(revision 23924)
@@ -1,3 +1,16 @@
+Wed Jul  1 21:09:25 2009  Tanaka Akira  <akr@f...>
+
+	* include/ruby/intern.h (rb_time_num_new): declared.
+
+	* time.c (nsec2timev): extracted from time_new_internal.
+	  (time_new_internal): change argument to VALUE.
+	  (rb_time_new): follow the argument change.
+	  (rb_time_nano_new): ditto.
+	  (rb_time_num_new): new function.
+
+	* ext/socket/ancdata.c (ancillary_timestamp): use rb_time_num_new to
+	  represent struct bintime preciously.
+
 Wed Jul  1 08:46:11 2009  Nobuyoshi Nakada  <nobu@r...>
 
 	* marshal.c (w_encoding): encodings need extra depth.
Index: ext/socket/ancdata.c
===================================================================
--- ext/socket/ancdata.c	(revision 23923)
+++ ext/socket/ancdata.c	(revision 23924)
@@ -327,14 +327,20 @@
     }
 # endif
 
+#define add(x,y) (rb_funcall((x), '+', 1, (y)))
+#define mul(x,y) (rb_funcall((x), '*', 1, (y)))
+#define quo(x,y) (rb_funcall((x), rb_intern("quo"), 1, (y)))
+
 # ifdef SCM_BINTIME
     if (level == SOL_SOCKET && type == SCM_BINTIME &&
         RSTRING_LEN(data) == sizeof(struct bintime)) {
         struct bintime bt;
-        struct timespec ts;
+	VALUE d, timev;
         memcpy((char*)&bt, RSTRING_PTR(data), sizeof(bt));
-        bintime2timespec(&bt, &ts);
-        result = rb_time_nano_new(ts.tv_sec, ts.tv_nsec);
+	d = ULL2NUM(0x100000000UL);
+	d = mul(d,d);
+	timev = add(TIMET2NUM(bt.sec), quo(ULL2NUM(bt.frac), d));
+        result = rb_time_num_new(timev, Qnil);
     }
 # endif
 
Index: test/socket/test_socket.rb
===================================================================
--- test/socket/test_socket.rb	(revision 23923)
+++ test/socket/test_socket.rb	(revision 23924)
@@ -383,6 +383,7 @@
     assert_match(pat, stamp.inspect)
     t = stamp.timestamp
     assert_match(pat, t.strftime("%Y-%m-%d"))
+    assert_equal(stamp.data[-8,8].unpack("Q")[0], t.subsec * 2**64)
   end
 
 end if defined?(Socket)

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

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