From: Andi Gutmans Date: Fri, 4 Jan 2002 09:21:16 +0000 (+0000) Subject: - Improve performance of indirect-referenced function calls X-Git-Tag: PRE_ISSET_PATCH~311 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=eb08cb956b06f67ad3a6a7e1bb79480077f80c5d;p=php - Improve performance of indirect-referenced function calls --- diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 6d0acd6282..482c105040 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -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();