Backport #5586

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

Added by Tomoyuki Chikanaga over 2 years ago. Updated over 1 year 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 すると TIMESETFIXOFF() で
struct timeobject の gmt と vtm.utcoffset がセットされるのですが
それを 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 オブジェクトのタイムゾーンは地方時となります。」とあるので TIMEGMTCOPY() 自体が
不要なのかもしれないと思いますがどうでしょう。

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

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

static VALUE timegettm(VALUE, struct timeobject *);
#define MAKE
TM(time, tobj) \

Associated revisions

Revision 34290
Added by Ayumu AIZAWA over 2 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 2 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 (TIMECOPYGMT): copy vtm.utc_offset and vtm.zone too. patch by Tomoyuki Chikanaga. [Bug #5586]

#2 Updated by Akira Tanaka over 2 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 すると TIMESETFIXOFF() で
struct timeobject の gmt と vtm.utcoffset がセットされるのですが
それを 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 オブジェクトのタイムゾーンは地方時となります。」とあるので TIMEGMTCOPY() 自体が
不要なのかもしれないと思いますがどうでしょう。

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

#3 Updated by Tomoyuki Chikanaga over 2 years ago

  • Tracker changed from Bug to Backport
  • Project changed from ruby-trunk to Backport93
  • Category deleted (core)
  • Status changed from Closed to Open

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

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

#4 Updated by Ayumu AIZAWA over 2 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