#define SEPARATE_ZVAL(zv) do { \
zval *_zv = (zv); \
- if (Z_REFCOUNTED_P(_zv)) { \
- if (Z_REFCOUNT_P(_zv) > 1) { \
+ if (Z_REFCOUNTED_P(_zv) || \
+ Z_IMMUTABLE_P(_zv)) { \
+ if (Z_IMMUTABLE_P(_zv)) { \
+ zval_copy_ctor_func(_zv); \
+ } else if (Z_REFCOUNT_P(_zv) > 1) { \
if (Z_ISREF_P(_zv)) { \
Z_DELREF_P(_zv); \
ZVAL_DUP(_zv, Z_REFVAL_P(_zv)); \
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)) { \
- 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); \
+ 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)
ZVAL_DEREF(container);
if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
- if (Z_IMMUTABLE_P(container)) {
- zval_copy_ctor(container);
- } else if (container == container_ptr) {
- SEPARATE_ZVAL(container);
- }
+ SEPARATE_ZVAL(container);
fetch_from_array:
if (dim == NULL) {
retval = zend_hash_next_index_insert(Z_ARRVAL_P(container), &EG(uninitialized_zval));