]> granicus.if.org Git - php/commitdiff
Fast path for pre/post inc/dec
authorDmitry Stogov <dmitry@zend.com>
Mon, 21 Apr 2014 17:38:44 +0000 (21:38 +0400)
committerDmitry Stogov <dmitry@zend.com>
Mon, 21 Apr 2014 17:38:44 +0000 (21:38 +0400)
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

index 57dbac8a7f048e73f533f52afafe6f2069b2749c..3c39e3c6c1fd81329fa1ce6761ee7d8bc42f5a58 100644 (file)
@@ -868,6 +868,14 @@ ZEND_VM_HANDLER(34, ZEND_PRE_INC, VAR|CV, ANY)
        SAVE_OPLINE();
        var_ptr = GET_OP1_ZVAL_PTR_PTR(BP_VAR_RW);
 
+       if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
+               fast_increment_function(var_ptr);
+               if (RETURN_VALUE_USED(opline)) {
+                       ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
+               }
+               ZEND_VM_NEXT_OPCODE();
+       }
+
        if (OP1_TYPE == IS_VAR && UNEXPECTED(Z_TYPE_P(var_ptr) == IS_STR_OFFSET)) {
                zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
        }
@@ -897,7 +905,7 @@ ZEND_VM_HANDLER(34, ZEND_PRE_INC, VAR|CV, ANY)
                Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, val TSRMLS_CC);
                zval_ptr_dtor(val);
        } else {
-               fast_increment_function(var_ptr);
+               increment_function(var_ptr);
        }
 
        if (RETURN_VALUE_USED(opline)) {
@@ -918,6 +926,14 @@ ZEND_VM_HANDLER(35, ZEND_PRE_DEC, VAR|CV, ANY)
        SAVE_OPLINE();
        var_ptr = GET_OP1_ZVAL_PTR_PTR(BP_VAR_RW);
 
+       if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
+               fast_decrement_function(var_ptr);
+               if (RETURN_VALUE_USED(opline)) {
+                       ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
+               }
+               ZEND_VM_NEXT_OPCODE();
+       }
+
        if (OP1_TYPE == IS_VAR && UNEXPECTED(Z_TYPE_P(var_ptr) == IS_STR_OFFSET)) {
                zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
        }
@@ -947,7 +963,7 @@ ZEND_VM_HANDLER(35, ZEND_PRE_DEC, VAR|CV, ANY)
                Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, val TSRMLS_CC);
                zval_ptr_dtor(val);
        } else {
-               fast_decrement_function(var_ptr);
+               decrement_function(var_ptr);
        }
 
        if (RETURN_VALUE_USED(opline)) {
@@ -968,6 +984,12 @@ ZEND_VM_HANDLER(36, ZEND_POST_INC, VAR|CV, ANY)
        SAVE_OPLINE();
        var_ptr = GET_OP1_ZVAL_PTR_PTR(BP_VAR_RW);
 
+       if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
+               ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
+               fast_increment_function(var_ptr);
+               ZEND_VM_NEXT_OPCODE();
+       }
+
        if (OP1_TYPE == IS_VAR && UNEXPECTED(Z_TYPE_P(var_ptr) == IS_STR_OFFSET)) {
                zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
        }
@@ -999,7 +1021,7 @@ ZEND_VM_HANDLER(36, ZEND_POST_INC, VAR|CV, ANY)
                Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, val TSRMLS_CC);
                zval_ptr_dtor(val);
        } else {
-               fast_increment_function(var_ptr);
+               increment_function(var_ptr);
        }
 
        FREE_OP1_VAR_PTR();
@@ -1016,6 +1038,12 @@ ZEND_VM_HANDLER(37, ZEND_POST_DEC, VAR|CV, ANY)
        SAVE_OPLINE();
        var_ptr = GET_OP1_ZVAL_PTR_PTR(BP_VAR_RW);
 
