電柱商事

CHANGELOG v0.31.0

2019/09/23

[原文]

言語仕様変更

変数に拘束されないブロック引数の型制約が & : T -> U の形式で可能に(#8117

マクロ

@type がマクロ内で実際の型を返すよう保証されるようになった(#8149

標準ライブラリ

[破壊的変更] 標準ライブラリから Markdown を除去(#8115

[破壊的変更] OptionParser#parse! は廃止予定となり、代わりに OptionParser#parse を使用するように(#8041

何箇所かのサンプルコードを修正(#8194

数値

[破壊的変更] オーバーフローの発生が標準動作になった(#8170

[破壊的変更] / が全ての型で算術除算結果を返すようになった(#8120

左辺が整数型であっても 3 / 2 は整数型の 1 ではなく浮動小数側の 1.5 が返される。以前の動作は // で使用可能。

BigDecimal#**BigRational#** を追加(#7860

Number#round(digits, base) メソッドでオーバーフローの発生を回避(#8204

Int#divisible_by? の挙動が明確になるようリファクタ(#8045

テキスト

[性能改善] ASCII文字しか含まない場合の String#lchop? について小規模な最適化(#8052

コレクション

[性能改善] 要素数が少ない場合の配列処理を最適化(#8048

[性能改善] Array#* を最適化(#8087

[性能改善] ハッシュにオープンアドレス法を採用(#8017#8182

[性能改善] Hash#to_aHash#keysHash#values の最適化(#8042

[性能改善] Hash#put を追加し、Set#add? を最適化(#8116

Slice#== の挙動を修正し, Slice#<=> を追加(#8074

同じインデックスの要素同士が別オブジェクトであっても同値とみなせる場合には、slice1 == slice2 が true を返すようになった。

Iterator のドキュメントに冪等性とめそっどの先行評価についての記述を追加(#8053

Set#+ を追加(#8121

Hash の内部で整数除算が必要な場所で / ではなく // を使用するよう修正(#8104

直列化

[破壊的変更] XML::Type の名称を XML::Node::Type へ変更し、XML::Reader::Type を導入(#8134

JSON と YAML における NamedTuple の nilable なフィールドのパースを修正(#8109

YAML でユニコード文字をそのまま使用するよう修正(#8132

セクションを持たない INI ファイルの生成を修正(#8106

ファイル

[性能改善] 可能な場合に結合後の長さを事前に計算しておくように Path#join を最適化(#8078

[性能改善] 単独のパーツ同士を結合する場合の Path#join の挙動を最適化(#8082

[性能改善] Dir.glob を最適化(#8081

File.basename の挙動を修正(#8119

拡張子(第二引数)が指定された際、拡張子を除いたファイル名が1文字(a.txt とか)だった場合に、拡張子を除去できていなかった。

Path.expand における不要な Path.home を除去(#8128

STORED 時の Zip::Writer の挙動を修正(#8142

Deflate 圧縮を行わず、データをそのままZipファイルに追加する STORED 方式を使用した際に、圧縮済みバイト数と非圧縮バイト数のカウントが正しくなるように修正された模様。

ARGF が読み込みバイト数が 0 であることをチェックするよう修正(#8177

読み込んでいるファイルの残りデータサイズが read バイト数より少ない場合におかしな挙動をしていたのが修正された。

ネットワーク

[破壊的変更] HTTP::Server::Response#respond_with_error#respond_with_status に置き換え(#6988

[破壊的変更] Handle too long URIs and too large header fields in HTTP::Request.from_io が非常に長いURIや非常に大きなヘッダフィールドを扱えるようにして、HTTP::Request::BadRequest を廃止(#8013

ssl_accept が失敗した際の SSL_new のメモリリークを修正(#8088

WebSocket が IPv6 接続する際のホスト処理を修正(#8066

uri.host は IPv6 アドレス指定時のブラケットがついたまま([::1])返されるため、ブラケットを除去(::1)してくれる uri.hostname を使うようになっている。

URI#query_params メソッドを追加 (#8090

URI#resolveURI#relativize を追加(#7716

HTTP::Cookies#clear#delete#size の各メソッドを追加(#8107

http/server_spec をリファクタ(#8056

UDP の spec をランダムばポートを使用するようにリファクタ(#8139

並行処理

マルチスレッド対応(#8112

ソースコードを -Dpreview_mt 付きでコンパイルするとマルチスレッドモードを利用可能。(【参照】Parallelism in Crystal

マルチスレッドモードでのファイバスタックの解放を遅延させるようにした(#8138

「マルチスレッドモードだと、ファイバスタックの再利用が現行ファイバの終了前に行われてしまう恐れがあるため」とのこと。

Crystal::Scheduler.init_workers をワーカの準備が完了するまでブロックするようにした(#8145

Crystal::ThreadLocalValue をスレッドセーフにした(#8168

スレッドローカルなデータ構造に exec_recursive を使用するようにした(#8146

Channel 関係のいくつかのメソドに返り値の型を明示した(#8161

イベントループ実行専用のファイバを無くした(#8173

スレッドリンクリストの破損を修正(#8196

新しいスレッドがごく短時間で終了した際に、そのスレッドがリストに追加される前に削除処理が走ってしまうことがあってGCのエラーの元になっていたのが修正された、とのこと。

Win32 環境でファイバが実装されるまで、同環境でコンパイルする際の回避策を追加(#8195

システム

Process.times の制度を向上 (#8097

スペック

[破壊的変更] focus のサポートを追加. (#8125#8178#8208

テストコードの discribecontextit に対して focus: true を指定できるようになった。

いずれかの要素にこの指定がある場合、focus: true 指定されたテストだけが実行され、出力に「Only running focus: true」というメッセージが追加される。

コンパイラ

内部関数宣言時のICEを修正(#8076

いくつかの関数呼び出しで name_location が欠けていたのを修正(#8192

コンパイラのワーニング出力をデフォルド動作にした(#8171

メソッド宣言と実際の返り値の型に齟齬がある場合のエラーメッセージを分かりやすく(#8203

for 文のエラーをわかりやすく(#7641

マクロの for に未対応の型を指定した際のメッセージに、最近追加された型が載っていなかった。

セマンティクス

抽象メソッド宣言時のジェネリック側の継承関係チェックを修正(#8098

Proc 型の型引数の仮想化が漏れていたのを修正(#8159

例外処理の後で変数の型が正しくなくなるのを修正(#8037

yield ノードが型を持たない場合の挙動を修正(#8101

参照型の offsetof の挙動を修正(#8137

クロージャ内の rescue で例外を変数で受けられるよう修正(#8143

クラス変数と定数の初期化をリファクタ(#8067#8091

クラス変数や定数が自身で初期化しようとした際、実行時エラーを出すようにした(#8172

class Foo
  @@bar : String = init

  def self.init
    @@bar = "a"
  end
end

みたいなのは、@@bar@@bar で初期化することになるため、これまではコンパイル時にクラッシュしていたが、今バージョンからそのことを実行時にエラーメッセージで指摘してくれるようになった。

ツール

ドキュメント生成

別クラスのコンストラクタへのリンクを修正(#8110

同じメソッドの以前の定義時や、継承元クラスの定義時に指定されたドキュメントを再利用できるようになった(#6989

ドキュメントコメントのないメソッド定義について、継承元の同名メソッドの定義時にドキュメントコメントがある場合、それより前の同名メソッドの定義時にドキュメントコメントがある場合などにそれらのドキュメントが再利用されるようになった。

# :ionherit: を指定して、そうしたドキュメント内容の再利用を明示することもできる模様。

# :ionherit: を使用せず、継承元の親クラスから自動的に引っ張ってこられた場合は、生成されたドキュメントにその旨記載される。

その他

CI が 0.30.1 を使用するようアップデート(#8032

LLVM 8.0 に Linux の公式パッケージを使用するようにした(#8155

ビルドプロセス中の依存関係をアップデート(#8205

コードのお掃除(#8033