Skip to content

Commit d778038

Browse files
committed
Merge pull request php#11 from TazeTSchnitzel/function-autoloading-7
Implement function autoloading
2 parents e811067 + 9038251 commit d778038

File tree

5 files changed

+40
-97
lines changed

5 files changed

+40
-97
lines changed

Zend/zend_API.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2915,7 +2915,7 @@ static int zend_is_callable_check_func(int check_flags, zval *callable, zend_fca
29152915
}
29162916
/* Check if function with given name exists.
29172917
* This may be a compound name that includes namespace name */
2918-
if (EXPECTED((fcc->function_handler = zend_hash_find_ptr(EG(function_table), lmname)) != NULL)) {
2918+
if (EXPECTED(ZEND_LOOKUP_FUNCTION_BY_NAME(lmname, fcc->function_handler))) {
29192919
if (lmname != Z_STR_P(callable)) {
29202920
STR_ALLOCA_FREE(lmname, use_heap);
29212921
}

Zend/zend_builtin_functions.c

Lines changed: 16 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,7 @@ ZEND_END_ARG_INFO()
182182

183183
ZEND_BEGIN_ARG_INFO_EX(arginfo_function_exists, 0, 0, 1)
184184
ZEND_ARG_INFO(0, function_name)
185+
ZEND_ARG_INFO(0, autoload)
185186
ZEND_END_ARG_INFO()
186187

187188
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_alias, 0, 0, 2)
@@ -246,13 +247,13 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_extension_loaded, 0, 0, 1)
246247
ZEND_END_ARG_INFO()
247248

248249
ZEND_BEGIN_ARG_INFO_EX(arginfo_autoload_register, 0, 0, 1)
249-
ZEND_ARG_INFO(0, callback)
250-
ZEND_ARG_INFO(0, type)
251-
ZEND_ARG_INFO(0, prepend)
250+
ZEND_ARG_INFO(0, callback)
251+
ZEND_ARG_INFO(0, type)
252+
ZEND_ARG_INFO(0, prepend)
252253
ZEND_END_ARG_INFO()
253254

254255
ZEND_BEGIN_ARG_INFO_EX(arginfo_autoload_unregister, 0, 0, 1)
255-
ZEND_ARG_INFO(0, callback)
256+
ZEND_ARG_INFO(0, callback)
256257
ZEND_END_ARG_INFO()
257258
/* }}} */
258259

@@ -324,8 +325,8 @@ static const zend_function_entry builtin_functions[] = { /* {{{ */
324325
ZEND_FE(gc_enabled, arginfo_zend__void)
325326
ZEND_FE(gc_enable, arginfo_zend__void)
326327
ZEND_FE(gc_disable, arginfo_zend__void)
327-
ZEND_NS_FE("php", autoload_register, arginfo_autoload_register)
328-
ZEND_NS_FE("php", autoload_unregister, arginfo_autoload_unregister)
328+
ZEND_NS_FE("php", autoload_register, arginfo_autoload_register)
329+
ZEND_NS_FE("php", autoload_unregister, arginfo_autoload_unregister)
329330
ZEND_FE_END
330331
};
331332
/* }}} */
@@ -1447,36 +1448,27 @@ ZEND_FUNCTION(trait_exists)
14471448
}
14481449
/* }}} */
14491450

