summaryrefslogtreecommitdiff
path: root/Zend/zend_API.h
diff options
context:
space:
mode:
authorNikita Popov <nikic@php.net>2013-08-26 19:06:36 +0200
committerNikita Popov <nikic@php.net>2013-08-31 13:16:41 +0200
commit08567145763f25aae3882f682d41d1b50cd9e666 (patch)
tree0458355affcbbbf8c936dc01f1792182c7b6ad6a /Zend/zend_API.h
parentd7ffca590b4ee188a5dcdbafb036e6541f3c79be (diff)
downloadphp-git-08567145763f25aae3882f682d41d1b50cd9e666.tar.gz
Always pass return_value_ptr to internal functions
Previous some places passed return_value_ptr only if the function returned by reference. Now return_value_ptr is always set, even for functions returning by-value. This allows you to return zvals without copying their contents. For this purpose two new macros RETVAL_ZVAL_FAST and RETURN_ZVAL_FAST are added: RETVAL_ZVAL_FAST(zv); /* Analog to RETVAL_ZVAL(zv, 1, 0) */ RETURN_ZVAL_FAST(zv); /* Analog to RETURN_ZVAL(zv, 1, 0) */ These macros behave similarly to the non-FAST versions with copy=1 and dtor=0, with the difference that the FAST versions will try return the zval without copying by utilizing return_value_ptr.
Diffstat (limited to 'Zend/zend_API.h')
-rw-r--r--Zend/zend_API.h12
1 files changed, 12 insertions, 0 deletions
diff --git a/Zend/zend_API.h b/Zend/zend_API.h
index 1a7c66e906..16e766d8a5 100644
--- a/Zend/zend_API.h
+++ b/Zend/zend_API.h
@@ -636,6 +636,18 @@ END_EXTERN_C()
#define RETURN_FALSE { RETVAL_FALSE; return; }
#define RETURN_TRUE { RETVAL_TRUE; return; }
+#define RETVAL_ZVAL_FAST(z) do { \
+ zval *_z = (z); \
+ if (Z_ISREF_P(_z)) { \
+ RETVAL_ZVAL(_z, 1, 0); \
+ } else { \
+ zval_ptr_dtor(&return_value); \
+ Z_ADDREF_P(_z); \
+ *return_value_ptr = _z; \
+ } \
+} while (0)
+#define RETURN_ZVAL_FAST(z) { RETVAL_ZVAL_FAST(z); return; }
+
#define SET_VAR_STRING(n, v) { \
{ \
zval *var; \