From: Dmitry Stogov Date: Mon, 13 Oct 2014 10:10:44 +0000 (+0400) Subject: Merge branch 'PHP-5.6' X-Git-Tag: POST_NATIVE_TLS_MERGE^2~75^2 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=702a2dfb3ef3c603d89bf7e4e9a63b6f8ff8968d;p=php Merge branch 'PHP-5.6' * PHP-5.6: We can't eliminate FETCH_CONSTANT opcodes for constants represented by AST. Conflicts: ext/opcache/Optimizer/pass1_5.c --- 702a2dfb3ef3c603d89bf7e4e9a63b6f8ff8968d diff --cc ext/opcache/Optimizer/pass1_5.c index f06f5cc559,41dde05083..b91ac5b50f --- a/ext/opcache/Optimizer/pass1_5.c +++ b/ext/opcache/Optimizer/pass1_5.c @@@ -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 && @@@ -302,18 -295,22 +305,21 @@@ ((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; }