1450-
/* {{{ proto bool function_exists(string function_name)
1451+
/* {{{ proto bool function_exists(string function_name[, autoload = 1])
14511452
Checks if the function exists */
14521453
ZEND_FUNCTION(function_exists)
14531454
{
1454-
char *name;
1455-
size_t name_len;
1455+
zend_string *name;
14561456
zend_function *func;
1457-
zend_string *lcname;
1457+
zend_bool autoload = 1;
14581458

14591459
#ifndef FAST_ZPP
1460-
if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &name, &name_len) == FAILURE) {
1460+
if (zend_parse_parameters(ZEND_NUM_ARGS(), "S|b", &name, &autoload) == FAILURE) {
14611461
return;
14621462
}
14631463
#else
1464-
ZEND_PARSE_PARAMETERS_START(1, 1)
1465-
Z_PARAM_STRING(name, name_len)
1464+
ZEND_PARSE_PARAMETERS_START(1, 2)
1465+
Z_PARAM_STR(name)
1466+
Z_PARAM_OPTIONAL
1467+
Z_PARAM_BOOL(autoload)
14661468
ZEND_PARSE_PARAMETERS_END();
14671469
#endif
14681470

1469-
if (name[0] == '\\') {
1470-
/* Ignore leading "\" */
1471-
lcname = zend_string_alloc(name_len - 1, 0);
1472-
zend_str_tolower_copy(lcname->val, name + 1, name_len - 1);
1473-
} else {
1474-
lcname = zend_string_alloc(name_len, 0);
1475-
zend_str_tolower_copy(lcname->val, name, name_len);
1476-
}
1477-
1478-
func = zend_hash_find_ptr(EG(function_table), lcname);
1479-
zend_string_free(lcname);
1471+
func = zend_lookup_function_ex(name, NULL, autoload);
14801472

14811473
/*
14821474
* A bit of a hack, but not a bad one: we see if the handler of the function

Zend/zend_interfaces.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,11 @@ ZEND_API zval* zend_call_method(zval *object, zend_class_entry *obj_ce, zend_fun
7777
}
7878
if (!fn_proxy || !*fn_proxy) {
7979
if ((fcic.function_handler = zend_hash_find_ptr(function_table, Z_STR(fci.function_name))) == NULL) {
80-
/* error at c-level */
81-
zend_error(E_CORE_ERROR, "Couldn't find implementation for method %s%s%s", obj_ce ? obj_ce->name->val : "", obj_ce ? "::" : "", function_name);
80+
/* try autoload before erroring */
81+
if (!obj_ce && !zend_lookup_function(Z_STR(fci.function_name))) {
82+
/* error at c-level */
83+
zend_error(E_CORE_ERROR, "Couldn't find implementation for method %s%s%s", obj_ce ? obj_ce->name->val : "", obj_ce ? "::" : "", function_name);
84+
}
8285
}
8386
if (fn_proxy) {
8487
*fn_proxy = fcic.function_handler;

Zend/zend_vm_def.h

Lines changed: 6 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2485,17 +2485,16 @@ ZEND_VM_HANDLER(59, ZEND_INIT_FCALL_BY_NAME, ANY, CONST|TMPVAR|CV)
24852485
{
24862486
USE_OPLINE
24872487
zend_function *fbc;
2488-
zval *function_name, *func;
2488+
zval *function_name;
24892489

24902490
if (OP2_TYPE == IS_CONST && Z_TYPE_P(EX_CONSTANT(opline->op2)) == IS_STRING) {
24912491
function_name = (zval*)(EX_CONSTANT(opline->op2)+1);
24922492
if (CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) {
24932493
fbc = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)));
2494-
} else if (UNEXPECTED((func = zend_hash_find(EG(function_table), Z_STR_P(function_name))) == NULL)) {
2494+
} else if (UNEXPECTED(!ZEND_LOOKUP_FUNCTION_BY_NAME(Z_STR_P(function_name), fbc))) {
24952495
SAVE_OPLINE();
24962496
zend_error_noreturn(E_ERROR, "Call to undefined function %s()", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
24972497
} else {
2498-
fbc = Z_FUNC_P(func);
24992498
CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), fbc);
25002499
}
25012500

