mirror of
https://github.com/php/php-src.git
synced 2026-04-17 21:11:02 +02:00
Refetetch function name on exceptional path to allow better code on fast code path.
This commit is contained in:
@@ -780,10 +780,20 @@ ZEND_VM_COLD_HELPER(zend_abstract_method_helper, ANY, ANY, zend_function *fbc)
|
||||
HANDLE_EXCEPTION();
|
||||
}
|
||||
|
||||
ZEND_VM_COLD_HELPER(zend_undefined_function_helper, ANY, ANY, zval *function_name)
|
||||
ZEND_VM_COLD_HELPER(zend_undefined_function_helper, ANY, ANY)
|
||||
{
|
||||
USE_OPLINE
|
||||
zval *function_name;
|
||||
char *name;
|
||||
|
||||
SAVE_OPLINE();
|
||||
zend_throw_error(NULL, "Call to undefined function %s()", Z_STRVAL_P(function_name));
|
||||
function_name = RT_CONSTANT(opline, opline->op2);
|
||||
if (opline->opcode == ZEND_INIT_NS_FCALL_BY_NAME) {
|
||||
name = Z_STRVAL_P(function_name + 2);
|
||||
} else {
|
||||
name = Z_STRVAL_P(function_name);
|
||||
}
|
||||
zend_throw_error(NULL, "Call to undefined function %s()", name);
|
||||
HANDLE_EXCEPTION();
|
||||
}
|
||||
|
||||
@@ -3263,7 +3273,7 @@ ZEND_VM_HOT_HANDLER(59, ZEND_INIT_FCALL_BY_NAME, ANY, CONST, NUM|CACHE_SLOT)
|
||||
function_name = (zval*)RT_CONSTANT(opline, opline->op2);
|
||||
func = zend_hash_find_ex(EG(function_table), Z_STR_P(function_name+1), 1);
|
||||
if (UNEXPECTED(func == NULL)) {
|
||||
ZEND_VM_DISPATCH_TO_HELPER(zend_undefined_function_helper, function_name, function_name);
|
||||
ZEND_VM_DISPATCH_TO_HELPER(zend_undefined_function_helper);
|
||||
}
|
||||
fbc = Z_FUNC_P(func);
|
||||
if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
|
||||
@@ -3426,7 +3436,7 @@ ZEND_VM_HOT_HANDLER(69, ZEND_INIT_NS_FCALL_BY_NAME, ANY, CONST, NUM|CACHE_SLOT)
|
||||
func_name++;
|
||||
func = zend_hash_find_ex(EG(function_table), Z_STR_P(func_name), 1);
|
||||
if (UNEXPECTED(func == NULL)) {
|
||||
ZEND_VM_DISPATCH_TO_HELPER(zend_undefined_function_helper, function_name, func_name);
|
||||
ZEND_VM_DISPATCH_TO_HELPER(zend_undefined_function_helper);
|
||||
}
|
||||
}
|
||||
fbc = Z_FUNC_P(func);
|
||||
@@ -3447,7 +3457,6 @@ ZEND_VM_HOT_HANDLER(69, ZEND_INIT_NS_FCALL_BY_NAME, ANY, CONST, NUM|CACHE_SLOT)
|
||||
ZEND_VM_HOT_HANDLER(61, ZEND_INIT_FCALL, NUM, CONST, NUM|CACHE_SLOT)
|
||||
{
|
||||
USE_OPLINE
|
||||
zend_free_op free_op2;
|
||||
zval *fname;
|
||||
zval *func;
|
||||
zend_function *fbc;
|
||||
@@ -3455,10 +3464,10 @@ ZEND_VM_HOT_HANDLER(61, ZEND_INIT_FCALL, NUM, CONST, NUM|CACHE_SLOT)
|
||||
|
||||
fbc = CACHED_PTR(opline->result.num);
|
||||
if (UNEXPECTED(fbc == NULL)) {
|
||||
fname = GET_OP2_ZVAL_PTR(BP_VAR_R);
|
||||
fname = (zval*)RT_CONSTANT(opline, opline->op2);
|
||||
func = zend_hash_find_ex(EG(function_table), Z_STR_P(fname), 1);
|
||||
if (UNEXPECTED(func == NULL)) {
|
||||
ZEND_VM_DISPATCH_TO_HELPER(zend_undefined_function_helper, function_name, fname);
|
||||
ZEND_VM_DISPATCH_TO_HELPER(zend_undefined_function_helper);
|
||||
}
|
||||
fbc = Z_FUNC_P(func);
|
||||
if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
|
||||
|
||||
@@ -470,10 +470,20 @@ static zend_never_inline ZEND_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_ab
|
||||
HANDLE_EXCEPTION();
|
||||
}
|
||||
|
||||
static zend_never_inline ZEND_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_undefined_function_helper_SPEC(zval *function_name ZEND_OPCODE_HANDLER_ARGS_DC)
|
||||
static zend_never_inline ZEND_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_undefined_function_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS)
|
||||
{
|
||||
USE_OPLINE
|
||||
zval *function_name;
|
||||
char *name;
|
||||
|
||||
SAVE_OPLINE();
|
||||
zend_throw_error(NULL, "Call to undefined function %s()", Z_STRVAL_P(function_name));
|
||||
function_name = RT_CONSTANT(opline, opline->op2);
|
||||
if (opline->opcode == ZEND_INIT_NS_FCALL_BY_NAME) {
|
||||
name = Z_STRVAL_P(function_name + 2);
|
||||
} else {
|
||||
name = Z_STRVAL_P(function_name);
|
||||
}
|
||||
zend_throw_error(NULL, "Call to undefined function %s()", name);
|
||||
HANDLE_EXCEPTION();
|
||||
}
|
||||
|
||||
@@ -2023,7 +2033,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_FCALL_BY_NAME
|
||||
function_name = (zval*)RT_CONSTANT(opline, opline->op2);
|
||||
func = zend_hash_find_ex(EG(function_table), Z_STR_P(function_name+1), 1);
|
||||
if (UNEXPECTED(func == NULL)) {
|
||||
ZEND_VM_TAIL_CALL(zend_undefined_function_helper_SPEC(function_name ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
|
||||
ZEND_VM_TAIL_CALL(zend_undefined_function_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
|
||||
}
|
||||
fbc = Z_FUNC_P(func);
|
||||
if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
|
||||
@@ -2111,7 +2121,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_NS_FCALL_BY_N
|
||||
func_name++;
|
||||
func = zend_hash_find_ex(EG(function_table), Z_STR_P(func_name), 1);
|
||||
if (UNEXPECTED(func == NULL)) {
|
||||
ZEND_VM_TAIL_CALL(zend_undefined_function_helper_SPEC(func_name ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
|
||||
ZEND_VM_TAIL_CALL(zend_undefined_function_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
|
||||
}
|
||||
}
|
||||
fbc = Z_FUNC_P(func);
|
||||
@@ -2132,7 +2142,6 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_NS_FCALL_BY_N
|
||||
static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_FCALL_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
|
||||
{
|
||||
USE_OPLINE
|
||||
|
||||
zval *fname;
|
||||
zval *func;
|
||||
zend_function *fbc;
|
||||
@@ -2140,10 +2149,10 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_FCALL_SPEC_CO
|
||||
|
||||
fbc = CACHED_PTR(opline->result.num);
|
||||
if (UNEXPECTED(fbc == NULL)) {
|
||||
fname = RT_CONSTANT(opline, opline->op2);
|
||||
fname = (zval*)RT_CONSTANT(opline, opline->op2);
|
||||
func = zend_hash_find_ex(EG(function_table), Z_STR_P(fname), 1);
|
||||
if (UNEXPECTED(func == NULL)) {
|
||||
ZEND_VM_TAIL_CALL(zend_undefined_function_helper_SPEC(fname ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
|
||||
ZEND_VM_TAIL_CALL(zend_undefined_function_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
|
||||
}
|
||||
fbc = Z_FUNC_P(func);
|
||||
if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
|
||||
|
||||
Reference in New Issue
Block a user