{
zval globals;
+ /* IS_TYPE_COPYABLE, but with ref-counter 1 and not IS_TYPE_REFCOUNTED */
ZVAL_ARR(&globals, &EG(symbol_table));
- Z_TYPE_INFO_P(&globals) = IS_ARRAY;
+ Z_TYPE_FLAGS_P(&globals) = IS_TYPE_COPYABLE;
ZVAL_NEW_REF(&globals, &globals);
zend_hash_update(&EG(symbol_table), name, &globals);
return 0;
}
if (Z_TYPE_P(array) == IS_ARRAY) {
- //??? TODO: try to avoid array duplication
zval_ptr_dtor(&intern->array);
- ZVAL_DUP(&intern->array, array);
+ if (Z_REFCOUNT_P(array) == 1) {
+ ZVAL_COPY(&intern->array, array);
+ } else {
+ //??? TODO: try to avoid array duplication
+ ZVAL_ARR(&intern->array, zend_array_dup(Z_ARR_P(array)));
+ }
} else {
if (Z_OBJ_HT_P(array) == &spl_handler_ArrayObject || Z_OBJ_HT_P(array) == &spl_handler_ArrayIterator) {
zval_ptr_dtor(&intern->array);