@@ -1257,51 +1257,54 @@ ZEND_FUNCTION(restore_exception_handler)
1257
1257
}
1258
1258
/* }}} */
1259
1259
1260
- static inline void get_declared_class_impl (INTERNAL_FUNCTION_PARAMETERS , int flags , int skip_flags ) /* {{{ */
1260
+ static inline void get_declared_class_impl (INTERNAL_FUNCTION_PARAMETERS , int flags ) /* {{{ */
1261
1261
{
1262
1262
zend_string * key ;
1263
- zval * zv , tmp ;
1263
+ zval * zv ;
1264
1264
zend_class_entry * ce ;
1265
1265
1266
1266
ZEND_PARSE_PARAMETERS_NONE ();
1267
1267
1268
1268
array_init (return_value );
1269
- ZEND_HASH_FOREACH_STR_KEY_VAL (EG (class_table ), key , zv ) {
1270
- ce = Z_PTR_P (zv );
1271
- if (key
1272
- && ZSTR_VAL (key )[0 ] != 0
1273
- && (ce -> ce_flags & flags )
1274
- && !(ce -> ce_flags & skip_flags )) {
1275
- if (EXPECTED (Z_TYPE_P (zv ) == IS_PTR )) {
1276
- ZVAL_STR_COPY (& tmp , ce -> name );
1277
- } else {
1278
- ZEND_ASSERT (Z_TYPE_P (zv ) == IS_ALIAS_PTR );
1279
- ZVAL_STR_COPY (& tmp , key );
1269
+ zend_hash_real_init_packed (Z_ARRVAL_P (return_value ));
1270
+ ZEND_HASH_FILL_PACKED (Z_ARRVAL_P (return_value )) {
1271
+ ZEND_HASH_FOREACH_STR_KEY_VAL (EG (class_table ), key , zv ) {
1272
+ ce = Z_PTR_P (zv );
1273
+ if ((ce -> ce_flags & (ZEND_ACC_LINKED |ZEND_ACC_INTERFACE |ZEND_ACC_TRAIT )) == flags
1274
+ && key
1275
+ && ZSTR_VAL (key )[0 ] != 0 ) {
1276
+ ZEND_HASH_FILL_GROW ();
1277
+ if (EXPECTED (Z_TYPE_P (zv ) == IS_PTR )) {
1278
+ ZEND_HASH_FILL_SET_STR_COPY (ce -> name );
1279
+ } else {
1280
+ ZEND_ASSERT (Z_TYPE_P (zv ) == IS_ALIAS_PTR );
1281
+ ZEND_HASH_FILL_SET_STR_COPY (key );
1282
+ }
1283
+ ZEND_HASH_FILL_NEXT ();
1280
1284
}
1281
- zend_hash_next_index_insert_new (Z_ARRVAL_P (return_value ), & tmp );
1282
- }
1283
- } ZEND_HASH_FOREACH_END ();
1285
+ } ZEND_HASH_FOREACH_END ();
1286
+ } ZEND_HASH_FILL_END ();
1284
1287
}
1285
1288
/* {{{ */
1286
1289
1287
1290
/* {{{ Returns an array of all declared traits. */
1288
1291
ZEND_FUNCTION (get_declared_traits )
1289
1292
{
1290
- get_declared_class_impl (INTERNAL_FUNCTION_PARAM_PASSTHRU , ZEND_ACC_TRAIT , 0 );
1293
+ get_declared_class_impl (INTERNAL_FUNCTION_PARAM_PASSTHRU , ZEND_ACC_LINKED | ZEND_ACC_TRAIT );
1291
1294
}
1292
1295
/* }}} */
1293
1296
1294
1297
/* {{{ Returns an array of all declared classes. */
1295
1298
ZEND_FUNCTION (get_declared_classes )
1296
1299
{
1297
- get_declared_class_impl (INTERNAL_FUNCTION_PARAM_PASSTHRU , ZEND_ACC_LINKED , ZEND_ACC_INTERFACE | ZEND_ACC_TRAIT );
1300
+ get_declared_class_impl (INTERNAL_FUNCTION_PARAM_PASSTHRU , ZEND_ACC_LINKED );
1298
1301
}
1299
1302
/* }}} */
1300
1303
1301
1304
/* {{{ Returns an array of all declared interfaces. */
1302
1305
ZEND_FUNCTION (get_declared_interfaces )
1303
1306
{
1304
- get_declared_class_impl (INTERNAL_FUNCTION_PARAM_PASSTHRU , ZEND_ACC_INTERFACE , 0 );
1307
+ get_declared_class_impl (INTERNAL_FUNCTION_PARAM_PASSTHRU , ZEND_ACC_LINKED | ZEND_ACC_INTERFACE );
1305
1308
}
1306
1309
/* }}} */
1307
1310
0 commit comments