diff options
-rw-r--r-- | Zend/tests/class_constants_005.phpt | 12 | ||||
-rw-r--r-- | Zend/zend_constants.c | 26 | ||||
-rw-r--r-- | ext/opcache/ZendAccelerator.c | 3 |
3 files changed, 10 insertions, 31 deletions
diff --git a/Zend/tests/class_constants_005.phpt b/Zend/tests/class_constants_005.phpt deleted file mode 100644 index de53c2c0ca..0000000000 --- a/Zend/tests/class_constants_005.phpt +++ /dev/null @@ -1,12 +0,0 @@ ---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_constants.c b/Zend/zend_constants.c index bbb4824d1d..100d0a263b 100644 --- a/Zend/zend_constants.c +++ b/Zend/zend_constants.c @@ -445,21 +445,13 @@ ZEND_API zend_constant* ZEND_FASTCALL zend_quick_get_constant(const zval *key, u static void* zend_hash_add_constant(HashTable *ht, zend_string *key, zend_constant *c) { - zval *ret, tmp; - zend_constant *copy; - - ZVAL_PTR(&tmp, NULL); - ret = zend_hash_add(ht, key, &tmp); - if (EXPECTED(ret)) { - Z_PTR_P(ret) = copy = pemalloc(sizeof(zend_constant), c->flags & CONST_PERSISTENT); - memcpy(copy, c, sizeof(zend_constant)); - if (Z_TYPE(copy->value) == IS_STRING && !ZSTR_IS_INTERNED(Z_STR(copy->value))) { - SEPARATE_STRING(©->value); - Z_STR(copy->value) = zend_new_interned_string(Z_STR(copy->value)); - if (ZSTR_IS_INTERNED(Z_STR(copy->value))) { - Z_TYPE_FLAGS(copy->value) &= ~ (IS_TYPE_REFCOUNTED | IS_TYPE_COPYABLE); - } - } + void *ret; + zend_constant *copy = pemalloc(sizeof(zend_constant), c->flags & CONST_PERSISTENT); + + memcpy(copy, c, sizeof(zend_constant)); + ret = zend_hash_add_ptr(ht, key, copy); + if (!ret) { + pefree(copy, c->flags & CONST_PERSISTENT); } return ret; } @@ -474,7 +466,9 @@ ZEND_API int zend_register_constant(zend_constant *c) printf("Registering constant for module %d\n", c->module_number); #endif - c->name = zend_new_interned_string(c->name); + if (c->module_number != PHP_USER_CONSTANT) { + c->name = zend_new_interned_string(c->name); + } if (!(c->flags & CONST_CS)) { lowercase_name = zend_string_alloc(ZSTR_LEN(c->name), c->flags & CONST_PERSISTENT); diff --git a/ext/opcache/ZendAccelerator.c b/ext/opcache/ZendAccelerator.c index 2a66077631..1d31489429 100644 --- a/ext/opcache/ZendAccelerator.c +++ b/ext/opcache/ZendAccelerator.c @@ -644,9 +644,6 @@ static void accel_copy_permanent_strings(zend_new_interned_string_func_t new_int if (c->name) { c->name = new_interned_string(c->name); } - if (Z_TYPE(c->value) == IS_STRING) { - Z_STR(c->value) = new_interned_string(Z_STR(c->value)); - } } ZEND_HASH_FOREACH_END(); /* auto globals hash keys and names */ |