Backport #5586

Time.at(Marshal.load(Marshal.dump(Time.now))).to_s raise TypeError

Added by Tomoyuki Chikanaga over 3 years ago. Updated over 2 years ago.

[ruby-dev:44827]
Status:Closed
Priority:Normal
Assignee:-

Description

以下のコードが TypeError を発生させます。なお 1.9.2-p312 でも発生しました。

Time.at(Marshal.load(Marshal.dump(Time.now))).to_s

=> TypeError: false can't be coerced into Fixnum

Time オブジェクトを Marshal.dump -> load すると TIME_SET_FIXOFF() で
struct time_object の gmt と vtm.utc_offset がセットされるのですが
それを Time.at に渡すと gmt だけコピーされて vtm.utc_offset が (VALUE)0 = Qfalse のままだからのようです。

どこが根本的な原因なのかよくわかりませんが、以下のパッチで例外はおきなくなりました。
るりまの Time.at(time) のページ( http://rurema.clear-code.com/1.9.3/method/Time/s/at.html )を見ると
「生成された Time オブジェクトのタイムゾーンは地方時となります。」とあるので TIME_GMT_COPY() 自体が
不要なのかもしれないと思いますがどうでしょう。

diff --git a/time.c b/time.c
index 3e50c7c..96b717b 100644
--- a/time.c
+++ b/time.c
@@ -1820,7 +1820,10 @@ struct time_object {
(tobj)->vtm.utc_offset = (off), \
(tobj)->vtm.zone = NULL)

-#define TIME_COPY_GMT(tobj1, tobj2) ((tobj1)->gmt = (tobj2)->gmt)
+#define TIME_COPY_GMT(tobj1, tobj2) \
+ ((tobj1)->gmt = (tobj2)->gmt, \
+ (tobj1)->vtm.utc_offset = (tobj2)->vtm.utc_offset, \
+ (tobj1)->vtm.zone = (tobj2)->vtm.zone)

static VALUE time_get_tm(VALUE, struct time_object *);
#define MAKE_TM(time, tobj) \

Associated revisions

Revision 33790
Added by Akira Tanaka over 3 years ago

  • time.c (TIME_COPY_GMT): copy vtm.utc_offset and vtm.zone too. patch by Tomoyuki Chikanaga. [Bug #5586]

Revision 34290
Added by Ayumu AIZAWA over 3 years ago

merge revision(s) 33790:

* time.c (TIME_COPY_GMT): copy vtm.utc_offset and vtm.zone too.
  patch by Tomoyuki Chikanaga.
   [Bug #5586]

History

#1 Updated by Akira Tanaka over 3 years ago

  • Status changed from Open to Closed
  • % Done changed from 0 to 100

This issue was solved with changeset r33790.
Tomoyuki, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.


  • time.c (TIME_COPY_GMT): copy vtm.utc_offset and vtm.zone too. patch by Tomoyuki Chikanaga. [Bug #5586]

#2 Updated by Akira Tanaka over 3 years ago

  • ruby -v changed from ruby 2.0.0dev (2011-11-07 trunk 33656) [x86_64-darwin10.8.0] to -

2011年11月8日0:42 Tomoyuki Chikanaga nagachika00@gmail.com:

Time.at(Marshal.load(Marshal.dump(Time.now))).to_s

=> TypeError: false can't be coerced into Fixnum

Time オブジェクトを Marshal.dump -> load すると TIME_SET_FIXOFF() で
struct time_object の gmt と vtm.utc_offset がセットされるのですが
それを Time.at に渡すと gmt だけコピーされて vtm.utc_offset が (VALUE)0 = Qfalse のままだからのようです。

どこが根本的な原因なのかよくわかりませんが、以下のパッチで例外はおきなくなりました。

パッチを入れました。

るりまの Time.at(time) のページ( http://rurema.clear-code.com/1.9.3/method/Time/s/at.html )を見ると
「生成された Time オブジェクトのタイムゾーンは地方時となります。」とあるので TIME_GMT_COPY() 自体が
不要なのかもしれないと思いますがどうでしょう。

time.c 中のドキュメントにはそういう記述はありませんね。
「生成された Time オブジェクトのタイムゾーンは地方時となります。」というのは
実態にあっていないので単なるバグじゃないでしょうか。
--
[田中 哲][たなか あきら][Tanaka Akira]

#3 Updated by Tomoyuki Chikanaga over 3 years ago

  • Tracker changed from Bug to Backport
  • Project changed from Ruby trunk to Backport193
  • Category deleted (core)
  • Status changed from Closed to Open

対応ありがとうございました。

time.c 中のドキュメントにはそういう記述はありませんね。
「生成された Time オブジェクトのタイムゾーンは地方時となります。」というのは
実態にあっていないので単なるバグじゃないでしょうか。
ありがとうございます。るりまのほうにチケットを起票しておきました。

#4 Updated by Ayumu AIZAWA over 3 years ago

  • Status changed from Open to Closed

This issue was solved with changeset r34290.
Tomoyuki, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.


merge revision(s) 33790:

* time.c (TIME_COPY_GMT): copy vtm.utc_offset and vtm.zone too.
  patch by Tomoyuki Chikanaga.
   [Bug #5586]

Also available in: Atom PDF