diff options
Diffstat (limited to 'Zend/zend.h')
| -rw-r--r-- | Zend/zend.h | 34 |
1 files changed, 21 insertions, 13 deletions
diff --git a/Zend/zend.h b/Zend/zend.h index aaf12ead40..46bc2ff39c 100644 --- a/Zend/zend.h +++ b/Zend/zend.h @@ -669,15 +669,30 @@ END_EXTERN_C() zval_copy_ctor(__z1); \ } while (0) +#define ZVAL_DEREF(z) do { \ + if (UNEXPECTED(Z_ISREF_P(z))) { \ + (z) = Z_REFVAL_P(z); \ + } \ + } while (0) + +//??? this macro should be used to get argument value passed by referebce +//??? unfortunately it's not always work as expected +#if 0 +#define ZVAL_DEREF_REF(z) do { \ + ZEND_ASSERT(Z_ISREF_P(z)); \ + (z) = Z_REFVAL_P(z); \ + } while (0) +#else +#define ZVAL_DEREF_REF(z) \ + ZVAL_DEREF(z) +#endif + #define ZVAL_DUP_DEREF(z, v) \ do { \ zval *__z1 = (z); \ zval *__z2 = (v); \ - if (Z_ISREF_P(__z2)) { \ - ZVAL_COPY_VALUE(__z1, Z_REFVAL_P(__z2)); \ - } else { \ - ZVAL_COPY_VALUE(__z1, __z2); \ - } \ + ZVAL_DEREF(__z2); \ + ZVAL_COPY_VALUE(__z1, __z2); \ zval_copy_ctor(__z1); \ } while (0) @@ -691,12 +706,6 @@ END_EXTERN_C() efree(ref); \ } while (0) -#define ZVAL_DEREF(z) do { \ - if (Z_ISREF_P((z))) { \ - (z) = Z_REFVAL_P((z)); \ - } \ - } while (0) - // TODO: invalud ??? #define INIT_PZVAL_COPY(z, v) \ do { \ @@ -738,9 +747,8 @@ END_EXTERN_C() if (Z_REFCOUNT_P(__zv) == 1) { \ ZVAL_UNREF(__zv); \ } else { \ - zval *ref = Z_REFVAL_P(__zv); \ Z_DELREF_P(__zv); \ - ZVAL_DUP(__zv, ref); \ + ZVAL_DUP(__zv, Z_REFVAL_P(__zv)); \ } \ } \ } while (0) |
