ruby-trunk-changes r42310 - r42339

今日は Rational や Complex の新たなリテラルの追加、def 文の戻り値の変更など 2.1 の新機能の追加がありました。あとは主に bignum.c のリファクタリング/最適化。

akr:r42310 2013-08-01 23:57:21 +0900

bignum.c の rb_big2str1() から不要なローカル変数を削除しています。

mrkn:r42311 2013-08-01 23:58:54 +0900

数値リテラルに r を後置すると Rational に、i を後置すると Complex になる新たな記法が追加されました。[ruby-core:55096] [Feature #8430]
'i' はほぼ全ての数値リテラルのうしろに付けることができます。1+1i のようにも書けますがこれは (1) + (1i) のように "+" メソッド呼び出しとしてパースされます。
r もだいたいの数値リテラルのうしろに付けることができ、小数表記の浮動小数点数リテラルにつけることができますが、指数表記のうしろにはつけられないようです。またやはり 4/3r のようにも書けますが、これも (4) / (3r) のようにパースされるので、リテラルとして直接サポートされているわけではないようです。

>> 1r
=> (1/1)
>> 4/3r
=> (4/3)
>> 0xfr
=> (15/1)
>> 077r
=> (63/1)
>> 0b11r
=> (3/1)
>> 0.33r
=> (33/100)
>> 1e-1r
SyntaxError: (irb):18: syntax error, unexpected tIDENTIFIER, expecting end-of-input

>> 1i
=> (0+1i)
>> 1+1i
=> (1+1i)
>> 0.1i
=> (0+0.1i)
>> 0xfi
=> (0+15i)
>> 077i
=> (0+63i)
>> 0b11i
=> (0+3i)
>> 1e-2i
=> (0+0.01i)

スゴイ! 便利! Cool!
開発者会議での成果だそうです(参考: http://bugs.ruby-lang.org/projects/ruby/wiki/DevelopersMeeting20130727Japan http://d.hatena.ne.jp/nurse/20130730#1375151654 )。2.1 の目玉機能のひとつになりそうですね。

nobu:r42312 2013-08-02 00:01:13 +0900

r42311 で新規追加したファイルの svn property 設定。

svn:r42313 2013-08-02 00:01:17 +0900

version.h の日付更新。

naruse:r42314 2013-08-02 00:04:13 +0900

テストで NoMemoryError が発生したらメモリ状況を出力するようにした対応に、/bin/ps があったら ps でメモリの情報を出力するようにコマンドの起動を追加しています。 [ruby-dev:47559] [Bug #8711]
チケットをみるとどうやらメモリ使用量の setrlimit での制限と ASLR *1のため仮想メモリ空間の断片化が原因でメモリが確保できなくなるんじゃないかということで、制限を緩めることで安定したようです。

mrkn:r42315 2013-08-02 00:14:45 +0900

bootstraptest/test_literal_suffix.rb に "1if true" や "1rescue nil" などのこれまでも動いていた分がパースできることを確認するテストを追加しています。 r42311 で数値リテラルの suffix に r i をつけられるようにしたので、その影響を受けていないことを確認するテストを追加したようです。

naruse:r42316 2013-08-02 02:11:27 +0900

r42314 にさらに追加して、テストが NoMemoryError になった時の ps の表示オプションを追加/変更しています。 [ruby-dev:47559] [Bug #8711]

mrkn:r42317 2013-08-02 02:33:29 +0900

r42311 で追加した数値リテラルの r と i の suffix 追加について NEWS ファイルに追記しています。

eregon:r42318 2013-08-02 05:46:01 +0900

r42317 の NEWS ファイルの記述の typo 修正。

akr:r42319 2013-08-02 07:49:12 +0900

bignum.c の big2str_orig() の引数から len を削除しています。元々未初期化で渡して、ローカル変数的にしか使ってなかったみたいですね。

drbrain:r42320 2013-08-02 09:14:58 +0900

doc/syntax/refinements.rdoc の using による Refinements の影響のスコープの解説を修正しています。クラスやモジュールのスコープでは activate できないって書いてあるような気がしますけど、Module#using は r41261 で復活してたんではないんでしたっけ?

naruse:r42321 2013-08-02 10:15:29 +0900

test/rubygems/test_gem_commands_uninstall_command.rb で Windows で警告メッセージが出るため失敗していたテストを修正しています。

naruse:r42322 2013-08-02 10:15:32 +0900

test/rubygems/test_gem_ext_builder.rb で RubyGems の拡張ライブラリビルドのテストで nmake が意図した出力をしないので、nmake で実行した時には assertion を実行しないようにしています。
このテストの失敗は 2.0.0 のブランチでも RubyGems 2.0.6 で起きてて、こちらの Github の issue で調整中です。 nmake が使える人はみてみてください。 https://github.com/rubygems/rubygems/issues/609

charliesome:r42323 2013-08-02 10:40:27 +0900

マイナス符号付きの数値リテラルのパース時の処理にオブジェクトの型をチェックしていたところに T_RATIONAL と T_COMPLEX を追加しています。 suffix 追加に伴ないこれらの型のオブジェクトが渡ってくることがありえるようになったため。 [ruby-core:56316] [Bug #8717]

akr:r42324 2013-08-02 12:28:33 +0900

bary_mul() で x と y で x のほうを小さい数にするようにひっくり返して再帰呼び出しするようにしています。 [ruby-dev:47565] [Bug #8719]

akr:r42325 2013-08-02 18:36:23 +0900

桁の多い Bignum の文字列化 big2str_karatsuba() で一回の再帰呼び出し内でできるだけ桁を処理してネストを軽減するようにする最適化だそうです。 そしてさり気に rb_big2ulong_pack() に deprecated というコメントを付けています。

nobu:r42329 2013-08-02 23:10:51 +0900

bignum.c の rb_cstr_to_inum() の未使用の変数を除去。

nobu:r42330 2013-08-02 23:13:20 +0900

r42311 で数値リテラルの suffix を追加したのに対応して拡張ライブラリ ripper でもシンボルを追加しています。

nobu:r42331 2013-08-02 23:14:18 +0900

parse.y に数値リテラル用のノードを追加してマイナス符号の規則をまとめるリファクタリング

nobu:r42332 2013-08-02 23:14:55 +0900

r42311 の変更では 1.0000000000000001r のように Float で表現できない精度の小数点表記に r の suffix をつけて Rational にしても、一旦浮動小数点数にしてから Float#to_r で Rational 化していたので、表記上の数値から変化してしまう可能性があったので、表記のとおりの精度を保って Rational 化するようにしています。

nobu:r42333 2013-08-02 23:24:17 +0900

parse.y で 拡張ライブラリ ripper 用の ripper_validate_object() でも新規にリテラルが取りうるオブジェクトの種別に T_RATIONAL と T_COMPLEX を追加しています。

nobu:r42334 2013-08-02 23:48:55 +0900

r42332 で r つきリテラルの精度を改善したのですが、文字列を切り出してから小数点の位置を見付けて計算していたのを、1文字ごとに計算するようにする最適化のようです。

akr:r42335 2013-08-02 23:53:22 +0900

bignum.c の power_cache_get_power() で結果の Bignum のサイズ調整を bigtrunc() で行なうようにするリファクタリングと、big2str_karatsuba() で 0埋めする桁の長さの計算間違いを修正しています。

glass:r42336 2013-08-02 23:56:39 +0900

Array#zip でブロックパラメータが2つ以上ある時の呼び出しで、中間データに配列オブジェクトを要素数ぶん毎回確保していたのを、バッファを用意して rb_yield_values2() を使うようにする最適化。

usa:r42337 2013-08-02 23:58:11 +0900

メソッドを定義する def 文はこれまで nil を返していましたが、定義したメソッド名の Symbol オブジェクトが返るように変更されました。 [ruby-dev:42151] [Feature #3753]

glass:r42338 2013-08-03 00:13:42 +0900

NEWS ファイルに IO#seek の引数に指定できる定数 SEEK_DATA, SEEK_HOLE を追加したことを追記しています。

svn:r42339 2013-08-03 00:13:47 +0900

version.h の日付更新。

*1:プログラムのメモリ上の配置位置をランダム化する OS の仕組み。特定のアドレスへのジャンプや書き換えなどのセキュリティ上の攻撃などを狙いにくくするなどの脆弱性対策として行なわれる