@@ -2135,23 +2135,6 @@ static void zend_do_traits_method_binding(zend_class_entry *ce, zend_class_entry
21352135}
21362136/* }}} */
21372137
2138- 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 ) /* {{{ */
2139- {
2140- size_t i ;
2141-
2142- if (colliding_ce == ce ) {
2143- for (i = 0 ; i < current_trait ; i ++ ) {
2144- if (traits [i ]
2145- && zend_hash_exists (& traits [i ]-> properties_info , prop_name )) {
2146- return traits [i ];
2147- }
2148- }
2149- }
2150-
2151- return colliding_ce ;
2152- }
2153- /* }}} */
2154-
21552138static 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 ) /* {{{ */
21562139{
21572140 size_t i ;
@@ -2169,9 +2152,8 @@ static zend_class_entry* find_first_constant_definition(zend_class_entry *ce, ze
21692152}
21702153/* }}} */
21712154
2172- static bool do_trait_constant_check (
2173- zend_class_entry * ce , zend_class_constant * trait_constant , zend_string * name , zend_class_entry * * traits , size_t current_trait
2174- ) {
2155+ 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 ) /* {{{ */
2156+ {
21752157 bool is_compatible = false;
21762158 uint32_t flags_mask = ZEND_ACC_PPP_MASK | ZEND_ACC_FINAL ;
21772159
@@ -2197,33 +2179,63 @@ static bool do_trait_constant_check(
21972179}
21982180/* }}} */
21992181
2200- 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 ) /* {{{ */
2182+ static void zend_do_traits_constant_binding ( zend_class_entry * ce , zend_class_entry * * traits ) /* {{{ */
22012183{
2202- if (do_trait_constant_check (ce , c , name , traits , current_trait )) {
2203- zend_class_constant * ct = NULL ;
2184+ size_t i ;
22042185
2205- ct = zend_arena_alloc ( & CG ( arena ), sizeof ( zend_class_constant ));
2206- memcpy ( ct , c , sizeof ( zend_class_constant )) ;
2207- c = ct ;
2186+ for ( i = 0 ; i < ce -> num_traits ; i ++ ) {
2187+ zend_string * constant_name ;
2188+ zend_class_constant * constant ;
22082189
2209- if (Z_TYPE (c -> value ) == IS_CONSTANT_AST ) {
2210- ce -> ce_flags &= ~ZEND_ACC_CONSTANTS_UPDATED ;
2211- ce -> ce_flags |= ZEND_ACC_HAS_AST_CONSTANTS ;
2190+ if (!traits [i ]) {
2191+ continue ;
22122192 }
22132193
2214- c -> ce = ce ;
2215- Z_TRY_ADDREF (c -> value );
2216- c -> doc_comment = c -> doc_comment ? zend_string_copy (c -> doc_comment ) : NULL ;
2217- if (c -> attributes && (!(GC_FLAGS (c -> attributes ) & IS_ARRAY_IMMUTABLE ))) {
2218- GC_ADDREF (c -> attributes );
2219- }
2194+ ZEND_HASH_MAP_FOREACH_STR_KEY_PTR (& traits [i ]-> constants_table , constant_name , constant ) {
2195+ if (do_trait_constant_check (ce , constant , constant_name , traits , i )) {
2196+ zend_class_constant * ct = NULL ;
22202197
2221- zend_hash_update_ptr (& ce -> constants_table , name , c );
2198+ ct = zend_arena_alloc (& CG (arena ),sizeof (zend_class_constant ));
2199+ memcpy (ct , constant , sizeof (zend_class_constant ));
2200+ constant = ct ;
2201+
2202+ if (Z_TYPE (constant -> value ) == IS_CONSTANT_AST ) {
2203+ ce -> ce_flags &= ~ZEND_ACC_CONSTANTS_UPDATED ;
2204+ ce -> ce_flags |= ZEND_ACC_HAS_AST_CONSTANTS ;
2205+ }
2206+
2207+ constant -> ce = ce ;
2208+ Z_TRY_ADDREF (constant -> value );
2209+ constant -> doc_comment = constant -> doc_comment ? zend_string_copy (constant -> doc_comment ) : NULL ;
2210+ if (constant -> attributes && (!(GC_FLAGS (constant -> attributes ) & IS_ARRAY_IMMUTABLE ))) {
2211+ GC_ADDREF (constant -> attributes );
2212+ }
2213+
2214+ zend_hash_update_ptr (& ce -> constants_table , constant_name , constant );
2215+ }
2216+ } ZEND_HASH_FOREACH_END ();
2217+ }
2218+ }
2219+ /* }}} */
2220+
2221+ 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 ) /* {{{ */
2222+ {
2223+ size_t i ;
2224+
2225+ if (colliding_ce == ce ) {
2226+ for (i = 0 ; i < current_trait ; i ++ ) {
2227+ if (traits [i ]
2228+ && zend_hash_exists (& traits [i ]-> properties_info , prop_name )) {
2229+ return traits [i ];
2230+ }
2231+ }
22222232 }
2233+
2234+ return colliding_ce ;
22232235}
22242236/* }}} */
22252237
2226- static void zend_do_traits_property_and_constant_binding (zend_class_entry * ce , zend_class_entry * * traits ) /* {{{ */
2238+ static void zend_do_traits_property_binding (zend_class_entry * ce , zend_class_entry * * traits ) /* {{{ */
22272239{
22282240 size_t i ;
22292241 zend_property_info * property_info ;
@@ -2232,8 +2244,6 @@ static void zend_do_traits_property_and_constant_binding(zend_class_entry *ce, z
22322244 zend_string * prop_name ;
22332245 zval * prop_value ;
22342246 zend_string * doc_comment ;
2235- zend_string * constant_name ;
2236- zend_class_constant * constant ;
22372247
22382248 /* In the following steps the properties are inserted into the property table
22392249 * for that, a very strict approach is applied:
@@ -2244,10 +2254,6 @@ static void zend_do_traits_property_and_constant_binding(zend_class_entry *ce, z
22442254 if (!traits [i ]) {
22452255 continue ;
22462256 }
2247- ZEND_HASH_MAP_FOREACH_STR_KEY_PTR (& traits [i ]-> constants_table , constant_name , constant ) {
2248- do_inherit_trait_constant (constant_name , constant , ce , traits , i );
2249- } ZEND_HASH_FOREACH_END ();
2250-
22512257 ZEND_HASH_MAP_FOREACH_STR_KEY_PTR (& traits [i ]-> properties_info , prop_name , property_info ) {
22522258 uint32_t flags = property_info -> flags ;
22532259
@@ -2338,8 +2344,9 @@ static void zend_do_bind_traits(zend_class_entry *ce, zend_class_entry **traits)
23382344 efree (exclude_tables );
23392345 }
23402346
2341- /* then flatten the properties into it, to, mostly to notify developer about problems */
2342- zend_do_traits_property_and_constant_binding (ce , traits );
2347+ /* then flatten the constants and properties into it, to, mostly to notify developer about problems */
2348+ zend_do_traits_constant_binding (ce , traits );
2349+ zend_do_traits_property_binding (ce , traits );
23432350}
23442351/* }}} */
23452352
0 commit comments