@@ -135,23 +135,28 @@ static zend_string *zp_get_param_name(zend_function *function, uint32_t arg_offs
135135 return zend_string_copy (function -> common .arg_info [arg_offset ].name );
136136}
137137
138+ #define ZP_PARAM_NAME (names , offset ) (names)[(offset)]
139+ #define ZP_VARIADIC_PARAM_NAME (names ) (names)[argc]
140+ #define ZP_EXTRA_NAMED_PARAMS_LEXICAL_NAME (names ) (names)[argc + uses_variadic_placeholder]
141+ #define ZP_FN_LEXICAL_NAME (names ) (names)[argc + uses_variadic_placeholder + (extra_named_params != NULL)]
142+
138143/* Assign a name for every variable that will be used in the generated closure,
139144 * including params and used vars. */
140145static void zp_assign_names (zend_string * * names , uint32_t num_names ,
141146 uint32_t argc , zval * argv ,
142- zend_function * function , bool variadic_partial ,
147+ zend_function * function , bool uses_variadic_placeholder ,
143148 zend_array * extra_named_params )
144149{
145150 /* Assign names for params. We never rename those. */
146151 for (uint32_t offset = 0 ; offset < MIN (argc , function -> common .num_args ); offset ++ ) {
147152 if (Z_IS_PLACEHOLDER_P (& argv [offset ])) {
148- names [ offset ] = zp_get_param_name (function , offset );
153+ ZP_PARAM_NAME ( names , offset ) = zp_get_param_name (function , offset );
149154 }
150155 }
151156
152157 /* Assign name for the variadic param. Never renamed. */
153- if (variadic_partial && (function -> common .fn_flags & ZEND_ACC_VARIADIC )) {
154- names [ argc ] = zp_get_param_name (function , function -> common .num_args );
158+ if (uses_variadic_placeholder && (function -> common .fn_flags & ZEND_ACC_VARIADIC )) {
159+ ZP_VARIADIC_PARAM_NAME ( names ) = zp_get_param_name (function , function -> common .num_args );
155160 }
156161
157162 /* Assign names for placeholders that bind to the variadic param:
@@ -176,7 +181,7 @@ static void zp_assign_names(zend_string **names, uint32_t num_names,
176181 }
177182 zend_string_release (new_name );
178183 }
179- names [ offset ] = new_name ;
184+ ZP_PARAM_NAME ( names , offset ) = new_name ;
180185 zend_string_release (orig_name );
181186 }
182187
@@ -194,7 +199,7 @@ static void zp_assign_names(zend_string **names, uint32_t num_names,
194199 new_name = zend_strpprintf_unchecked (0 , "%S%" PRIu32 , orig_name , n );
195200 n ++ ;
196201 }
197- names [ offset ] = new_name ;
202+ ZP_PARAM_NAME ( names , offset ) = new_name ;
198203 zend_string_release (orig_name );
199204 }
200205
@@ -207,7 +212,7 @@ static void zp_assign_names(zend_string **names, uint32_t num_names,
207212 n ++ ;
208213 new_name = zend_strpprintf (0 , "%s%" PRIu32 , "extra_named_params" , n );
209214 }
210- names [ argc + variadic_partial ] = new_name ;
215+ ZP_EXTRA_NAMED_PARAMS_LEXICAL_NAME ( names ) = new_name ;
211216 }
212217
213218 /* Assign name for $fn */
@@ -219,7 +224,7 @@ static void zp_assign_names(zend_string **names, uint32_t num_names,
219224 n ++ ;
220225 new_name = zend_strpprintf (0 , "%s%" PRIu32 , "fn" , n );
221226 }
222- names [ argc + variadic_partial + ( extra_named_params != NULL )] = new_name ;
227+ ZP_FN_LEXICAL_NAME ( names ) = new_name ;
223228 }
224229}
225230
@@ -497,7 +502,7 @@ static zend_string *zp_pfa_name(const zend_op_array *declaring_op_array,
497502static zend_ast * zp_compile_forwarding_call (
498503 zval * this_ptr , zend_function * function ,
499504 uint32_t argc , zval * argv , zend_array * extra_named_params ,
500- zend_string * * param_names , bool variadic_partial , uint32_t num_args ,
505+ zend_string * * param_names , bool uses_variadic_placeholder , uint32_t num_args ,
501506 zend_class_entry * called_scope , zend_type return_type ,
502507 bool forward_superfluous_args ,
503508 zend_ast * stmts_ast )
@@ -542,19 +547,19 @@ static zend_ast *zp_compile_forwarding_call(
542547 args_ast = zend_ast_list_add (args_ast , default_value_ast );
543548 } else {
544549 args_ast = zend_ast_list_add (args_ast , zend_ast_create (ZEND_AST_VAR ,
545- zend_ast_create_zval_from_str (zend_string_copy (param_names [ offset ] ))));
550+ zend_ast_create_zval_from_str (zend_string_copy (ZP_PARAM_NAME ( param_names , offset ) ))));
546551 }
547552 }
548553 if (extra_named_params ) {
549554 args_ast = zend_ast_list_add (args_ast , zend_ast_create (ZEND_AST_UNPACK ,
550555 zend_ast_create (ZEND_AST_VAR ,
551- zend_ast_create_zval_from_str (zend_string_copy (param_names [ argc + variadic_partial ] )))));
556+ zend_ast_create_zval_from_str (zend_string_copy (ZP_EXTRA_NAMED_PARAMS_LEXICAL_NAME ( param_names ) )))));
552557 }
553- if (variadic_partial ) {
558+ if (uses_variadic_placeholder ) {
554559 if (function -> common .fn_flags & ZEND_ACC_VARIADIC ) {
555560 args_ast = zend_ast_list_add (args_ast , zend_ast_create (ZEND_AST_UNPACK ,
556561 zend_ast_create (ZEND_AST_VAR ,
557- zend_ast_create_zval_from_str (zend_string_copy (param_names [ argc ] )))));
562+ zend_ast_create_zval_from_str (zend_string_copy (ZP_VARIADIC_PARAM_NAME ( param_names ) )))));
558563 } else if (forward_superfluous_args ) {
559564 /* When a '...' placeholder is used, and the underlying function is
560565 * not variadic, superfluous arguments are forwarded.
@@ -587,7 +592,7 @@ static zend_ast *zp_compile_forwarding_call(
587592 call_ast = zend_ast_create (ZEND_AST_CALL , func_name_ast , args_ast );
588593 } else if (function -> common .fn_flags & ZEND_ACC_CLOSURE ) {
589594 zend_ast * fn_ast = zend_ast_create (ZEND_AST_VAR ,
590- zend_ast_create_zval_from_str (zend_string_copy (param_names [ argc + variadic_partial + ( extra_named_params != NULL )] )));
595+ zend_ast_create_zval_from_str (zend_string_copy (ZP_FN_LEXICAL_NAME ( param_names ) )));
591596 call_ast = zend_ast_create (ZEND_AST_CALL , fn_ast , args_ast );
592597 } else if (Z_TYPE_P (this_ptr ) == IS_OBJECT ) {
593598 zend_ast * this_ast = zend_ast_create (ZEND_AST_VAR ,
@@ -795,7 +800,7 @@ static zend_op_array *zp_compile(zval *this_ptr, zend_function *function,
795800 * do_closure_bind(). */
796801 if (function -> common .fn_flags & ZEND_ACC_CLOSURE ) {
797802 zend_ast * lexical_var_ast = zend_ast_create_zval_from_str (
798- zend_string_copy (param_names [ argc + uses_variadic_placeholder + ( extra_named_params != NULL )] ));
803+ zend_string_copy (ZP_FN_LEXICAL_NAME ( param_names ) ));
799804 lexical_vars_ast = zend_ast_list_add (lexical_vars_ast , lexical_var_ast );
800805 }
801806
@@ -829,14 +834,14 @@ static zend_op_array *zp_compile(zval *this_ptr, zend_function *function,
829834 params [param_offset ] = zend_ast_create_ex (ZEND_AST_PARAM ,
830835 param_flags , param_type_ast ,
831836 zend_ast_create_zval_from_str (
832- zend_string_copy (param_names [ offset ] )),
837+ zend_string_copy (ZP_PARAM_NAME ( param_names , offset ) )),
833838 default_value_ast , attributes_ast , NULL , NULL );
834839
835840 } else if (!Z_ISUNDEF (argv [offset ])) {
836841 // TODO: If the pre-bound parameter is a literal, it can be a
837842 // literal in the function body instead of a lexical var.
838843 zend_ast * lexical_var_ast = zend_ast_create_zval_from_str (
839- zend_string_copy (param_names [ offset ] ));
844+ zend_string_copy (ZP_PARAM_NAME ( param_names , offset ) ));
840845 if (zp_arg_must_be_sent_by_ref (function , offset + 1 )) {
841846 lexical_var_ast -> attr = ZEND_BIND_REF ;
842847 }
@@ -852,7 +857,7 @@ static zend_op_array *zp_compile(zval *this_ptr, zend_function *function,
852857
853858 if (extra_named_params ) {
854859 zend_ast * lexical_var_ast = zend_ast_create_zval_from_str (
855- zend_string_copy (param_names [ argc + uses_variadic_placeholder ] ));
860+ zend_string_copy (ZP_EXTRA_NAMED_PARAMS_LEXICAL_NAME ( param_names ) ));
856861 lexical_vars_ast = zend_ast_list_add (lexical_vars_ast , lexical_var_ast );
857862 }
858863
@@ -870,7 +875,7 @@ static zend_op_array *zp_compile(zval *this_ptr, zend_function *function,
870875 params_ast = zend_ast_list_add (params_ast , zend_ast_create_ex (ZEND_AST_PARAM ,
871876 param_flags , param_type_ast ,
872877 zend_ast_create_zval_from_str (
873- zend_string_copy (param_names [ argc ] )),
878+ zend_string_copy (ZP_VARIADIC_PARAM_NAME ( param_names ) )),
874879 NULL , attributes_ast , NULL , NULL ));
875880 }
876881
0 commit comments