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