[#42915] min(n), max(n), min_by(n), max_by(n) — Tanaka Akira <akr@...>
思ったんですが、
[#42937] Re: Proc#callの別名の提案 — hattorihiroaki1@...
服部裕暁です。
[#42944] [Ruby 1.8-Bug#4230][Open] PlatformSDKのヘッダでビルドするとSocket::getaddrinfoで例外 — Masahiro Kitajima <redmine@...>
Bug #4230: PlatformSDKのヘッダでビルドするとSocket::getaddrinfoで例外
[#42945] [Ruby 1.8-Bug#4231][Open] configure.bat --with-winsock2 が socket/extconf.rbに効いていない — Masahiro Kitajima <redmine@...>
Bug #4231: configure.bat --with-winsock2 が socket/extconf.rbに効いていない
> Bug #4231: configure.bat --with-winsock2 が socket/extconf.rbに効いていない
(2011/01/05 15:04), KOSAKI Motohiro wrote:
[#42970] Re: 特異メソッドの定義の簡略化 — hattorihiroaki1@...
服部裕暁です。
[#43001] Re: Hash#[]の別名(Symbolをキーにして) — hattorihiroaki1@...
服部裕暁です。
[#43027] [Ruby 1.9-Feature#4280][Assigned] SJIS should be an alias of Windows-31J, not of Shift_JIS — Usaku NAKAMURA <redmine@...>
Feature #4280: SJIS should be an alias of Windows-31J, not of Shift_JIS
チケット #4280 が更新されました。 (by Motohiro KOSAKI)
こんにちは、なかむら(う)です。
2011年1月14日16:35 U.Nakamura <usa@garbagecollect.jp>:
こんにちは、なかむら(う)です。
[#43039] ext/openssl development repository — Hiroshi Nakamura <nakahiro@...>
W3J1YnktY29yZTozNDQxNl3jga7ml6XmnKzlkJHjgZHniYjjgafjgZnjgIIKCuacgOi/kU1hcnRp
こんにちは、なかむら(う)です。
遠藤です。
MjAxMS8xLzE0IFl1c3VrZSBFTkRPSCA8bWFtZUB0c2cubmUuanA+Ogo+Pj4gwqAgwqAgwqAgwqAg
こんにちは、なかむら(う)です。
44G+44Go44KB44Oi44O844OJ44Gn44GZ44CCCgoyMDExLzEvMTcgVS5OYWthbXVyYSA8dXNhQGdh
[#43047] Fwd: [ruby-core:33987] [Ruby 1.9-Feature#4222][Open] Irb tab completion support for the valid (but rare) obj::method invocation syntax — Yugui <yugui@...>
=E7=9F=B3=E5=A1=9A=E3=81=95=E3=82=93=E3=80=81
[#43060] [Ruby 1.9-Bug#4287][Open] test_europe_lisbon(TestTimeTZ) Failure — Tomoyuki Chikanaga <redmine@...>
Bug #4287: test_europe_lisbon(TestTimeTZ) Failure
[#43079] [Backport87-Backport#4296][Open] getaddrinfoがOSXで動かない問題をバックポートしてほしい — Takeyuki Fujioka <redmine@...>
Backport #4296: getaddrinfoがOSXで動かない問題をバックポートしてほしい
[#43092] pthread_cond を用いたConditionVariable — keiju@... (Keiju ISHITSUKA)
けいじゅ@いしつかです.
小崎@便乗です
遠藤です。
PiAxLiBkZWFkbG9ja+OBruODgeOCp+ODg+OCr+OBjOOBp+OBjeOBpuOBhOOBquOBhC4gdGhyZWFk
[#43111] Hashのイテレーション中の新規キー追加 — masa <masap.hat@...>
ruby-list の方で同じタイトルで投稿した畠山です。
はじめまして、近永と申します。
[#43139] ext/dbmのデフォルトDBについて — KOSAKI Motohiro <kosaki.motohiro@...>
小崎です
[#43140] Fwd: [ruby-cvs:37153] Ruby:r29960 (trunk): * io.c (struct argf): make lineno long, and reorder members. — Yutaka Kanemoto <kinpoco@...>
金本と申します。
[#43144] 現在 win32 portが壊れています — KOSAKI Motohiro <kosaki.motohiro@...>
遠藤さん
[#43152] RubyのパッチレベルとABI互換 — Takahiro Kambe <taca@...>
こんにちは。
うーむ。なるほど...
> うーむ。なるほど...
[ruby-dev:43111] Hashのイテレーション中の新規キー追加
ruby-list の方で同じタイトルで投稿した畠山です。
(ruby-list:47766)
ruby-dev 初投稿になり、勝手がよくわかっていませんが、
どうぞよろしくお願いします。
問題点
Ruby 1.8.7 においてHashイテレーション中に自己のHashに
キーを追加していくとある一定数以上のところでRuntimeError
になる。これを常に新しくキーを追加できるようにできないか。
より具体的には、
遠藤さんから提示してもらった
h = {}
(1..66).each {|n| h[n.to_s] = n }
h.each_key do |k|
p k
if k == '66'
h['67'] = 67
end
end
が Ruby 1.8.7 でエラーになるのを解決したい、というのが
いま私のやりたいことです。(そもそもそんなの必要ない、
ということでしたらそもそも議論の余地はありませんが...)
その後、ハッシュのソースコード(Ruby-1.8.7-p330, st.c, hash.c)を
読ませてもらいまして、おおよそ理解しました。
(Ruby 1.9 のハッシュコードはまだ読んでいません)
まず問題点の整理ですが(Ruby1.8.7においてですが)
Hashイテレーション中に新規キーを追加したときにエラーが
起きるのは、
(st.c内において)
キーを追加中にHash密度が一定値を超えるとrehash関数が
呼ばれ、table->binsがcallocされ直すためにst_foreach関数内
のptrポインタ変数の指し示す場所が不明になってしまうこと
からエラーになる、という処理だということを理解しました。
その後、よくよくst_foreach関数(st.c)を眺めてみまして
(この関数が自体の意義はまだ完全に理解できていませんが)
ptrの行き先が不明になったところで代入し直してあげることで
とりえあず上記のサンプルのエラーは回避することができました。
ただ、st_foreach関数のcase ST_CHECKはrehashに伴うtable->bins
変更チェック以外の役割もある気がするので、その場合には
まずいかもしれないと思っています。
か、もしくは、まだ私の理解が浅いので、根本的に「それはまずい」
という場合がありましたら、どなたかアドバイスをお願いします。
一応 make test はパスしましたがmake test-all は二つほどFailure
がでました(その失敗はまだ追えてません)。
以下 diff -u の結果を添付します。
--- st.c.org 2011-01-25 23:46:02.000000000 +0100
+++ st.c 2011-01-25 23:44:06.000000000 +0100
@@ -495,7 +495,8 @@
}
if (!tmp) {
/* call func with error notice */
- return 1;
+ /*return 1;*/
+ ptr = table->bins[i];
}
/* fall through */
case ST_CONTINUE:
この方向性でもし問題がないようでしたら
(もしくはプラスアルファで問題が解決しそうなら)
Ruby1.9.2のコードも眺めてみたいと思います。
がそもそも根本的にまずいという場合は出直すことにします。
それからいまいち Wiki の使い方がわかっていないのですが、こう
いう問題提起をしたい場合はどういう手順を踏むのが良いでしょうか?
長々すいませんでしたが、どうぞよろしくお願いします。
畠山