summaryrefslogtreecommitdiff
path: root/Zend/zend_types.h
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2018-11-15 17:13:12 +0100
committerNikita Popov <nikita.ppv@gmail.com>2018-11-15 17:16:39 +0100
commitdee5a450d9b7f7b03f012dd1912cc0a3dcb0482c (patch)
tree2a0727b81684fe683fc9efe3b9a5b3df01840a72 /Zend/zend_types.h
parent2a062f3c020e8cc53e49fa823021f3e8ce591cfe (diff)
downloadphp-git-dee5a450d9b7f7b03f012dd1912cc0a3dcb0482c.tar.gz
Fixed bug #77165
Also add some helper macros for PROTECT/UNPROTECT that check for IMMUTABLE. These checks are needed for nearly any use of PROTECT/UNPROTECT.
Diffstat (limited to 'Zend/zend_types.h')
-rw-r--r--Zend/zend_types.h8
1 files changed, 8 insertions, 0 deletions
diff --git a/Zend/zend_types.h b/Zend/zend_types.h
index 5492f17c00..4250aabd1f 100644
--- a/Zend/zend_types.h
+++ b/Zend/zend_types.h
@@ -570,6 +570,14 @@ static zend_always_inline uint32_t zval_gc_info(uint32_t gc_type_info) {
GC_DEL_FLAGS(p, GC_PROTECTED); \
} while (0)
+#define GC_TRY_PROTECT_RECURSION(p) do { \
+ if (!(GC_FLAGS(p) & GC_IMMUTABLE)) GC_PROTECT_RECURSION(p); \
+ } while (0)
+
+#define GC_TRY_UNPROTECT_RECURSION(p) do { \
+ if (!(GC_FLAGS(p) & GC_IMMUTABLE)) GC_UNPROTECT_RECURSION(p); \
+ } while (0)
+
#define Z_IS_RECURSIVE(zval) GC_IS_RECURSIVE(Z_COUNTED(zval))
#define Z_PROTECT_RECURSION(zval) GC_PROTECT_RECURSION(Z_COUNTED(zval))
#define Z_UNPROTECT_RECURSION(zval) GC_UNPROTECT_RECURSION(Z_COUNTED(zval))