summaryrefslogtreecommitdiff
path: root/Zend/zend.h
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2014-05-29 18:21:56 +0400
committerDmitry Stogov <dmitry@zend.com>2014-05-29 18:21:56 +0400
commitb3b616cf7ee0702aca2f6fdb022dc7e28e015a22 (patch)
tree933686808b06b0408b0207f6fa2afe9111b866f9 /Zend/zend.h
parentbfff679d903c7ef1648d3d009f42566baa7d6232 (diff)
downloadphp-git-b3b616cf7ee0702aca2f6fdb022dc7e28e015a22.tar.gz
Introduced immutable arrays. They don't need to be copyed and may be used directly from SHM.
Diffstat (limited to 'Zend/zend.h')
-rw-r--r--Zend/zend.h27
1 files changed, 15 insertions, 12 deletions
diff --git a/Zend/zend.h b/Zend/zend.h
index 1968d76c22..1a4d301f45 100644
--- a/Zend/zend.h
+++ b/Zend/zend.h
@@ -737,17 +737,22 @@ END_EXTERN_C()
zval_copy_ctor_func(_zv); \
} \
} \
+ } else if (Z_IMMUTABLE_P(_zv)) { \
+ zval_copy_ctor_func(_zv); \
} \
} while (0)
#define SEPARATE_ZVAL_IF_NOT_REF(zv) do { \
zval *_zv = (zv); \
- if (!Z_ISREF_P(_zv) && \
- Z_COPYABLE_P(_zv) && \
- Z_REFCOUNT_P(_zv) > 1) { \
- Z_DELREF_P(_zv); \
- zval_copy_ctor_func(_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); \
+ } else if (Z_IMMUTABLE_P(_zv)) { \
+ zval_copy_ctor_func(_zv); \
+ } \
+ } \
} while (0)
#define SEPARATE_ZVAL_IF_REF(zv) do { \
@@ -765,14 +770,12 @@ END_EXTERN_C()
#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) { \
- ZVAL_NEW_REF(__zv, __zv); \
- } else { \
+ if (Z_COPYABLE_P(__zv) && \
+ Z_REFCOUNT_P(__zv) > 1) { \
Z_DELREF_P(__zv); \
- ZVAL_NEW_REF(__zv, __zv); \
- zval_copy_ctor_func(Z_REFVAL_P(__zv)); \
+ zval_copy_ctor_func(__zv); \
} \
+ ZVAL_NEW_REF(__zv, __zv); \
} \
} while (0)