]> granicus.if.org Git - php/commitdiff
Eliminate check on the fast path
authorDmitry Stogov <dmitry@zend.com>
Tue, 24 Feb 2015 15:34:15 +0000 (18:34 +0300)
committerDmitry Stogov <dmitry@zend.com>
Tue, 24 Feb 2015 15:34:15 +0000 (18:34 +0300)
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

index b21c12f23ce72bf38cd344db04d07933700eb3eb..ed7814d8b808a37a8a60489ea605142b233d83b7 100644 (file)
@@ -2540,18 +2540,22 @@ ZEND_VM_HANDLER(59, ZEND_INIT_FCALL_BY_NAME, ANY, CONST|TMPVAR|CV)
        zend_function *fbc;
        zval *function_name, *func;
 
-       if (OP2_TYPE == IS_CONST && Z_TYPE_P(EX_CONSTANT(opline->op2)) == IS_STRING) {
-               function_name = (zval*)(EX_CONSTANT(opline->op2)+1);
-               if (CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) {
+       if (OP2_TYPE == IS_CONST) {
+               if (EXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))))) {
                        fbc = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)));
-               } else if (UNEXPECTED((func = zend_hash_find(EG(function_table), Z_STR_P(function_name))) == NULL)) {
-                       SAVE_OPLINE();
-                       zend_error_noreturn(E_ERROR, "Call to undefined function %s()", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
                } else {
-                       fbc = Z_FUNC_P(func);
-                       CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), fbc);
+                       if (UNEXPECTED(Z_TYPE_P(EX_CONSTANT(opline->op2)) != IS_STRING)) {
+                               goto init_fcall_complex;
+                       }
+                       function_name = (zval*)(EX_CONSTANT(opline->op2)+1);
+                       if (UNEXPECTED((func = zend_hash_find(EG(function_table), Z_STR_P(function_name))) == NULL)) {
+                               SAVE_OPLINE();
+                               zend_error_noreturn(E_ERROR, "Call to undefined function %s()", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
+                       } else {
+                               fbc = Z_FUNC_P(func);
+                               CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), fbc);
+                       }
                }
-
                EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
                        fbc, opline->extended_value, NULL, NULL, EX(call));
 
@@ -2563,6 +2567,7 @@ ZEND_VM_HANDLER(59, ZEND_INIT_FCALL_BY_NAME, ANY, CONST|TMPVAR|CV)
                zend_class_entry *called_scope;
                zend_object *object;
 
+init_fcall_complex:
                SAVE_OPLINE();
                function_name = GET_OP2_ZVAL_PTR(BP_VAR_R);
 
index 8e3d41cb6de478b0cf758d308608801fd481b667..31462bc07ca61f192c3b37704b89e9b9d9c3fe9b 100644 (file)
@@ -1559,18 +1559,22 @@ static int ZEND_FASTCALL  ZEND_INIT_FCALL_BY_NAME_SPEC_CONST_HANDLER(ZEND_OPCODE
        zend_function *fbc;
        zval *function_name, *func;
 
-       if (IS_CONST == IS_CONST && Z_TYPE_P(EX_CONSTANT(opline->op2)) == IS_STRING) {
-               function_name = (zval*)(EX_CONSTANT(opline->op2)+1);
-               if (CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) {
+       if (IS_CONST == IS_CONST) {
+               if (EXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))))) {
                        fbc = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)));
-               } else if (UNEXPECTED((func = zend_hash_find(EG(function_table), Z_STR_P(function_name))) == NULL)) {
-                       SAVE_OPLINE();
-                       zend_error_noreturn(E_ERROR, "Call to undefined function %s()", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
                } else {
-                       fbc = Z_FUNC_P(func);
-                       CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), fbc);
+                       if (UNEXPECTED(Z_TYPE_P(EX_CONSTANT(opline->op2)) != IS_STRING)) {
+                               goto init_fcall_complex;
+                       }
+                       function_name = (zval*)(EX_CONSTANT(opline->op2)+1);
+                       if (UNEXPECTED((func = zend_hash_find(EG(function_table), Z_STR_P(function_name))) == NULL)) {
+                               SAVE_OPLINE();
+                               zend_error_noreturn(E_ERROR, "Call to undefined function %s()", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
+                       } else {
+                               fbc = Z_FUNC_P(func);
+                               CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), fbc);
+                       }
                }
-
                EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
                        fbc, opline->extended_value, NULL, NULL, EX(call));
 
