@@ -2204,23 +2204,6 @@ static void zend_do_traits_method_binding(zend_class_entry *ce, zend_class_entry
22042204}
22052205/* }}} */
22062206
2207- static zend_class_entry * find_first_property_definition (zend_class_entry * ce , zend_class_entry * * traits , size_t current_trait , zend_string * prop_name , zend_class_entry * colliding_ce ) /* {{{ */
2208- {
2209- size_t i ;
2210-
2211- if (colliding_ce == ce ) {
2212- for (i = 0 ; i < current_trait ; i ++ ) {
2213- if (traits [i ]
2214- && zend_hash_exists (& traits [i ]-> properties_info , prop_name )) {
2215- return traits [i ];
2216- }
2217- }
2218- }
2219-
2220- return colliding_ce ;
2221- }
2222- /* }}} */
2223-
22242207static zend_class_entry * find_first_constant_definition (zend_class_entry * ce , zend_class_entry * * traits , size_t current_trait , zend_string * constant_name , zend_class_entry * colliding_ce ) /* {{{ */
22252208{
22262209 size_t i ;
@@ -2238,9 +2221,8 @@ static zend_class_entry* find_first_constant_definition(zend_class_entry *ce, ze
22382221}
22392222/* }}} */
22402223
2241- static bool do_trait_constant_check (
2242- zend_class_entry * ce , zend_class_constant * trait_constant , zend_string * name , zend_class_entry * * traits , size_t current_trait
2243- ) {
2224+ static bool do_trait_constant_check (zend_class_entry * ce , zend_class_constant * trait_constant , zend_string * name , zend_class_entry * * traits , size_t current_trait ) /* {{{ */
2225+ {
22442226 bool is_compatible = false;
22452227 uint32_t flags_mask = ZEND_ACC_PPP_MASK | ZEND_ACC_FINAL ;
22462228
@@ -2266,33 +2248,63 @@ static bool do_trait_constant_check(
22662248}
22672249/* }}} */
22682250
2269- static void do_inherit_trait_constant ( zend_string * name , zend_class_constant * c , zend_class_entry * ce , zend_class_entry * * traits , size_t current_trait ) /* {{{ */
2251+ static void zend_do_traits_constant_binding ( zend_class_entry * ce , zend_class_entry * * traits ) /* {{{ */
22702252{
2271- if (do_trait_constant_check (ce , c , name , traits , current_trait )) {
2272- zend_class_constant * ct = NULL ;
2253+ size_t i ;
22732254
2274- ct = zend_arena_alloc ( & CG ( arena ), sizeof ( zend_class_constant ));
2275- memcpy ( ct , c , sizeof ( zend_class_constant )) ;
2276- c = ct ;
2255+ for ( i = 0 ; i < ce -> num_traits ; i ++ ) {
2256+ zend_string * constant_name ;
2257+ zend_class_constant * constant ;
22772258
2278- if (Z_TYPE (c -> value ) == IS_CONSTANT_AST ) {
2279- ce -> ce_flags &= ~ZEND_ACC_CONSTANTS_UPDATED ;
2280- ce -> ce_flags |= ZEND_ACC_HAS_AST_CONSTANTS ;
2259+ if (!traits [i ]) {
2260+ continue ;
22812261 }
22822262
2283- c -> ce = ce ;
2284- Z_TRY_ADDREF (c -> value );
2285- c -> doc_comment = c -> doc_comment ? zend_string_copy (c -> doc_comment ) : NULL ;
2286- if (c -> attributes && (!(GC_FLAGS (c -> attributes ) & IS_ARRAY_IMMUTABLE ))) {
2287- GC_ADDREF (c -> attributes );
2288- }
2263+ ZEND_HASH_MAP_FOREACH_STR_KEY_PTR (& traits [i ]-> constants_table , constant_name , constant ) {
2264+ if (do_trait_constant_check (ce , constant , constant_name , traits , i )) {
2265+ zend_class_constant * ct = NULL ;
22892266
2290- zend_hash_update_ptr (& ce -> constants_table , name , c );
2267+ ct = zend_arena_alloc (& CG (arena ),sizeof (zend_class_constant ));
2268+ memcpy (ct , constant , sizeof (zend_class_constant ));
2269+ constant = ct ;
2270+
2271+ if (Z_TYPE (constant -> value ) == IS_CONSTANT_AST ) {
2272+ ce -> ce_flags &= ~ZEND_ACC_CONSTANTS_UPDATED ;
2273+ ce -> ce_flags |= ZEND_ACC_HAS_AST_CONSTANTS ;
2274+ }
2275+
2276+ constant -> ce = ce ;
2277+ Z_TRY_ADDREF (constant -> value );
2278+ constant -> doc_comment = constant -> doc_comment ? zend_string_copy (constant -> doc_comment ) : NULL ;
2279+ if (constant -> attributes && (!(GC_FLAGS (constant -> attributes ) & IS_ARRAY_IMMUTABLE ))) {
2280+ GC_ADDREF (constant -> attributes );
2281+ }
2282+
2283+ zend_hash_update_ptr (& ce -> constants_table , constant_name , constant );
2284+ }
2285+ } ZEND_HASH_FOREACH_END ();
2286+ }
2287+ }
2288+ /* }}} */
2289+
2290+ static zend_class_entry * find_first_property_definition (zend_class_entry * ce , zend_class_entry * * traits , size_t current_trait , zend_string * prop_name , zend_class_entry * colliding_ce ) /* {{{ */
2291+ {
2292+ size_t i ;
2293+
2294+ if (colliding_ce == ce ) {
2295+ for (i = 0 ; i < current_trait ; i ++ ) {
2296+ if (traits [i ]
2297+ && zend_hash_exists (& traits [i ]-> properties_info , prop_name )) {
2298+ return traits [i ];
2299+ }
2300+ }
22912301 }
2302+
2303+ return colliding_ce ;
22922304}
22932305/* }}} */
22942306
2295- static void zend_do_traits_property_and_constant_binding (zend_class_entry * ce , zend_class_entry * * traits ) /* {{{ */
2307+ static void zend_do_traits_property_binding (zend_class_entry * ce , zend_class_entry * * traits ) /* {{{ */
22962308{
22972309 size_t i ;
22982310 zend_property_info * property_info ;
@@ -2301,8 +2313,6 @@ static void zend_do_traits_property_and_constant_binding(zend_class_entry *ce, z
23012313 zend_string * prop_name ;
23022314 zval * prop_value ;
23032315 zend_string * doc_comment ;
2304- zend_string * constant_name ;
2305- zend_class_constant * constant ;
23062316
23072317 /* In the following steps the properties are inserted into the property table
23082318 * for that, a very strict approach is applied:
@@ -2313,10 +2323,6 @@ static void zend_do_traits_property_and_constant_binding(zend_class_entry *ce, z
23132323 if (!traits [i ]) {
23142324 continue ;
23152325 }
2316- ZEND_HASH_MAP_FOREACH_STR_KEY_PTR (& traits [i ]-> constants_table , constant_name , constant ) {
2317- do_inherit_trait_constant (constant_name , constant , ce , traits , i );
2318- } ZEND_HASH_FOREACH_END ();
2319-
23202326 ZEND_HASH_MAP_FOREACH_STR_KEY_PTR (& traits [i ]-> properties_info , prop_name , property_info ) {
23212327 uint32_t flags = property_info -> flags ;
23222328
@@ -2407,8 +2413,9 @@ static void zend_do_bind_traits(zend_class_entry *ce, zend_class_entry **traits)
24072413 efree (exclude_tables );
24082414 }
24092415
2410- /* then flatten the properties into it, to, mostly to notify developer about problems */
2411- zend_do_traits_property_and_constant_binding (ce , traits );
2416+ /* then flatten the constants and properties into it, to, mostly to notify developer about problems */
2417+ zend_do_traits_constant_binding (ce , traits );
2418+ zend_do_traits_property_binding (ce , traits );
24122419}
24132420/* }}} */
24142421
0 commit comments