ALLOC_ZVAL(tmp);
INIT_PZVAL_COPY(tmp, array_ptr);
array_ptr = tmp;
+ if (Z_TYPE_P(array_ptr) == IS_OBJECT) {
+ ce = Z_OBJCE_P(array_ptr);
+ if (ce && ce->get_iterator) {
+ Z_DELREF_P(array_ptr);
+ }
+ }
} else if (Z_TYPE_P(array_ptr) == IS_OBJECT) {
ce = Z_OBJCE_P(array_ptr);
if (!ce || !ce->get_iterator) {
Z_ADDREF_P(array_ptr);
}
+ } else if (OP1_TYPE == IS_CONST ||
+ ((OP1_TYPE == IS_CV || OP1_TYPE == IS_VAR) &&
+ !Z_ISREF_P(array_ptr) &&
+ Z_REFCOUNT_P(array_ptr) > 1)) {
+ zval *tmp;
+
+ ALLOC_ZVAL(tmp);
+ INIT_PZVAL_COPY(tmp, array_ptr);
+ zval_copy_ctor(tmp);
+ array_ptr = tmp;
} else {
- if ((OP1_TYPE == IS_CV || OP1_TYPE == IS_VAR) &&
- !Z_ISREF_P(array_ptr) &&
- Z_REFCOUNT_P(array_ptr) > 1) {
- zval *tmp;
-
- ALLOC_ZVAL(tmp);
- INIT_PZVAL_COPY(tmp, array_ptr);
- zval_copy_ctor(tmp);
- array_ptr = tmp;
- } else {
- Z_ADDREF_P(array_ptr);
- }
+ Z_ADDREF_P(array_ptr);
}
}
- if (OP1_TYPE != IS_TMP_VAR && ce && ce->get_iterator) {
+ if (ce && ce->get_iterator) {
iter = ce->get_iterator(ce, array_ptr, opline->extended_value & ZEND_FE_RESET_REFERENCE TSRMLS_CC);
if (iter && !EG(exception)) {
ALLOC_ZVAL(tmp);
INIT_PZVAL_COPY(tmp, array_ptr);
array_ptr = tmp;
+ if (Z_TYPE_P(array_ptr) == IS_OBJECT) {
+ ce = Z_OBJCE_P(array_ptr);
+ if (ce && ce->get_iterator) {
+ Z_DELREF_P(array_ptr);
+ }
+ }
} else if (Z_TYPE_P(array_ptr) == IS_OBJECT) {
ce = Z_OBJCE_P(array_ptr);
if (!ce || !ce->get_iterator) {
Z_ADDREF_P(array_ptr);
}
+ } else if (IS_CONST == IS_CONST ||
+ ((IS_CONST == IS_CV || IS_CONST == IS_VAR) &&
+ !Z_ISREF_P(array_ptr) &&
+ Z_REFCOUNT_P(array_ptr) > 1)) {
+ zval *tmp;
+
+ ALLOC_ZVAL(tmp);
+ INIT_PZVAL_COPY(tmp, array_ptr);
+ zval_copy_ctor(tmp);
+ array_ptr = tmp;
} else {
- if ((IS_CONST == IS_CV || IS_CONST == IS_VAR) &&
- !Z_ISREF_P(array_ptr) &&
- Z_REFCOUNT_P(array_ptr) > 1) {
- zval *tmp;
-
- ALLOC_ZVAL(tmp);
- INIT_PZVAL_COPY(tmp, array_ptr);
- zval_copy_ctor(tmp);
- array_ptr = tmp;
- } else {
- Z_ADDREF_P(array_ptr);
- }
+ Z_ADDREF_P(array_ptr);
}
}
- if (IS_CONST != IS_TMP_VAR && ce && ce->get_iterator) {
+ if (ce && ce->get_iterator) {
iter = ce->get_iterator(ce, array_ptr, opline->extended_value & ZEND_FE_RESET_REFERENCE TSRMLS_CC);
if (iter && !EG(exception)) {
ALLOC_ZVAL(tmp);
INIT_PZVAL_COPY(tmp, array_ptr);
array_ptr = tmp;
+ if (Z_TYPE_P(array_ptr) == IS_OBJECT) {
+ ce = Z_OBJCE_P(array_ptr);
+ if (ce && ce->get_iterator) {
+ Z_DELREF_P(array_ptr);
+ }
+ }
} else if (Z_TYPE_P(array_ptr) == IS_OBJECT) {
ce = Z_OBJCE_P(array_ptr);
if (!ce || !ce->get_iterator) {
Z_ADDREF_P(array_ptr);
}
+ } else if (IS_TMP_VAR == IS_CONST ||
+ ((IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) &&
+ !Z_ISREF_P(array_ptr) &&
+ Z_REFCOUNT_P(array_ptr) > 1)) {
+ zval *tmp;
+
+ ALLOC_ZVAL(tmp);
+ INIT_PZVAL_COPY(tmp, array_ptr);
+ zval_copy_ctor(tmp);
+ array_ptr = tmp;
} else {
- if ((IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) &&
- !Z_ISREF_P(array_ptr) &&
- Z_REFCOUNT_P(array_ptr) > 1) {
- zval *tmp;
-
- ALLOC_ZVAL(tmp);
- INIT_PZVAL_COPY(tmp, array_ptr);
- zval_copy_ctor(tmp);
- array_ptr = tmp;
- } else {
- Z_ADDREF_P(array_ptr);
- }
+ Z_ADDREF_P(array_ptr);
}
}
- if (IS_TMP_VAR != IS_TMP_VAR && ce && ce->get_iterator) {
+ if (ce && ce->get_iterator) {
iter = ce->get_iterator(ce, array_ptr, opline->extended_value & ZEND_FE_RESET_REFERENCE TSRMLS_CC);
if (iter && !EG(exception)) {
ALLOC_ZVAL(tmp);
INIT_PZVAL_COPY(tmp, array_ptr);
array_ptr = tmp;
+ if (Z_TYPE_P(array_ptr) == IS_OBJECT) {
+ ce = Z_OBJCE_P(array_ptr);
+ if (ce && ce->get_iterator) {
+ Z_DELREF_P(array_ptr);
+ }
+ }
} else if (Z_TYPE_P(array_ptr) == IS_OBJECT) {
ce = Z_OBJCE_P(array_ptr);
if (!ce || !ce->get_iterator) {
Z_ADDREF_P(array_ptr);
}
+ } else if (IS_VAR == IS_CONST ||
+ ((IS_VAR == IS_CV || IS_VAR == IS_VAR) &&
+ !Z_ISREF_P(array_ptr) &&
+ Z_REFCOUNT_P(array_ptr) > 1)) {
+ zval *tmp;
+
+ ALLOC_ZVAL(tmp);
+ INIT_PZVAL_COPY(tmp, array_ptr);
+ zval_copy_ctor(tmp);
+ array_ptr = tmp;
} else {
- if ((IS_VAR == IS_CV || IS_VAR == IS_VAR) &&
- !Z_ISREF_P(array_ptr) &&
- Z_REFCOUNT_P(array_ptr) > 1) {
- zval *tmp;
-
- ALLOC_ZVAL(tmp);
- INIT_PZVAL_COPY(tmp, array_ptr);
- zval_copy_ctor(tmp);
- array_ptr = tmp;
- } else {
- Z_ADDREF_P(array_ptr);
- }
+ Z_ADDREF_P(array_ptr);
}
}
- if (IS_VAR != IS_TMP_VAR && ce && ce->get_iterator) {
+ if (ce && ce->get_iterator) {
iter = ce->get_iterator(ce, array_ptr, opline->extended_value & ZEND_FE_RESET_REFERENCE TSRMLS_CC);
if (iter && !EG(exception)) {
ALLOC_ZVAL(tmp);
INIT_PZVAL_COPY(tmp, array_ptr);
array_ptr = tmp;
+ if (Z_TYPE_P(array_ptr) == IS_OBJECT) {
+ ce = Z_OBJCE_P(array_ptr);
+ if (ce && ce->get_iterator) {
+ Z_DELREF_P(array_ptr);
+ }
+ }
} else if (Z_TYPE_P(array_ptr) == IS_OBJECT) {
ce = Z_OBJCE_P(array_ptr);
if (!ce || !ce->get_iterator) {
Z_ADDREF_P(array_ptr);
}
+ } else if (IS_CV == IS_CONST ||
+ ((IS_CV == IS_CV || IS_CV == IS_VAR) &&
+ !Z_ISREF_P(array_ptr) &&
+ Z_REFCOUNT_P(array_ptr) > 1)) {
+ zval *tmp;
+
+ ALLOC_ZVAL(tmp);
+ INIT_PZVAL_COPY(tmp, array_ptr);
+ zval_copy_ctor(tmp);
+ array_ptr = tmp;
} else {
- if ((IS_CV == IS_CV || IS_CV == IS_VAR) &&
- !Z_ISREF_P(array_ptr) &&
- Z_REFCOUNT_P(array_ptr) > 1) {
- zval *tmp;
-
- ALLOC_ZVAL(tmp);
- INIT_PZVAL_COPY(tmp, array_ptr);
- zval_copy_ctor(tmp);
- array_ptr = tmp;
- } else {
- Z_ADDREF_P(array_ptr);
- }
+ Z_ADDREF_P(array_ptr);
}
}
- if (IS_CV != IS_TMP_VAR && ce && ce->get_iterator) {
+ if (ce && ce->get_iterator) {
iter = ce->get_iterator(ce, array_ptr, opline->extended_value & ZEND_FE_RESET_REFERENCE TSRMLS_CC);
if (iter && !EG(exception)) {