Project

General

Profile

Actions

Backport #5586

closed

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

Added by nagachika (Tomoyuki Chikanaga) over 12 years ago. Updated over 11 years ago.

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

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) \

Actions #1

Updated by akr (Akira Tanaka) over 12 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.
    [ruby-dev:44827] [Bug #5586]

Updated by akr (Akira Tanaka) over 12 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 :

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]

Actions #3

Updated by nagachika (Tomoyuki Chikanaga) over 12 years ago

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

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

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

Actions #4

Updated by ayumin (Ayumu AIZAWA) about 12 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.
  [ruby-dev:44827] [Bug #5586]
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0