@@ -1169,10 +1169,19 @@ ZEND_API bool zend_is_valid_class_name(zend_string *name) {
11691169static zend_class_entry * zend_resolve_nested_class (zend_string * requested_name , uint32_t flags ) {
11701170 zend_class_entry * ce = NULL ;
11711171 char * separator ;
1172- zend_string * scope_name = zend_string_copy ( requested_name ) ;
1172+ zend_string * scope_name = NULL ;
11731173
1174- const char * unqualified_name = strrchr (ZSTR_VAL (scope_name ), '\\' );
1175- zend_string * inner_name = zend_string_init (unqualified_name , ZSTR_LEN (scope_name ) - (unqualified_name - ZSTR_VAL (scope_name )), 0 );
1174+ const char * unqualified_name = strrchr (ZSTR_VAL (requested_name ), '|' );
1175+ if (unqualified_name == NULL ) {
1176+ unqualified_name = strrchr (ZSTR_VAL (requested_name ), '\\' );
1177+ }
1178+
1179+ zend_string * inner_name = zend_string_init (unqualified_name + 1 , ZSTR_LEN (requested_name ) - (unqualified_name - ZSTR_VAL (requested_name ) + 1 ), 0 );
1180+
1181+ scope_name = zend_string_init (ZSTR_VAL (requested_name ), unqualified_name - ZSTR_VAL (requested_name ) + 1 , 0 );
1182+ scope_name -> val [scope_name -> len - 1 ] = '\\' ; // todo: there is probably a better way
1183+
1184+ requested_name = zend_string_concat2 (ZSTR_VAL (scope_name ), ZSTR_LEN (scope_name ), ZSTR_VAL (inner_name ), ZSTR_LEN (inner_name ));
11761185
11771186 while ((separator = strrchr (ZSTR_VAL (scope_name ), '\\' ))) {
11781187 const size_t outer_len = separator - ZSTR_VAL (scope_name );
@@ -1187,56 +1196,50 @@ static zend_class_entry *zend_resolve_nested_class(zend_string *requested_name,
11871196 zend_string_release (scope_name );
11881197 zend_string_release (outer_class_name );
11891198 zend_string_release (inner_name );
1199+ zend_string_release (requested_name );
11901200 return ce ;
11911201 }
1202+ }
11921203
1193- // Check if the class is in the outer scope
1194- zend_string * outer_name = zend_string_concat2 (ZSTR_VAL (outer_class_name ), ZSTR_LEN (outer_class_name ), ZSTR_VAL (inner_name ), ZSTR_LEN (inner_name ));
1195- ce = zend_lookup_class_ex (outer_name , NULL , flags | ZEND_FETCH_CLASS_NO_INNER );
1196- zend_string_release (outer_name );
1197- zend_string_release (outer_class_name );
1198- if (ce ) {
1199- zend_string_release (scope_name );
1200- zend_string_release (inner_name );
1201- return ce ;
1202- }
1203-
1204- // Continue moving upwards (perhaps the inner class is further up)
1205- zend_string * shorter_scope = zend_string_init (ZSTR_VAL (scope_name ), outer_len , 0 );
1204+ // Check if the class is in the outer scope
1205+ zend_string * outer_name = zend_string_concat3 (ZSTR_VAL (outer_class_name ), ZSTR_LEN (outer_class_name ), "\\" , 1 , ZSTR_VAL (inner_name ), ZSTR_LEN (inner_name ));
1206+ ce = zend_lookup_class_ex (outer_name , NULL , flags | ZEND_FETCH_CLASS_NO_INNER );
1207+ zend_string_release (outer_name );
1208+ zend_string_release (outer_class_name );
1209+ if (ce ) {
12061210 zend_string_release (scope_name );
1207- scope_name = shorter_scope ;
1208- } else {
1209- // Outer class isn't found: reached namespace level.
1210- zend_string_release (scope_name );
1211- zend_string_release (outer_class_name );
12121211 zend_string_release (inner_name );
1212+ zend_string_release (requested_name );
1213+ return ce ;
1214+ }
1215+
1216+ // Continue moving upwards (perhaps the inner class is further up)
1217+ zend_string * shorter_scope = zend_string_init (ZSTR_VAL (scope_name ), outer_len , 0 );
1218+ zend_string_release (scope_name );
1219+ scope_name = shorter_scope ;
1220+
1221+ if (!outer_ce ) {
1222+ // we have reached the namespace/global scope so nothing to do here
12131223 break ;
12141224 }
12151225 }
12161226
12171227 // handle the edge case where the class is in the global scope
12181228 if (separator == NULL ) {
1219- separator = strrchr (ZSTR_VAL (requested_name ), '\\' );
1220- if (separator ) {
1221- zend_string_release (scope_name );
1222- // set scope name to just the separator minus the first character
1223- scope_name = zend_string_init (separator + 1 , ZSTR_LEN (requested_name ) - (separator - ZSTR_VAL (requested_name ) + 1 ), 0 );
1224- } else {
1225- zend_string_release (scope_name );
1226- zend_string_release (inner_name );
1227- return NULL ;
1228- }
1229- ce = zend_lookup_class_ex (scope_name , NULL , flags | ZEND_FETCH_CLASS_NO_INNER );
1229+ ce = zend_lookup_class_ex (inner_name , NULL , flags | ZEND_FETCH_CLASS_NO_INNER );
12301230 zend_string_release (scope_name );
12311231 zend_string_release (inner_name );
1232+ zend_string_release (requested_name );
12321233 return ce ;
12331234 }
12341235
12351236 zend_string_release (scope_name );
1236- zend_string_release (inner_name );
12371237
12381238 // Final lookup directly at namespace/global scope
1239- return zend_lookup_class_ex (requested_name , NULL , flags | ZEND_FETCH_CLASS_NO_INNER );
1239+ //ce = zend_lookup_class_ex(inner_name, NULL, flags | ZEND_FETCH_CLASS_NO_INNER);
1240+ zend_string_release (inner_name );
1241+ zend_string_release (requested_name );
1242+ return NULL ;
12401243}
12411244
12421245ZEND_API zend_class_entry * zend_lookup_class_ex (zend_string * name , zend_string * key , uint32_t flags ) /* {{{ */
0 commit comments