ext/intl converter and formatter using fast ZPP (#14413)

This commit is contained in:
David CARLIER 2024-06-01 19:36:40 +01:00 committed by GitHub
parent 694bb32119
commit d005ab20ea
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 61 additions and 62 deletions

View file

@ -109,10 +109,12 @@ PHP_METHOD(UConverter, toUCallback) {
zend_string *source, *codeUnits;
zval *error;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "lSSz",
&reason, &source, &codeUnits, &error) == FAILURE) {
RETURN_THROWS();
}
ZEND_PARSE_PARAMETERS_START(4, 4)
Z_PARAM_LONG(reason)
Z_PARAM_STR(source)
Z_PARAM_STR(codeUnits)
Z_PARAM_ZVAL(error)
ZEND_PARSE_PARAMETERS_END();
php_converter_default_callback(return_value, ZEND_THIS, reason, error);
}
@ -124,10 +126,12 @@ PHP_METHOD(UConverter, fromUCallback) {
zval *source, *error;
zend_long codePoint;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "lalz",
&reason, &source, &codePoint, &error) == FAILURE) {
RETURN_THROWS();
}
ZEND_PARSE_PARAMETERS_START(4, 4)
Z_PARAM_LONG(reason)
Z_PARAM_ARRAY(source)
Z_PARAM_LONG(codePoint)
Z_PARAM_ZVAL(error)
ZEND_PARSE_PARAMETERS_END();
php_converter_default_callback(return_value, ZEND_THIS, reason, error);
}
@ -333,7 +337,7 @@ static void php_converter_from_u_callback(const void *context,
/* {{{ php_converter_set_callbacks */
static inline bool php_converter_set_callbacks(php_converter_object *objval, UConverter *cnv) {
bool ret = 1;
bool ret = true;
UErrorCode error = U_ZERO_ERROR;
if (objval->obj.ce == php_converter_ce) {
@ -403,9 +407,10 @@ static void php_converter_do_set_encoding(UConverter **pcnv, INTERNAL_FUNCTION_P
char *enc;
size_t enc_len;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &enc, &enc_len) == FAILURE) {
RETURN_THROWS();
}
ZEND_PARSE_PARAMETERS_START(1, 1)
Z_PARAM_STRING(enc, enc_len)
ZEND_PARSE_PARAMETERS_END();
intl_errors_reset(&objval->error);
RETURN_BOOL(php_converter_set_encoding(objval, pcnv, enc, enc_len));
@ -430,9 +435,7 @@ PHP_METHOD(UConverter, setDestinationEncoding) {
static void php_converter_do_get_encoding(php_converter_object *objval, UConverter *cnv, INTERNAL_FUNCTION_PARAMETERS) {
const char *name;
if (zend_parse_parameters_none() == FAILURE) {
RETURN_THROWS();
}
ZEND_PARSE_PARAMETERS_NONE();
intl_errors_reset(&objval->error);
@ -468,9 +471,7 @@ PHP_METHOD(UConverter, getDestinationEncoding) {
static void php_converter_do_get_type(php_converter_object *objval, UConverter *cnv, INTERNAL_FUNCTION_PARAMETERS) {
UConverterType t;
if (zend_parse_parameters_none() == FAILURE) {
RETURN_THROWS();
}
ZEND_PARSE_PARAMETERS_NONE();
intl_errors_reset(&objval->error);
if (!cnv) {
@ -535,9 +536,11 @@ PHP_METHOD(UConverter, __construct) {
intl_error_reset(NULL);
if (zend_parse_parameters(ZEND_NUM_ARGS(), "|s!s!", &dest, &dest_len, &src, &src_len) == FAILURE) {
RETURN_THROWS();
}
ZEND_PARSE_PARAMETERS_START(0, 2)
Z_PARAM_OPTIONAL
Z_PARAM_STRING_OR_NULL(dest, dest_len)
Z_PARAM_STRING_OR_NULL(src, src_len)
ZEND_PARSE_PARAMETERS_END();
php_converter_set_encoding(objval, &(objval->src), src, src_len );
php_converter_set_encoding(objval, &(objval->dest), dest, dest_len);
@ -553,9 +556,10 @@ PHP_METHOD(UConverter, setSubstChars) {
size_t chars_len;
int ret = 1;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &chars, &chars_len) == FAILURE) {
RETURN_THROWS();
}
ZEND_PARSE_PARAMETERS_START(1, 1)
Z_PARAM_STRING(chars, chars_len)
ZEND_PARSE_PARAMETERS_END();
intl_errors_reset(&objval->error);
if (objval->src) {
@ -593,9 +597,7 @@ PHP_METHOD(UConverter, getSubstChars) {
int8_t chars_len = sizeof(chars);
UErrorCode error = U_ZERO_ERROR;
if (zend_parse_parameters_none() == FAILURE) {
RETURN_THROWS();
}
ZEND_PARSE_PARAMETERS_NONE();
intl_errors_reset(&objval->error);
if (!objval->src) {
@ -678,9 +680,9 @@ static zend_string* php_converter_do_convert(UConverter *dest_cnv,
PHP_METHOD(UConverter, reasonText) {
zend_long reason;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "l", &reason) == FAILURE) {
RETURN_THROWS();
}
ZEND_PARSE_PARAMETERS_START(1, 1)
Z_PARAM_LONG(reason)
ZEND_PARSE_PARAMETERS_END();
intl_error_reset(NULL);
switch (reason) {
@ -703,12 +705,13 @@ PHP_METHOD(UConverter, convert) {
char *str;
size_t str_len;
zend_string *ret;
bool reverse = 0;
bool reverse = false;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|b",
&str, &str_len, &reverse) == FAILURE) {
RETURN_THROWS();
}
ZEND_PARSE_PARAMETERS_START(1, 2)
Z_PARAM_STRING(str, str_len)
Z_PARAM_OPTIONAL
Z_PARAM_BOOL(reverse)
ZEND_PARSE_PARAMETERS_END();
intl_errors_reset(&objval->error);
ret = php_converter_do_convert(reverse ? objval->src : objval->dest,
@ -730,10 +733,13 @@ PHP_METHOD(UConverter, transcode) {
zval *options = NULL;
UConverter *src_cnv = NULL, *dest_cnv = NULL;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "sss|a!",
&str, &str_len, &dest, &dest_len, &src, &src_len, &options) == FAILURE) {
RETURN_THROWS();
}
ZEND_PARSE_PARAMETERS_START(3, 4)
Z_PARAM_STRING(str, str_len)
Z_PARAM_STRING(dest, dest_len)
Z_PARAM_STRING(src, src_len)
Z_PARAM_OPTIONAL
Z_PARAM_ARRAY_OR_NULL(options)
ZEND_PARSE_PARAMETERS_END();
intl_error_reset(NULL);
if (php_converter_set_encoding(NULL, &src_cnv, src, src_len) &&
@ -784,9 +790,7 @@ PHP_METHOD(UConverter, transcode) {
PHP_METHOD(UConverter, getErrorCode) {
php_converter_object *objval = CONV_GET(ZEND_THIS);
if (zend_parse_parameters_none() == FAILURE) {
RETURN_THROWS();
}
ZEND_PARSE_PARAMETERS_NONE();
RETURN_LONG(intl_error_get_code(&(objval->error)));
}
@ -796,9 +800,7 @@ PHP_METHOD(UConverter, getErrorCode) {
PHP_METHOD(UConverter, getErrorMessage) {
php_converter_object *objval = CONV_GET(ZEND_THIS);
if (zend_parse_parameters_none() == FAILURE) {
RETURN_THROWS();
}
ZEND_PARSE_PARAMETERS_NONE();
zend_string *message = intl_error_get_message(&(objval->error));
if (message) {
@ -814,9 +816,8 @@ PHP_METHOD(UConverter, getAvailable) {
int32_t i,
count = ucnv_countAvailable();
if (zend_parse_parameters_none() == FAILURE) {
RETURN_THROWS();
}
ZEND_PARSE_PARAMETERS_NONE();
intl_error_reset(NULL);
array_init(return_value);
@ -834,9 +835,9 @@ PHP_METHOD(UConverter, getAliases) {
UErrorCode error = U_ZERO_ERROR;
uint16_t i, count;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &name, &name_len) == FAILURE) {
RETURN_THROWS();
}
ZEND_PARSE_PARAMETERS_START(1, 1)
Z_PARAM_STRING(name, name_len)
ZEND_PARSE_PARAMETERS_END();
intl_error_reset(NULL);
count = ucnv_countAliases(name, &error);
@ -865,9 +866,7 @@ PHP_METHOD(UConverter, getAliases) {
PHP_METHOD(UConverter, getStandards) {
uint16_t i, count;
if (zend_parse_parameters_none() == FAILURE) {
RETURN_THROWS();
}
ZEND_PARSE_PARAMETERS_NONE();
intl_error_reset(NULL);
array_init(return_value);

View file

@ -26,7 +26,7 @@
/* {{{ */
static int numfmt_ctor(INTERNAL_FUNCTION_PARAMETERS, zend_error_handling *error_handling, bool *error_handling_replaced)
{
const char* locale;
char* locale;
char* pattern = NULL;
size_t locale_len = 0, pattern_len = 0;
zend_long style;
@ -34,12 +34,12 @@ static int numfmt_ctor(INTERNAL_FUNCTION_PARAMETERS, zend_error_handling *error_
int32_t spattern_len = 0;
FORMATTER_METHOD_INIT_VARS;
/* Parse parameters. */
if( zend_parse_parameters( ZEND_NUM_ARGS(), "sl|s!",
&locale, &locale_len, &style, &pattern, &pattern_len ) == FAILURE )
{
return FAILURE;
}
ZEND_PARSE_PARAMETERS_START(2, 3)
Z_PARAM_STRING(locale, locale_len)
Z_PARAM_LONG(style)
Z_PARAM_OPTIONAL
Z_PARAM_STRING_OR_NULL(pattern, pattern_len)
ZEND_PARSE_PARAMETERS_END_EX(return FAILURE);
if (error_handling != NULL) {
zend_replace_error_handling(EH_THROW, IntlException_ce_ptr, error_handling);
@ -61,7 +61,7 @@ static int numfmt_ctor(INTERNAL_FUNCTION_PARAMETERS, zend_error_handling *error_
}
if(locale_len == 0) {
locale = intl_locale_get_default();
locale = (char *)intl_locale_get_default();
}
if (strlen(uloc_getISO3Language(locale)) == 0) {