]> granicus.if.org Git - php/commitdiff
Make ZEND_RECV_INIT and ZEND_BIND_GLOBALS opcodes to be "repeatabe" with inner-loop...
authorDmitry Stogov <dmitry@zend.com>
Tue, 28 Apr 2015 21:40:43 +0000 (00:40 +0300)
committerDmitry Stogov <dmitry@zend.com>
Tue, 28 Apr 2015 21:40:43 +0000 (00:40 +0300)
Zend/zend_execute.c
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

index 20a35535ba60a2099e7ad12bde2d5f5c6853e91c..097f89aa575a5da312ec98cb34d24b1169db12c5 100644 (file)
@@ -2215,6 +2215,12 @@ static zend_always_inline zend_generator *zend_get_running_generator(zend_execut
 #define ZEND_VM_INC_OPCODE() \
        OPLINE++
 
+#define ZEND_VM_REPEATABLE_OPCODE \
+       do {
+
+#define ZEND_VM_REPEAT_OPCODE(_opcode) \
+       } while (UNEXPECTED(OPLINE->opcode == _opcode))
+
 #ifdef __GNUC__
 # define ZEND_VM_GUARD(name) __asm__("#" #name)
 #else
index a1bd6b860b0a11baa1a785e2545753ee4441169d..b2493c956a1e217f9b4e5d776e406ac3a725e40b 100644 (file)
@@ -4608,9 +4608,12 @@ ZEND_VM_HANDLER(63, ZEND_RECV, ANY, ANY)
 ZEND_VM_HANDLER(64, ZEND_RECV_INIT, ANY, CONST)
 {
        USE_OPLINE
-       uint32_t arg_num = opline->op1.num;
+       uint32_t arg_num;
        zval *param;
 
+       ZEND_VM_REPEATABLE_OPCODE
+
+       arg_num = opline->op1.num;
        param = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->result.var);
        if (arg_num > EX_NUM_ARGS()) {
                ZVAL_COPY_VALUE(param, EX_CONSTANT(opline->op2));
@@ -4635,7 +4638,9 @@ ZEND_VM_HANDLER(64, ZEND_RECV_INIT, ANY, CONST)
                }
        }
 
-       ZEND_VM_NEXT_OPCODE();
+       ZEND_VM_INC_OPCODE();
+       ZEND_VM_REPEAT_OPCODE(ZEND_RECV_INIT);
+       ZEND_VM_CONTINUE();
 }
 
 ZEND_VM_HANDLER(164, ZEND_RECV_VARIADIC, ANY, ANY)
@@ -7613,6 +7618,8 @@ ZEND_VM_HANDLER(168, ZEND_BIND_GLOBAL, CV, CONST)
        zval *variable_ptr;
        uint32_t idx;
 
+       ZEND_VM_REPEATABLE_OPCODE
+
        varname = GET_OP2_ZVAL_PTR(BP_VAR_R);
 
        /* We store "hash slot index" + 1 (NULL is a mark of uninitialized cache slot) */
@@ -7677,7 +7684,9 @@ ZEND_VM_C_LABEL(check_indirect):
                ZVAL_REF(variable_ptr, ref);
        }
 
-       ZEND_VM_NEXT_OPCODE();
+       ZEND_VM_INC_OPCODE();
+       ZEND_VM_REPEAT_OPCODE(ZEND_BIND_GLOBAL);
+       ZEND_VM_CONTINUE();
 }
 
 ZEND_VM_HANDLER(121, ZEND_STRLEN, CONST|TMPVAR|CV, ANY)
index f8c528db54ad098e0bd10a6cf4351ac62deec1aa..8333e076104613cc4cdb6b59555f2f487ac8cbc7 100644 (file)
@@ -2224,9 +2224,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_FCALL_SPEC_CONST_HANDLER(
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RECV_INIT_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
-       uint32_t arg_num = opline->op1.num;
+       uint32_t arg_num;
        zval *param;
 
+       ZEND_VM_REPEATABLE_OPCODE
+
+       arg_num = opline->op1.num;
        param = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->result.var);
        if (arg_num > EX_NUM_ARGS()) {
                ZVAL_COPY_VALUE(param, EX_CONSTANT(opline->op2));
@@ -2251,7 +2254,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RECV_INIT_SPEC_CONST_HANDLER(Z
                }
        }
 
-       ZEND_VM_NEXT_OPCODE();
+       ZEND_VM_INC_OPCODE();
+       ZEND_VM_REPEAT_OPCODE(ZEND_RECV_INIT);
+       ZEND_VM_CONTINUE();
 }
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BRK_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -32556,6 +32561,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BIND_GLOBAL_SPEC_CV_CONST_HAND
        zval *variable_ptr;
        uint32_t idx;
 
+       ZEND_VM_REPEATABLE_OPCODE
+
        varname = EX_CONSTANT(opline->op2);
 
        /* We store "hash slot index" + 1 (NULL is a mark of uninitialized cache slot) */
@@ -32620,7 +32627,9 @@ check_indirect:
                ZVAL_REF(variable_ptr, ref);
        }
 
-       ZEND_VM_NEXT_OPCODE();
+       ZEND_VM_INC_OPCODE();
+       ZEND_VM_REPEAT_OPCODE(ZEND_BIND_GLOBAL);
+       ZEND_VM_CONTINUE();
 }
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)