@@ -3202,6 +3202,8 @@ static void preload_link(void)
32023202 zend_string * key ;
32033203 zend_bool found , changed ;
32043204 uint32_t i ;
3205+ zend_op_array * op_array ;
3206+ dtor_func_t orig_dtor ;
32053207
32063208 /* Resolve class dependencies */
32073209 do {
@@ -3324,8 +3326,8 @@ static void preload_link(void)
33243326 } while (changed );
33253327 EG (exception ) = NULL ;
33263328
3327- /* Move unlinked clases (and with unresilved constants) back to scripts */
3328- dtor_func_t orig_dtor = EG (class_table )-> pDestructor ;
3329+ /* Move unlinked clases (and with unresilved constants) back to scripts */
3330+ orig_dtor = EG (class_table )-> pDestructor ;
33293331 EG (class_table )-> pDestructor = NULL ;
33303332 ZEND_HASH_REVERSE_FOREACH_STR_KEY_VAL (EG (class_table ), key , zv ) {
33313333 ce = Z_PTR_P (zv );
@@ -3349,6 +3351,28 @@ static void preload_link(void)
33493351 EG (class_table )-> pDestructor = orig_dtor ;
33503352 zend_hash_rehash (EG (class_table ));
33513353
3354+ /* Move run-time declared functions back to scripts */
3355+ orig_dtor = EG (function_table )-> pDestructor ;
3356+ EG (function_table )-> pDestructor = NULL ;
3357+ ZEND_HASH_REVERSE_FOREACH_STR_KEY_VAL (EG (function_table ), key , zv ) {
3358+ op_array = Z_PTR_P (zv );
3359+ if (op_array -> type == ZEND_INTERNAL_FUNCTION ) {
3360+ break ;
3361+ }
3362+ if (op_array -> fn_flags & (ZEND_ACC_TOP_LEVEL |ZEND_ACC_CLOSURE )) {
3363+ continue ;
3364+ }
3365+ script = zend_hash_find_ptr (preload_scripts , op_array -> filename );
3366+ ZEND_ASSERT (script );
3367+ zend_hash_add (& script -> script .function_table , key , zv );
3368+ ZVAL_UNDEF (zv );
3369+ zend_string_release (key );
3370+ EG (function_table )-> nNumOfElements -- ;
3371+ } ZEND_HASH_FOREACH_END ();
3372+ EG (function_table )-> pDestructor = orig_dtor ;
3373+ zend_hash_rehash (EG (function_table ));
3374+
3375+
33523376 /* Remove DECLARE opcodes */
33533377 ZEND_HASH_FOREACH_PTR (preload_scripts , script ) {
33543378 zend_op_array * op_array = & script -> script .main_op_array ;
0 commit comments