@@ -1245,7 +1245,7 @@ static int zend_traits_copy_functions(zend_string *fnname, zend_function *fn, ze
12451245 zend_string * lcname ;
12461246 zend_function fn_copy ;
12471247
1248- /* apply aliases which are qualified with a class name, there should not be any ambiguity */
1248+ /* aliases which are qualified with a class name won't have any ambiguity. method names try to match with alias->trait_names */
12491249 if (ce -> trait_aliases ) {
12501250 alias_ptr = ce -> trait_aliases ;
12511251 alias = * alias_ptr ;
@@ -1255,20 +1255,38 @@ static int zend_traits_copy_functions(zend_string *fnname, zend_function *fn, ze
12551255 && (!alias -> trait_method -> ce || fn -> common .scope == alias -> trait_method -> ce )
12561256 && ZSTR_LEN (alias -> trait_method -> method_name ) == ZSTR_LEN (fnname )
12571257 && (zend_binary_strcasecmp (ZSTR_VAL (alias -> trait_method -> method_name ), ZSTR_LEN (alias -> trait_method -> method_name ), ZSTR_VAL (fnname ), ZSTR_LEN (fnname )) == 0 )) {
1258- fn_copy = * fn ;
12591258
1260- /* if it is 0, no modifieres has been changed */
1261- if (alias -> modifiers ) {
1262- fn_copy .common .fn_flags = alias -> modifiers | (fn -> common .fn_flags ^ (fn -> common .fn_flags & ZEND_ACC_PPP_MASK ));
1259+ if (alias -> trait_names ) {
1260+ size_t i = 0 ;
1261+ while (alias -> trait_names [i ]) {
1262+ if (zend_binary_strcasecmp (
1263+ ZSTR_VAL (fn -> common .scope -> name ),
1264+ ZSTR_LEN (fn -> common .scope -> name ),
1265+ ZSTR_VAL (alias -> trait_names [i ]),
1266+ ZSTR_LEN (alias -> trait_names [i ])) == 0 ) {
1267+
1268+ alias -> trait_method -> class_name = alias -> trait_names [i ];
1269+ }
1270+ i ++ ;
1271+ }
12631272 }
12641273
1265- lcname = zend_string_tolower (alias -> alias );
1266- zend_add_trait_method (ce , ZSTR_VAL (alias -> alias ), lcname , & fn_copy , overriden );
1267- zend_string_release (lcname );
1274+ if (alias -> trait_method -> ce || alias -> trait_method -> class_name ) {
1275+ fn_copy = * fn ;
1276+
1277+ /* if it is 0, no modifiers have been changed */
1278+ if (alias -> modifiers ) {
1279+ fn_copy .common .fn_flags = alias -> modifiers | (fn -> common .fn_flags ^ (fn -> common .fn_flags & ZEND_ACC_PPP_MASK ));
1280+ }
1281+
1282+ lcname = zend_string_tolower (alias -> alias );
1283+ zend_add_trait_method (ce , ZSTR_VAL (alias -> alias ), lcname , & fn_copy , overriden );
1284+ zend_string_release (lcname );
12681285
1269- /* Record the trait from which this alias was resolved. */
1270- if (!alias -> trait_method -> ce ) {
1271- alias -> trait_method -> ce = fn -> common .scope ;
1286+ /* Record the trait from which this alias was resolved. */
1287+ if (!alias -> trait_method -> ce ) {
1288+ alias -> trait_method -> ce = fn -> common .scope ;
1289+ }
12721290 }
12731291 }
12741292 alias_ptr ++ ;
@@ -1292,11 +1310,28 @@ static int zend_traits_copy_functions(zend_string *fnname, zend_function *fn, ze
12921310 && (ZSTR_LEN (alias -> trait_method -> method_name ) == ZSTR_LEN (fnname ))
12931311 && (zend_binary_strcasecmp (ZSTR_VAL (alias -> trait_method -> method_name ), ZSTR_LEN (alias -> trait_method -> method_name ), ZSTR_VAL (fnname ), ZSTR_LEN (fnname )) == 0 )) {
12941312
1295- fn_copy .common .fn_flags = alias -> modifiers | (fn -> common .fn_flags ^ (fn -> common .fn_flags & ZEND_ACC_PPP_MASK ));
1313+ if (alias -> trait_names ) {
1314+ size_t i = 0 ;
1315+ while (alias -> trait_names [i ]) {
1316+ if (zend_binary_strcasecmp (
1317+ ZSTR_VAL (fn -> common .scope -> name ),
1318+ ZSTR_LEN (fn -> common .scope -> name ),
1319+ ZSTR_VAL (alias -> trait_names [i ]),
1320+ ZSTR_LEN (alias -> trait_names [i ])) == 0 ) {
12961321
1297- /** Record the trait from which this alias was resolved. */
1298- if (!alias -> trait_method -> ce ) {
1299- alias -> trait_method -> ce = fn -> common .scope ;
1322+ alias -> trait_method -> class_name = alias -> trait_names [i ];
1323+ }
1324+ i ++ ;
1325+ }
1326+ }
1327+
1328+ if (alias -> trait_method -> ce || alias -> trait_method -> class_name ) {
1329+ fn_copy .common .fn_flags = alias -> modifiers | (fn -> common .fn_flags ^ (fn -> common .fn_flags & ZEND_ACC_PPP_MASK ));
1330+
1331+ /** Record the trait from which this alias was resolved. */
1332+ if (!alias -> trait_method -> ce ) {
1333+ alias -> trait_method -> ce = fn -> common .scope ;
1334+ }
13001335 }
13011336 }
13021337 alias_ptr ++ ;
0 commit comments