summaryrefslogtreecommitdiff
path: root/Zend/zend_execute.c
diff options
context:
space:
mode:
Diffstat (limited to 'Zend/zend_execute.c')
-rw-r--r--Zend/zend_execute.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c
index 08ba4fa63e..9e7db630ec 100644
--- a/Zend/zend_execute.c
+++ b/Zend/zend_execute.c
@@ -64,7 +64,7 @@ static void zend_extension_fcall_end_handler(zend_extension *extension, zend_op_
#define TEMP_VAR_STACK_LIMIT 2000
-static inline void zend_pzval_unlock_func(zval *z, zend_free_op *should_free, int unref)
+static inline void zend_pzval_unlock_func(zval *z, zend_free_op *should_free, int unref TSRMLS_DC)
{
if (!Z_DELREF_P(z)) {
Z_SET_REFCOUNT_P(z, 1);
@@ -76,19 +76,21 @@ static inline void zend_pzval_unlock_func(zval *z, zend_free_op *should_free, in
if (unref && Z_ISREF_P(z) && Z_REFCOUNT_P(z) == 1) {
Z_UNSET_ISREF_P(z);
}
+ GC_ZVAL_CHECK_POSSIBLE_ROOT(z);
}
}
static inline void zend_pzval_unlock_free_func(zval *z)
{
if (!Z_DELREF_P(z)) {
+ GC_REMOVE_ZVAL_FROM_BUFFER(z);
zval_dtor(z);
safe_free_zval_ptr(z);
}
}
-#define PZVAL_UNLOCK(z, f) zend_pzval_unlock_func(z, f, 1)
-#define PZVAL_UNLOCK_EX(z, f, u) zend_pzval_unlock_func(z, f, u)
+#define PZVAL_UNLOCK(z, f) zend_pzval_unlock_func(z, f, 1 TSRMLS_CC)
+#define PZVAL_UNLOCK_EX(z, f, u) zend_pzval_unlock_func(z, f, u TSRMLS_CC)
#define PZVAL_UNLOCK_FREE(z) zend_pzval_unlock_free_func(z)
#define PZVAL_LOCK(z) Z_ADDREF_P((z))
#define RETURN_VALUE_UNUSED(pzn) (((pzn)->u.EA.type & EXT_TYPE_UNUSED))
@@ -777,6 +779,7 @@ static inline zval* zend_assign_to_variable(zval **variable_ptr_ptr, zval *value
} else {
Z_ADDREF_P(value);
*variable_ptr_ptr = value;
+ GC_REMOVE_ZVAL_FROM_BUFFER(variable_ptr);
zendi_zval_dtor(*variable_ptr);
safe_free_zval_ptr(variable_ptr);
return value;