ruby-trunk-changes r45398 - r45406

今日は 2.1 からの省略できないキーワード引数を仮引数にかっこがないメソッド宣言で使うと SyntaxError になる不具合の修正(ただし不完全らしい)や、先日の Time の Marshal.load のテストの再修正などがありました。
必須キーワード引数の parse の問題はこんなのが残ってたのかという感じですね。

akr: r45398 2014-03-24 22:51:28 +0900

r44958 の Enumerable#max, #min, #max_by, #min_by の機能追加について NEWS ファイルにメソッド名だけ記述されていたのを、取得する個数を引数に受けとれることを追記しています。

nobu: r45399 2014-03-25 00:28:30 +0900

VM の内部的に利用するメソッドである m_core_hash_from_ary() で配列を先頭から 2要素ずつキーと値のペアとみなして Hash にして返す処理を同様の処理を実装した m_core_hash_merge_ary() を利用するようにリファクタリングしています。

nobu: r45400 2014-03-25 00:28:31 +0900

r45399 の続きっぽいのですが同様に Array から Hash を作る処理が m_core_hash_merge_ptr() にもあったので core_hash_merge() という関数に括り出して共有するリファクタリングです。
また配列にアクセスするのに RARRAY_AREF() で毎回参照するのではなくて RARRAY_CONST_PTR() でポインタを渡して C の配列としてアクセスするようにしています。

svn: r45401 2014-03-25 00:28:33 +0900

version.h の日付更新。

nobu: r45402 2014-03-25 10:30:07 +0900

GNUMakefile の元になる defs/gmake.mk で -O0 が指定されていた時に -D_FORTIFY_SOURCE を XCFLAGS から削るようにしているみたいです。 _FORTIFY_SOURCE は最適化ありのコンパイルする必要があるそうです。へー。これはバックポート必要でしょうか。

usa: r45403 2014-03-25 15:55:04 +0900

r45364 での Time オブジェクトの Marshal.load でのタイムゾーン文字列を保持するようにする修正のテストで r45395 で環境変数 TZ にセットするのを "Asia/Tokyo" に修正しましたが、今度は Windows でもこれではうまくいかないということでとりあえず "JST-9" にしています。 [ruby-core:61671] [Bug #9652]

nobu: r45404 2014-03-25 16:39:58 +0900

parse.y で定義されている構造体 struct parser_params で先頭の int is_ripper メンバーを後ろのほうの int 型のメンバが並ぶところに移動してアライメントがうまくとれて 64bit 環境で余分な padding が入らないように調整しています。

nobu: r45405 2014-03-25 16:47:37 +0900

2.1 から追加された省略不可能なキーワード引数を最後の引数として持つメソッド定義を仮引数をかっこで括らずに書くと、メソッド内容によって SyntaxError になる不具合の修正として、parser や lexer にキーワード引数の key: の後を意味する状態を持たせて、その後に改行が続いたらそこで切って行継続しているようにならないようにしているようです。これまでは EXPR_BEG だったため改行がきたら無視されていて次の行の式がキーワード引数のデフォルト値として扱われてたみたいです。まじかー、と思ってテストはどうなってるか確認してみると、確かにメソッド定義は仮引数をかっこで囲んだ方法で定義しているのでこのケースはテストされていなかったようです。なるほど…。これまで誰も気がつかなかったとは…と思いますが、無意識のうちに地雷原を避ける能力が働いてしまったような気がします。確かにこれかっこ付けたくなるもんな…。
しかしチケットには、これでもまだダメだった、と書かれているので不完全な修正の模様。 [ruby-core:61658] [Bug #9669]

usa: r45406 2014-03-25 16:57:35 +0900

再度 r45364 のテストの修正で、Marshal.load で Time オブジェクトが壊れるのは GC される可能性があるからで常におきるわけではないので 1,000,000 回繰り返してテストしていたのですが、CI でタイムアウトしてしまうということで 100,000回に減らしています。