Skip to content

Commit 18ddd11

Browse files
committed
Handle a few more cases in the fast-path
1 parent 1942986 commit 18ddd11

File tree

1 file changed

+29
-4
lines changed

1 file changed

+29
-4
lines changed

ext/reflection/php_reflection.c

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -573,6 +573,7 @@ static zend_op* _get_recv_op(zend_op_array *op_array, uint32_t offset)
573573
}
574574
++op;
575575
}
576+
ZEND_ASSERT(0 && "Failed to find op");
576577
return NULL;
577578
}
578579
/* }}} */
@@ -1356,6 +1357,19 @@ static int get_default_via_ast(zval *default_value_zval, const char *default_val
13561357
return SUCCESS;
13571358
}
13581359

1360+
static zend_string *try_parse_string(const char *str, size_t len, char quote) {
1361+
if (len == 0) {
1362+
return ZSTR_EMPTY_ALLOC();
1363+
}
1364+
1365+
for (size_t i = 0; i < len; i++) {
1366+
if (str[i] == '\\' || str[i] == quote) {
1367+
return NULL;
1368+
}
1369+
}
1370+
return zend_string_init(str, len, 0);
1371+
}
1372+
13591373
/* {{{ _reflection_param_get_default_arg_info */
13601374
static int _reflection_param_get_default_arg_info(zend_internal_arg_info *arg_info, zval *default_value_zval)
13611375
{
@@ -1380,16 +1394,27 @@ static int _reflection_param_get_default_arg_info(zend_internal_arg_info *arg_in
13801394
&& !memcmp(default_value, "false", sizeof("false")-1)) {
13811395
ZVAL_FALSE(default_value_zval);
13821396
return SUCCESS;
1383-
} else if (default_value_len == sizeof("\"\"")-1
1384-
&& (!memcmp(default_value, "\"\"", sizeof("\"\"")-1)
1385-
|| !memcmp(default_value, "''", sizeof("''")-1))) {
1386-
ZVAL_EMPTY_STRING(default_value_zval);
1397+
} else if (default_value_len >= 2
1398+
&& (default_value[0] == '\'' || default_value[0] == '"')
1399+
&& default_value[default_value_len - 1] == default_value[0]) {
1400+
zend_string *str = try_parse_string(
1401+
default_value + 1, default_value_len - 2, default_value[0]);
1402+
if (str) {
1403+
ZVAL_STR(default_value_zval, str);
1404+
return SUCCESS;
1405+
}
1406+
} else if (default_value_len == sizeof("[]")-1
1407+
&& !memcmp(default_value, "[]", sizeof("[]")-1)) {
1408+
ZVAL_EMPTY_ARRAY(default_value_zval);
13871409
return SUCCESS;
13881410
} else if (ZEND_HANDLE_NUMERIC_STR(default_value, default_value_len, lval)) {
13891411
ZVAL_LONG(default_value_zval, lval);
13901412
return SUCCESS;
13911413
}
13921414

1415+
#if 0
1416+
fprintf(stderr, "Evaluating %s via AST\n", default_value);
1417+
#endif
13931418
return get_default_via_ast(default_value_zval, default_value);
13941419
}
13951420

0 commit comments

Comments
 (0)