]> granicus.if.org Git - php/commitdiff
- Improve performance of indirect-referenced function calls
authorAndi Gutmans <andi@php.net>
Fri, 4 Jan 2002 09:21:16 +0000 (09:21 +0000)
committerAndi Gutmans <andi@php.net>
Fri, 4 Jan 2002 09:21:16 +0000 (09:21 +0000)
Zend/zend_execute.c

index 6d0acd6282c3749a7cbdb3adef0df4106e6b9bc5..482c105040be6b15ae64790d1e30e62bd21a6c87 100644 (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();