diff options
author | Dmitry Stogov <dmitry@zend.com> | 2014-04-25 00:56:15 +0400 |
---|---|---|
committer | Dmitry Stogov <dmitry@zend.com> | 2014-04-25 00:56:15 +0400 |
commit | df7ca608ce62dba76ab7c766bede2a3f9b68755e (patch) | |
tree | b70e97f10e30c2ac1fb414c11925808492f77400 /Zend/zend_ini_parser.y | |
parent | 0ca57dd1d30f725c68734ec9aec5bc174bb3680e (diff) | |
download | php-git-df7ca608ce62dba76ab7c766bede2a3f9b68755e.tar.gz |
Optimized constant lookup
Diffstat (limited to 'Zend/zend_ini_parser.y')
-rw-r--r-- | Zend/zend_ini_parser.y | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/Zend/zend_ini_parser.y b/Zend/zend_ini_parser.y index b65b16a93c..29a2cb0aff 100644 --- a/Zend/zend_ini_parser.y +++ b/Zend/zend_ini_parser.y @@ -112,15 +112,24 @@ static void zend_ini_add_string(zval *result, zval *op1, zval *op2) */ static void zend_ini_get_constant(zval *result, zval *name TSRMLS_DC) { - zval z_constant; + zval *c, tmp; /* If name contains ':' it is not a constant. Bug #26893. */ if (!memchr(Z_STRVAL_P(name), ':', Z_STRLEN_P(name)) - && zend_get_constant(Z_STRVAL_P(name), Z_STRLEN_P(name), &z_constant TSRMLS_CC)) { - /* z_constant is emalloc()'d */ - convert_to_string(&z_constant); - ZVAL_PSTRINGL(result, Z_STRVAL(z_constant), Z_STRLEN(z_constant)); - zval_dtor(&z_constant); + && (c = zend_get_constant(Z_STR_P(name) TSRMLS_CC)) != 0) { + if (Z_TYPE_P(c) != IS_STRING) { + ZVAL_COPY_VALUE(&tmp, c); + if (Z_OPT_CONSTANT(tmp)) { + zval_update_constant_ex(&tmp, (void*)1, NULL TSRMLS_CC); + } + zval_opt_copy_ctor(&tmp); + convert_to_string(&tmp); + c = &tmp; + } + ZVAL_PSTRINGL(result, Z_STRVAL_P(c), Z_STRLEN_P(c)); + if (c == &tmp) { + zval_dtor(&tmp); + } STR_FREE(Z_STR_P(name)); } else { *result = *name; |