summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXinchen Hui <laruence@gmail.com>2017-11-01 18:42:12 +0800
committerXinchen Hui <laruence@gmail.com>2017-11-01 18:42:12 +0800
commita32e567ec8b28a7ccc0ebca9d24911788aaf853c (patch)
tree78572163576a1e612e59a02a3fe103e22f408a97
parent322f7e57008d04993bc8bb4dd09768816a07f769 (diff)
parent02a05146fd34e059aa8ac6af2113b3cbf3a8fd8a (diff)
downloadphp-git-a32e567ec8b28a7ccc0ebca9d24911788aaf853c.tar.gz
Merge branch 'master' of git.php.net:/php-src
* 'master' of git.php.net:/php-src: Fixed string interning during constants substitution
-rw-r--r--Zend/tests/class_constants_005.phpt12
-rw-r--r--Zend/zend_compile.c3
2 files changed, 14 insertions, 1 deletions
diff --git a/Zend/tests/class_constants_005.phpt b/Zend/tests/class_constants_005.phpt
new file mode 100644
index 0000000000..de53c2c0ca
--- /dev/null
+++ b/Zend/tests/class_constants_005.phpt
@@ -0,0 +1,12 @@
+--TEST--
+String interning during constants substitution
+--INI--
+opcache.enable_cli=0
+--FILE--
+<?php
+define ("A", "." . ord(26) . ".");
+eval("class A {const a = A;}");
+var_dump(A::a);
+?>
+--EXPECT--
+string(4) ".50."
diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c
index 32c5e2e221..bbe69d0a43 100644
--- a/Zend/zend_compile.c
+++ b/Zend/zend_compile.c
@@ -6079,7 +6079,8 @@ void zend_compile_class_const_decl(zend_ast *ast) /* {{{ */
}
zend_const_expr_to_zval(&value_zv, value_ast);
- if (Z_TYPE(value_zv) == IS_STRING) {
+ if (Z_TYPE(value_zv) == IS_STRING && !ZSTR_IS_INTERNED(Z_STR(value_zv))) {
+ SEPARATE_STRING(&value_zv);
zval_make_interned_string(&value_zv);
}
zend_declare_class_constant_ex(ce, name, &value_zv, ast->attr, doc_comment);