diff options
author | Dmitry Stogov <dmitry@zend.com> | 2015-02-20 13:28:26 +0300 |
---|---|---|
committer | Dmitry Stogov <dmitry@zend.com> | 2015-02-20 13:28:26 +0300 |
commit | d85113702cc6030a9149f518c55953ccb6933a7c (patch) | |
tree | d203e105d433a87050fca191298d1757d4aeeaba /Zend/zend_opcode.c | |
parent | 582aa41d6fb7bf803b5d731ec9f5d6627d01c4c7 (diff) | |
download | php-git-d85113702cc6030a9149f518c55953ccb6933a7c.tar.gz |
Lazy duplication of op_array->static_variables
Diffstat (limited to 'Zend/zend_opcode.c')
-rw-r--r-- | Zend/zend_opcode.c | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/Zend/zend_opcode.c b/Zend/zend_opcode.c index d75cdd0ff3..999ee65957 100644 --- a/Zend/zend_opcode.c +++ b/Zend/zend_opcode.c @@ -130,7 +130,8 @@ ZEND_API void zend_function_dtor(zval *zv) ZEND_API void zend_cleanup_op_array_data(zend_op_array *op_array) { - if (op_array->static_variables) { + if (op_array->static_variables && + !(GC_FLAGS(op_array->static_variables) & IS_ARRAY_IMMUTABLE)) { zend_hash_clean(op_array->static_variables); } } @@ -317,9 +318,12 @@ ZEND_API void destroy_op_array(zend_op_array *op_array) zval *end; uint32_t i; - if (op_array->static_variables) { - zend_hash_destroy(op_array->static_variables); - FREE_HASHTABLE(op_array->static_variables); + if (op_array->static_variables && + !(GC_FLAGS(op_array->static_variables) & IS_ARRAY_IMMUTABLE)) { + if (--GC_REFCOUNT(op_array->static_variables) == 0) { + zend_array_destroy(op_array->static_variables); + FREE_HASHTABLE(op_array->static_variables); + } } if (op_array->run_time_cache && !op_array->function_name) { |