diff options
Diffstat (limited to 'ext/spl/spl_iterators.c')
| -rw-r--r-- | ext/spl/spl_iterators.c | 35 |
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) { |
