From b13ac10a5816adc4b9510e8f49a5d637c64a5a41 Mon Sep 17 00:00:00 2001 From: Gina Peter Banyard Date: Fri, 23 Oct 2026 19:58:39 +0100 Subject: [PATCH 1/9] intl: refactor collator - Make functions private - Drop some header includes --- ext/intl/collator/collator.h | 2 - ext/intl/collator/collator_class.cpp | 39 +++++------- ext/intl/collator/collator_class.h | 1 - .../collator/collator_functions_arginfo.h | 62 ------------------- 4 files changed, 17 insertions(+), 87 deletions(-) delete mode 100644 ext/intl/collator/collator_functions_arginfo.h diff --git a/ext/intl/collator/collator.h b/ext/intl/collator/collator.h index 959da9063e09..75e7bdc07997 100644 --- a/ext/intl/collator/collator.h +++ b/ext/intl/collator/collator.h @@ -16,8 +16,6 @@ #ifndef COLLATOR_COLLATOR_H #define COLLATOR_COLLATOR_H -#include - #define COLLATOR_SORT_REGULAR 0 #define COLLATOR_SORT_STRING 1 #define COLLATOR_SORT_NUMERIC 2 diff --git a/ext/intl/collator/collator_class.cpp b/ext/intl/collator/collator_class.cpp index 6e4996d065fe..c8920d782124 100644 --- a/ext/intl/collator/collator_class.cpp +++ b/ext/intl/collator/collator_class.cpp @@ -34,8 +34,22 @@ static zend_object_handlers Collator_handlers; * Auxiliary functions needed by objects of 'Collator' class */ -/* {{{ Collator_objects_free */ -void Collator_objects_free(zend_object *object ) +/* Clean up mem allocted by internals of Collator_object */ +static void collator_object_destroy( Collator_object* co ) +{ + if( !co ) + return; + + if( co->ucoll ) + { + ucol_close( co->ucoll ); + co->ucoll = nullptr; + } + + intl_error_reset( COLLATOR_ERROR_P( co ) ); +} + +static void Collator_objects_free(zend_object *object ) { Collator_object* co = php_intl_collator_fetch_object(object); @@ -43,10 +57,9 @@ void Collator_objects_free(zend_object *object ) collator_object_destroy(co ); } -/* }}} */ /* {{{ Collator_object_create */ -U_CFUNC zend_object *Collator_object_create(zend_class_entry *ce ) +static zend_object *Collator_object_create(zend_class_entry *ce ) { Collator_object *intern = reinterpret_cast(zend_object_alloc(sizeof(Collator_object), ce)); intl_error_init(COLLATOR_ERROR_P(intern)); @@ -82,21 +95,3 @@ U_CFUNC void collator_register_Collator_symbols(int module_number) Collator_handlers.free_obj = Collator_objects_free; } /* }}} */ - -/* {{{ void collator_object_destroy( Collator_object* co ) - * Clean up mem allocted by internals of Collator_object - */ -U_CFUNC void collator_object_destroy( Collator_object* co ) -{ - if( !co ) - return; - - if( co->ucoll ) - { - ucol_close( co->ucoll ); - co->ucoll = nullptr; - } - - intl_error_reset( COLLATOR_ERROR_P( co ) ); -} -/* }}} */ diff --git a/ext/intl/collator/collator_class.h b/ext/intl/collator/collator_class.h index 84790e88f808..affe588c2214 100644 --- a/ext/intl/collator/collator_class.h +++ b/ext/intl/collator/collator_class.h @@ -60,7 +60,6 @@ static zend_always_inline zend_result collator_check_initialized(Collator_object } BEGIN_EXTERN_C() void collator_register_Collator_symbols(int module_number); -void collator_object_destroy( Collator_object* co ); extern zend_class_entry *Collator_ce_ptr; END_EXTERN_C() diff --git a/ext/intl/collator/collator_functions_arginfo.h b/ext/intl/collator/collator_functions_arginfo.h deleted file mode 100644 index 4a863d747643..000000000000 --- a/ext/intl/collator/collator_functions_arginfo.h +++ /dev/null @@ -1,62 +0,0 @@ -/* This is a generated file, edit the .stub.php file instead. */ - -ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_collator_create, 0, 1, Collator, 1) - ZEND_ARG_TYPE_INFO(0, locale, IS_STRING, 0) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_collator_compare, 0, 3, MAY_BE_LONG|MAY_BE_FALSE) - ZEND_ARG_OBJ_INFO(0, object, Collator, 0) - ZEND_ARG_TYPE_INFO(0, str1, IS_STRING, 0) - ZEND_ARG_TYPE_INFO(0, str2, IS_STRING, 0) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_collator_get_attribute, 0, 2, MAY_BE_LONG|MAY_BE_FALSE) - ZEND_ARG_OBJ_INFO(0, object, Collator, 0) - ZEND_ARG_TYPE_INFO(0, attr, IS_LONG, 0) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_collator_set_attribute, 0, 3, _IS_BOOL, 0) - ZEND_ARG_OBJ_INFO(0, object, Collator, 0) - ZEND_ARG_TYPE_INFO(0, attr, IS_LONG, 0) - ZEND_ARG_TYPE_INFO(0, val, IS_LONG, 0) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_collator_get_strength, 0, 1, IS_LONG, 0) - ZEND_ARG_OBJ_INFO(0, object, Collator, 0) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_collator_set_strength, 0, 2, _IS_BOOL, 0) - ZEND_ARG_OBJ_INFO(0, object, Collator, 0) - ZEND_ARG_TYPE_INFO(0, strength, IS_LONG, 0) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_collator_sort, 0, 2, _IS_BOOL, 0) - ZEND_ARG_OBJ_INFO(0, object, Collator, 0) - ZEND_ARG_TYPE_INFO(1, arr, IS_ARRAY, 0) - ZEND_ARG_TYPE_INFO(0, sort_flag, IS_LONG, 0) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_collator_sort_with_sort_keys, 0, 2, _IS_BOOL, 0) - ZEND_ARG_OBJ_INFO(0, object, Collator, 0) - ZEND_ARG_TYPE_INFO(1, arr, IS_ARRAY, 0) -ZEND_END_ARG_INFO() - -#define arginfo_collator_asort arginfo_collator_sort - -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_collator_get_locale, 0, 2, MAY_BE_STRING|MAY_BE_FALSE) - ZEND_ARG_OBJ_INFO(0, object, Collator, 0) - ZEND_ARG_TYPE_INFO(0, type, IS_LONG, 0) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_collator_get_error_code, 0, 1, MAY_BE_LONG|MAY_BE_FALSE) - ZEND_ARG_OBJ_INFO(0, object, Collator, 0) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_collator_get_error_message, 0, 1, MAY_BE_STRING|MAY_BE_FALSE) - ZEND_ARG_OBJ_INFO(0, object, Collator, 0) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_collator_get_sort_key, 0, 2, MAY_BE_STRING|MAY_BE_FALSE) - ZEND_ARG_OBJ_INFO(0, object, Collator, 0) - ZEND_ARG_TYPE_INFO(0, str, IS_STRING, 0) -ZEND_END_ARG_INFO() From 766907cc1db4489a2d25447784484c2875ae8cc8 Mon Sep 17 00:00:00 2001 From: Gina Peter Banyard Date: Fri, 23 Oct 2026 19:54:01 +0100 Subject: [PATCH 2/9] intl: use C++ name mangling for BreakIterator PHP functions/methods --- .../breakiterator/breakiterator_class.cpp | 4 +- ext/intl/breakiterator/breakiterator_class.h | 2 +- .../breakiterator/breakiterator_iterators.cpp | 6 +-- .../breakiterator/breakiterator_iterators.h | 1 - .../breakiterator/breakiterator_methods.cpp | 44 +++++++++---------- .../codepointiterator_methods.cpp | 2 +- .../rulebasedbreakiterator_methods.cpp | 10 ++--- 7 files changed, 32 insertions(+), 37 deletions(-) diff --git a/ext/intl/breakiterator/breakiterator_class.cpp b/ext/intl/breakiterator/breakiterator_class.cpp index c9f2a53b58d1..5b63580e6ad9 100644 --- a/ext/intl/breakiterator/breakiterator_class.cpp +++ b/ext/intl/breakiterator/breakiterator_class.cpp @@ -26,9 +26,7 @@ #define USE_BREAKITERATOR_POINTER 1 #include "breakiterator_class.h" -BEGIN_EXTERN_C() #include "breakiterator_arginfo.h" -END_EXTERN_C() #include #include #include @@ -53,7 +51,7 @@ static void breakiterator_object_construct(zval *object, bio->biter = biter; } -U_CFUNC void breakiterator_object_create(zval *object, +void breakiterator_object_create(zval *object, BreakIterator *biter, int brand_new) { UClassID classId = biter->getDynamicClassID(); diff --git a/ext/intl/breakiterator/breakiterator_class.h b/ext/intl/breakiterator/breakiterator_class.h index 9038aa3e7f78..2cee8e3db702 100644 --- a/ext/intl/breakiterator/breakiterator_class.h +++ b/ext/intl/breakiterator/breakiterator_class.h @@ -62,9 +62,9 @@ typedef struct { RETURN_THROWS(); \ } -BEGIN_EXTERN_C() void breakiterator_object_create(zval *object, BreakIterator *break_iter, int brand_new); +BEGIN_EXTERN_C() void breakiterator_register_BreakIterator_class(void); extern zend_class_entry *BreakIterator_ce_ptr, diff --git a/ext/intl/breakiterator/breakiterator_iterators.cpp b/ext/intl/breakiterator/breakiterator_iterators.cpp index 8b1c136a0647..4c62522c95a8 100644 --- a/ext/intl/breakiterator/breakiterator_iterators.cpp +++ b/ext/intl/breakiterator/breakiterator_iterators.cpp @@ -23,9 +23,7 @@ #define USE_BREAKITERATOR_POINTER #include "breakiterator_class.h" -BEGIN_EXTERN_C() #include "breakiterator_iterators_arginfo.h" -END_EXTERN_C() #include "../intl_convert.h" #include "../locale/locale.h" #include @@ -253,7 +251,7 @@ void IntlIterator_from_BreakIterator_parts(zval *break_iter_zv, ((zoi_break_iter_parts*)ii->iterator)->index_right = 0; } -U_CFUNC PHP_METHOD(IntlPartsIterator, getBreakIterator) +PHP_METHOD(IntlPartsIterator, getBreakIterator) { INTLITERATOR_METHOD_INIT_VARS; @@ -264,7 +262,7 @@ U_CFUNC PHP_METHOD(IntlPartsIterator, getBreakIterator) RETURN_COPY_DEREF(&ii->iterator->data); } -U_CFUNC PHP_METHOD(IntlPartsIterator, getRuleStatus) +PHP_METHOD(IntlPartsIterator, getRuleStatus) { INTLITERATOR_METHOD_INIT_VARS; diff --git a/ext/intl/breakiterator/breakiterator_iterators.h b/ext/intl/breakiterator/breakiterator_iterators.h index bca19cc2b0b2..b92ea22f7f31 100644 --- a/ext/intl/breakiterator/breakiterator_iterators.h +++ b/ext/intl/breakiterator/breakiterator_iterators.h @@ -16,7 +16,6 @@ #include -#include #include typedef enum { diff --git a/ext/intl/breakiterator/breakiterator_methods.cpp b/ext/intl/breakiterator/breakiterator_methods.cpp index 05d8c659bf23..13f4fddf3623 100644 --- a/ext/intl/breakiterator/breakiterator_methods.cpp +++ b/ext/intl/breakiterator/breakiterator_methods.cpp @@ -32,7 +32,7 @@ using PHP::CodePointBreakIterator; using icu::BreakIterator; using icu::Locale; -U_CFUNC PHP_METHOD(IntlBreakIterator, __construct) +PHP_METHOD(IntlBreakIterator, __construct) { zend_throw_exception( NULL, "An object of this type cannot be created with the new operator", @@ -68,42 +68,42 @@ static void _breakiter_factory( breakiterator_object_create(return_value, biter, 1); } -U_CFUNC PHP_METHOD(IntlBreakIterator, createWordInstance) +PHP_METHOD(IntlBreakIterator, createWordInstance) { _breakiter_factory( &BreakIterator::createWordInstance, INTERNAL_FUNCTION_PARAM_PASSTHRU); } -U_CFUNC PHP_METHOD(IntlBreakIterator, createLineInstance) +PHP_METHOD(IntlBreakIterator, createLineInstance) { _breakiter_factory( &BreakIterator::createLineInstance, INTERNAL_FUNCTION_PARAM_PASSTHRU); } -U_CFUNC PHP_METHOD(IntlBreakIterator, createCharacterInstance) +PHP_METHOD(IntlBreakIterator, createCharacterInstance) { _breakiter_factory( &BreakIterator::createCharacterInstance, INTERNAL_FUNCTION_PARAM_PASSTHRU); } -U_CFUNC PHP_METHOD(IntlBreakIterator, createSentenceInstance) +PHP_METHOD(IntlBreakIterator, createSentenceInstance) { _breakiter_factory( &BreakIterator::createSentenceInstance, INTERNAL_FUNCTION_PARAM_PASSTHRU); } -U_CFUNC PHP_METHOD(IntlBreakIterator, createTitleInstance) +PHP_METHOD(IntlBreakIterator, createTitleInstance) { _breakiter_factory( &BreakIterator::createTitleInstance, INTERNAL_FUNCTION_PARAM_PASSTHRU); } -U_CFUNC PHP_METHOD(IntlBreakIterator, createCodePointInstance) +PHP_METHOD(IntlBreakIterator, createCodePointInstance) { intl_error_reset(NULL); @@ -113,7 +113,7 @@ U_CFUNC PHP_METHOD(IntlBreakIterator, createCodePointInstance) breakiterator_object_create(return_value, cpbi, 1); } -U_CFUNC PHP_METHOD(IntlBreakIterator, getText) +PHP_METHOD(IntlBreakIterator, getText) { BREAKITER_METHOD_INIT_VARS; object = ZEND_THIS; @@ -129,7 +129,7 @@ U_CFUNC PHP_METHOD(IntlBreakIterator, getText) } } -U_CFUNC PHP_METHOD(IntlBreakIterator, setText) +PHP_METHOD(IntlBreakIterator, setText) { UText *ut = NULL; zend_string *text; @@ -198,25 +198,25 @@ static void _breakiter_int32_ret_int32( RETURN_LONG((zend_long)res); } -U_CFUNC PHP_METHOD(IntlBreakIterator, first) +PHP_METHOD(IntlBreakIterator, first) { _breakiter_no_args_ret_int32(&BreakIterator::first, INTERNAL_FUNCTION_PARAM_PASSTHRU); } -U_CFUNC PHP_METHOD(IntlBreakIterator, last) +PHP_METHOD(IntlBreakIterator, last) { _breakiter_no_args_ret_int32(&BreakIterator::last, INTERNAL_FUNCTION_PARAM_PASSTHRU); } -U_CFUNC PHP_METHOD(IntlBreakIterator, previous) +PHP_METHOD(IntlBreakIterator, previous) { _breakiter_no_args_ret_int32(&BreakIterator::previous, INTERNAL_FUNCTION_PARAM_PASSTHRU); } -U_CFUNC PHP_METHOD(IntlBreakIterator, next) +PHP_METHOD(IntlBreakIterator, next) { zval *arg = NULL; @@ -235,7 +235,7 @@ U_CFUNC PHP_METHOD(IntlBreakIterator, next) } } -U_CFUNC PHP_METHOD(IntlBreakIterator, current) +PHP_METHOD(IntlBreakIterator, current) { BREAKITER_METHOD_INIT_VARS; object = ZEND_THIS; @@ -249,21 +249,21 @@ U_CFUNC PHP_METHOD(IntlBreakIterator, current) RETURN_LONG((zend_long)res); } -U_CFUNC PHP_METHOD(IntlBreakIterator, following) +PHP_METHOD(IntlBreakIterator, following) { _breakiter_int32_ret_int32( &BreakIterator::following, INTERNAL_FUNCTION_PARAM_PASSTHRU); } -U_CFUNC PHP_METHOD(IntlBreakIterator, preceding) +PHP_METHOD(IntlBreakIterator, preceding) { _breakiter_int32_ret_int32( &BreakIterator::preceding, INTERNAL_FUNCTION_PARAM_PASSTHRU); } -U_CFUNC PHP_METHOD(IntlBreakIterator, isBoundary) +PHP_METHOD(IntlBreakIterator, isBoundary) { zend_long offset; BREAKITER_METHOD_INIT_VARS; @@ -285,7 +285,7 @@ U_CFUNC PHP_METHOD(IntlBreakIterator, isBoundary) RETURN_BOOL((zend_long)res); } -U_CFUNC PHP_METHOD(IntlBreakIterator, getLocale) +PHP_METHOD(IntlBreakIterator, getLocale) { zend_long locale_type; BREAKITER_METHOD_INIT_VARS; @@ -309,7 +309,7 @@ U_CFUNC PHP_METHOD(IntlBreakIterator, getLocale) RETURN_STRING(locale.getName()); } -U_CFUNC PHP_METHOD(IntlBreakIterator, getPartsIterator) +PHP_METHOD(IntlBreakIterator, getPartsIterator) { zend_long key_type = 0; BREAKITER_METHOD_INIT_VARS; @@ -334,7 +334,7 @@ U_CFUNC PHP_METHOD(IntlBreakIterator, getPartsIterator) object, return_value, (parts_iter_key_type)key_type); } -U_CFUNC PHP_METHOD(IntlBreakIterator, getErrorCode) +PHP_METHOD(IntlBreakIterator, getErrorCode) { BREAKITER_METHOD_INIT_VARS; object = ZEND_THIS; @@ -346,7 +346,7 @@ U_CFUNC PHP_METHOD(IntlBreakIterator, getErrorCode) RETURN_LONG((zend_long)BREAKITER_ERROR_CODE(bio)); } -U_CFUNC PHP_METHOD(IntlBreakIterator, getErrorMessage) +PHP_METHOD(IntlBreakIterator, getErrorMessage) { zend_string* message = NULL; BREAKITER_METHOD_INIT_VARS; @@ -362,7 +362,7 @@ U_CFUNC PHP_METHOD(IntlBreakIterator, getErrorMessage) RETURN_STR(message); } -U_CFUNC PHP_METHOD(IntlBreakIterator, getIterator) +PHP_METHOD(IntlBreakIterator, getIterator) { ZEND_PARSE_PARAMETERS_NONE(); diff --git a/ext/intl/breakiterator/codepointiterator_methods.cpp b/ext/intl/breakiterator/codepointiterator_methods.cpp index 934e10c2cbf0..810274a69cf7 100644 --- a/ext/intl/breakiterator/codepointiterator_methods.cpp +++ b/ext/intl/breakiterator/codepointiterator_methods.cpp @@ -23,7 +23,7 @@ static inline CodePointBreakIterator *fetch_cpbi(BreakIterator_object *bio) { return (CodePointBreakIterator*)bio->biter; } -U_CFUNC PHP_METHOD(IntlCodePointBreakIterator, getLastCodePoint) +PHP_METHOD(IntlCodePointBreakIterator, getLastCodePoint) { BREAKITER_METHOD_INIT_VARS; object = ZEND_THIS; diff --git a/ext/intl/breakiterator/rulebasedbreakiterator_methods.cpp b/ext/intl/breakiterator/rulebasedbreakiterator_methods.cpp index 5a978a97f43c..f03f027e281c 100644 --- a/ext/intl/breakiterator/rulebasedbreakiterator_methods.cpp +++ b/ext/intl/breakiterator/rulebasedbreakiterator_methods.cpp @@ -30,7 +30,7 @@ static inline RuleBasedBreakIterator *fetch_rbbi(BreakIterator_object *bio) { return (RuleBasedBreakIterator*)bio->biter; } -U_CFUNC PHP_METHOD(IntlRuleBasedBreakIterator, __construct) +PHP_METHOD(IntlRuleBasedBreakIterator, __construct) { zend_string *rules; bool compiled = false; @@ -90,7 +90,7 @@ U_CFUNC PHP_METHOD(IntlRuleBasedBreakIterator, __construct) } } -U_CFUNC PHP_METHOD(IntlRuleBasedBreakIterator, getRules) +PHP_METHOD(IntlRuleBasedBreakIterator, getRules) { BREAKITER_METHOD_INIT_VARS; object = ZEND_THIS; @@ -112,7 +112,7 @@ U_CFUNC PHP_METHOD(IntlRuleBasedBreakIterator, getRules) RETVAL_STR(u8str); } -U_CFUNC PHP_METHOD(IntlRuleBasedBreakIterator, getRuleStatus) +PHP_METHOD(IntlRuleBasedBreakIterator, getRuleStatus) { BREAKITER_METHOD_INIT_VARS; object = ZEND_THIS; @@ -124,7 +124,7 @@ U_CFUNC PHP_METHOD(IntlRuleBasedBreakIterator, getRuleStatus) RETURN_LONG(fetch_rbbi(bio)->getRuleStatus()); } -U_CFUNC PHP_METHOD(IntlRuleBasedBreakIterator, getRuleStatusVec) +PHP_METHOD(IntlRuleBasedBreakIterator, getRuleStatusVec) { BREAKITER_METHOD_INIT_VARS; object = ZEND_THIS; @@ -154,7 +154,7 @@ U_CFUNC PHP_METHOD(IntlRuleBasedBreakIterator, getRuleStatusVec) } } -U_CFUNC PHP_METHOD(IntlRuleBasedBreakIterator, getBinaryRules) +PHP_METHOD(IntlRuleBasedBreakIterator, getBinaryRules) { BREAKITER_METHOD_INIT_VARS; object = ZEND_THIS; From 51c0bf7f65575382dee869f11c41708124a0d60d Mon Sep 17 00:00:00 2001 From: Gina Peter Banyard Date: Fri, 23 Oct 2026 20:19:53 +0100 Subject: [PATCH 3/9] intl: use C++ name mangling for common code --- ext/intl/common/common_date.cpp | 7 ++++--- ext/intl/common/common_date.h | 6 +++--- ext/intl/common/common_enum.cpp | 8 ++++---- ext/intl/common/common_enum.h | 12 ++++++------ 4 files changed, 17 insertions(+), 16 deletions(-) diff --git a/ext/intl/common/common_date.cpp b/ext/intl/common/common_date.cpp index db800cc01cc6..50b4b065efaa 100644 --- a/ext/intl/common/common_date.cpp +++ b/ext/intl/common/common_date.cpp @@ -19,6 +19,7 @@ #include "../php_intl.h" #define USE_CALENDAR_POINTER 1 #include "../calendar/calendar_class.h" +#include "common_date.h" U_CDECL_BEGIN #include @@ -31,7 +32,7 @@ using icu::UnicodeString; /* {{{ timezone_convert_datetimezone * The timezone in DateTime and DateTimeZone is not unified. */ -U_CFUNC TimeZone *timezone_convert_datetimezone( +TimeZone *timezone_convert_datetimezone( int type, void *object, bool is_datetime, intl_error *outside_error) { @@ -89,7 +90,7 @@ U_CFUNC TimeZone *timezone_convert_datetimezone( } /* }}} */ -U_CFUNC zend_result intl_datetime_decompose(zend_object *obj, double *millis, TimeZone **tz, +zend_result intl_datetime_decompose(zend_object *obj, double *millis, TimeZone **tz, intl_error *err) { char *message; @@ -153,7 +154,7 @@ U_CFUNC zend_result intl_datetime_decompose(zend_object *obj, double *millis, Ti return SUCCESS; } -U_CFUNC double intl_zval_to_millis(zval *z, intl_error *err) +double intl_zval_to_millis(zval *z, intl_error *err) { double rv = ZEND_NAN; zend_long lv; diff --git a/ext/intl/common/common_date.h b/ext/intl/common/common_date.h index 42936875e36c..e8f8946e0ac4 100644 --- a/ext/intl/common/common_date.h +++ b/ext/intl/common/common_date.h @@ -29,11 +29,11 @@ using icu::TimeZone; -U_CFUNC TimeZone *timezone_convert_datetimezone(int type, void *object, bool is_datetime, intl_error *outside_error); -U_CFUNC zend_result intl_datetime_decompose(zend_object *obj, double *millis, TimeZone **tz, intl_error *err); +TimeZone *timezone_convert_datetimezone(int type, void *object, bool is_datetime, intl_error *outside_error); +zend_result intl_datetime_decompose(zend_object *obj, double *millis, TimeZone **tz, intl_error *err); #endif -U_CFUNC double intl_zval_to_millis(zval *z, intl_error *err); +double intl_zval_to_millis(zval *z, intl_error *err); #endif /* COMMON_DATE_H */ diff --git a/ext/intl/common/common_enum.cpp b/ext/intl/common/common_enum.cpp index b95491945070..7bc5fca1f6a5 100644 --- a/ext/intl/common/common_enum.cpp +++ b/ext/intl/common/common_enum.cpp @@ -37,17 +37,17 @@ void zoi_with_current_dtor(zend_object_iterator *iter) ZVAL_UNDEF(&zoiwc->wrapping_obj); } -U_CFUNC zend_result zoi_with_current_valid(zend_object_iterator *iter) +zend_result zoi_with_current_valid(zend_object_iterator *iter) { return Z_ISUNDEF(((zoi_with_current*)iter)->current)? FAILURE : SUCCESS; } -U_CFUNC zval *zoi_with_current_get_current_data(zend_object_iterator *iter) +zval *zoi_with_current_get_current_data(zend_object_iterator *iter) { return &((zoi_with_current*)iter)->current; } -U_CFUNC void zoi_with_current_invalidate_current(zend_object_iterator *iter) +void zoi_with_current_invalidate_current(zend_object_iterator *iter) { zoi_with_current *zoi_iter = (zoi_with_current*)iter; if (!Z_ISUNDEF(zoi_iter->current)) { @@ -124,7 +124,7 @@ static const zend_object_iterator_funcs string_enum_object_iterator_funcs = { zoi_with_current_get_gc, }; -U_CFUNC void IntlIterator_from_StringEnumeration(StringEnumeration *se, zval *object) +void IntlIterator_from_StringEnumeration(StringEnumeration *se, zval *object) { IntlIterator_object *ii; object_init_ex(object, IntlIterator_ce_ptr); diff --git a/ext/intl/common/common_enum.h b/ext/intl/common/common_enum.h index 48a11bfbbea7..aa7931c74f69 100644 --- a/ext/intl/common/common_enum.h +++ b/ext/intl/common/common_enum.h @@ -59,15 +59,15 @@ typedef struct { extern zend_class_entry *IntlIterator_ce_ptr; extern zend_object_handlers IntlIterator_handlers; -U_CFUNC void zoi_with_current_dtor(zend_object_iterator *iter); -U_CFUNC zend_result zoi_with_current_valid(zend_object_iterator *iter); -U_CFUNC zval *zoi_with_current_get_current_data(zend_object_iterator *iter); -U_CFUNC void zoi_with_current_invalidate_current(zend_object_iterator *iter); -U_CFUNC HashTable *zoi_with_current_get_gc(zend_object_iterator *iter, zval **table, int *n); +void zoi_with_current_dtor(zend_object_iterator *iter); +zend_result zoi_with_current_valid(zend_object_iterator *iter); +zval *zoi_with_current_get_current_data(zend_object_iterator *iter); +void zoi_with_current_invalidate_current(zend_object_iterator *iter); +HashTable *zoi_with_current_get_gc(zend_object_iterator *iter, zval **table, int *n); #ifdef __cplusplus using icu::StringEnumeration; -U_CFUNC void IntlIterator_from_StringEnumeration(StringEnumeration *se, zval *object); +void IntlIterator_from_StringEnumeration(StringEnumeration *se, zval *object); #endif U_CFUNC void intl_register_common_symbols(int module_number); From 38a53763b1403a3f73c0a8413a9a919a3b853bd3 Mon Sep 17 00:00:00 2001 From: Gina Peter Banyard Date: Fri, 23 Oct 2026 20:27:43 +0100 Subject: [PATCH 4/9] intl: use C++ name mangling for Spoofchecker PHP methods --- ext/intl/spoofchecker/spoofchecker_class.cpp | 2 -- ext/intl/spoofchecker/spoofchecker_create.cpp | 2 +- ext/intl/spoofchecker/spoofchecker_main.cpp | 18 +++++++++--------- 3 files changed, 10 insertions(+), 12 deletions(-) diff --git a/ext/intl/spoofchecker/spoofchecker_class.cpp b/ext/intl/spoofchecker/spoofchecker_class.cpp index 317b844e9937..55d39ecfa2ab 100644 --- a/ext/intl/spoofchecker/spoofchecker_class.cpp +++ b/ext/intl/spoofchecker/spoofchecker_class.cpp @@ -18,9 +18,7 @@ #include -BEGIN_EXTERN_C() #include "spoofchecker_arginfo.h" -END_EXTERN_C() zend_class_entry *Spoofchecker_ce_ptr = NULL; static zend_object_handlers Spoofchecker_handlers; diff --git a/ext/intl/spoofchecker/spoofchecker_create.cpp b/ext/intl/spoofchecker/spoofchecker_create.cpp index 9dbd2a6eac0a..4c15f1428dbb 100644 --- a/ext/intl/spoofchecker/spoofchecker_create.cpp +++ b/ext/intl/spoofchecker/spoofchecker_create.cpp @@ -26,7 +26,7 @@ #include "spoofchecker_class.h" /* {{{ Spoofchecker object constructor. */ -U_CFUNC PHP_METHOD(Spoofchecker, __construct) +PHP_METHOD(Spoofchecker, __construct) { SPOOFCHECKER_METHOD_INIT_VARS; diff --git a/ext/intl/spoofchecker/spoofchecker_main.cpp b/ext/intl/spoofchecker/spoofchecker_main.cpp index 92c7bb44de5c..8caa5e345aa9 100644 --- a/ext/intl/spoofchecker/spoofchecker_main.cpp +++ b/ext/intl/spoofchecker/spoofchecker_main.cpp @@ -26,7 +26,7 @@ #include "spoofchecker_class.h" /* {{{ Checks if a given text contains any suspicious characters */ -U_CFUNC PHP_METHOD(Spoofchecker, isSuspicious) +PHP_METHOD(Spoofchecker, isSuspicious) { int32_t ret, errmask; zend_string *text; @@ -61,7 +61,7 @@ U_CFUNC PHP_METHOD(Spoofchecker, isSuspicious) /* }}} */ /* {{{ Checks if a given text contains any confusable characters */ -U_CFUNC PHP_METHOD(Spoofchecker, areConfusable) +PHP_METHOD(Spoofchecker, areConfusable) { int ret; zend_string *s1, *s2; @@ -95,7 +95,7 @@ U_CFUNC PHP_METHOD(Spoofchecker, areConfusable) /* }}} */ /* {{{ Locales to use when running checks */ -U_CFUNC PHP_METHOD(Spoofchecker, setAllowedLocales) +PHP_METHOD(Spoofchecker, setAllowedLocales) { zend_string *locales; SPOOFCHECKER_METHOD_INIT_VARS; @@ -117,7 +117,7 @@ U_CFUNC PHP_METHOD(Spoofchecker, setAllowedLocales) /* }}} */ /* {{{ Set the checks to run */ -U_CFUNC PHP_METHOD(Spoofchecker, setChecks) +PHP_METHOD(Spoofchecker, setChecks) { zend_long checks; SPOOFCHECKER_METHOD_INIT_VARS; @@ -139,7 +139,7 @@ U_CFUNC PHP_METHOD(Spoofchecker, setChecks) /* TODO Document this method on PHP.net */ /* {{{ Set the loosest restriction level allowed for strings. */ -U_CFUNC PHP_METHOD(Spoofchecker, setRestrictionLevel) +PHP_METHOD(Spoofchecker, setRestrictionLevel) { zend_long level; SPOOFCHECKER_METHOD_INIT_VARS; @@ -166,7 +166,7 @@ U_CFUNC PHP_METHOD(Spoofchecker, setRestrictionLevel) } /* }}} */ -U_CFUNC PHP_METHOD(Spoofchecker, setAllowedChars) +PHP_METHOD(Spoofchecker, setAllowedChars) { zend_string *pattern; UChar *upattern = NULL; @@ -272,7 +272,7 @@ static zend_string *spoofchecker_skeleton(Spoofchecker_object *co, zend_string * /* }}} */ /* {{{ Get the confusable skeleton for an identifier */ -U_CFUNC PHP_METHOD(Spoofchecker, getSkeleton) +PHP_METHOD(Spoofchecker, getSkeleton) { zend_string *string; SPOOFCHECKER_METHOD_INIT_VARS; @@ -298,7 +298,7 @@ U_CFUNC PHP_METHOD(Spoofchecker, getSkeleton) #if U_ICU_VERSION_MAJOR_NUM >= 74 /* {{{ Get the confusable skeleton for an identifier in a given text direction */ -U_CFUNC PHP_METHOD(Spoofchecker, getBidiSkeleton) +PHP_METHOD(Spoofchecker, getBidiSkeleton) { zend_long direction; zend_string *string; @@ -329,7 +329,7 @@ U_CFUNC PHP_METHOD(Spoofchecker, getBidiSkeleton) /* }}} */ /* {{{ Checks if a given text contains any confusable characters, for a given text direction */ -U_CFUNC PHP_METHOD(Spoofchecker, areBidiConfusable) +PHP_METHOD(Spoofchecker, areBidiConfusable) { uint32_t ret = 0; zend_long direction; From abe74833c2dd7b649b08f35dc1a7e22b8bc44d11 Mon Sep 17 00:00:00 2001 From: Gina Peter Banyard Date: Fri, 23 Oct 2026 21:58:53 +0100 Subject: [PATCH 5/9] intl: use C++ name mangling for IntlNumberRangeFormatter PHP methods --- ext/intl/rangeformatter/rangeformatter_class.cpp | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/ext/intl/rangeformatter/rangeformatter_class.cpp b/ext/intl/rangeformatter/rangeformatter_class.cpp index 1291d17b37bb..5b07cbbdee72 100644 --- a/ext/intl/rangeformatter/rangeformatter_class.cpp +++ b/ext/intl/rangeformatter/rangeformatter_class.cpp @@ -27,9 +27,7 @@ #include "../php_intl.h" #include "../intl_data.h" -BEGIN_EXTERN_C() #include "rangeformatter_arginfo.h" -END_EXTERN_C() #include "rangeformatter_class.h" @@ -73,13 +71,13 @@ static icu::Formattable rangeformatter_create_formattable(const zval *number) return formattable; } -U_CFUNC PHP_METHOD(IntlNumberRangeFormatter, __construct) +PHP_METHOD(IntlNumberRangeFormatter, __construct) { ZEND_PARSE_PARAMETERS_NONE(); zend_throw_error(NULL, "Cannot directly construct %s, use createFromSkeleton method instead", ZSTR_VAL(Z_OBJCE_P(ZEND_THIS)->name)); } -U_CFUNC PHP_METHOD(IntlNumberRangeFormatter, createFromSkeleton) +PHP_METHOD(IntlNumberRangeFormatter, createFromSkeleton) { char* skeleton; char* locale; @@ -157,7 +155,7 @@ U_CFUNC PHP_METHOD(IntlNumberRangeFormatter, createFromSkeleton) RETURN_OBJ(obj); } -U_CFUNC PHP_METHOD(IntlNumberRangeFormatter, format) +PHP_METHOD(IntlNumberRangeFormatter, format) { zval *start; zval *end; @@ -212,7 +210,7 @@ U_CFUNC PHP_METHOD(IntlNumberRangeFormatter, format) RETVAL_NEW_STR(ret); } -U_CFUNC PHP_METHOD(IntlNumberRangeFormatter, getErrorCode) +PHP_METHOD(IntlNumberRangeFormatter, getErrorCode) { ZEND_PARSE_PARAMETERS_NONE(); @@ -221,7 +219,7 @@ U_CFUNC PHP_METHOD(IntlNumberRangeFormatter, getErrorCode) RETURN_LONG(intl_error_get_code(&obj->nrf_data.error)); } -U_CFUNC PHP_METHOD(IntlNumberRangeFormatter, getErrorMessage) +PHP_METHOD(IntlNumberRangeFormatter, getErrorMessage) { ZEND_PARSE_PARAMETERS_NONE(); @@ -230,7 +228,7 @@ U_CFUNC PHP_METHOD(IntlNumberRangeFormatter, getErrorMessage) RETURN_STR(intl_error_get_message(&obj->nrf_data.error)); } -void IntlNumberRangeFormatter_object_free(zend_object *object) +static void IntlNumberRangeFormatter_object_free(zend_object *object) { IntlNumberRangeFormatter_object* nfo = php_intl_numberrangeformatter_fetch_object(object); From c6e8423421a384d9bc549de642e51d6cc9569fc0 Mon Sep 17 00:00:00 2001 From: Gina Peter Banyard Date: Fri, 23 Oct 2026 22:00:39 +0100 Subject: [PATCH 6/9] intl: use C++ name mangling for IntlNumberFormatter PHP methods --- ext/intl/numberformatter/numberformatter_class.cpp | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/ext/intl/numberformatter/numberformatter_class.cpp b/ext/intl/numberformatter/numberformatter_class.cpp index cc98c075f568..16f6e7492cc3 100644 --- a/ext/intl/numberformatter/numberformatter_class.cpp +++ b/ext/intl/numberformatter/numberformatter_class.cpp @@ -23,9 +23,7 @@ #include "../intl_convertcpp.h" #include "../php_intl.h" -BEGIN_EXTERN_C() #include "numberformatter_arginfo.h" -END_EXTERN_C() #include "numberformatter_class.h" using icu::number::NumberFormatter; @@ -60,14 +58,14 @@ static zend_object *numberformatter_create_object(zend_class_entry *ce) return &nfo->zo; } -U_CFUNC PHP_METHOD(IntlNumberFormatter, __construct) +PHP_METHOD(IntlNumberFormatter, __construct) { ZEND_PARSE_PARAMETERS_NONE(); zend_throw_error(nullptr, "Cannot directly construct %s, use createFromSkeleton method instead", ZSTR_VAL(Z_OBJCE_P(ZEND_THIS)->name)); } -U_CFUNC PHP_METHOD(IntlNumberFormatter, createFromSkeleton) +PHP_METHOD(IntlNumberFormatter, createFromSkeleton) { char *skeleton, *locale; size_t skeleton_len, locale_len; @@ -114,7 +112,7 @@ U_CFUNC PHP_METHOD(IntlNumberFormatter, createFromSkeleton) NUMBERFORMATTER_OBJECT(Z_INTL_INTLNUMBERFORMATTER_P(return_value)) = new LocalizedNumberFormatter(nf.locale(icu::Locale::createCanonical(locale))); } -U_CFUNC PHP_METHOD(IntlNumberFormatter, format) +PHP_METHOD(IntlNumberFormatter, format) { zval *value; @@ -163,14 +161,14 @@ U_CFUNC PHP_METHOD(IntlNumberFormatter, format) RETVAL_STR(ret); } -U_CFUNC PHP_METHOD(IntlNumberFormatter, getErrorCode) +PHP_METHOD(IntlNumberFormatter, getErrorCode) { ZEND_PARSE_PARAMETERS_NONE(); RETURN_LONG(INTL_DATA_ERROR_CODE(Z_INTL_INTLNUMBERFORMATTER_P(ZEND_THIS))); } -U_CFUNC PHP_METHOD(IntlNumberFormatter, getErrorMessage) +PHP_METHOD(IntlNumberFormatter, getErrorMessage) { ZEND_PARSE_PARAMETERS_NONE(); From bc052db9fecd8fb3107d70424dc62417ad2eb4e0 Mon Sep 17 00:00:00 2001 From: Gina Peter Banyard Date: Fri, 23 Oct 2026 22:02:24 +0100 Subject: [PATCH 7/9] intl: No need to extern C the arginfo header for IntlListFormatter --- ext/intl/listformatter/listformatter_class.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/ext/intl/listformatter/listformatter_class.cpp b/ext/intl/listformatter/listformatter_class.cpp index 10ec6053dc8d..89ebe868559b 100644 --- a/ext/intl/listformatter/listformatter_class.cpp +++ b/ext/intl/listformatter/listformatter_class.cpp @@ -20,9 +20,7 @@ #include "php_intl.h" #include "listformatter_class.h" -BEGIN_EXTERN_C() #include "listformatter_arginfo.h" -END_EXTERN_C() #include From e7de75184ca4b4025f8d3aaaff8996b4ef21c205 Mon Sep 17 00:00:00 2001 From: Gina Peter Banyard Date: Fri, 16 Oct 2026 21:44:17 +0100 Subject: [PATCH 8/9] intl: use C++ name mangling for resourcebundle_get_iterator --- ext/intl/resourcebundle/resourcebundle_iterator.cpp | 4 +--- ext/intl/resourcebundle/resourcebundle_iterator.h | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/ext/intl/resourcebundle/resourcebundle_iterator.cpp b/ext/intl/resourcebundle/resourcebundle_iterator.cpp index 1ff2f6667669..73f7ff7365dd 100644 --- a/ext/intl/resourcebundle/resourcebundle_iterator.cpp +++ b/ext/intl/resourcebundle/resourcebundle_iterator.cpp @@ -144,8 +144,7 @@ static const zend_object_iterator_funcs resourcebundle_iterator_funcs = { }; /* }}} */ -/* {{{ resourcebundle_get_iterator */ -U_CFUNC zend_object_iterator *resourcebundle_get_iterator( zend_class_entry *ce, zval *object, int byref ) +zend_object_iterator *resourcebundle_get_iterator( zend_class_entry *ce, zval *object, int byref ) { if (byref) { zend_throw_error(NULL, "An iterator cannot be used with foreach by reference"); @@ -174,4 +173,3 @@ U_CFUNC zend_object_iterator *resourcebundle_get_iterator( zend_class_entry *ce, return (zend_object_iterator *) iterator; } -/* }}} */ diff --git a/ext/intl/resourcebundle/resourcebundle_iterator.h b/ext/intl/resourcebundle/resourcebundle_iterator.h index 3eab1f099811..2a155fc8c8db 100644 --- a/ext/intl/resourcebundle/resourcebundle_iterator.h +++ b/ext/intl/resourcebundle/resourcebundle_iterator.h @@ -29,6 +29,6 @@ typedef struct { zend_long i; } ResourceBundle_iterator; -U_CFUNC zend_object_iterator *resourcebundle_get_iterator( zend_class_entry *ce, zval *object, int byref ); +zend_object_iterator *resourcebundle_get_iterator( zend_class_entry *ce, zval *object, int byref ); #endif // #ifndef RESOURCEBUNDLE_ITERATOR_H From b2ec27a31f4ce147037a0820f3f435b9ddfba7f6 Mon Sep 17 00:00:00 2001 From: Gina Peter Banyard Date: Fri, 16 Oct 2026 21:51:47 +0100 Subject: [PATCH 9/9] intl: refactor intl_convertcpp.cpp --- ext/intl/intl_convertcpp.cpp | 13 +++++++------ ext/intl/intl_convertcpp.h | 2 +- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/ext/intl/intl_convertcpp.cpp b/ext/intl/intl_convertcpp.cpp index e8ad587c2689..d22dc994f80a 100644 --- a/ext/intl/intl_convertcpp.cpp +++ b/ext/intl/intl_convertcpp.cpp @@ -16,10 +16,11 @@ #include "intl_convertcpp.h" #include -#include +#include +#include /* {{{ intl_stringFromChar */ -int intl_stringFromChar(UnicodeString &ret, char *str, size_t str_len, UErrorCode *status) +zend_result intl_stringFromChar(UnicodeString &ret, char *str, size_t str_len, UErrorCode *status) { if(UNEXPECTED(str_len > INT32_MAX)) { *status = U_BUFFER_OVERFLOW_ERROR; @@ -55,14 +56,14 @@ zend_string* intl_charFromString(const UnicodeString &from, UErrorCode *status) zend_string *u8res; if (UNEXPECTED(from.isBogus())) { - return NULL; + return nullptr; } //the number of UTF-8 code units is not larger than that of UTF-16 code //units * 3 if (UNEXPECTED(from.length() > INT32_MAX / 3)) { *status = U_BUFFER_OVERFLOW_ERROR; - return NULL; + return nullptr; } int32_t capacity = from.length() * 3; @@ -75,11 +76,11 @@ zend_string* intl_charFromString(const UnicodeString &from, UErrorCode *status) const UChar *utf16buf = from.getBuffer(); int32_t actual_len; u_strToUTF8WithSub(ZSTR_VAL(u8res), capacity + 1, &actual_len, utf16buf, from.length(), - U_SENTINEL, NULL, status); + U_SENTINEL, nullptr, status); if (U_FAILURE(*status)) { zend_string_free(u8res); - return NULL; + return nullptr; } u8res = zend_string_truncate(u8res, actual_len, 0); diff --git a/ext/intl/intl_convertcpp.h b/ext/intl/intl_convertcpp.h index ef4310bac4ff..d3bb6c8cf07e 100644 --- a/ext/intl/intl_convertcpp.h +++ b/ext/intl/intl_convertcpp.h @@ -24,7 +24,7 @@ using icu::UnicodeString; -int intl_stringFromChar(UnicodeString &ret, char *str, size_t str_len, UErrorCode *status); +zend_result intl_stringFromChar(UnicodeString &ret, char *str, size_t str_len, UErrorCode *status); zend_string* intl_charFromString(const UnicodeString &from, UErrorCode *status);