summaryrefslogtreecommitdiff
path: root/Zend/zend_opcode.c
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2015-02-20 13:28:26 +0300
committerDmitry Stogov <dmitry@zend.com>2015-02-20 13:28:26 +0300
commitd85113702cc6030a9149f518c55953ccb6933a7c (patch)
treed203e105d433a87050fca191298d1757d4aeeaba /Zend/zend_opcode.c
parent582aa41d6fb7bf803b5d731ec9f5d6627d01c4c7 (diff)
downloadphp-git-d85113702cc6030a9149f518c55953ccb6933a7c.tar.gz
Lazy duplication of op_array->static_variables
Diffstat (limited to 'Zend/zend_opcode.c')
-rw-r--r--Zend/zend_opcode.c12
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) {