- Improve performance of indirect-referenced function calls

This commit is contained in:
Andi Gutmans 2002-01-04 09:21:16 +00:00
parent 878f78a6d6
commit eb08cb956b

View File

@ -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();