Skip to content

Commit 8514af4

Browse files
committed
Reuse zp_argument_error()
1 parent 65fd2c6 commit 8514af4

5 files changed

Lines changed: 58 additions & 34 deletions

File tree

Zend/zend_API.c

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -374,7 +374,9 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_unexpected_extra_named_error(void)
374374
class_name, space, get_active_function_name());
375375
}
376376

377-
ZEND_API ZEND_COLD void ZEND_FASTCALL zend_argument_error_variadic(zend_class_entry *error_ce, uint32_t arg_num, const char *format, va_list va) /* {{{ */
377+
ZEND_API ZEND_COLD void ZEND_FASTCALL zend_argument_error_variadic_ex(
378+
const zend_function *function, uint32_t arg_num,
379+
zend_class_entry *error_ce, const char *format, va_list va)
378380
{
379381
zend_string *func_name;
380382
const char *arg_name;
@@ -383,8 +385,8 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_argument_error_variadic(zend_class_en
383385
return;
384386
}
385387

386-
func_name = get_active_function_or_method_name();
387-
arg_name = get_active_function_arg_name(arg_num);
388+
func_name = get_function_or_method_name(function);
389+
arg_name = get_function_arg_name(function, arg_num);
388390

389391
zend_vspprintf(&message, 0, format, va);
390392
zend_throw_error(error_ce, "%s(): Argument #%d%s%s%s %s",
@@ -394,8 +396,27 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_argument_error_variadic(zend_class_en
394396
efree(message);
395397
zend_string_release(func_name);
396398
}
399+
400+
ZEND_API ZEND_COLD void ZEND_FASTCALL zend_argument_error_variadic(zend_class_entry *error_ce, uint32_t arg_num, const char *format, va_list va) /* {{{ */
401+
{
402+
ZEND_ASSERT(zend_is_executing());
403+
404+
const zend_function *function = zend_active_function();
405+
406+
zend_argument_error_variadic_ex(function, arg_num, error_ce, format, va);
407+
}
397408
/* }}} */
398409

410+
ZEND_API ZEND_COLD void zend_argument_error_ex(const zend_function *function,
411+
uint32_t arg_num, zend_class_entry *error_ce, const char *format, ...)
412+
{
413+
va_list va;
414+
415+
va_start(va, format);
416+
zend_argument_error_variadic_ex(function, arg_num, error_ce, format, va);
417+
va_end(va);
418+
}
419+
399420
ZEND_API ZEND_COLD void zend_argument_error(zend_class_entry *error_ce, uint32_t arg_num, const char *format, ...) /* {{{ */
400421
{
401422
va_list va;
@@ -406,6 +427,18 @@ ZEND_API ZEND_COLD void zend_argument_error(zend_class_entry *error_ce, uint32_t
406427
}
407428
/* }}} */
408429

430+
ZEND_API ZEND_COLD void zend_argument_type_error_ex(
431+
const zend_function *function, uint32_t arg_num,
432+
const char *format, ...)
433+
{
434+
va_list va;
435+
436+
va_start(va, format);
437+
zend_argument_error_variadic_ex(function, arg_num,
438+
zend_ce_type_error, format, va);
439+
va_end(va);
440+
}
441+
409442
ZEND_API ZEND_COLD void zend_argument_type_error(uint32_t arg_num, const char *format, ...) /* {{{ */
410443
{
411444
va_list va;

Zend/zend_API.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1560,13 +1560,22 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_error(uint32_t num, ch
15601560
ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_or_null_error(uint32_t num, char *error);
15611561
ZEND_API ZEND_COLD void ZEND_FASTCALL zend_unexpected_extra_named_error(void);
15621562
ZEND_API ZEND_COLD void ZEND_FASTCALL zend_argument_error_variadic(zend_class_entry *error_ce, uint32_t arg_num, const char *format, va_list va);
1563+
ZEND_API ZEND_COLD void ZEND_FASTCALL zend_argument_error_variadic_ex(
1564+
const zend_function *function, uint32_t arg_num,
1565+
zend_class_entry *error_ce, const char *format, va_list va);
15631566
ZEND_API ZEND_COLD void zend_argument_error(zend_class_entry *error_ce, uint32_t arg_num, const char *format, ...);
1567+
ZEND_API ZEND_COLD void zend_argument_error_ex(const zend_function *function,
1568+
uint32_t arg_num, zend_class_entry *error_ce, const char *format, ...);
15641569
ZEND_API ZEND_COLD void zend_argument_type_error(uint32_t arg_num, const char *format, ...);
1570+
ZEND_API ZEND_COLD void zend_argument_type_error_ex(
1571+
const zend_function *function, uint32_t arg_num,
1572+
const char *format, ...);
15651573
ZEND_API ZEND_COLD void zend_argument_value_error(uint32_t arg_num, const char *format, ...);
15661574
ZEND_API ZEND_COLD void zend_argument_must_not_be_empty_error(uint32_t arg_num);
15671575
ZEND_API ZEND_COLD void zend_class_redeclaration_error(int type, const zend_class_entry *old_ce);
15681576
ZEND_API ZEND_COLD void zend_class_redeclaration_error_ex(int type, zend_string *new_name, const zend_class_entry *old_ce);
15691577

1578+
15701579
#define ZPP_ERROR_OK 0
15711580
#define ZPP_ERROR_FAILURE 1
15721581
#define ZPP_ERROR_WRONG_CALLBACK 2

Zend/zend_partial.c

Lines changed: 4 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -363,28 +363,6 @@ static zend_ast *zp_type_to_ast(const zend_type type)
363363
return zp_simple_type_to_ast(type_mask);
364364
}
365365

366-
/* Can not use zend_argument_error() as the function is not on the stack */
367-
static zend_never_inline ZEND_COLD void zp_argument_error(zend_class_entry *error_ce,
368-
zend_function *function, uint32_t arg_num, const char *format, ...)
369-
{
370-
zend_string *func_name = get_function_or_method_name(function);
371-
const char *arg_name = get_function_arg_name(function, arg_num);
372-
373-
char *message = NULL;
374-
375-
va_list va;
376-
va_start(va, format);
377-
zend_vspprintf(&message, 0, format, va);
378-
va_end(va);
379-
380-
zend_throw_error(error_ce, "%s(): Argument #%d%s%s%s %s",
381-
ZSTR_VAL(func_name), arg_num,
382-
arg_name ? " ($" : "", arg_name ? arg_name : "", arg_name ? ")" : "", message
383-
);
384-
efree(message);
385-
zend_string_release(func_name);
386-
}
387-
388366
static zend_result zp_get_param_default_value(zval *result, zend_function *function, uint32_t arg_offset)
389367
{
390368
ZEND_ASSERT(arg_offset < function->common.num_args);
@@ -410,7 +388,8 @@ static zend_result zp_get_param_default_value(zval *result, zend_function *funct
410388
}
411389

412390
error:
413-
zp_argument_error(zend_ce_argument_count_error, function, arg_offset + 1,
391+
zend_argument_error_ex(function, arg_offset + 1,
392+
zend_ce_argument_count_error,
414393
"must be passed explicitly, because the default value is not known");
415394

416395
return FAILURE;
@@ -544,8 +523,8 @@ static zend_ast *zp_compile_forwarding_call(
544523
/* Required param was not passed. This can happen due to named
545524
* args. Using the same exception CE and message as
546525
* zend_handle_undef_args(). */
547-
zp_argument_error(zend_ce_argument_count_error, function,
548-
offset + 1, "not passed");
526+
zend_argument_error_ex(function, offset + 1,
527+
zend_ce_argument_count_error, "not passed");
549528
goto error;
550529
}
551530
zval default_value;

Zend/zend_vm_def.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8892,9 +8892,10 @@ ZEND_VM_HOT_HANDLER(211, ZEND_TYPE_ASSERT, CONST, ANY, NUM)
88928892
zend_arg_info *arginfo = &fbc->common.arg_info[argno - 1];
88938893

88948894
if (!zend_check_type(&arginfo->type, value, /* is_return_type */ false, /* is_internal */ true)) {
8895-
const char *param_name = get_function_arg_name(fbc, argno);
88968895
zend_string *expected = zend_type_to_string(arginfo->type);
8897-
zend_type_error("%s(): Argument #%d%s%s%s must be of type %s, %s given", ZSTR_VAL(fbc->common.function_name), argno, param_name ? " ($" : "", param_name ? param_name : "", param_name ? ")" : "", ZSTR_VAL(expected), zend_zval_value_name(value));
8896+
zend_argument_type_error_ex(fbc, argno,
8897+
"must be of type %s, %s given",
8898+
ZSTR_VAL(expected), zend_zval_value_name(value));
88988899
zend_string_release(expected);
88998900
}
89008901
}

Zend/zend_vm_execute.h

Lines changed: 6 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)