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/