今日は内部クラスの静的プロパティの扱い修正、run_time_cache をヒープで持つ部分や内部フラグのリファクタ、ext/mbstringのバグ修正があった!
2018-10-02
dstogov: Allocate only necessary space for static properties of internal classes in ZTS mode.
- https://github.com/php/php-src/commit/a2e83346134c7a197492cb520ad440e0e1aff463
- ZTS 版で内部クラスの静的プロパティについて、必要な量のメモリのみ確保するよう修正
dstogov: Rename ZEND_ACC_NO_RT_ARENA into ZEND_ACC_HEAP_RT_CACHE and use it for pseudo-main op_arrays.
- https://github.com/php/php-src/commit/26065662692f2ce7d1b7ebd1ab6c1c96d177a067
- ZEND_ACC_NO_RT_ARENA を ZEND_ACC_HEAP_RT_CACHE と改名し、クロージャだけでなくトップレベル main の擬似 op_array でも使うようリファクタ
- op_array は run_time_cache を持つ
- 基本的に同じクロージャーは同じ Arena の領域を run_time_cache に使うが、
\Closure::call()
などでスコープを変えて使う際には Arena ではなくヒープへ別途確保、という修正が2015年にあって、この際ヒープへ run_time_cache が確保されてることを示すよう導入されたのが ZEND_ACC_NO_RT_ARENA
dstogov: Make ZEND_ACC_IMMUTABLE and ZEND_ACC_HAS_TYPE_HINTS to be common (for functions and classes)
- https://github.com/php/php-src/commit/f52158681422c15a33d43f31b8dad5d3a5d80bc7
- ZEND_ACC_IMMUTABLE と ZEND_ACC_HAS_TYPE_HINTS のフラグを関数とクラスで共通のフラグとしてヘッダでの定義位置で明示
dstogov: typo
nikic: Don't fall back to vtbl_pass if no matching vtbl found
- https://github.com/php/php-src/commit/9cfd8f43c2a6386bcf1567a5c0de47dcb182b109
- [7.3~]
- ext/mbstring で vtbl_pass へのフォールバックを廃止
- mbstring の文字コード変換は、 mbfl_convert_vtbl という、各エンコーディング間の変換処理を持つ C 言語構造体というか関数テーブルというか C 言語でオブジェクト指向!みたいなノリのブツがあり、入力と出力のエンコーディングに応じ適切なものを使う
- vtbl_pass は素通し用で、適切な変換方法が見つからない場合に使われていたが、これをやめてエラーとするよう修正、かな
- 変換元と変換先が同じ場合には vtbl_pass が使われる
- これ BC break ではないのだろうか?という素朴な疑問
- ↓のバグ修正の一環で「わかりづらいわ!」となって直したっぽいかな
nikic: Fixed bug #76958
- https://github.com/php/php-src/commit/26f82a77061b7389c4507a2277643139339b430b
- [7.3~]
- ext/mbstring で UTF7-IMAP を変換元/変換先とする mb_convert_encoding() が動かない問題の修正
- 当初適切な vtbl を引く処理は配列に一通りの vtbl を詰めて線形探索する、という処理だったが、後にテーブルは分割され、更に vtbl が mbfl_encoding へ埋め込みになって、デカい表を使わなくなった
- が、このタイミングで vtbl_utf7imap_wchar への埋め込みが漏れていたために起きた問題