]> granicus.if.org Git - php/commitdiff
Merge branch 'PHP-7.4'
authorDmitry Stogov <dmitry@zend.com>
Mon, 16 Dec 2019 09:25:40 +0000 (12:25 +0300)
committerDmitry Stogov <dmitry@zend.com>
Mon, 16 Dec 2019 09:25:40 +0000 (12:25 +0300)
* PHP-7.4:
  Fixed bug #78961 (erroneous optimization of re-assigned $GLOBALS)

1  2 
ext/opcache/Optimizer/pass1.c

index 2e9e547175efdf5fa5b73de8e5e6ce0475eb6791,8f4173011475dd99068e8b2c2cd8ff34592db61b..7d244a283c5acea1b4d649565ac52636e966f3df
@@@ -643,72 -560,8 +645,73 @@@ constant_binary_op
                                MAKE_NOP(opline);
                        }
                        break;
+ #endif
  
 +              case ZEND_JMPZ_EX:
 +              case ZEND_JMPNZ_EX:
 +                      /* convert Ti = JMPZ_EX(C, L) => Ti = QM_ASSIGN(C)
 +                         in case we know it wouldn't jump */
 +                      if (opline->op1_type == IS_CONST) {
 +                              if (zend_is_true(&ZEND_OP1_LITERAL(opline))) {
 +                                      if (opline->opcode == ZEND_JMPZ_EX) {
 +                                              opline->opcode = ZEND_QM_ASSIGN;
 +                                              zval_ptr_dtor_nogc(&ZEND_OP1_LITERAL(opline));
 +                                              ZVAL_TRUE(&ZEND_OP1_LITERAL(opline));
 +                                              opline->op2.num = 0;
 +                                              break;
 +                                      }
 +                              } else {
 +                                      if (opline->opcode == ZEND_JMPNZ_EX) {
 +                                              opline->opcode = ZEND_QM_ASSIGN;
 +                                              zval_ptr_dtor_nogc(&ZEND_OP1_LITERAL(opline));
 +                                              ZVAL_FALSE(&ZEND_OP1_LITERAL(opline));
 +                                              opline->op2.num = 0;
 +                                              break;
 +                                      }
 +                              }
 +                      }
 +                      collect_constants = 0;
 +                      break;
 +
 +              case ZEND_JMPZ:
 +              case ZEND_JMPNZ:
 +                      if (opline->op1_type == IS_CONST) {
 +                              int should_jmp = zend_is_true(&ZEND_OP1_LITERAL(opline));
 +
 +                              if (opline->opcode == ZEND_JMPZ) {
 +                                      should_jmp = !should_jmp;
 +                              }
 +                              literal_dtor(&ZEND_OP1_LITERAL(opline));
 +                              opline->op1_type = IS_UNUSED;
 +                              if (should_jmp) {
 +                                      opline->opcode = ZEND_JMP;
 +                                      COPY_NODE(opline->op1, opline->op2);
 +                                      opline->op2.num = 0;
 +                              } else {
 +                                      MAKE_NOP(opline);
 +                                      break;
 +                              }
 +                      }
 +                      collect_constants = 0;
 +                      break;
 +
 +              case ZEND_JMPZNZ:
 +                      if (opline->op1_type == IS_CONST) {
 +                              zend_op *target_opline;
 +
 +                              if (zend_is_true(&ZEND_OP1_LITERAL(opline))) {
 +                                      target_opline = ZEND_OFFSET_TO_OPLINE(opline, opline->extended_value); /* JMPNZ */
 +                              } else {
 +                                      target_opline = ZEND_OP2_JMP_ADDR(opline); /* JMPZ */
 +                              }
 +                              literal_dtor(&ZEND_OP1_LITERAL(opline));
 +                              ZEND_SET_OP_JMP_ADDR(opline, opline->op1, target_opline);
 +                              opline->op1_type = IS_UNUSED;
 +                              opline->opcode = ZEND_JMP;
 +                      }
 +                      collect_constants = 0;
 +                      break;
 +
                case ZEND_RETURN:
                case ZEND_RETURN_BY_REF:
                case ZEND_GENERATOR_RETURN: