Backport #5586
closedTime.at(Marshal.load(Marshal.dump(Time.now))).to_s raise TypeError
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) \
Updated by akr (Akira Tanaka) almost 13 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 13 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]
Updated by nagachika (Tomoyuki Chikanaga) almost 13 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 オブジェクトのタイムゾーンは地方時となります。」というのは
実態にあっていないので単なるバグじゃないでしょうか。
ありがとうございます。るりまのほうにチケットを起票しておきました。
Updated by ayumin (Ayumu AIZAWA) almost 13 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]