2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

php-master-changes 2018-08-23

Posted at

2018-08-23

dstogov: Replace zend_class_entry->traits by persistent zend_class_entry->trait_names.

  • https://github.com/php/php-src/commit/67397970b25d03254f000c36a73204720475b324
  • trait 実装のリファクタリング
  • trait の最初の実装時に入ったオペコード ZEND_ADD_TRAIT と ZEND_BIND_TRAITS にサヨナラ
  • trait は class と同様 zend_class_entry で管理されている
  • ZEND_ADD_TRAIT は use に対応し、trait のクラスエントリをフェッチした後、各クラスのクラスエントリが持つ「使っている trait のクラスエントリリスト」へ追加するような処理
  • ZEND_BIND_TRAITS はそのリストにもとづき、クラス定義内へ実際に trait の実装をまとめて導入していく処理
  • 今回の修正により、「使っている trait のクラスエントリリスト」を廃止、かわりに「使っている trait の名前(zend_class_name)リスト」を導入
  • ZEND_ADD_TRAIT でやっていたのに相当する処理は、use のコンパイル時 AST から trait 名を取り出すのみに(クラスエントリのフェッチを行わない)
  • ZEND_BIND_TRAITS でやっていたのに相当する処理は ZEND_DECLARE_*CLASS へ移動し、trait のクラスエントリのフェッチもバインド時に trait の名前リストから行う

cmb69: Simplify regression test

dstogov: Keep information about unresolved interfaces in zend_class_entry->interface_names.

  • https://github.com/php/php-src/commit/d140df58e6152037e7e3a3a0b119eae4970dd77e
  • ZEND_ADD_INTERFACE と ZEND_VERIFY_ABSTRACT_CLASS にサヨナラして interface の実装を ZEND_DECLARE_*CLASS へ移動
  • 構造的に trait と似たような部分はある
  • こちらはクラスエントリリストを名前リストに置き換えただけでなく、名前リストからのフェッチが済んだ後は、フェッチ後の interface のクラスエントリリストを同じ領域へ保存、という作りになっている
  • たとえば継承時はこのクラスエントリリストがそのまま使われる
2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?