Project

General

Profile

Backport #5586

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

Added by nagachika (Tomoyuki Chikanaga) almost 8 years ago. Updated almost 7 years ago.

Status:
Closed
Priority:
Normal
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) \

Associated revisions

Revision 6445aab4
Added by akr (Akira Tanaka) almost 8 years ago

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

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@33790 b2dd03c8-39d4-4d8f-98ff-823fe69b080e

Revision 33790
Added by akr (Akira Tanaka) almost 8 years ago

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

Revision 33790
Added by akr (Akira Tanaka) almost 8 years ago

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

Revision 33790
Added by akr (Akira Tanaka) almost 8 years ago

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

Revision 33790
Added by akr (Akira Tanaka) almost 8 years ago

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

Revision 33790
Added by akr (Akira Tanaka) almost 8 years ago

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

Revision 33790
Added by akr (Akira Tanaka) almost 8 years ago

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

Revision abe4ff92
Added by ayumin (Ayumu AIZAWA) almost 8 years ago

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]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_9_3@34290 b2dd03c8-39d4-4d8f-98ff-823fe69b080e

Revision 34290
Added by ayumin (Ayumu AIZAWA) almost 8 years ago

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]

History

#1

Updated by akr (Akira Tanaka) almost 8 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) almost 8 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 nagachika (Tomoyuki Chikanaga) almost 8 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 オブジェクトのタイムゾーンは地方時となります。」というのは
実態にあっていないので単なるバグじゃないでしょうか。
ありがとうございます。るりまのほうにチケットを起票しておきました。

#4

Updated by ayumin (Ayumu AIZAWA) almost 8 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]

Also available in: Atom PDF