@@ -2505,7 +2504,6 @@ ZEND_VM_HANDLER(59, ZEND_INIT_FCALL_BY_NAME, ANY, CONST|TMPVAR|CV)
25052504
/*CHECK_EXCEPTION();*/
25062505
ZEND_VM_NEXT_OPCODE();
25072506
} else {
2508-
zend_string *lcname;
25092507
zend_free_op free_op2;
25102508
zend_class_entry *called_scope;
25112509
zend_object *object;
@@ -2515,20 +2513,11 @@ ZEND_VM_HANDLER(59, ZEND_INIT_FCALL_BY_NAME, ANY, CONST|TMPVAR|CV)
25152513

25162514
ZEND_VM_C_LABEL(try_function_name):
25172515
if (OP2_TYPE != IS_CONST && EXPECTED(Z_TYPE_P(function_name) == IS_STRING)) {
2518-
if (Z_STRVAL_P(function_name)[0] == '\\') {
2519-
lcname = zend_string_alloc(Z_STRLEN_P(function_name) - 1, 0);
2520-
zend_str_tolower_copy(lcname->val, Z_STRVAL_P(function_name) + 1, Z_STRLEN_P(function_name) - 1);
2521-
} else {
2522-
lcname = zend_string_alloc(Z_STRLEN_P(function_name), 0);
2523-
zend_str_tolower_copy(lcname->val, Z_STRVAL_P(function_name), Z_STRLEN_P(function_name));
2524-
}
2525-
if (UNEXPECTED((func = zend_hash_find(EG(function_table), lcname)) == NULL)) {
2516+
if (UNEXPECTED(!ZEND_LOOKUP_FUNCTION_BY_NAME(Z_STR_P(function_name), fbc))) {
25262517
zend_error_noreturn(E_ERROR, "Call to undefined function %s()", Z_STRVAL_P(function_name));
25272518
}
2528-
zend_string_free(lcname);
25292519
FREE_OP2();
25302520

2531-
fbc = Z_FUNC_P(func);
25322521
called_scope = NULL;
25332522
object = NULL;
25342523
} else if (OP2_TYPE != IS_CONST &&
@@ -2692,17 +2681,15 @@ ZEND_VM_HANDLER(69, ZEND_INIT_NS_FCALL_BY_NAME, ANY, CONST)
26922681
func_name = EX_CONSTANT(opline->op2) + 1;
26932682
if (CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) {
26942683
fbc = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)));
2695-
} else if ((func = zend_hash_find(EG(function_table), Z_STR_P(func_name))) == NULL) {
2684+
} else if (!ZEND_LOOKUP_FUNCTION_BY_NAME(Z_STR_P(func_name), fbc)) {
26962685
func_name++;
2697-
if (UNEXPECTED((func = zend_hash_find(EG(function_table), Z_STR_P(func_name))) == NULL)) {
2686+
if (!ZEND_LOOKUP_FUNCTION_BY_NAME(Z_STR_P(func_name), fbc)) {
26982687
SAVE_OPLINE();
26992688
zend_error_noreturn(E_ERROR, "Call to undefined function %s()", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
27002689
} else {
2701-
fbc = Z_FUNC_P(func);
27022690
CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), fbc);
27032691
}
27042692
} else {
2705-
fbc = Z_FUNC_P(func);
27062693
CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), fbc);
27072694
}
27082695

@@ -2717,16 +2704,14 @@ ZEND_VM_HANDLER(61, ZEND_INIT_FCALL, ANY, CONST)
27172704
USE_OPLINE
27182705
zend_free_op free_op2;
27192706
zval *fname = GET_OP2_ZVAL_PTR(BP_VAR_R);
2720-
zval *func;
27212707
zend_function *fbc;
27222708

27232709
if (CACHED_PTR(Z_CACHE_SLOT_P(fname))) {
27242710
fbc = CACHED_PTR(Z_CACHE_SLOT_P(fname));
2725-
} else if (UNEXPECTED((func = zend_hash_find(EG(function_table), Z_STR_P(fname))) == NULL)) {
2711+
} else if (UNEXPECTED(!ZEND_LOOKUP_FUNCTION_BY_NAME(Z_STR_P(fname), fbc))) {
27262712
SAVE_OPLINE();
27272713
zend_error_noreturn(E_ERROR, "Call to undefined function %s()", Z_STRVAL_P(fname));
27282714
} else {
2729-
fbc = Z_FUNC_P(func);
27302715
CACHE_PTR(Z_CACHE_SLOT_P(fname), fbc);
27312716
}
27322717

Zend/zend_vm_execute.h

