@@ -3608,6 +3608,11 @@ ZEND_API zend_class_entry *zend_do_link_class(zend_class_entry *ce, zend_string
3608
3608
zend_do_traits_method_binding (ce , traits_and_interfaces , trait_exclude_tables , trait_aliases , false, & trait_contains_abstract_methods );
3609
3609
zend_do_traits_constant_binding (ce , traits_and_interfaces );
3610
3610
zend_do_traits_property_binding (ce , traits_and_interfaces );
3611
+
3612
+ zend_function * fn ;
3613
+ ZEND_HASH_MAP_FOREACH_PTR (& ce -> function_table , fn ) {
3614
+ zend_fixup_trait_method (fn , ce );
3615
+ } ZEND_HASH_FOREACH_END ();
3611
3616
}
3612
3617
if (parent ) {
3613
3618
if (!(parent -> ce_flags & ZEND_ACC_LINKED )) {
@@ -3618,6 +3623,13 @@ ZEND_API zend_class_entry *zend_do_link_class(zend_class_entry *ce, zend_string
3618
3623
if (ce -> num_traits ) {
3619
3624
if (trait_contains_abstract_methods ) {
3620
3625
zend_do_traits_method_binding (ce , traits_and_interfaces , trait_exclude_tables , trait_aliases , true, & trait_contains_abstract_methods );
3626
+
3627
+ /* New abstract methods may have been added, make sure to add
3628
+ * ZEND_ACC_IMPLICIT_ABSTRACT_CLASS to ce. */
3629
+ zend_function * fn ;
3630
+ ZEND_HASH_MAP_FOREACH_PTR (& ce -> function_table , fn ) {
3631
+ zend_fixup_trait_method (fn , ce );
3632
+ } ZEND_HASH_FOREACH_END ();
3621
3633
}
3622
3634
3623
3635
if (trait_exclude_tables ) {
@@ -3634,11 +3646,6 @@ ZEND_API zend_class_entry *zend_do_link_class(zend_class_entry *ce, zend_string
3634
3646
if (trait_aliases ) {
3635
3647
efree (trait_aliases );
3636
3648
}
3637
-
3638
- zend_function * fn ;
3639
- ZEND_HASH_MAP_FOREACH_PTR (& ce -> function_table , fn ) {
3640
- zend_fixup_trait_method (fn , ce );
3641
- } ZEND_HASH_FOREACH_END ();
3642
3649
}
3643
3650
if (ce -> num_interfaces ) {
3644
3651
/* Also copy the parent interfaces here, so we don't need to reallocate later. */
0 commit comments