@@ -1746,6 +1746,27 @@ ZEND_API inheritance_status zend_verify_property_hook_variance(const zend_proper
1746
1746
return zend_perform_covariant_type_check (ce , prop_info -> type , ce , value_arg_info -> type );
1747
1747
}
1748
1748
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
+
1749
1770
ZEND_API void zend_do_inheritance_ex (zend_class_entry * ce , zend_class_entry * parent_ce , bool checked ) /* {{{ */
1750
1771
{
1751
1772
zend_property_info * property_info ;
@@ -3405,7 +3426,7 @@ static zend_class_entry *zend_lazy_class_load(zend_class_entry *pce)
3405
3426
return ce ;
3406
3427
}
3407
3428
3408
- #ifndef ZEND_WIN32
3429
+ #ifndef ZEND_OPCACHE_SHM_REATTACHMENT
3409
3430
# define UPDATE_IS_CACHEABLE (ce ) do { \
3410
3431
if ((ce)->type == ZEND_USER_CLASS) { \
3411
3432
is_cacheable &= (ce)->ce_flags; \
@@ -3550,6 +3571,10 @@ ZEND_API zend_class_entry *zend_do_link_class(zend_class_entry *ce, zend_string
3550
3571
zend_enum_register_funcs (ce );
3551
3572
}
3552
3573
3574
+ #ifdef ZEND_OPCACHE_SHM_REATTACHMENT
3575
+ zend_link_hooked_object_iter (ce );
3576
+ #endif
3577
+
3553
3578
if (parent ) {
3554
3579
if (!(parent -> ce_flags & ZEND_ACC_LINKED )) {
3555
3580
add_dependency_obligation (ce , parent );
@@ -3838,6 +3863,10 @@ ZEND_API zend_class_entry *zend_try_early_bind(zend_class_entry *ce, zend_class_
3838
3863
zend_begin_record_errors ();
3839
3864
}
3840
3865
3866
+ #ifdef ZEND_OPCACHE_SHM_REATTACHMENT
3867
+ zend_link_hooked_object_iter (ce );
3868
+ #endif
3869
+
3841
3870
zend_do_inheritance_ex (ce , parent_ce , status == INHERITANCE_SUCCESS );
3842
3871
if (parent_ce && parent_ce -> num_interfaces ) {
3843
3872
zend_do_inherit_interfaces (ce , parent_ce );
0 commit comments