電柱商事

CHANGELOG v0.33.0

2020/02/14

[原文]

言語仕様変更

select 文で timeout を指定可能に(#8506#8705

マクロ

ジェネリック型の TypeNode の名前を、型引数の有無を指定して取得できる TypeNode#name(generic_args : BoolLiteral) を追加(#8483

generic_argsfalse を指定すると、Foo(T) 型から Foo を取得できる。

標準ライブラリ

[破壊的変更] 廃止予定だったいくつかのメソッドやモジュールが取り除かれた(#8646#8596

ドキュメントをブラッシュアップ(#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

Hashinitial_capacity に関連したドキュメントを修正(#8569

直列化

JSON をユニオン型に解釈する際の挙動を改善(#8689

libxml2 のエラーに関する spec で正しいメッセージが出力されるよう修正(#8699

JSON::PullParser のオーバーフロー処理を修正(#8698

配列やハッシュのような構造を持たない値に対する JSON::Any#dig?YAML::Any#dig? の挙動を修正(#8745

時刻/時間

Time#shift で日付を跨ぐ場合のタイムゾーンオフセット処理を修正(#8742

ファイル

[破壊的変更] File::Info#ownerFile::Info#group は廃止予定となり、 owner_idgroup_id の利用を推奨(#8007

Path.new が第一引数として Path 型の値を受け取れるように(#8753

File.sizeFile.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::Cookiemax-age の値として Int64 型を使用できるよう修正(#8759

getaddrinfo が失敗した際のエラ〜メッセージを改善#8498

ドキュメントには記載されないが、IO::SysCall#wait_readableIO::SysCall#wait_writable がパブリックメソッドになった(#7366

StaticFileHandlerPath を使用するよう修正(#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_errorprintf と同様のフォーマットを使用できるように(#8786

Spec

[破壊的変更] 廃止予定になっていた assert メソッドが取り除かれた(#8767

Spec::JUnitFormatter のオプションと出力内容が改善された(#8599#8692

コンパイラ

[破壊的変更] 廃止予定だったカンマ区切りによる列挙型定義が取り除かれた(#8657

併せてすでに不要となっているコードなどのせいが行われている。

[破壊的変更] 数値リテラルが不動小数点型であることを示す接尾辞として大文字の F32F64 は使えなくなった(#8782

整数型リテラルの接尾辞 iu では元々大文字は許可されていなかったので、それに合わせる形に変更された。

LLVM’s memsetmemcpy を対象の環境(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 節の中で breakraise 等が使用された結果、全ての rescue 節が NoReturn になってしまうような場合。

マクロに指定された可視性(public とか private とか)がマクロの展開結果にも伝搬するようになった(#8762#8796

private macro 内で定義された型やメソッドは、すべて private 扱いになる。

ツール

crystal init. を扱えるようになった(#8681

既存のディレクトリを初期化できる。

モジュール名とかはカレントディレクトリ名から生成してくれる模様。

フォーマッタ

ハッシュや配列のインデックス内にコメントを記述した場合のインデントがおかしかったのを修正(#8627

Proc リテラルの最終行にコメントを記述した場合のインデントがおかしかったのを修正(#8778

macro 文の後にコメントがあるとクラッシュしていたのを修正(#8697

exp.! があるとクラッシュしていたのを修正(#8768

不要なエスケープシーケンスを除去(#8619

ドキュメント生成

[破壊的変更] コロンの無い dittonodoc は廃止予定になり、:ditto::nodoc: を推奨(#6362

必要なければ docs/ ディレクトリを作成しないようにした(#8718

crystal docs -f json の時とか。

その他

CI の改善と整理(#8580#8597#8679#8779

GitHub Actions を使用した Windows 用 CI を追加(#8676

CircleCI を用いた Alpine 用 CI を追加 (#7420

Alpine 環境を使用した Docker イメージを追加(#8708

lld が提供されている場合は使用するよう Makefile を修正(Linux only)(#8641

インストールされた LLVM のバージョン判定スクリプトを簡素化(#8605

CircleCI にテストサマリを追加(#8617

Win32 環境で必要な標準ライブラリの spec を識別するためのヘルパスクリプトを追加(#8664