diff options
author | Nikita Popov <nikita.ppv@gmail.com> | 2020-10-12 16:44:18 +0200 |
---|---|---|
committer | Nikita Popov <nikita.ppv@gmail.com> | 2020-10-12 16:44:18 +0200 |
commit | 6edad1716da48ac4765089d8603a4178b852afd8 (patch) | |
tree | afacd0cd66b083b604b0c4510341e8f09905d7e3 /ext/intl | |
parent | f9b7609d17694c5b5d5bba6321b27944220566be (diff) | |
parent | 74cf2eb83fc664cbad2d619fd2662bee770d8f81 (diff) | |
download | php-git-6edad1716da48ac4765089d8603a4178b852afd8.tar.gz |
Merge branch 'PHP-7.4' into PHP-8.0
* PHP-7.4:
intl: report more information about message pattern parse errors
Diffstat (limited to 'ext/intl')
-rw-r--r-- | ext/intl/msgformat/msgformat.c | 21 | ||||
-rw-r--r-- | ext/intl/msgformat/msgformat_format.c | 18 | ||||
-rw-r--r-- | ext/intl/tests/msgfmt_fail2.phpt | 16 |
3 files changed, 44 insertions, 11 deletions
diff --git a/ext/intl/msgformat/msgformat.c b/ext/intl/msgformat/msgformat.c index cb625ed037..fdb366c1b1 100644 --- a/ext/intl/msgformat/msgformat.c +++ b/ext/intl/msgformat/msgformat.c @@ -34,6 +34,7 @@ static int msgfmt_ctor(INTERNAL_FUNCTION_PARAMETERS) int spattern_len = 0; zval* object; MessageFormatter_object* mfo; + UParseError parse_error; intl_error_reset( NULL ); object = return_value; @@ -74,12 +75,26 @@ static int msgfmt_ctor(INTERNAL_FUNCTION_PARAMETERS) (mfo)->mf_data.orig_format_len = pattern_len; /* Create an ICU message formatter. */ - MSG_FORMAT_OBJECT(mfo) = umsg_open(spattern, spattern_len, locale, NULL, &INTL_DATA_ERROR_CODE(mfo)); + MSG_FORMAT_OBJECT(mfo) = umsg_open(spattern, spattern_len, locale, &parse_error, &INTL_DATA_ERROR_CODE(mfo)); if(spattern) { efree(spattern); } + if (INTL_DATA_ERROR_CODE( mfo ) == U_PATTERN_SYNTAX_ERROR) { + char *msg = NULL; + smart_str parse_error_str; + parse_error_str = intl_parse_error_to_string( &parse_error ); + spprintf( &msg, 0, "pattern syntax error (%s)", parse_error_str.s? ZSTR_VAL(parse_error_str.s) : "unknown parser error" ); + smart_str_free( &parse_error_str ); + + intl_error_set_code( NULL, INTL_DATA_ERROR_CODE( mfo ) ); + intl_errors_set_custom_msg( INTL_DATA_ERROR_P( mfo ), msg, 1 ); + + efree( msg ); + return FAILURE; + } + INTL_CTOR_CHECK_STATUS(mfo, "msgfmt_create: message formatter creation failed"); return SUCCESS; } @@ -105,7 +120,9 @@ PHP_METHOD( MessageFormatter, __construct ) return_value = ZEND_THIS; if (msgfmt_ctor(INTERNAL_FUNCTION_PARAM_PASSTHRU) == FAILURE) { if (!EG(exception)) { - zend_throw_exception(IntlException_ce_ptr, "Constructor failed", 0); + zend_string *err = intl_error_get_message(NULL); + zend_throw_exception(IntlException_ce_ptr, ZSTR_VAL(err), intl_error_get_code(NULL)); + zend_string_release_ex(err, 0); } } zend_restore_error_handling(&error_handling); diff --git a/ext/intl/msgformat/msgformat_format.c b/ext/intl/msgformat/msgformat_format.c index 1e4c49609e..0f422d2301 100644 --- a/ext/intl/msgformat/msgformat_format.c +++ b/ext/intl/msgformat/msgformat_format.c @@ -80,6 +80,7 @@ PHP_FUNCTION( msgfmt_format_message ) size_t slocale_len = 0; MessageFormatter_object mf; MessageFormatter_object *mfo = &mf; + UParseError parse_error; /* Parse parameters. */ if( zend_parse_method_parameters( ZEND_NUM_ARGS(), getThis(), "ssa", @@ -119,10 +120,25 @@ PHP_FUNCTION( msgfmt_format_message ) #endif /* Create an ICU message formatter. */ - MSG_FORMAT_OBJECT(mfo) = umsg_open(spattern, spattern_len, slocale, NULL, &INTL_DATA_ERROR_CODE(mfo)); + MSG_FORMAT_OBJECT(mfo) = umsg_open(spattern, spattern_len, slocale, &parse_error, &INTL_DATA_ERROR_CODE(mfo)); if(spattern && spattern_len) { efree(spattern); } + + if (INTL_DATA_ERROR_CODE( mfo ) == U_PATTERN_SYNTAX_ERROR) { + char *msg = NULL; + smart_str parse_error_str; + parse_error_str = intl_parse_error_to_string( &parse_error ); + spprintf( &msg, 0, "pattern syntax error (%s)", parse_error_str.s? ZSTR_VAL(parse_error_str.s) : "unknown parser error" ); + smart_str_free( &parse_error_str ); + + intl_error_set_code( NULL, INTL_DATA_ERROR_CODE( mfo ) ); + intl_errors_set_custom_msg( INTL_DATA_ERROR_P( mfo ), msg, 1 ); + + efree( msg ); + RETURN_FALSE; + } + INTL_METHOD_CHECK_STATUS(mfo, "Creating message formatter failed"); msgfmt_do_format(mfo, args, return_value); diff --git a/ext/intl/tests/msgfmt_fail2.phpt b/ext/intl/tests/msgfmt_fail2.phpt index 4061eab3dc..f604de0727 100644 --- a/ext/intl/tests/msgfmt_fail2.phpt +++ b/ext/intl/tests/msgfmt_fail2.phpt @@ -126,12 +126,12 @@ ArgumentCountError: msgfmt_create() expects exactly 2 arguments, 1 given in %s o ArgumentCountError: MessageFormatter::create() expects exactly 2 arguments, 1 given in %s on line %d 'U_ZERO_ERROR' -IntlException: Constructor failed in %s on line %d +IntlException: msgfmt_create: message formatter creation failed: U_ILLEGAL_ARGUMENT_ERROR in %s on line %d 'msgfmt_create: message formatter creation failed: U_ILLEGAL_ARGUMENT_ERROR' 'msgfmt_create: message formatter creation failed: U_ILLEGAL_ARGUMENT_ERROR' 'msgfmt_create: message formatter creation failed: U_ILLEGAL_ARGUMENT_ERROR' -IntlException: Constructor failed in %s on line %d +IntlException: msgfmt_create: message formatter creation failed: U_ILLEGAL_ARGUMENT_ERROR in %s on line %d 'msgfmt_create: message formatter creation failed: U_ILLEGAL_ARGUMENT_ERROR' 'msgfmt_create: message formatter creation failed: U_ILLEGAL_ARGUMENT_ERROR' 'msgfmt_create: message formatter creation failed: U_ILLEGAL_ARGUMENT_ERROR' @@ -145,17 +145,17 @@ TypeError: MessageFormatter::create(): Argument #1 ($locale) must be of type str TypeError: msgfmt_create(): Argument #1 ($locale) must be of type string, array given in %s on line %d 'U_ZERO_ERROR' -IntlException: Constructor failed in %s on line %d -'msgfmt_create: message formatter creation failed: U_PATTERN_SYNTAX_ERROR' -'msgfmt_create: message formatter creation failed: U_PATTERN_SYNTAX_ERROR' -'msgfmt_create: message formatter creation failed: U_PATTERN_SYNTAX_ERROR' +IntlException: pattern syntax error (parse error at offset 1, after "{", before or at "0,choice}"): U_PATTERN_SYNTAX_ERROR in %s on line %d +'pattern syntax error (parse error at offset 1, after "{", before or at "0,choice}"): U_PATTERN_SYNTAX_ERROR' +'pattern syntax error (parse error at offset 1, after "{", before or at "0,choice}"): U_PATTERN_SYNTAX_ERROR' +'pattern syntax error (parse error at offset 1, after "{", before or at "0,choice}"): U_PATTERN_SYNTAX_ERROR' -IntlException: Constructor failed in %s on line %d +IntlException: msgfmt_create: message formatter creation failed: U_UNMATCHED_BRACES in %s on line %d 'msgfmt_create: message formatter creation failed: U_UNMATCHED_BRACES' 'msgfmt_create: message formatter creation failed: U_UNMATCHED_BRACES' 'msgfmt_create: message formatter creation failed: U_UNMATCHED_BRACES' -IntlException: Constructor failed in %s on line %d +IntlException: msgfmt_create: error converting pattern to UTF-16: U_INVALID_CHAR_FOUND in %s on line %d 'msgfmt_create: error converting pattern to UTF-16: U_INVALID_CHAR_FOUND' 'msgfmt_create: error converting pattern to UTF-16: U_INVALID_CHAR_FOUND' 'msgfmt_create: error converting pattern to UTF-16: U_INVALID_CHAR_FOUND' |