[php-src] master: Merge branch 'PHP-8.4' into PHP-8.5
Weilin Du <[email protected]>
| Newsgroups | gmane.comp.php.cvs.general |
|---|---|
| Message-ID | <[email protected]> |
Author: Weilin Du (LamentXU123)
Date: 2026-06-29T22:49:50+08:00
Commit: https://github.com/php/php-src/commit/9aa4580e071c71e9d79be4d81914889dbbe04382
Raw diff: https://github.com/php/php-src/commit/9aa4580e071c71e9d79be4d81914889dbbe04382.diff
Merge branch 'PHP-8.4' into PHP-8.5
* PHP-8.4:
ext/intl: Reset IntlChar error state on method entry (#22500)
Changed paths:
A ext/intl/tests/intlchar_reset_error.phpt
M NEWS
M ext/intl/uchar/uchar.cpp
Diff:
diff --git a/NEWS b/NEWS
index dc37bcf555da..957e4123a227 100644
--- a/NEWS
+++ b/NEWS
@@ -26,6 +26,8 @@ PHP NEWS
Spoofchecker::__construct() twice. (Weilin Du)
. Fixed memory leak when calling IntlListFormatter::__construct() twice.
(Weilin Du)
+ . Fixed IntlChar methods leaving stale global error state after successful
+ calls. (Xuyang Zhang)
- Phar:
. Fixed inconsistent handling of the magic ".phar" directory. Paths such as
diff --git a/ext/intl/tests/intlchar_reset_error.phpt b/ext/intl/tests/intlchar_reset_error.phpt
new file mode 100644
index 000000000000..45f6d1df2961
--- /dev/null
+++ b/ext/intl/tests/intlchar_reset_error.phpt
@@ -0,0 +1,19 @@
+--TEST--
+IntlChar methods reset intl error on success
+--EXTENSIONS--
+intl
+--FILE--
+<?php
+var_dump(IntlChar::digit('a', 1));
+var_dump(intl_get_error_code() !== U_ZERO_ERROR);
+
+var_dump(IntlChar::forDigit(1) === ord('1'));
+var_dump(intl_get_error_code() === U_ZERO_ERROR);
+var_dump(intl_get_error_message() === 'U_ZERO_ERROR');
+?>
+--EXPECT--
+bool(false)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
diff --git a/ext/intl/uchar/uchar.cpp b/ext/intl/uchar/uchar.cpp
index 8486d384846f..d51ab204d4bb 100644
--- a/ext/intl/uchar/uchar.cpp
+++ b/ext/intl/uchar/uchar.cpp
@@ -56,6 +56,8 @@ IC_METHOD(chr) {
char buffer[5];
int buffer_len = 0;
+ intl_error_reset(NULL);
+
if (parse_code_point_param(INTERNAL_FUNCTION_PARAM_PASSTHRU, &cp) == FAILURE) {
RETURN_NULL();
}
@@ -75,6 +77,8 @@ IC_METHOD(chr) {
IC_METHOD(ord) {
UChar32 cp;
+ intl_error_reset(NULL);
+
if (parse_code_point_param(INTERNAL_FUNCTION_PARAM_PASSTHRU, &cp) == FAILURE) {
RETURN_NULL();
}
@@ -90,6 +94,8 @@ IC_METHOD(hasBinaryProperty) {
zend_string *string_codepoint;
zend_long int_codepoint = 0;
+ intl_error_reset(NULL);
+
ZEND_PARSE_PARAMETERS_START(2, 2)
Z_PARAM_STR_OR_LONG(string_codepoint, int_codepoint)
Z_PARAM_LONG(prop)
@@ -110,6 +116,8 @@ IC_METHOD(getIntPropertyValue) {
zend_string *string_codepoint;
zend_long int_codepoint = 0;
+ intl_error_reset(NULL);
+
ZEND_PARSE_PARAMETERS_START(2, 2)
Z_PARAM_STR_OR_LONG(string_codepoint, int_codepoint)
Z_PARAM_LONG(prop)
@@ -127,6 +135,8 @@ IC_METHOD(getIntPropertyValue) {
IC_METHOD(getIntPropertyMinValue) {
zend_long prop;
+ intl_error_reset(NULL);
+
ZEND_PARSE_PARAMETERS_START(1, 1)
Z_PARAM_LONG(prop)
ZEND_PARSE_PARAMETERS_END();
@@ -139,6 +149,8 @@ IC_METHOD(getIntPropertyMinValue) {
IC_METHOD(getIntPropertyMaxValue) {
zend_long prop;
+ intl_error_reset(NULL);
+
ZEND_PARSE_PARAMETERS_START(1, 1)
Z_PARAM_LONG(prop)
ZEND_PARSE_PARAMETERS_END();
@@ -151,6 +163,8 @@ IC_METHOD(getIntPropertyMaxValue) {
IC_METHOD(getNumericValue) {
UChar32 cp;
+ intl_error_reset(NULL);
+
if (parse_code_point_param(INTERNAL_FUNCTION_PARAM_PASSTHRU, &cp) == FAILURE) {
RETURN_NULL();
}
@@ -193,6 +207,8 @@ static UBool enumCharType_callback(enumCharType_data *context,
IC_METHOD(enumCharTypes) {
enumCharType_data context;
+ intl_error_reset(NULL);
+
ZEND_PARSE_PARAMETERS_START(1, 1)
Z_PARAM_FUNC(context.fci, context.fci_cache)
ZEND_PARSE_PARAMETERS_END();
@@ -204,6 +220,8 @@ IC_METHOD(enumCharTypes) {
IC_METHOD(getBlockCode) {
UChar32 cp;
+ intl_error_reset(NULL);
+
if (parse_code_point_param(INTERNAL_FUNCTION_PARAM_PASSTHRU, &cp) == FAILURE) {
RETURN_NULL();
}
@@ -222,6 +240,8 @@ IC_METHOD(charName) {
zend_string *buffer = NULL;
int32_t buffer_len;
+ intl_error_reset(NULL);
+
ZEND_PARSE_PARAMETERS_START(1, 2)
Z_PARAM_STR_OR_LONG(string_codepoint, int_codepoint)
Z_PARAM_OPTIONAL
@@ -252,6 +272,8 @@ IC_METHOD(charFromName) {
UChar32 ret;
UErrorCode error = U_ZERO_ERROR;
+ intl_error_reset(NULL);
+
ZEND_PARSE_PARAMETERS_START(1, 2)
Z_PARAM_STRING(name, name_len)
Z_PARAM_OPTIONAL
@@ -303,6 +325,7 @@ IC_METHOD(enumCharNames) {
zend_long nameChoice = U_UNICODE_CHAR_NAME;
UErrorCode error = U_ZERO_ERROR;
+ intl_error_reset(NULL);
ZEND_PARSE_PARAMETERS_START(3, 4)
Z_PARAM_STR_OR_LONG(string_start, int_start)
@@ -328,6 +351,8 @@ IC_METHOD(getPropertyName) {
zend_long nameChoice = U_LONG_PROPERTY_NAME;
const char *ret;
+ intl_error_reset(NULL);
+
ZEND_PARSE_PARAMETERS_START(1, 2)
Z_PARAM_LONG(property)
Z_PARAM_OPTIONAL
@@ -350,6 +375,8 @@ IC_METHOD(getPropertyEnum) {
char *alias;
size_t alias_len;
+ intl_error_reset(NULL);
+
ZEND_PARSE_PARAMETERS_START(1, 1)
Z_PARAM_STRING(alias, alias_len)
ZEND_PARSE_PARAMETERS_END();
@@ -363,6 +390,8 @@ IC_METHOD(getPropertyValueName) {
zend_long property, value, nameChoice = U_LONG_PROPERTY_NAME;
const char *ret;
+ intl_error_reset(NULL);
+
ZEND_PARSE_PARAMETERS_START(2, 3)
Z_PARAM_LONG(property)
Z_PARAM_LONG(value)
@@ -387,6 +416,8 @@ IC_METHOD(getPropertyValueEnum) {
char *name;
size_t name_len;
+ intl_error_reset(NULL);
+
ZEND_PARSE_PARAMETERS_START(2, 2)
Z_PARAM_LONG(property)
Z_PARAM_STRING(name, name_len)
@@ -403,6 +434,8 @@ IC_METHOD(foldCase) {
zend_string *string_codepoint;
zend_long int_codepoint = 0;
+ intl_error_reset(NULL);
+
ZEND_PARSE_PARAMETERS_START(1, 2)
Z_PARAM_STR_OR_LONG(string_codepoint, int_codepoint)
Z_PARAM_OPTIONAL
@@ -434,6 +467,8 @@ IC_METHOD(digit) {
zend_string *string_codepoint;
zend_long int_codepoint = 0;
+ intl_error_reset(NULL);
+
ZEND_PARSE_PARAMETERS_START(1, 2)
Z_PARAM_STR_OR_LONG(string_codepoint, int_codepoint)
Z_PARAM_OPTIONAL
@@ -458,6 +493,8 @@ IC_METHOD(digit) {
IC_METHOD(forDigit) {
zend_long digit, radix = 10;
+ intl_error_reset(NULL);
+
ZEND_PARSE_PARAMETERS_START(1, 2)
Z_PARAM_LONG(digit)
Z_PARAM_OPTIONAL
@@ -474,6 +511,8 @@ IC_METHOD(charAge) {
UVersionInfo version;
int i;
+ intl_error_reset(NULL);
+
if (parse_code_point_param(INTERNAL_FUNCTION_PARAM_PASSTHRU, &cp) == FAILURE) {
RETURN_NULL();
}
@@ -491,6 +530,8 @@ IC_METHOD(getUnicodeVersion) {
UVersionInfo version;
int i;
+ intl_error_reset(NULL);
+
ZEND_PARSE_PARAMETERS_NONE();
u_getUnicodeVersion(version);
@@ -509,6 +550,8 @@ IC_METHOD(getFC_NFKC_Closure) {
int32_t closure_len;
UErrorCode error = U_ZERO_ERROR;
+ intl_error_reset(NULL);
+
if (parse_code_point_param(INTERNAL_FUNCTION_PARAM_PASSTHRU, &cp) == FAILURE) {
RETURN_NULL();
}
@@ -537,6 +580,7 @@ IC_METHOD(getFC_NFKC_Closure) {
#define IC_BOOL_METHOD_CHAR(name) \
IC_METHOD(name) { \
UChar32 cp; \
+ intl_error_reset(NULL); \
if (parse_code_point_param(INTERNAL_FUNCTION_PARAM_PASSTHRU, &cp) == FAILURE) { \
RETURN_NULL(); \
} \
@@ -577,6 +621,7 @@ IC_BOOL_METHOD_CHAR(isJavaIDPart)
#define IC_INT_METHOD_CHAR(name) \
IC_METHOD(name) { \
UChar32 cp; \
+ intl_error_reset(NULL); \
if (parse_code_point_param(INTERNAL_FUNCTION_PARAM_PASSTHRU, &cp) == FAILURE) { \
RETURN_NULL(); \
} \
@@ -597,6 +642,7 @@ IC_METHOD(name) { \
UChar32 cp, ret; \
zend_string *string_codepoint; \
zend_long int_codepoint = -1; \
+ intl_error_reset(NULL); \
ZEND_PARSE_PARAMETERS_START(1, 1) \
Z_PARAM_STR_OR_LONG(string_codepoint, int_codepoint) \
ZEND_PARSE_PARAMETERS_END(); \