@@ -2504,39 +2504,27 @@ static zend_always_inline void i_init_func_execute_data(zend_op_array *op_array,
25042504}
25052505/* }}} */
25062506
2507- static zend_never_inline void ZEND_FASTCALL init_func_run_time_cache (zend_op_array * op_array ) /* {{{ */
2508- {
2509- ZEND_ASSERT (op_array -> run_time_cache == NULL );
2510- op_array -> run_time_cache = zend_arena_alloc (& CG (arena ), op_array -> cache_size );
2511- memset (op_array -> run_time_cache , 0 , op_array -> cache_size );
2512- }
2513- /* }}} */
2514-
2515- static zend_always_inline zend_function * ZEND_FASTCALL init_func_run_time_cache_i (zval * zv ) /* {{{ */
2507+ static zend_always_inline void init_func_run_time_cache_i (zend_op_array * op_array ) /* {{{ */
25162508{
2517- zend_op_array * op_array = Z_PTR_P ( zv ) ;
2509+ void * * run_time_cache ;
25182510
2519- ZEND_ASSERT (op_array -> run_time_cache == NULL );
2511+ ZEND_ASSERT (RUN_TIME_CACHE (op_array ) == NULL );
2512+ run_time_cache = zend_arena_alloc (& CG (arena ), op_array -> cache_size );
2513+ memset (run_time_cache , 0 , op_array -> cache_size );
25202514 if (op_array -> fn_flags & ZEND_ACC_IMMUTABLE ) {
2521- zend_op_array * new_op_array = zend_arena_alloc (& CG (arena ), sizeof (zend_op_array ) + op_array -> cache_size );
2522-
2523- Z_PTR_P (zv ) = new_op_array ;
2524- memcpy (new_op_array , op_array , sizeof (zend_op_array ));
2525- new_op_array -> fn_flags &= ~ZEND_ACC_IMMUTABLE ;
2526- new_op_array -> run_time_cache = (void * * )(new_op_array + 1 );
2527- memset (new_op_array -> run_time_cache , 0 , new_op_array -> cache_size );
2528- return (zend_function * )new_op_array ;
2515+ CG (request_data )[op_array -> run_time_cache_idx ] = run_time_cache ;
2516+ if (op_array -> static_variables ) {
2517+ CG (request_data )[op_array -> run_time_cache_idx + 1 ] = zend_array_dup (op_array -> static_variables );
2518+ }
25292519 } else {
2530- op_array -> run_time_cache = zend_arena_alloc (& CG (arena ), op_array -> cache_size );
2531- memset (op_array -> run_time_cache , 0 , op_array -> cache_size );
2532- return (zend_function * )op_array ;
2520+ op_array -> run_time_cache = run_time_cache ;
25332521 }
25342522}
25352523/* }}} */
25362524
2537- static zend_never_inline zend_function * init_func_run_time_cache_ex ( zval * zv ) /* {{{ */
2525+ static zend_never_inline void ZEND_FASTCALL init_func_run_time_cache ( zend_op_array * op_array ) /* {{{ */
25382526{
2539- return init_func_run_time_cache_i (zv );
2527+ init_func_run_time_cache_i (op_array );
25402528}
25412529/* }}} */
25422530
@@ -2547,8 +2535,8 @@ ZEND_API zend_function * ZEND_FASTCALL zend_fetch_function(zend_string *name) /*
25472535 if (EXPECTED (zv != NULL )) {
25482536 zend_function * fbc = Z_FUNC_P (zv );
25492537
2550- if (EXPECTED (fbc -> type == ZEND_USER_FUNCTION ) && UNEXPECTED (!fbc -> op_array . run_time_cache )) {
2551- fbc = ( zend_function * ) init_func_run_time_cache_i (zv );
2538+ if (EXPECTED (fbc -> type == ZEND_USER_FUNCTION ) && UNEXPECTED (!RUN_TIME_CACHE ( & fbc -> op_array ) )) {
2539+ init_func_run_time_cache_i (& fbc -> op_array );
25522540 }
25532541 return fbc ;
25542542 }
@@ -2562,8 +2550,8 @@ ZEND_API zend_function * ZEND_FASTCALL zend_fetch_function_str(const char *name,
25622550 if (EXPECTED (zv != NULL )) {
25632551 zend_function * fbc = Z_FUNC_P (zv );
25642552
2565- if (EXPECTED (fbc -> type == ZEND_USER_FUNCTION ) && UNEXPECTED (!fbc -> op_array . run_time_cache )) {
2566- fbc = ( zend_function * ) init_func_run_time_cache_i (zv );
2553+ if (EXPECTED (fbc -> type == ZEND_USER_FUNCTION ) && UNEXPECTED (!RUN_TIME_CACHE ( & fbc -> op_array ) )) {
2554+ init_func_run_time_cache_i (& fbc -> op_array );
25672555 }
25682556 return fbc ;
25692557 }
@@ -2602,7 +2590,7 @@ ZEND_API void zend_init_func_execute_data(zend_execute_data *ex, zend_op_array *
26022590#endif
26032591
26042592 EX (prev_execute_data ) = EG (current_execute_data );
2605- if (!op_array -> run_time_cache ) {
2593+ if (!RUN_TIME_CACHE ( op_array ) ) {
26062594 init_func_run_time_cache (op_array );
26072595 }
26082596 i_init_func_execute_data (op_array , return_value , 1 EXECUTE_DATA_CC );
@@ -2964,7 +2952,7 @@ static zend_never_inline zend_execute_data *zend_init_dynamic_call_string(zend_s
29642952 return NULL ;
29652953 }
29662954 }
2967- if (EXPECTED (fbc -> type == ZEND_USER_FUNCTION ) && UNEXPECTED (!fbc -> op_array . run_time_cache )) {
2955+ if (EXPECTED (fbc -> type == ZEND_USER_FUNCTION ) && UNEXPECTED (!RUN_TIME_CACHE ( & fbc -> op_array ) )) {
29682956 init_func_run_time_cache (& fbc -> op_array );
29692957 }
29702958 } else {
@@ -2982,8 +2970,8 @@ static zend_never_inline zend_execute_data *zend_init_dynamic_call_string(zend_s
29822970 zend_string_release_ex (lcname , 0 );
29832971
29842972 fbc = Z_FUNC_P (func );
2985- if (EXPECTED (fbc -> type == ZEND_USER_FUNCTION ) && UNEXPECTED (!fbc -> op_array . run_time_cache )) {
2986- fbc = init_func_run_time_cache_ex ( func );
2973+ if (EXPECTED (fbc -> type == ZEND_USER_FUNCTION ) && UNEXPECTED (!RUN_TIME_CACHE ( & fbc -> op_array ) )) {
2974+ init_func_run_time_cache ( & fbc -> op_array );
29872975 }
29882976 called_scope = NULL ;
29892977 }
@@ -3019,7 +3007,7 @@ static zend_never_inline zend_execute_data *zend_init_dynamic_call_object(zval *
30193007 return NULL ;
30203008 }
30213009
3022- if (EXPECTED (fbc -> type == ZEND_USER_FUNCTION ) && UNEXPECTED (!fbc -> op_array . run_time_cache )) {
3010+ if (EXPECTED (fbc -> type == ZEND_USER_FUNCTION ) && UNEXPECTED (!RUN_TIME_CACHE ( & fbc -> op_array ) )) {
30233011 init_func_run_time_cache (& fbc -> op_array );
30243012 }
30253013
@@ -3106,7 +3094,7 @@ static zend_never_inline zend_execute_data *zend_init_dynamic_call_array(zend_ar
31063094 return NULL ;
31073095 }
31083096
3109- if (EXPECTED (fbc -> type == ZEND_USER_FUNCTION ) && UNEXPECTED (!fbc -> op_array . run_time_cache )) {
3097+ if (EXPECTED (fbc -> type == ZEND_USER_FUNCTION ) && UNEXPECTED (!RUN_TIME_CACHE ( & fbc -> op_array ) )) {
31103098 init_func_run_time_cache (& fbc -> op_array );
31113099 }
31123100
0 commit comments