Commit 5dfd11b1b0d for php
commit 5dfd11b1b0de6d066868ea6384d42d1aacc3b93d
Author: Weilin Du <weilindu@php.net>
Date: Fri Sep 25 00:23:44 2026 +0800
ext/intl: Stop enumCharNames() when the callback throws (#23866)
diff --git a/ext/intl/uchar/tests/enumCharNames_callback_exception.phpt b/ext/intl/uchar/tests/enumCharNames_callback_exception.phpt
new file mode 100644
index 00000000000..2ebac7aac92
--- /dev/null
+++ b/ext/intl/uchar/tests/enumCharNames_callback_exception.phpt
@@ -0,0 +1,20 @@
+--TEST--
+IntlChar::enumCharNames() propagates callback exceptions and remains usable
+--EXTENSIONS--
+intl
+--FILE--
+<?php
+try {
+ IntlChar::enumCharNames(65, 68, static function ($codepoint) {
+ echo $codepoint, "\n";
+ throw new Exception('Stop enumeration');
+ });
+} catch (Exception $e) {
+ echo $e->getMessage(), "\n";
+}
+var_dump(IntlChar::enumCharNames(65, 68, static fn() => false));
+?>
+--EXPECT--
+65
+Stop enumeration
+bool(true)
diff --git a/ext/intl/uchar/uchar.cpp b/ext/intl/uchar/uchar.cpp
index 1319ec67908..b2df5b9a05a 100644
--- a/ext/intl/uchar/uchar.cpp
+++ b/ext/intl/uchar/uchar.cpp
@@ -312,7 +312,7 @@ static UBool enumCharNames_callback(enumCharNames_data *context,
}
zval_ptr_dtor(&retval);
zval_ptr_dtor_str(&args[2]);
- return 1;
+ return !EG(exception);
}
IC_METHOD(enumCharNames) {
UChar32 start, limit;