Lines changed: 12 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1541,17 +1541,16 @@ static int ZEND_FASTCALL ZEND_INIT_FCALL_BY_NAME_SPEC_CONST_HANDLER(ZEND_OPCODE
15411541
{
15421542
USE_OPLINE
15431543
zend_function *fbc;
1544-
zval *function_name, *func;
1544+
zval *function_name;
15451545

15461546
if (IS_CONST == IS_CONST && Z_TYPE_P(EX_CONSTANT(opline->op2)) == IS_STRING) {
15471547
function_name = (zval*)(EX_CONSTANT(opline->op2)+1);
15481548
if (CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) {
15491549
fbc = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)));
1550-
} else if (UNEXPECTED((func = zend_hash_find(EG(function_table), Z_STR_P(function_name))) == NULL)) {
1550+
} else if (UNEXPECTED(!ZEND_LOOKUP_FUNCTION_BY_NAME(Z_STR_P(function_name), fbc))) {
15511551
SAVE_OPLINE();
15521552
zend_error_noreturn(E_ERROR, "Call to undefined function %s()", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
15531553
} else {
1554-
fbc = Z_FUNC_P(func);
15551554
CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), fbc);
15561555
}
15571556

@@ -1561,7 +1560,6 @@ static int ZEND_FASTCALL ZEND_INIT_FCALL_BY_NAME_SPEC_CONST_HANDLER(ZEND_OPCODE
15611560
/*CHECK_EXCEPTION();*/
15621561
ZEND_VM_NEXT_OPCODE();
15631562
} else {
1564-
zend_string *lcname;
15651563
zend_free_op free_op2;
15661564
zend_class_entry *called_scope;
15671565
zend_object *object;
@@ -1571,19 +1569,10 @@ static int ZEND_FASTCALL ZEND_INIT_FCALL_BY_NAME_SPEC_CONST_HANDLER(ZEND_OPCODE
15711569

15721570
try_function_name:
15731571
if (IS_CONST != IS_CONST && EXPECTED(Z_TYPE_P(function_name) == IS_STRING)) {
1574-
if (Z_STRVAL_P(function_name)[0] == '\\') {
1575-
lcname = zend_string_alloc(Z_STRLEN_P(function_name) - 1, 0);
1576-
zend_str_tolower_copy(lcname->val, Z_STRVAL_P(function_name) + 1, Z_STRLEN_P(function_name) - 1);
1577-
} else {
1578-
lcname = zend_string_alloc(Z_STRLEN_P(function_name), 0);
1579-
zend_str_tolower_copy(lcname->val, Z_STRVAL_P(function_name), Z_STRLEN_P(function_name));
1580-
}
1581-
if (UNEXPECTED((func = zend_hash_find(EG(function_table), lcname)) == NULL)) {
1572+
if (UNEXPECTED(!ZEND_LOOKUP_FUNCTION_BY_NAME(Z_STR_P(function_name), fbc))) {
15821573
zend_error_noreturn(E_ERROR, "Call to undefined function %s()", Z_STRVAL_P(function_name));
15831574
}
1584-
zend_string_free(lcname);
15851575

1586-
fbc = Z_FUNC_P(func);
15871576
called_scope = NULL;
15881577
object = NULL;
15891578
} else if (IS_CONST != IS_CONST &&
@@ -1693,17 +1682,15 @@ static int ZEND_FASTCALL ZEND_INIT_NS_FCALL_BY_NAME_SPEC_CONST_HANDLER(ZEND_OPC
16931682
func_name = EX_CONSTANT(opline->op2) + 1;
16941683
if (CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) {
16951684
fbc = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)));
1696-
} else if ((func = zend_hash_find(EG(function_table), Z_STR_P(func_name))) == NULL) {
1685+
} else if (!ZEND_LOOKUP_FUNCTION_BY_NAME(Z_STR_P(func_name), fbc)) {
16971686
func_name++;
1698-
if (UNEXPECTED((func = zend_hash_find(EG(function_table), Z_STR_P(func_name))) == NULL)) {
1687+
if (!ZEND_LOOKUP_FUNCTION_BY_NAME(Z_STR_P(func_name), fbc)) {
16991688
SAVE_OPLINE();
17001689
zend_error_noreturn(E_ERROR, "Call to undefined function %s()", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
17011690
} else {
1702-
fbc = Z_FUNC_P(func);
17031691
CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), fbc);
17041692
}
17051693
} else {
1706-
fbc = Z_FUNC_P(func);
17071694
CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), fbc);
17081695
}
17091696

