summaryrefslogtreecommitdiff
path: root/ext/spl/spl_iterators.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/spl/spl_iterators.c')
-rw-r--r--ext/spl/spl_iterators.c35
1 files changed, 17 insertions, 18 deletions
diff --git a/ext/spl/spl_iterators.c b/ext/spl/spl_iterators.c
index 697d5f1d91..defb9fdb88 100644
--- a/ext/spl/spl_iterators.c
+++ b/ext/spl/spl_iterators.c
@@ -1066,23 +1066,18 @@ static void spl_recursive_tree_iterator_get_entry(spl_recursive_it_object *objec
{
zend_object_iterator *iterator = object->iterators[object->level].iterator;
zval *data;
- zend_error_handling error_handling;
data = iterator->funcs->get_current_data(iterator);
-
- /* Replace exception handling so the catchable fatal error that is thrown when a class
- * without __toString is converted to string is converted into an exception. */
- zend_replace_error_handling(EH_THROW, spl_ce_UnexpectedValueException, &error_handling);
if (data) {
ZVAL_DEREF(data);
+ /* TODO: Remove this special case? */
if (Z_TYPE_P(data) == IS_ARRAY) {
- ZVAL_STRINGL(return_value, "Array", sizeof("Array")-1);
+ RETVAL_INTERNED_STR(ZSTR_KNOWN(ZEND_STR_ARRAY_CAPITALIZED));
} else {
ZVAL_COPY(return_value, data);
convert_to_string(return_value);
}
}
- zend_restore_error_handling(&error_handling);
}
static void spl_recursive_tree_iterator_get_postfix(spl_recursive_it_object *object, zval *return_value)
@@ -2006,7 +2001,7 @@ SPL_METHOD(RegexIterator, accept)
spl_dual_it_object *intern;
zend_string *result, *subject;
size_t count = 0;
- zval zcount, *replacement, tmp_replacement, rv;
+ zval zcount, rv;
pcre2_match_data *match_data;
pcre2_code *re;
int rc;
@@ -2030,6 +2025,11 @@ SPL_METHOD(RegexIterator, accept)
subject = zval_get_string(&intern->current.data);
}
+ /* Exception during string conversion. */
+ if (EG(exception)) {
+ return;
+ }
+
switch (intern->u.regex.mode)
{
case REGIT_MODE_MAX: /* won't happen but makes compiler happy */
@@ -2061,14 +2061,14 @@ SPL_METHOD(RegexIterator, accept)
RETVAL_BOOL(count > 1);
break;
- case REGIT_MODE_REPLACE:
- replacement = zend_read_property(intern->std.ce, ZEND_THIS, "replacement", sizeof("replacement")-1, 1, &rv);
- if (Z_TYPE_P(replacement) != IS_STRING) {
- ZVAL_COPY(&tmp_replacement, replacement);
- convert_to_string(&tmp_replacement);
- replacement = &tmp_replacement;
+ case REGIT_MODE_REPLACE: {
+ zval *replacement = zend_read_property(intern->std.ce, ZEND_THIS, "replacement", sizeof("replacement")-1, 1, &rv);
+ zend_string *replacement_str = zval_get_string(replacement);
+ if (EG(exception)) {
+ return;
}
- result = php_pcre_replace_impl(intern->u.regex.pce, subject, ZSTR_VAL(subject), ZSTR_LEN(subject), Z_STR_P(replacement), -1, &count);
+
+ result = php_pcre_replace_impl(intern->u.regex.pce, subject, ZSTR_VAL(subject), ZSTR_LEN(subject), replacement_str, -1, &count);
if (intern->u.regex.flags & REGIT_USE_KEY) {
zval_ptr_dtor(&intern->current.key);
@@ -2078,10 +2078,9 @@ SPL_METHOD(RegexIterator, accept)
ZVAL_STR(&intern->current.data, result);
}
- if (replacement == &tmp_replacement) {
- zval_ptr_dtor(replacement);
- }
+ zend_string_release(replacement_str);
RETVAL_BOOL(count > 0);
+ }
}
if (intern->u.regex.flags & REGIT_INVERTED) {