ruby-changes:55405
From: nobu <ko1@a...>
Date: Fri, 19 Apr 2019 17:53:44 +0900 (JST)
Subject: [ruby-changes:55405] nobu:r67613 (trunk): time.c: added in: option to Time.now
nobu 2019-04-19 17:53:40 +0900 (Fri, 19 Apr 2019) New Revision: 67613 https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=67613 Log: time.c: added in: option to Time.now * time.c (time_s_now): added in: option to Time.now as well as Time.at. Modified files: trunk/test/ruby/test_time_tz.rb trunk/time.c Index: test/ruby/test_time_tz.rb =================================================================== --- test/ruby/test_time_tz.rb (revision 67612) +++ test/ruby/test_time_tz.rb (revision 67613) @@ -582,6 +582,11 @@ module TestTimeTZ::WithTZ https://github.com/ruby/ruby/blob/trunk/test/ruby/test_time_tz.rb#L582 assert_equal(time_class.utc(2018, 9, 1, 12+h, m, 0).to_i, t.to_i) end + def subtest_now(time_class, tz, tzarg, tzname, abbr, utc_offset) + t = time_class.now(in: tzarg) + assert_equal(tz, t.zone) + end + def subtest_getlocal(time_class, tz, tzarg, tzname, abbr, utc_offset) t = time_class.utc(2018, 9, 1, 12, 0, 0).getlocal(tzarg) h, m = (utc_offset / 60).divmod(60) Index: time.c =================================================================== --- time.c (revision 67612) +++ time.c (revision 67613) @@ -2671,6 +2671,22 @@ rb_time_timespec(VALUE time) https://github.com/ruby/ruby/blob/trunk/time.c#L2671 return time_timespec(time, FALSE); } +enum { + TMOPT_IN, + TMOPT_MAX_ +}; + +static bool +get_tmopt(VALUE opts, VALUE vals[TMOPT_MAX_]) +{ + ID ids[TMOPT_MAX_]; + + if (NIL_P(opts)) return false; + CONST_ID(ids[TMOPT_IN], "in"); + rb_get_kwargs(opts, ids, 0, TMOPT_MAX_, vals); + return true; +} + /* * call-seq: * Time.now -> time @@ -2682,9 +2698,16 @@ rb_time_timespec(VALUE time) https://github.com/ruby/ruby/blob/trunk/time.c#L2698 */ static VALUE -time_s_now(VALUE klass) +time_s_now(int argc, VALUE *argv, VALUE klass) { - return rb_class_new_instance(0, NULL, klass); + VALUE vals[TMOPT_MAX_], opts, t, zone = Qundef; + rb_scan_args(argc, argv, ":", &opts); + if (get_tmopt(opts, vals)) zone = vals[TMOPT_IN]; + t = rb_class_new_instance(0, NULL, klass); + if (zone != Qundef) { + time_zonelocal(t, zone); + } + return t; } static int @@ -2746,15 +2769,11 @@ static VALUE https://github.com/ruby/ruby/blob/trunk/time.c#L2769 time_s_at(int argc, VALUE *argv, VALUE klass) { VALUE time, t, unit = Qundef, zone = Qundef, opts; + VALUE vals[TMOPT_MAX_]; wideval_t timew; argc = rb_scan_args(argc, argv, "12:", &time, &t, &unit, &opts); - if (!NIL_P(opts)) { - ID ids[1]; - VALUE vals[numberof(ids)]; - - CONST_ID(ids[0], "in"); - rb_get_kwargs(opts, ids, 0, 1, vals); + if (get_tmopt(opts, vals)) { zone = vals[0]; } if (argc >= 2) { @@ -5577,7 +5596,7 @@ Init_Time(void) https://github.com/ruby/ruby/blob/trunk/time.c#L5596 rb_include_module(rb_cTime, rb_mComparable); rb_define_alloc_func(rb_cTime, time_s_alloc); - rb_define_singleton_method(rb_cTime, "now", time_s_now, 0); + rb_define_singleton_method(rb_cTime, "now", time_s_now, -1); rb_define_singleton_method(rb_cTime, "at", time_s_at, -1); rb_define_singleton_method(rb_cTime, "utc", time_s_mkutc, -1); rb_define_singleton_method(rb_cTime, "gm", time_s_mkutc, -1); -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/