@@ -1582,6 +1586,7 @@ static int ZEND_FASTCALL  ZEND_INIT_FCALL_BY_NAME_SPEC_CONST_HANDLER(ZEND_OPCODE
                zend_class_entry *called_scope;
                zend_object *object;
 
+init_fcall_complex:
                SAVE_OPLINE();
                function_name = EX_CONSTANT(opline->op2);
 
@@ -1950,18 +1955,22 @@ static int ZEND_FASTCALL  ZEND_INIT_FCALL_BY_NAME_SPEC_CV_HANDLER(ZEND_OPCODE_HA
        zend_function *fbc;
        zval *function_name, *func;
 
-       if (IS_CV == IS_CONST && Z_TYPE_P(EX_CONSTANT(opline->op2)) == IS_STRING) {
-               function_name = (zval*)(EX_CONSTANT(opline->op2)+1);
-               if (CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) {
+       if (IS_CV == IS_CONST) {
+               if (EXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))))) {
                        fbc = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)));
-               } else if (UNEXPECTED((func = zend_hash_find(EG(function_table), Z_STR_P(function_name))) == NULL)) {
-                       SAVE_OPLINE();
-                       zend_error_noreturn(E_ERROR, "Call to undefined function %s()", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
                } else {
-                       fbc = Z_FUNC_P(func);
-                       CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), fbc);
+                       if (UNEXPECTED(Z_TYPE_P(EX_CONSTANT(opline->op2)) != IS_STRING)) {
+                               goto init_fcall_complex;
+                       }
+                       function_name = (zval*)(EX_CONSTANT(opline->op2)+1);
+                       if (UNEXPECTED((func = zend_hash_find(EG(function_table), Z_STR_P(function_name))) == NULL)) {
+                               SAVE_OPLINE();
+                               zend_error_noreturn(E_ERROR, "Call to undefined function %s()", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
+                       } else {
+                               fbc = Z_FUNC_P(func);
+                               CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), fbc);
+                       }
                }
-
                EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
                        fbc, opline->extended_value, NULL, NULL, EX(call));
 
@@ -1973,6 +1982,7 @@ static int ZEND_FASTCALL  ZEND_INIT_FCALL_BY_NAME_SPEC_CV_HANDLER(ZEND_OPCODE_HA
                zend_class_entry *called_scope;
                zend_object *object;
 
+init_fcall_complex:
                SAVE_OPLINE();
                function_name = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var);
 
@@ -2139,18 +2149,22 @@ static int ZEND_FASTCALL  ZEND_INIT_FCALL_BY_NAME_SPEC_TMPVAR_HANDLER(ZEND_OPCOD
        zend_function *fbc;
        zval *function_name, *func;
 
-       if ((IS_TMP_VAR|IS_VAR) == IS_CONST && Z_TYPE_P(EX_CONSTANT(opline->op2)) == IS_STRING) {
-               function_name = (zval*)(EX_CONSTANT(opline->op2)+1);
-               if (CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) {
+       if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+               if (EXPECTED(CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))))) {
                        fbc = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)));
-               } else if (UNEXPECTED((func = zend_hash_find(EG(function_table), Z_STR_P(function_name))) == NULL)) {
-                       SAVE_OPLINE();
-                       zend_error_noreturn(E_ERROR, "Call to undefined function %s()", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
                } else {
-                       fbc = Z_FUNC_P(func);
-                       CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), fbc);
+                       if (UNEXPECTED(Z_TYPE_P(EX_CONSTANT(opline->op2)) != IS_STRING)) {
+                               goto init_fcall_complex;
+                       }
+                       function_name = (zval*)(EX_CONSTANT(opline->op2)+1);
+                       if (UNEXPECTED((func = zend_hash_find(EG(function_table), Z_STR_P(function_name))) == NULL)) {
+                               SAVE_OPLINE();
+                               zend_error_noreturn(E_ERROR, "Call to undefined function %s()", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
+                       } else {
+                               fbc = Z_FUNC_P(func);
+                               CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), fbc);
+                       }
                }
-
                EX(call) = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
                        fbc, opline->extended_value, NULL, NULL, EX(call));
 
@@ -2162,6 +2176,7 @@ static int ZEND_FASTCALL  ZEND_INIT_FCALL_BY_NAME_SPEC_TMPVAR_HANDLER(ZEND_OPCOD
                zend_class_entry *called_scope;
                zend_object *object;
 
+init_fcall_complex:
                SAVE_OPLINE();
                function_name = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);