@@ -1724,17 +1724,21 @@ static void do_inherit_property(zend_property_info *parent_info, zend_string *ke
1724
1724
}
1725
1725
/* }}} */
1726
1726
1727
- static inline void do_implement_interface (zend_class_entry * ce , zend_class_entry * iface ) /* {{{ */
1727
+ static inline void do_implement_interface_ex (zend_class_entry * ce , zend_class_entry * inherited_face , zend_class_entry * base_iface )
1728
1728
{
1729
- if (!(ce -> ce_flags & ZEND_ACC_INTERFACE ) && iface -> interface_gets_implemented && iface -> interface_gets_implemented (iface , ce ) == FAILURE ) {
1730
- zend_error_noreturn (E_CORE_ERROR , "%s %s could not implement interface %s" , zend_get_object_type_uc (ce ), ZSTR_VAL (ce -> name ), ZSTR_VAL (iface -> name ));
1729
+ if (!(ce -> ce_flags & ZEND_ACC_INTERFACE ) && inherited_face -> interface_gets_implemented && inherited_face -> interface_gets_implemented (base_iface , ce ) == FAILURE ) {
1730
+ zend_error_noreturn (E_CORE_ERROR , "%s %s could not implement interface %s" , zend_get_object_type_uc (ce ), ZSTR_VAL (ce -> name ), ZSTR_VAL (base_iface -> name ));
1731
1731
}
1732
1732
/* This should be prevented by the class lookup logic. */
1733
- ZEND_ASSERT (ce != iface );
1733
+ ZEND_ASSERT (ce != base_iface );
1734
+ }
1735
+
1736
+ static inline void do_implement_interface (zend_class_entry * ce , zend_class_entry * iface )
1737
+ {
1738
+ do_implement_interface_ex (ce , iface , iface );
1734
1739
}
1735
- /* }}} */
1736
1740
1737
- static void zend_do_inherit_interfaces (zend_class_entry * ce , const zend_class_entry * iface ) /* {{{ */
1741
+ static void zend_do_inherit_interfaces (zend_class_entry * ce , zend_class_entry * iface ) /* {{{ */
1738
1742
{
1739
1743
/* expects interface to be contained in ce's interface list already */
1740
1744
uint32_t i , ce_num , if_num = iface -> num_interfaces ;
@@ -1764,7 +1768,7 @@ static void zend_do_inherit_interfaces(zend_class_entry *ce, const zend_class_en
1764
1768
1765
1769
/* and now call the implementing handlers */
1766
1770
while (ce_num < ce -> num_interfaces ) {
1767
- do_implement_interface (ce , ce -> interfaces [ce_num ++ ]);
1771
+ do_implement_interface_ex (ce , ce -> interfaces [ce_num ++ ], iface );
1768
1772
}
1769
1773
}
1770
1774
/* }}} */
@@ -2406,6 +2410,10 @@ static void do_interface_implementation(zend_class_entry *ce, zend_class_entry *
2406
2410
zend_class_constant * c ;
2407
2411
uint32_t flags = ZEND_INHERITANCE_CHECK_PROTO | ZEND_INHERITANCE_CHECK_VISIBILITY ;
2408
2412
2413
+ if (iface -> num_interfaces ) {
2414
+ zend_do_inherit_interfaces (ce , iface );
2415
+ }
2416
+
2409
2417
if (!(ce -> ce_flags & ZEND_ACC_INTERFACE )) {
2410
2418
/* We are not setting the prototype of overridden interface methods because of abstract
2411
2419
* constructors. See Zend/tests/interface_constructor_prototype_001.phpt. */
@@ -2525,9 +2533,6 @@ static void do_interface_implementation(zend_class_entry *ce, zend_class_entry *
2525
2533
} ZEND_HASH_FOREACH_END ();
2526
2534
2527
2535
do_implement_interface (ce , iface );
2528
- if (iface -> num_interfaces ) {
2529
- zend_do_inherit_interfaces (ce , iface );
2530
- }
2531
2536
}
2532
2537
/* }}} */
2533
2538
0 commit comments