+       if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
+               ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
+               fast_decrement_function(var_ptr);
+               ZEND_VM_NEXT_OPCODE();
+       }
+
        if (OP1_TYPE == IS_VAR && UNEXPECTED(Z_TYPE_P(var_ptr) == IS_STR_OFFSET)) {
                zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
        }
@@ -1047,7 +1075,7 @@ ZEND_VM_HANDLER(37, ZEND_POST_DEC, VAR|CV, ANY)
                Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, val TSRMLS_CC);
                zval_ptr_dtor(val);
        } else {
-               fast_decrement_function(var_ptr);
+               decrement_function(var_ptr);
        }
 
        FREE_OP1_VAR_PTR();
index 5679b3d744ceaaf63b827e99ea7483d0209bd750..e60451e72f3de73354a2b7d0115f6f481f516bec 100644 (file)
@@ -11971,6 +11971,14 @@ static int ZEND_FASTCALL  ZEND_PRE_INC_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS
        SAVE_OPLINE();
        var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
 
+       if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
+               fast_increment_function(var_ptr);
+               if (RETURN_VALUE_USED(opline)) {
+                       ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
+               }
+               ZEND_VM_NEXT_OPCODE();
+       }
+
        if (IS_VAR == IS_VAR && UNEXPECTED(Z_TYPE_P(var_ptr) == IS_STR_OFFSET)) {
                zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
        }
@@ -12000,7 +12008,7 @@ static int ZEND_FASTCALL  ZEND_PRE_INC_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS
                Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, val TSRMLS_CC);
                zval_ptr_dtor(val);
        } else {
-               fast_increment_function(var_ptr);
+               increment_function(var_ptr);
        }
 
        if (RETURN_VALUE_USED(opline)) {
@@ -12021,6 +12029,14 @@ static int ZEND_FASTCALL  ZEND_PRE_DEC_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS
        SAVE_OPLINE();
        var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
 
+       if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
+               fast_decrement_function(var_ptr);
+               if (RETURN_VALUE_USED(opline)) {
+                       ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
+               }
+               ZEND_VM_NEXT_OPCODE();
+       }
+
        if (IS_VAR == IS_VAR && UNEXPECTED(Z_TYPE_P(var_ptr) == IS_STR_OFFSET)) {
                zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
        }
@@ -12050,7 +12066,7 @@ static int ZEND_FASTCALL  ZEND_PRE_DEC_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS
                Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, val TSRMLS_CC);
                zval_ptr_dtor(val);
        } else {
-               fast_decrement_function(var_ptr);
+               decrement_function(var_ptr);
        }
 
        if (RETURN_VALUE_USED(opline)) {
@@ -12071,6 +12087,12 @@ static int ZEND_FASTCALL  ZEND_POST_INC_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
        SAVE_OPLINE();
        var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
 
+       if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
+               ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
+               fast_increment_function(var_ptr);
+               ZEND_VM_NEXT_OPCODE();
+       }
+
        if (IS_VAR == IS_VAR && UNEXPECTED(Z_TYPE_P(var_ptr) == IS_STR_OFFSET)) {
                zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
        }
@@ -12102,7 +12124,7 @@ static int ZEND_FASTCALL  ZEND_POST_INC_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
                Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, val TSRMLS_CC);
                zval_ptr_dtor(val);
        } else {
-               fast_increment_function(var_ptr);
+               increment_function(var_ptr);
        }
 
        if (free_op1.var) {zval_ptr_dtor_nogc(free_op1.var);};
@@ -12119,6 +12141,12 @@ static int ZEND_FASTCALL  ZEND_POST_DEC_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
        SAVE_OPLINE();
        var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
 
+       if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
+               ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
+               fast_decrement_function(var_ptr);
+               ZEND_VM_NEXT_OPCODE();
+       }
+
        if (IS_VAR == IS_VAR && UNEXPECTED(Z_TYPE_P(var_ptr) == IS_STR_OFFSET)) {
                zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
        }
