From: Xinchen Hui Date: Wed, 25 Feb 2015 12:16:15 +0000 (+0800) Subject: Merge branch 'PHP-5.6' X-Git-Tag: PRE_PHP7_EREG_MYSQL_REMOVALS~69 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=60f18026eb5f657a4cd9effa825be58848f56fc3;p=php Merge branch 'PHP-5.6' Conflicts: ext/opcache/Optimizer/zend_optimizer.c --- 60f18026eb5f657a4cd9effa825be58848f56fc3 diff --cc ext/opcache/Optimizer/zend_optimizer.c index c9ee97f49d,08ce46c356..62409e6530 --- a/ext/opcache/Optimizer/zend_optimizer.c +++ b/ext/opcache/Optimizer/zend_optimizer.c @@@ -307,28 -325,22 +307,39 @@@ int zend_optimizer_replace_by_const(zen if (opline->extended_value & ZEND_ARG_SEND_BY_REF) { return 0; } - opline->extended_value = ZEND_DO_FCALL; + opline->extended_value = 0; + opline->opcode = ZEND_SEND_VAL_EX; } else { - opline->extended_value = ZEND_DO_FCALL_BY_NAME; + opline->extended_value = 0; + opline->opcode = ZEND_SEND_VAL; } - opline->opcode = ZEND_SEND_VAL; break; - case ZEND_SWITCH_FREE: + /* In most cases IS_TMP_VAR operand may be used only once. + * The operands are usually destroyed by the opcode handler. + * ZEND_CASE is an exception, that keeps operand unchanged, + * and allows its reuse. The number of ZEND_CASE instructions + * usually terminated by ZEND_FREE that finally kills the value. + */ ++ case ZEND_FREE: case ZEND_CASE: { zend_op *m, *n; int brk = op_array->last_brk_cont; ++ zend_bool in_switch = 0; while (brk--) { if (op_array->brk_cont_array[brk].start <= (opline - op_array->opcodes) && op_array->brk_cont_array[brk].brk > (opline - op_array->opcodes)) { ++ in_switch = 1; break; } } ++ ++ if (!in_switch) { ++ ZEND_ASSERT(opline->opcode == ZEND_FREE); ++ MAKE_NOP(opline); ++ zval_dtor(val); ++ return 1; ++ } ++ m = opline; n = op_array->opcodes + op_array->brk_cont_array[brk].brk + 1; while (m < n) { @@@ -351,18 -363,18 +362,14 @@@ zval_dtor(val); return 1; } -- case ZEND_FREE: -- MAKE_NOP(opline); -- zval_dtor(val); - return 1; - break; default: break; - } - update_op1_const(op_array, opline, val TSRMLS_CC); + } + zend_optimizer_update_op1_const(op_array, opline, val); break; } - - if (ZEND_OP2_TYPE(opline) == IS_VAR && + + if (ZEND_OP2_TYPE(opline) == type && ZEND_OP2(opline).var == var) { switch (opline->opcode) { case ZEND_ASSIGN_REF: