diff options
author | Dmitry Stogov <dmitry@zend.com> | 2017-11-01 10:56:37 +0300 |
---|---|---|
committer | Dmitry Stogov <dmitry@zend.com> | 2017-11-01 10:56:37 +0300 |
commit | 02a05146fd34e059aa8ac6af2113b3cbf3a8fd8a (patch) | |
tree | 2c71be8ce4a9ec0f8cdaf1293cfcccb6ed13e1a3 | |
parent | 5baf657db3c58201c2d861f9809c40124c57d666 (diff) | |
download | php-git-02a05146fd34e059aa8ac6af2113b3cbf3a8fd8a.tar.gz |
Fixed string interning during constants substitution
-rw-r--r-- | Zend/tests/class_constants_005.phpt | 12 | ||||
-rw-r--r-- | Zend/zend_compile.c | 3 |
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); |