summaryrefslogtreecommitdiff
path: root/Zend/zend_ini_parser.y
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2014-04-25 00:56:15 +0400
committerDmitry Stogov <dmitry@zend.com>2014-04-25 00:56:15 +0400
commitdf7ca608ce62dba76ab7c766bede2a3f9b68755e (patch)
treeb70e97f10e30c2ac1fb414c11925808492f77400 /Zend/zend_ini_parser.y
parent0ca57dd1d30f725c68734ec9aec5bc174bb3680e (diff)
downloadphp-git-df7ca608ce62dba76ab7c766bede2a3f9b68755e.tar.gz
Optimized constant lookup
Diffstat (limited to 'Zend/zend_ini_parser.y')
-rw-r--r--Zend/zend_ini_parser.y21
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;