]> granicus.if.org Git - php/commitdiff
Merge branch 'PHP-7.0'
authorXinchen Hui <laruence@gmail.com>
Thu, 17 Mar 2016 12:24:43 +0000 (20:24 +0800)
committerXinchen Hui <laruence@gmail.com>
Thu, 17 Mar 2016 12:24:59 +0000 (20:24 +0800)
* 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

1  2 
ext/opcache/Optimizer/block_pass.c

index 4f4dd8e11a0759f5da08bc33a74aeace61940637,e168457661b8a2c5edf71505443d3eebd48a9006..159620c6179adfb3419b19ee31203bd9e3be46ad
@@@ -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;
 +                                      }
                                }
                        }