From: Xinchen Hui Date: Thu, 17 Mar 2016 12:24:43 +0000 (+0800) Subject: Merge branch 'PHP-7.0' X-Git-Tag: php-7.1.0alpha1~466 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=adb82514eb06384508e45627caf074cb2104e4bd;p=php Merge branch 'PHP-7.0' * PHP-7.0: Remove unnecessary pattern Fixed for PHP7 Fixed bug #71843 (null ptr deref ZEND_RETURN_SPEC_CONST_HANDLER) Conflicts: ext/opcache/Optimizer/block_pass.c --- adb82514eb06384508e45627caf074cb2104e4bd diff --cc ext/opcache/Optimizer/block_pass.c index 4f4dd8e11a,e168457661..159620c617 --- a/ext/opcache/Optimizer/block_pass.c +++ b/ext/opcache/Optimizer/block_pass.c @@@ -1573,84 -1859,64 +1573,87 @@@ static void zend_t_usage(zend_cfg *cfg continue; } - zend_bitset_copy(usage, used_ext, bitset_len); + opline = op_array->opcodes + block->end; + end = op_array->opcodes + block->start; + if (!next_block || + !(next_block->flags & ZEND_BB_FOLLOW) || + (next_block->flags & ZEND_BB_TARGET)) { + /* Skip continuation of "extended" BB */ + zend_bitset_copy(usage, used_ext, bitset_len); + } else if (block->successors[1] != -1) { + zend_bitset_union(usage, used_ext, bitset_len); + } + next_block = block; - while (opline >= block->start_opline) { + while (opline >= end) { /* usage checks */ - if (RES_NEVER_USED(opline)) { - switch (opline->opcode) { - case ZEND_ASSIGN_ADD: - case ZEND_ASSIGN_SUB: - case ZEND_ASSIGN_MUL: - case ZEND_ASSIGN_DIV: - case ZEND_ASSIGN_POW: - case ZEND_ASSIGN_MOD: - case ZEND_ASSIGN_SL: - case ZEND_ASSIGN_SR: - case ZEND_ASSIGN_CONCAT: - case ZEND_ASSIGN_BW_OR: - case ZEND_ASSIGN_BW_AND: - case ZEND_ASSIGN_BW_XOR: - case ZEND_PRE_INC: - case ZEND_PRE_DEC: - case ZEND_POST_INC: - case ZEND_POST_DEC: - case ZEND_ASSIGN: - case ZEND_ASSIGN_REF: - case ZEND_DO_FCALL: - case ZEND_DO_ICALL: - case ZEND_DO_UCALL: - case ZEND_DO_FCALL_BY_NAME: - if (ZEND_RESULT_TYPE(opline) == IS_VAR) { - ZEND_RESULT_TYPE(opline) |= EXT_TYPE_UNUSED; - } - break; - case ZEND_QM_ASSIGN: - case ZEND_BOOL: - case ZEND_BOOL_NOT: - if (ZEND_OP1_TYPE(opline) == IS_CONST) { - literal_dtor(&ZEND_OP1_LITERAL(opline)); - } else if (ZEND_OP1_TYPE(opline) == IS_TMP_VAR) { - opline->opcode = ZEND_FREE; - } else { - MAKE_NOP(opline); - } - break; - case ZEND_JMPZ_EX: - case ZEND_JMPNZ_EX: - opline->opcode -= 3; - SET_UNUSED(opline->result); - break; - } - } - - if (opline->opcode == ZEND_ADD_ARRAY_ELEMENT) { - if (ZEND_OP1_TYPE(opline) == IS_VAR || ZEND_OP1_TYPE(opline) == IS_TMP_VAR) { - zend_bitset_incl(usage, VAR_NUM(ZEND_RESULT(opline).var)); + if (opline->result_type == IS_VAR) { + if (!zend_bitset_in(usage, VAR_NUM(opline->result.var))) { + switch (opline->opcode) { + case ZEND_ASSIGN_ADD: + case ZEND_ASSIGN_SUB: + case ZEND_ASSIGN_MUL: + case ZEND_ASSIGN_DIV: + case ZEND_ASSIGN_POW: + case ZEND_ASSIGN_MOD: + case ZEND_ASSIGN_SL: + case ZEND_ASSIGN_SR: + case ZEND_ASSIGN_CONCAT: + case ZEND_ASSIGN_BW_OR: + case ZEND_ASSIGN_BW_AND: + case ZEND_ASSIGN_BW_XOR: + case ZEND_PRE_INC: + case ZEND_PRE_DEC: + case ZEND_ASSIGN: + case ZEND_ASSIGN_REF: + case ZEND_DO_FCALL: + case ZEND_DO_ICALL: + case ZEND_DO_UCALL: + case ZEND_DO_FCALL_BY_NAME: + opline->result_type = IS_UNUSED; + break; + } + } else { + zend_bitset_excl(usage, VAR_NUM(opline->result.var)); } - } else { - if (RESULT_USED(opline)) { - zend_bitset_excl(usage, VAR_NUM(ZEND_RESULT(opline).var)); + } else if (opline->result_type == IS_TMP_VAR) { + if (!zend_bitset_in(usage, VAR_NUM(opline->result.var))) { + switch (opline->opcode) { + case ZEND_POST_INC: + case ZEND_POST_DEC: + opline->opcode -= 2; + opline->result_type = IS_UNUSED; + break; + case ZEND_QM_ASSIGN: + case ZEND_BOOL: + case ZEND_BOOL_NOT: + if (ZEND_OP1_TYPE(opline) == IS_CONST) { + literal_dtor(&ZEND_OP1_LITERAL(opline)); ++ } else if (ZEND_OP1_TYPE(opline) == IS_TMP_VAR) { ++ opline->opcode = ZEND_FREE; ++ } else { ++ MAKE_NOP(opline); + } - MAKE_NOP(opline); + break; + case ZEND_JMPZ_EX: + case ZEND_JMPNZ_EX: + opline->opcode -= 3; + SET_UNUSED(opline->result); + break; + case ZEND_ADD_ARRAY_ELEMENT: + case ZEND_ROPE_ADD: + zend_bitset_incl(usage, VAR_NUM(opline->result.var)); + break; + } + } else { + switch (opline->opcode) { + case ZEND_ADD_ARRAY_ELEMENT: + case ZEND_ROPE_ADD: + break; + default: + zend_bitset_excl(usage, VAR_NUM(opline->result.var)); + break; + } } }