@@ -1746,6 +1746,27 @@ ZEND_API inheritance_status zend_verify_property_hook_variance(const zend_proper
17461746 return zend_perform_covariant_type_check (ce , prop_info -> type , ce , value_arg_info -> type );
17471747}
17481748
1749+ #ifdef ZEND_OPCACHE_SHM_REATTACHMENT
1750+ /* Hooked properties set get_iterator, which causes issues on for shm
1751+ * reattachment. Avoid early-binding on Windows and set get_iterator during
1752+ * inheritance. The linked class may not use inheritance cache. */
1753+ static void zend_link_hooked_object_iter (zend_class_entry * ce ) {
1754+ if (!ce -> get_iterator && ce -> num_hooked_props ) {
1755+ ce -> get_iterator = zend_hooked_object_get_iterator ;
1756+ ce -> ce_flags &= ~ZEND_ACC_CACHEABLE ;
1757+ if (CG (current_linking_class ) == ce ) {
1758+ # if ZEND_DEBUG
1759+ /* This check is executed before inheriting any elements that can
1760+ * track dependencies. */
1761+ HashTable * ht = (HashTable * )ce -> inheritance_cache ;
1762+ ZEND_ASSERT (!ht );
1763+ # endif
1764+ CG (current_linking_class ) = NULL ;
1765+ }
1766+ }
1767+ }
1768+ #endif
1769+
17491770ZEND_API void zend_do_inheritance_ex (zend_class_entry * ce , zend_class_entry * parent_ce , bool checked ) /* {{{ */
17501771{
17511772 zend_property_info * property_info ;
@@ -3405,7 +3426,7 @@ static zend_class_entry *zend_lazy_class_load(zend_class_entry *pce)
34053426 return ce ;
34063427}
34073428
3408- #ifndef ZEND_WIN32
3429+ #ifndef ZEND_OPCACHE_SHM_REATTACHMENT
34093430# define UPDATE_IS_CACHEABLE (ce ) do { \
34103431 if ((ce)->type == ZEND_USER_CLASS) { \
34113432 is_cacheable &= (ce)->ce_flags; \
@@ -3550,6 +3571,10 @@ ZEND_API zend_class_entry *zend_do_link_class(zend_class_entry *ce, zend_string
35503571 zend_enum_register_funcs (ce );
35513572 }
35523573
3574+ #ifdef ZEND_OPCACHE_SHM_REATTACHMENT
3575+ zend_link_hooked_object_iter (ce );
3576+ #endif
3577+
35533578 if (parent ) {
35543579 if (!(parent -> ce_flags & ZEND_ACC_LINKED )) {
35553580 add_dependency_obligation (ce , parent );
@@ -3838,6 +3863,10 @@ ZEND_API zend_class_entry *zend_try_early_bind(zend_class_entry *ce, zend_class_
38383863 zend_begin_record_errors ();
38393864 }
38403865
3866+ #ifdef ZEND_OPCACHE_SHM_REATTACHMENT
3867+ zend_link_hooked_object_iter (ce );
3868+ #endif
3869+
38413870 zend_do_inheritance_ex (ce , parent_ce , status == INHERITANCE_SUCCESS );
38423871 if (parent_ce && parent_ce -> num_interfaces ) {
38433872 zend_do_inherit_interfaces (ce , parent_ce );
0 commit comments