CHANGELOG v0.33.0
2020/02/14
[原文]
言語仕様変更
select 文で timeout を指定可能に(#8506、#8705)
マクロ
ジェネリック型の TypeNode の名前を、型引数の有無を指定して取得できる TypeNode#name(generic_args : BoolLiteral) を追加(#8483)
generic_args に false を指定すると、Foo(T) 型から Foo を取得できる。
標準ライブラリ
[破壊的変更] 廃止予定だったいくつかのメソッドやモジュールが取り除かれた(#8646、#8596)
PartialComparableCrypto::Bcrypt::Password#==HTTP::Server::Response#respond_with_errorJSON::PullParser::Kind#==Symbol#==(JSON::PullParser::Kind)JSON::Token#typeString#atTime.newTime.nowTime.utc_nowURI.escapeURI.unescape
ドキュメントをブラッシュアップ(#8606、#8784)
Object#in? を追加(#8720、#8723)
シンボルから列挙型を生成できるようになった(#8634)
可変長引数の次の要素を取得できる VaList#next を追加(#8535、#8688)
ARGF の実装をリファクタ(#8593)
ダム端末上での Colorize の spec を修正(#8673)
Win32 上でのいくつかの spec を修正(#8670)
数値
BigInt#unsafe_shr を追加(#8763)
Int 型内部で階乗の計算に使用されていたが、BigInt 型に定義されていなかったせいで、
2 ** Bigint.new(10)
みたいな処理がエラーになっていた。
Float#fdiv がバイナリプリミティブを使用するようリファクタ(#8662)
テキスト
String#sub(Hash) 時に不要な \u0000 が追加されてしまうのを修正(#8644)
コレクション
Enumerable#zip をユニオン型でも動作するよう修正(#8621)
Hash の initial_capacity に関連したドキュメントを修正(#8569)
直列化
JSON をユニオン型に解釈する際の挙動を改善(#8689)
libxml2 のエラーに関する spec で正しいメッセージが出力されるよう修正(#8699)
JSON::PullParser のオーバーフロー処理を修正(#8698)
配列やハッシュのような構造を持たない値に対する JSON::Any#dig? と YAML::Any#dig? の挙動を修正(#8745)
時刻/時間
Time#shift で日付を跨ぐ場合のタイムゾーンオフセット処理を修正(#8742)
ファイル
[破壊的変更] File::Info#owner と File::Info#group は廃止予定となり、 owner_id と group_id の利用を推奨(#8007)
Path.new が第一引数として Path 型の値を受け取れるように(#8753)
File.size と File.info が引数として Path 型の値を取れるように(#8625)
ENV["HOME"] が指定されていない場合の Path の挙動を修正(#8667)
Dir.mkdir_p が Win32 環境でも動作するように Path#each_parent を使用するように変更(#8668)
IO::MultiWriter の spec で使用したファイルを読み込んだり削除したりする前にファイルを閉じるよう修正(#8674)
ネットワーク
不正な libevent の関数呼び出しと、稀にクローズされたIOに対する読み込み/書き出し処理が再開される場合の処理を修正(#8707、#8733)
マルチスレッドでの動作が可能になったことで、あるスレッドが IO でデータを読み書きしようとした際、その IO がクローズされていないことを確認した後でも、実際にデータを読み込む前に別スレッドがその IO をクローズできてしまう、といった事象が起こる模様。
SSL コネクションを切断した際に、想定外の EOF が発生していたのを修正(#8540)
HTTP::Cookie が max-age の値として Int64 型を使用できるよう修正(#8759)
getaddrinfo が失敗した際のエラ〜メッセージを改善#8498)
ドキュメントには記載されないが、IO::SysCall#wait_readable と IO::SysCall#wait_writable がパブリックメソッドになった(#7366)
StaticFileHandler が Path を使用するよう修正(#8672)
spec 中で日付が固定で記述されていたのを修正(#8640)
有効期限が切れいていないことのチェック対象が 2020/01/01 00:00:00 固定だった模様。
この変更で常に実行時の2年後の 01/01 00:00:00 が設定されるようになった。
TCPServer の spec 内の汎用でないエラーメッセージを削除(#8702)
暗号
Crypto::Bcrypt::Password が不正なハッシュ値をチェックできるようになった(#6467)
Random::Secure のドキュンとを改善(#8484)
並行/並列動作
ブロック内で例外が発生した場合の Future(Nil) の挙動を修正(#8650)
マルチスレッド動作時の IO のクローズ処理を改善(#8733)
マルチスレッド動作時の標準的な spec をいくつか修正(#8592、#8643、#8724、#8761)
Fiber にドキュメントを追加(#8739)
システム
Win32 環境でも System モジュールが標準で require されるようになった(#8661)
__crystal_sigfault_handler で発生した例外を処理できるようになった(#8743)
実行時
LibUnwind::Exception がアトミックでないため、例外オブジェクトが予期せずGCに回収されてしまう場合があったのを修正(#8728)
DWARF 環境のバックトレースでステートメントでない行の処理を修正(#8499)
エラー箇所の行番号が予期せず 0 となってしまう場合があった。
トップレベルでの例外処理を改善(#8735、#8791)
標準入出力用の IO オブジェクト生成時にノンブロッキングモードを使うかどうかをチェックるすように(#8787)
これまで、標準入出力先が TTY でない場合(ファイルへのリダイレクトとか)については、blocking: true が設定されていた。
ファイルへのリダイレクトなどについては良い方法だが、標準入力をパイプ経由で受けるような場合で並列/並行動作してると、1つのファイバが IO をブロックした際に全てのファイバの動作が止まってしまう状態だった。
Crystal::System.print_error で printf と同様のフォーマットを使用できるように(#8786)
Spec
[破壊的変更] 廃止予定になっていた assert メソッドが取り除かれた(#8767)
Spec::JUnitFormatter のオプションと出力内容が改善された(#8599、#8692)
コンパイラ
[破壊的変更] 廃止予定だったカンマ区切りによる列挙型定義が取り除かれた(#8657)
併せてすでに不要となっているコードなどのせいが行われている。
[破壊的変更] 数値リテラルが不動小数点型であることを示す接尾辞として大文字の F32 や F64 は使えなくなった(#8782)
整数型リテラルの接尾辞 i や u では元々大文字は許可されていなかったので、それに合わせる形に変更された。
LLVM’s memset と memcpy を対象の環境(32bit/64bit)に応じて使い分けることでメモリの浪費を抑制(#8746)
注釈内に型を追加しようとした際に発生する内部コンパイラエラーを修正(#8628)
実際には使用されないブロック内での typeof を使用した際に発生する内部コンパイラエラーを修正(#8695)
コンパイル環境を識別する target triple が不正だった場合に発生する内部コンパイラエラーを修正(#8710)
マクロ内でメッセージが空の例外を発生させた際の内部コンパイラエラーを修正(#8654)
マクロ内で eenum を使用した際のパースエラーになっていたのを修正(#8760)
enum は予約後だけど、eenum とか eeenum とかなら使えるはず。
shard が標準ライブラリを上書きできるよう CRYSTAL_PATH の定義を変更(#8752)
shard に同名のファイルがあれば、標準添付ライブラリより先にヒットするようになっている。
言語仕様
Proc ポインタの処理に必要な仮想型が用意されていなかったのを修正(#8757)
全ての rescue 節が終端まで到達しない場合に、begin/rescue 後の変数の型が正しく判定されないのを修正(#8758)
rescue 節の中で break や raise 等が使用された結果、全ての rescue 節が NoReturn になってしまうような場合。
マクロに指定された可視性(public とか private とか)がマクロの展開結果にも伝搬するようになった(#8762、#8796)
private macro 内で定義された型やメソッドは、すべて private 扱いになる。
ツール
crystal init が . を扱えるようになった(#8681)
既存のディレクトリを初期化できる。
モジュール名とかはカレントディレクトリ名から生成してくれる模様。
フォーマッタ
ハッシュや配列のインデックス内にコメントを記述した場合のインデントがおかしかったのを修正(#8627)
Proc リテラルの最終行にコメントを記述した場合のインデントがおかしかったのを修正(#8778)
macro 文の後にコメントがあるとクラッシュしていたのを修正(#8697)
exp.! があるとクラッシュしていたのを修正(#8768)
不要なエスケープシーケンスを除去(#8619)
ドキュメント生成
[破壊的変更] コロンの無い ditto と nodoc は廃止予定になり、:ditto: と :nodoc: を推奨(#6362)
必要なければ docs/ ディレクトリを作成しないようにした(#8718)
crystal docs -f json の時とか。
電柱商事