summaryrefslogtreecommitdiff
path: root/Zend/zend.h
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2014-06-05 16:04:11 +0400
committerDmitry Stogov <dmitry@zend.com>2014-06-05 16:04:11 +0400
commitc1965f58d4dd3970912dcd6a63ccd5860bae1a97 (patch)
tree15b4a94e8e8405f791438c468ad4eb03f60c4079 /Zend/zend.h
parent3d87391cc06fe87344536e88ac74ded22b0195cf (diff)
downloadphp-git-c1965f58d4dd3970912dcd6a63ccd5860bae1a97.tar.gz
Use reference counting instead of zval duplication
Diffstat (limited to 'Zend/zend.h')
-rw-r--r--Zend/zend.h73
1 files changed, 42 insertions, 31 deletions
diff --git a/Zend/zend.h b/Zend/zend.h
index d9c8db19b6..c346c023c1 100644
--- a/Zend/zend.h
+++ b/Zend/zend.h
@@ -707,6 +707,13 @@ END_EXTERN_C()
} \
} while (0)
+#define ZVAL_MAKE_REF(zv) do { \
+ zval *__zv = (zv); \
+ if (!Z_ISREF_P(__zv)) { \
+ ZVAL_NEW_REF(__zv, __zv); \
+ } \
+ } while (0)
+
#define ZVAL_UNREF(z) do { \
zval *_z = (z); \
zend_reference *ref; \
@@ -716,6 +723,38 @@ END_EXTERN_C()
efree(ref); \
} while (0)
+#define SEPARATE_STRING(zv) do { \
+ zval *_zv = (zv); \
+ if (Z_REFCOUNTED_P(_zv) && \
+ Z_REFCOUNT_P(_zv) > 1) { \
+ Z_DELREF_P(_zv); \
+ zval_copy_ctor_func(_zv); \
+ } \
+ } while (0)
+
+#define SEPARATE_ARRAY(zv) do { \
+ zval *_zv = (zv); \
+ if (Z_IMMUTABLE_P(_zv)) { \
+ zval_copy_ctor_func(_zv); \
+ } else if (Z_REFCOUNT_P(_zv) > 1) { \
+ Z_DELREF_P(_zv); \
+ zval_copy_ctor_func(_zv); \
+ } \
+ } while (0)
+
+#define SEPARATE_ZVAL_NOREF(zv) do { \
+ zval *_zv = (zv); \
+ if (Z_COPYABLE_P(_zv) || \
+ Z_IMMUTABLE_P(_zv)) { \
+ if (Z_IMMUTABLE_P(_zv)) { \
+ zval_copy_ctor_func(_zv); \
+ } else if (Z_REFCOUNT_P(_zv) > 1) { \
+ Z_DELREF_P(_zv); \
+ zval_copy_ctor_func(_zv); \
+ } \
+ } \
+ } while (0)
+
#define SEPARATE_ZVAL(zv) do { \
zval *_zv = (zv); \
if (Z_REFCOUNTED_P(_zv) || \
@@ -749,38 +788,10 @@ END_EXTERN_C()
} \
} while (0)
-#define SEPARATE_ZVAL_IF_REF(zv) do { \
- zval *__zv = (zv); \
- if (Z_ISREF_P(__zv)) { \
- if (Z_REFCOUNT_P(__zv) == 1) { \
- ZVAL_UNREF(__zv); \
- } else { \
- Z_DELREF_P(__zv); \
- ZVAL_DUP(__zv, Z_REFVAL_P(__zv)); \
- } \
- } \
- } while (0)
-
-#define SEPARATE_ZVAL_TO_MAKE_IS_REF(zv) do { \
- zval *__zv = (zv); \
- if (!Z_ISREF_P(__zv)) { \
- if (Z_COPYABLE_P(__zv) && \
- Z_REFCOUNT_P(__zv) > 1) { \
- Z_DELREF_P(__zv); \
- zval_copy_ctor_func(__zv); \
- } \
- ZVAL_NEW_REF(__zv, __zv); \
- } \
- } while (0)
-
#define SEPARATE_ARG_IF_REF(varptr) do { \
- zval *_varptr = (varptr); \
- if (Z_ISREF_P(_varptr)) { \
- zval tmp; \
- ZVAL_DUP(&tmp, Z_REFVAL_P(_varptr)); \
- varptr = &tmp; \
- } else if (Z_REFCOUNTED_P(_varptr)) { \
- Z_ADDREF_P(_varptr); \
+ ZVAL_DEREF(varptr); \
+ if (Z_REFCOUNTED_P(varptr)) { \
+ Z_ADDREF_P(varptr); \
} \
} while (0)