Skip to content

Commit 15efa98

Browse files
Merge branch 'PHP-7.1' into PHP-7.2
2 parents 7e21f47 + 4372293 commit 15efa98

File tree

3 files changed

+38
-3
lines changed

3 files changed

+38
-3
lines changed

NEWS

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ PHP NEWS
55
- Core
66
. Fixed bug #75220 (Segfault when calling is_callable on parent).
77
(andrewnester)
8+
. Fixed bug #75290 (debug info of Closures of internal functions contain
9+
garbage argument names). (Andrea)
810

911
- Date:
1012
. Fixed bug #75222 (DateInterval microseconds property always 0). (jhdxr)

Zend/tests/bug75290.phpt

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
--TEST--
2+
Bug #75290 (debug info of Closures of internal functions contain garbage argument names)
3+
--FILE--
4+
<?php
5+
6+
var_dump((new ReflectionFunction('sin'))->getClosure());
7+
8+
var_dump(function ($someThing) {});
9+
10+
?>
11+
--EXPECT--
12+
object(Closure)#2 (1) {
13+
["parameter"]=>
14+
array(1) {
15+
["$number"]=>
16+
string(10) "<required>"
17+
}
18+
}
19+
object(Closure)#2 (1) {
20+
["parameter"]=>
21+
array(1) {
22+
["$someThing"]=>
23+
string(10) "<required>"
24+
}
25+
}
26+

Zend/zend_closures.c

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -500,6 +500,7 @@ static HashTable *zend_closure_get_debug_info(zval *object, int *is_temp) /* {{{
500500
zval val;
501501
struct _zend_arg_info *arg_info = closure->func.common.arg_info;
502502
HashTable *debug_info;
503+
zend_bool zstr_args = (closure->func.type == ZEND_USER_FUNCTION) || (closure->func.common.fn_flags & ZEND_ACC_USER_ARG_INFO);
503504

504505
*is_temp = 1;
505506

@@ -532,9 +533,15 @@ static HashTable *zend_closure_get_debug_info(zval *object, int *is_temp) /* {{{
532533
zend_string *name;
533534
zval info;
534535
if (arg_info->name) {
535-
name = zend_strpprintf(0, "%s$%s",
536-
arg_info->pass_by_reference ? "&" : "",
537-
ZSTR_VAL(arg_info->name));
536+
if (zstr_args) {
537+
name = zend_strpprintf(0, "%s$%s",
538+
arg_info->pass_by_reference ? "&" : "",
539+
ZSTR_VAL(arg_info->name));
540+
} else {
541+
name = zend_strpprintf(0, "%s$%s",
542+
arg_info->pass_by_reference ? "&" : "",
543+
((zend_internal_arg_info*)arg_info)->name);
544+
}
538545
} else {
539546
name = zend_strpprintf(0, "%s$param%d",
540547
arg_info->pass_by_reference ? "&" : "",

0 commit comments

Comments
 (0)