]> granicus.if.org Git - php/commitdiff
Merge branch 'PHP-5.6'
authorDmitry Stogov <dmitry@zend.com>
Mon, 13 Oct 2014 10:10:44 +0000 (14:10 +0400)
committerDmitry Stogov <dmitry@zend.com>
Mon, 13 Oct 2014 10:10:44 +0000 (14:10 +0400)
* PHP-5.6:
  We can't eliminate FETCH_CONSTANT opcodes for constants represented by AST.

Conflicts:
ext/opcache/Optimizer/pass1_5.c

1  2 
ext/opcache/Optimizer/pass1_5.c

index f06f5cc55978d40c35bcc7c42b6bc0f483c91d75,41dde050835ef6442a591a7e8e2688cb9e7e1f7d..b91ac5b50f059c1147b07ce0796c83409fdcf80c
@@@ -266,11 -252,15 +266,14 @@@ void zend_optimizer_pass1(zend_op_arra
                                                break;
                                        }
                                }
+                               if (Z_TYPE(c) == IS_CONSTANT_AST) {
+                                       break;
+                               }
                                literal_dtor(&ZEND_OP2_LITERAL(opline));
                                MAKE_NOP(opline);
 -                              replace_tmp_by_const(op_array, opline, tv, &c TSRMLS_CC);
 +                              zend_optimizer_replace_by_const(op_array, opline, IS_TMP_VAR, tv, &c TSRMLS_CC);
                        }
  
 -#if ZEND_EXTENSION_API_NO > PHP_5_3_X_API_NO
                        /* class constant */
                        if (ZEND_OP1_TYPE(opline) != IS_UNUSED &&
                            ZEND_OP2_TYPE(opline) == IS_CONST &&
                                        ((opline - 1)->extended_value & ~ZEND_FETCH_CLASS_NO_AUTOLOAD) == ZEND_FETCH_CLASS_SELF) &&
                                        ZEND_RESULT((opline - 1)).var == ZEND_OP1(opline).var) {
                                        /* for self::B */
 -                                      pce = &op_array->scope;
 +                                      ce = op_array->scope;
                                }
  
 -                              if (pce) {
 -                                      zend_uint tv = ZEND_RESULT(opline).var;
 -                                      zval **c, t;
 +                              if (ce) {
 +                                      uint32_t tv = ZEND_RESULT(opline).var;
 +                                      zval *c, t;
  
 -                                      if (zend_hash_find(&(*pce)->constants_table,
 -                                                      Z_STRVAL(ZEND_OP2_LITERAL(opline)),
 -                                                      Z_STRLEN(ZEND_OP2_LITERAL(opline)) + 1,
 -                                                      (void **) &c) == SUCCESS) {
 -                                              if (Z_TYPE_PP(c) == IS_CONSTANT_AST) {
 +                                      if ((c = zend_hash_find(&ce->constants_table,
 +                                                      Z_STR(ZEND_OP2_LITERAL(opline)))) != NULL) {
 +                                              ZVAL_DEREF(c);
++                                              if (Z_TYPE_P(c) == IS_CONSTANT_AST) {
+                                                       break;
+                                               }
 -                                              if (ZEND_IS_CONSTANT_TYPE(Z_TYPE_PP(c))) { 
 -                                                      if (!zend_get_persistent_constant(Z_STRVAL_PP(c), Z_STRLEN_PP(c), &t, 1 TSRMLS_CC) ||
 +                                              if (ZEND_IS_CONSTANT_TYPE(Z_TYPE_P(c))) { 
 +                                                      if (!zend_optimizer_get_persistent_constant(Z_STR_P(c), &t, 1 TSRMLS_CC) ||
                                                            ZEND_IS_CONSTANT_TYPE(Z_TYPE(t))) {
                                                                break;
                                                        }