@@ -1718,16 +1705,14 @@ static int ZEND_FASTCALL ZEND_INIT_FCALL_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER
17181705
USE_OPLINE
17191706

17201707
zval *fname = EX_CONSTANT(opline->op2);
1721-
zval *func;
17221708
zend_function *fbc;
17231709

17241710
if (CACHED_PTR(Z_CACHE_SLOT_P(fname))) {
17251711
fbc = CACHED_PTR(Z_CACHE_SLOT_P(fname));
1726-
} else if (UNEXPECTED((func = zend_hash_find(EG(function_table), Z_STR_P(fname))) == NULL)) {
1712+
} else if (UNEXPECTED(!ZEND_LOOKUP_FUNCTION_BY_NAME(Z_STR_P(fname), fbc))) {
17271713
SAVE_OPLINE();
17281714
zend_error_noreturn(E_ERROR, "Call to undefined function %s()", Z_STRVAL_P(fname));
17291715
} else {
1730-
fbc = Z_FUNC_P(func);
17311716
CACHE_PTR(Z_CACHE_SLOT_P(fname), fbc);
17321717
}
17331718

@@ -1925,17 +1910,16 @@ static int ZEND_FASTCALL ZEND_INIT_FCALL_BY_NAME_SPEC_CV_HANDLER(ZEND_OPCODE_HA
19251910
{
19261911
USE_OPLINE
19271912
zend_function *fbc;
1928-
zval *function_name, *func;
1913+
zval *function_name;
19291914

19301915
if (IS_CV == IS_CONST && Z_TYPE_P(EX_CONSTANT(opline->op2)) == IS_STRING) {
19311916
function_name = (zval*)(EX_CONSTANT(opline->op2)+1);
19321917
if (CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) {
19331918
fbc = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)));
1934-
} else if (UNEXPECTED((func = zend_hash_find(EG(function_table), Z_STR_P(function_name))) == NULL)) {
1919+
} else if (UNEXPECTED(!ZEND_LOOKUP_FUNCTION_BY_NAME(Z_STR_P(function_name), fbc))) {
19351920
SAVE_OPLINE();
19361921
zend_error_noreturn(E_ERROR, "Call to undefined function %s()", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
19371922
} else {
1938-
fbc = Z_FUNC_P(func);
19391923
CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), fbc);
19401924
}
19411925

@@ -1945,7 +1929,6 @@ static int ZEND_FASTCALL ZEND_INIT_FCALL_BY_NAME_SPEC_CV_HANDLER(ZEND_OPCODE_HA
19451929
/*CHECK_EXCEPTION();*/
19461930
ZEND_VM_NEXT_OPCODE();
19471931
} else {
1948-
zend_string *lcname;
19491932
zend_free_op free_op2;
19501933
zend_class_entry *called_scope;
19511934
zend_object *object;
@@ -1955,19 +1938,10 @@ static int ZEND_FASTCALL ZEND_INIT_FCALL_BY_NAME_SPEC_CV_HANDLER(ZEND_OPCODE_HA
19551938

19561939
try_function_name:
19571940
if (IS_CV != IS_CONST && EXPECTED(Z_TYPE_P(function_name) == IS_STRING)) {
1958-
if (Z_STRVAL_P(function_name)[0] == '\\') {
1959-
lcname = zend_string_alloc(Z_STRLEN_P(function_name) - 1, 0);
1960-
zend_str_tolower_copy(lcname->val, Z_STRVAL_P(function_name) + 1, Z_STRLEN_P(function_name) - 1);
1961-
} else {
1962-
lcname = zend_string_alloc(Z_STRLEN_P(function_name), 0);
1963-
zend_str_tolower_copy(lcname->val, Z_STRVAL_P(function_name), Z_STRLEN_P(function_name));
1964-
}
1965-
if (UNEXPECTED((func = zend_hash_find(EG(function_table), lcname)) == NULL)) {
1941+
if (UNEXPECTED(!ZEND_LOOKUP_FUNCTION_BY_NAME(Z_STR_P(function_name), fbc))) {
19661942
zend_error_noreturn(E_ERROR, "Call to undefined function %s()", Z_STRVAL_P(function_name));
19671943
}
1968-
zend_string_free(lcname);
19691944

1970-
fbc = Z_FUNC_P(func);
19711945
called_scope = NULL;
19721946
object = NULL;
19731947
} else if (IS_CV != IS_CONST &&
@@ -2115,17 +2089,16 @@ static int ZEND_FASTCALL ZEND_INIT_FCALL_BY_NAME_SPEC_TMPVAR_HANDLER(ZEND_OPCOD
21152089
{
21162090
USE_OPLINE
21172091
zend_function *fbc;
2118-
zval *function_name, *func;
2092+
zval *function_name;
21192093

21202094
if ((IS_TMP_VAR|IS_VAR) == IS_CONST && Z_TYPE_P(EX_CONSTANT(opline->op2)) == IS_STRING) {
21212095
function_name = (zval*)(EX_CONSTANT(opline->op2)+1);
21222096
if (CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) {
21232097
fbc = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)));
2124-
} else if (UNEXPECTED((func = zend_hash_find(EG(function_table), Z_STR_P(function_name))) == NULL)) {
2098+
} else if (UNEXPECTED(!ZEND_LOOKUP_FUNCTION_BY_NAME(Z_STR_P(function_name), fbc))) {
21252099
SAVE_OPLINE();
21262100
zend_error_noreturn(E_ERROR, "Call to undefined function %s()", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
21272101
} else {
2128-
fbc = Z_FUNC_P(func);
21292102
CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), fbc);
21302103
}
21312104

@@ -2135,7 +2108,6 @@ static int ZEND_FASTCALL ZEND_INIT_FCALL_BY_NAME_SPEC_TMPVAR_HANDLER(ZEND_OPCOD
21352108
/*CHECK_EXCEPTION();*/
21362109
ZEND_VM_NEXT_OPCODE();
21372110
} else {
2138-
zend_string *lcname;
21392111
zend_free_op free_op2;
21402112
zend_class_entry *called_scope;
21412113
zend_object *object;
@@ -2145,20 +2117,11 @@ static int ZEND_FASTCALL ZEND_INIT_FCALL_BY_NAME_SPEC_TMPVAR_HANDLER(ZEND_OPCOD
21452117

21462118
try_function_name:
21472119
if ((IS_TMP_VAR|IS_VAR) != IS_CONST && EXPECTED(Z_TYPE_P(function_name) == IS_STRING)) {
2148-
if (Z_STRVAL_P(function_name)[0] == '\\') {
2149-
lcname = zend_string_alloc(Z_STRLEN_P(function_name) - 1, 0);
2150-
zend_str_tolower_copy(lcname->val, Z_STRVAL_P(function_name) + 1, Z_STRLEN_P(function_name) - 1);
2151-
} else {
2152-
lcname = zend_string_alloc(Z_STRLEN_P(function_name), 0);
2153-
zend_str_tolower_copy(lcname->val, Z_STRVAL_P(function_name), Z_STRLEN_P(function_name));
2154-
}
2155-
if (UNEXPECTED((func = zend_hash_find(EG(function_table), lcname)) == NULL)) {
2120+
if (UNEXPECTED(!ZEND_LOOKUP_FUNCTION_BY_NAME(Z_STR_P(function_name), fbc))) {
21562121
zend_error_noreturn(E_ERROR, "Call to undefined function %s()", Z_STRVAL_P(function_name));
21572122
}
2158-
zend_string_free(lcname);
21592123
zval_ptr_dtor_nogc(free_op2);
21602124

2161-
fbc = Z_FUNC_P(func);
21622125
called_scope = NULL;
21632126
object = NULL;
21642127
} else if ((IS_TMP_VAR|IS_VAR) != IS_CONST &&

0 commit comments

Comments
 (0)