]> granicus.if.org Git - php/commitdiff
Fixed string interning during constants substitution
authorDmitry Stogov <dmitry@zend.com>
Wed, 1 Nov 2017 07:56:37 +0000 (10:56 +0300)
committerDmitry Stogov <dmitry@zend.com>
Wed, 1 Nov 2017 07:56:37 +0000 (10:56 +0300)
Zend/tests/class_constants_005.phpt [new file with mode: 0644]
Zend/zend_compile.c

diff --git a/Zend/tests/class_constants_005.phpt b/Zend/tests/class_constants_005.phpt
new file mode 100644 (file)
index 0000000..de53c2c
--- /dev/null
@@ -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."
index 32c5e2e221504c9f7c2fb1aad3276139bb35df4e..bbe69d0a434abaf0110d95443a8493498be148ce 100644 (file)
@@ -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);