php-master-changes 2018-08-17

出社する前までに出そうとすると、休日の扱いに困るということに気付くなど

# 2018-08-17
## laruence: Fixed bug [#76752](https://bugs.php.net/bug.php?id=76752) (Crash in ZEND_COALESCE_SPEC_TMP_HANDLER - assertion in _get_zval_ptr_tmp failed).
- https://github.com/php/php-src/commit/fd463a9a6078074f8f648982b42bdd14423fb614
- ?? と参照を使う一部コードが PHP7.3 でクラッシュする問題の修正
- 元々 ZEND_COALESCE のオペコードハンドラが ZEND_COALESCE_SPEC_TMP_HANDLER と ZEND_COALESCE_SPEC_VAR_HANDLER で別に[特化](https://nikic.github.io/2017/04/14/PHP-7-Virtual-machine.html#specialization)されていた
- TMP と VAR の違いは参照を持てるかどうか
- ZEND_COALESCE_SPEC_TMP_HANDLER に振り分けられたにもかかわらずオペランドが参照を持つケースがあった
- ZEND_COALESCE_SPEC_TMPVAR_HANDLER で TMP/VAR を区別しない特化ハンドラを持つことで解決

## laruence: Added a note
- https://github.com/php/php-src/commit/4ab25235e5b478e60d9951750fed9475a0e2b475
- ↑の修正箇所近辺へコメントの追加

## laruence: Fixed bug [#76754](https://bugs.php.net/bug.php?id=76754) (parent private constant in extends class memory leak)
- https://github.com/php/php-src/commit/04c4854fdfbc11b2b6a2cf1c8045f2efcd5dcdcc
- 親クラスがプライベートな定数を持っていて、自身は定数を持っていないようなクラスを定義した際にメモリリークする問題の修正
- [zval](http://www.phpinternalsbook-ja.com/zvals/basic_structure.html) にはクラスの定義情報を保持する [zend_class_entry](http://www.phpinternalsbook-ja.com/classes_objects/simple_classes.html) というのが入ってる奴があって、リクエスト終了時などそのクラス情報の破棄時に destroy_zend_class() がデストラクタとして呼ばれる
- 各 zend_class_entry は自身の定数テーブルを持っている
- 元コードでは destroy_zend_class() で定数テーブルに要素が見つかる場合のみ定数テーブルを破棄する作りだったのが、常に定数テーブルを破棄するよう修正された
- 一方、バグ報告者の [twose](https://github.com/twose) は、自身で[別の修正](https://github.com/php/php-src/pull/3447)を送ってもいて、あわせて見ると問題の正体がわかりやすい
    - この twose という人は [swoole](https://github.com/swoole/swoole-src) の中の人
- 定数テーブルはクラス情報の初期生成時、データ構造の仮初期化のみが行われ、動的なメモリ領域の確保は実際に定数定義をそのクラスへ導入しようとするまで行われない
- 継承で子クラスのクラス情報を生成する際、親クラスの定数テーブル内容を引き継いで子クラス用の定数テーブルを生成する
- 現状実装はこのとき単に親クラスでの定数テーブルの個数を見て、あれば定数テーブルの枠（＝動的なメモリ領域）の確保を行う、というもの
- 本来は PHP7.1 で導入されたアクセス修飾子を見て、親の private な定数は数に含めない、という処理を行う必要がある
    - なお定数テーブルの枠は確保するものの、親クラスの定数テーブル内容を持ってくるデータ引き継ぎ処理の方はちゃんと private かどうかを見ているので、メモリリークはしても機能としては動いてた、という奴
- この対応によって、このテストケースでは子クラスの定数定義数が 0 になり、動的なメモリ領域確保が行われず、解放も不要になるので、クラス情報の破棄処理は laurence の修正を入れる前の「要素が見つかる場合のみ定数テーブルを破棄」のままでよいということになる
- 余分なメモリ確保を行わなくなる点では twose 案の方がよさそうな気がする

## laruence: Update NEWS
- https://github.com/php/php-src/commit/acd4264f7b9169038cd3f320169c1ec569c3e5ba
- ↑のバグ修正を NEWS へ追記

## laruence: Fixed bug [#76755](https://bugs.php.net/bug.php?id=76755) (setcookie does not accept "double" type for expire time)
- https://github.com/php/php-src/commit/d61ff37f45de803ec45dd7f722bf4b51c3b0be02
- setcookie() の expire が PHP7.3 で float を受け付けなくなっていた問題の修正
- Z_LVAL_P() は zval を整数と見なしてとってくるだけ、修正後の zval_get_long() は整数じゃないのが詰まっていても変換して整数にしてとってきてくれる奴

## laruence: Micro optimization & fixed invalid key handling
- https://github.com/php/php-src/commit/751bbaa41fd64cf39554d75b8b8f02629f90de78
- setcookie() まわりの無効なキーの扱い修正と局所最適化（変数 1 つ削った箇所のことかな）

## laruence: Cheaper checking
- https://github.com/php/php-src/commit/0a16af043e24a2c55d9bc4f7bf552dee96fcedcc
- SameSiteCookie 対応で setcookie() がオプション配列を受け取った際、続けて無駄な引数が来ていないかのチェック処理を修正

## laruence: Fixed same bug [#76755](https://bugs.php.net/bug.php?id=76755) in setrawcookie
- https://github.com/php/php-src/commit/5c1a2d8375c7edcb4716d2de6c51cd3b59f0ae7b
- setrawcookie() の方も expire が float を受け付けなくなっていた問題の修正

## andrewnester: DOMDocument::formatOutput attribute sometimes ignored
- https://github.com/php/php-src/commit/2072d377d3f0380f1f77768746d196106673db8d
- ext/dom で DOMDocument::formatOutput が失敗したりする問題の修正
- [14 日に revert した奴](https://qiita.com/sj-i/items/5961d7540e2110a43483#weltling-followup-fix-for-ef9ed19e-see-also-bug-76738)の入れなおし

## laruence: Fixed build
- https://github.com/php/php-src/commit/10d724d82d6471a7808b46c186b5b8ded68e79d5
- ↑関連でext/dom の修正入れ直し

## weltling: Followup fix for ef9ed19e, see also bug #76738
- https://github.com/php/php-src/commit/ddd73d4fa8155f8fa8d0d29082136d5719afd1f4
- ↑関連でext/dom の修正入れ直し

## weltling: Cleanup
- https://github.com/php/php-src/commit/0c2327b4723c4b05cafea16140fe2c5c3de73599
- ↑関連でext/dom の修正入れ直し

## cmb69: [ci skip] Update NEWS
- https://github.com/php/php-src/commit/a097f926c8849ca541e989cac27762c92e6797ac
- alpha3 で [#76285](https://bugs.php.net/bug.php?id=76285) を直したと思ったら [#76738](https://bugs.php.net/bug.php?id=76738) が出ていたのでbeta2でリバート、なんだかだで直ったよ、というのを NEWS へ追記

## weltling: Update binary SDK version for AppVeyor
- https://github.com/php/php-src/commit/837ed71c65eaafc339f718cb02e7c0fe065e98d9
- AppVeyer のバイナリ SDK バージョンを更新

## weltling: Fix memory leak
- https://github.com/php/php-src/commit/0414fff205bad752573a4b2176d9f08afd096196
- ext/dom のメモリリークを修正