@@ -12150,7 +12178,7 @@ static int ZEND_FASTCALL  ZEND_POST_DEC_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
                Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, val TSRMLS_CC);
                zval_ptr_dtor(val);
        } else {
-               fast_decrement_function(var_ptr);
+               decrement_function(var_ptr);
        }
 
        if (free_op1.var) {zval_ptr_dtor_nogc(free_op1.var);};
@@ -28504,6 +28532,14 @@ static int ZEND_FASTCALL  ZEND_PRE_INC_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
        SAVE_OPLINE();
        var_ptr = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var TSRMLS_CC);
 
+       if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
+               fast_increment_function(var_ptr);
+               if (RETURN_VALUE_USED(opline)) {
+                       ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
+               }
+               ZEND_VM_NEXT_OPCODE();
+       }
+
        if (IS_CV == IS_VAR && UNEXPECTED(Z_TYPE_P(var_ptr) == IS_STR_OFFSET)) {
                zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
        }
@@ -28533,7 +28569,7 @@ static int ZEND_FASTCALL  ZEND_PRE_INC_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
                Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, val TSRMLS_CC);
                zval_ptr_dtor(val);
        } else {
-               fast_increment_function(var_ptr);
+               increment_function(var_ptr);
        }
 
        if (RETURN_VALUE_USED(opline)) {
@@ -28553,6 +28589,14 @@ static int ZEND_FASTCALL  ZEND_PRE_DEC_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
        SAVE_OPLINE();
        var_ptr = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var TSRMLS_CC);
 
+       if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
+               fast_decrement_function(var_ptr);
+               if (RETURN_VALUE_USED(opline)) {
+                       ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
+               }
+               ZEND_VM_NEXT_OPCODE();
+       }
+
        if (IS_CV == IS_VAR && UNEXPECTED(Z_TYPE_P(var_ptr) == IS_STR_OFFSET)) {
                zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
        }
@@ -28582,7 +28626,7 @@ static int ZEND_FASTCALL  ZEND_PRE_DEC_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
                Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, val TSRMLS_CC);
                zval_ptr_dtor(val);
        } else {
-               fast_decrement_function(var_ptr);
+               decrement_function(var_ptr);
        }
 
        if (RETURN_VALUE_USED(opline)) {
@@ -28602,6 +28646,12 @@ static int ZEND_FASTCALL  ZEND_POST_INC_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS
        SAVE_OPLINE();
        var_ptr = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var TSRMLS_CC);
 
+       if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
+               ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
+               fast_increment_function(var_ptr);
+               ZEND_VM_NEXT_OPCODE();
+       }
+
        if (IS_CV == IS_VAR && UNEXPECTED(Z_TYPE_P(var_ptr) == IS_STR_OFFSET)) {
                zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
        }
@@ -28633,7 +28683,7 @@ static int ZEND_FASTCALL  ZEND_POST_INC_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS
                Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, val TSRMLS_CC);
                zval_ptr_dtor(val);
        } else {
-               fast_increment_function(var_ptr);
+               increment_function(var_ptr);
        }
 
        CHECK_EXCEPTION();
@@ -28649,6 +28699,12 @@ static int ZEND_FASTCALL  ZEND_POST_DEC_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS
        SAVE_OPLINE();
        var_ptr = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var TSRMLS_CC);
 
+       if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
+               ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
+               fast_decrement_function(var_ptr);
+               ZEND_VM_NEXT_OPCODE();
+       }
+
        if (IS_CV == IS_VAR && UNEXPECTED(Z_TYPE_P(var_ptr) == IS_STR_OFFSET)) {
                zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
        }
@@ -28680,7 +28736,7 @@ static int ZEND_FASTCALL  ZEND_POST_DEC_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS
                Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, val TSRMLS_CC);
                zval_ptr_dtor(val);
        } else {
-               fast_decrement_function(var_ptr);
+               decrement_function(var_ptr);
        }
 
        CHECK_EXCEPTION();