mirror of
https://github.com/php/php-src.git
synced 2024-09-21 18:07:23 +00:00
- Improve performance of indirect-referenced function calls
This commit is contained in:
parent
878f78a6d6
commit
eb08cb956b
@ -1691,16 +1691,29 @@ binary_assign_op_addr: {
|
||||
zval *function_name;
|
||||
zend_function *function;
|
||||
zval tmp;
|
||||
zend_bool is_const;
|
||||
char *function_name_strval;
|
||||
int function_name_strlen;
|
||||
|
||||
zend_ptr_stack_n_push(&EG(arg_types_stack), 2, EX(fbc), EX(object).ptr);
|
||||
|
||||
function_name = get_zval_ptr(&EX(opline)->op2, EX(Ts), &EG(free_op2), BP_VAR_R);
|
||||
is_const = (EX(opline)->op2.op_type == IS_CONST);
|
||||
|
||||
tmp = *function_name;
|
||||
zval_copy_ctor(&tmp);
|
||||
convert_to_string(&tmp);
|
||||
function_name = &tmp;
|
||||
zend_str_tolower(tmp.value.str.val, tmp.value.str.len);
|
||||
if (is_const) {
|
||||
function_name_strval = EX(opline)->op2.u.constant.value.str.val;
|
||||
function_name_strlen = EX(opline)->op2.u.constant.value.str.len;
|
||||
} else {
|
||||
function_name = get_zval_ptr(&EX(opline)->op2, EX(Ts), &EG(free_op2), BP_VAR_R);
|
||||
|
||||
tmp = *function_name;
|
||||
zval_copy_ctor(&tmp);
|
||||
convert_to_string(&tmp);
|
||||
function_name = &tmp;
|
||||
zend_str_tolower(tmp.value.str.val, tmp.value.str.len);
|
||||
|
||||
function_name_strval = tmp.value.str.val;
|
||||
function_name_strlen = tmp.value.str.len;
|
||||
}
|
||||
|
||||
EX(calling_namespace) = EG(namespace);
|
||||
|
||||
@ -1708,17 +1721,19 @@ binary_assign_op_addr: {
|
||||
|
||||
do {
|
||||
if (EG(namespace)) {
|
||||
if (zend_hash_find(&EG(namespace)->function_table, function_name->value.str.val, function_name->value.str.len+1, (void **) &function) == SUCCESS) {
|
||||
if (zend_hash_find(&EG(namespace)->function_table, function_name_strval, function_name_strlen+1, (void **) &function) == SUCCESS) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (zend_hash_find(EG(function_table), function_name->value.str.val, function_name->value.str.len+1, (void **) &function)==FAILURE) {
|
||||
zend_error(E_ERROR, "Call to undefined function: %s()", function_name->value.str.val);
|
||||
if (zend_hash_find(EG(function_table), function_name_strval, function_name_strlen+1, (void **) &function)==FAILURE) {
|
||||
zend_error(E_ERROR, "Call to undefined function: %s()", function_name_strval);
|
||||
}
|
||||
EX(calling_namespace) = NULL;
|
||||
} while (0);
|
||||
|
||||
zval_dtor(&tmp);
|
||||
if (!is_const) {
|
||||
zval_dtor(&tmp);
|
||||
}
|
||||
EX(fbc) = function;
|
||||
|
||||
NEXT_OPCODE();
|
||||
|
Loading…
Reference in New Issue
Block a user