From: Dmitry Stogov Date: Tue, 28 Apr 2015 21:40:43 +0000 (+0300) Subject: Make ZEND_RECV_INIT and ZEND_BIND_GLOBALS opcodes to be "repeatabe" with inner-loop... X-Git-Tag: PRE_PHP7_NSAPI_REMOVAL~123 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d271d2cf7b7f156383a1a2674f195e22dd05ae86;p=php Make ZEND_RECV_INIT and ZEND_BIND_GLOBALS opcodes to be "repeatabe" with inner-loop instead of main interpreter loop. --- diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 20a35535ba..097f89aa57 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -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 diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index a1bd6b860b..b2493c956a 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -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) diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index f8c528db54..8333e07610 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -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)