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)
PartialComparable
Crypto::Bcrypt::Password#==
HTTP::Server::Response#respond_with_error
JSON::PullParser::Kind#==
Symbol#==(JSON::PullParser::Kind)
JSON::Token#type
String#at
Time.new
Time.now
Time.utc_now
URI.escape
URI.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
の時とか。