1
0
mirror of https://github.com/php/php-src.git synced 2026-03-24 00:02:20 +01:00

ext/intl: TimeZone address todo to throw exceptions on error.

close GH-17215
This commit is contained in:
David Carlier
2024-12-19 02:12:14 +00:00
parent 4e9cde758e
commit bf3673a415
9 changed files with 62 additions and 59 deletions

2
NEWS
View File

@@ -28,6 +28,8 @@ PHP NEWS
- Intl:
. Bumped ICU requirement to ICU >= 57.1. (cmb)
. IntlDateFormatter::setTimeZone()/datefmt_set_timezone() throws an exception
with uninitialised classes or clone failure. (David Carlier)
- MySQLnd:
. Added mysqlnd.collect_memory_statistics to ini quick reference.

View File

@@ -100,10 +100,9 @@ PHP 8.5 UPGRADE NOTES
5. Changed Functions
========================================
- Zlib:
. The "use_include_path" argument for the
gzfile, gzopen and readgzfile functions had been changed
from int to boolean.
- Intl:
. IntlDateFormatter::setTimeZone()()/datefmt_set_timezone
throws an IntlException on uninitialised classes/clone failures.
- PCNTL:
. pcntl_exec() now has a formal return type of false.
@@ -125,6 +124,11 @@ PHP 8.5 UPGRADE NOTES
. posix_fpathconf checks invalid file descriptors and sets
last_error to EBADF and raises an E_WARNING message.
- Zlib:
. The "use_include_path" argument for the
gzfile, gzopen and readgzfile functions had been changed
from int to boolean.
========================================
6. New Functions
========================================

View File

@@ -5,19 +5,22 @@ intl
--FILE--
<?php
ini_set('intl.error_level', E_WARNING);
var_dump(
datefmt_create('', IntlDateFormatter::NONE, IntlDateFormatter::NONE, "\xFF",
IntlDateFormatter::GREGORIAN, 'a'));
try {
var_dump(
datefmt_create('', IntlDateFormatter::NONE, IntlDateFormatter::NONE, "\xFF",
IntlDateFormatter::GREGORIAN, 'a');
} catch (IntlException $e) {
echo PHP_EOL."Exception: " . $e->getMessage() . " in " . $e->getFile() . " on line " . $e->getLine() . PHP_EOL;
}
try {
new IntlDateFormatter('', IntlDateFormatter::NONE, IntlDateFormatter::NONE, "Europe/Lisbon",
IntlDateFormatter::GREGORIAN, "\x80"));
IntlDateFormatter::GREGORIAN, "\x80");
} catch (IntlException $e) {
echo PHP_EOL."Exception: " . $e->getMessage() . " in " . $e->getFile() . " on line " . $e->getLine() . PHP_EOL;
}
?>
--EXPECTF--
Warning: datefmt_create(): datefmt_create: Time zone identifier given is not a valid UTF-8 string in %s on line %d
NULL
Exception: IntlDateFormatter::__construct(): datefmt_create: error converting pattern to UTF-16 in %sbug62017.php on line %d
Exception: datefmt_create: Time zone identifier given is not a valid UTF-8 string in %s on line %d
Exception: IntlDateFormatter::__construct(): datefmt_create: error converting pattern to UTF-16 in %s on line %d

View File

@@ -10,8 +10,11 @@ class X extends IntlTimeZone {
function __construct() {}
}
var_dump(intlcal_create_instance(new X, NULL));
try {
intlcal_create_instance(new X, NULL);
} catch (IntlException $e) {
echo $e->getMessage();
}
?>
--EXPECTF--
Warning: intlcal_create_instance(): intlcal_create_instance: passed IntlTimeZone is not properly constructed in %s on line %d
NULL
--EXPECT--
intlcal_create_instance: passed IntlTimeZone is not properly constructed

View File

@@ -29,7 +29,8 @@ try {
}
?>
--EXPECTF--
Exception: IntlDateFormatter::__construct(): datefmt_create: No such time zone: 'bad timezone' in %s on line %d
Exception: datefmt_create: No such time zone: 'bad timezone' in %s on line %d
Exception: IntlDateFormatter::__construct(): datefmt_create: Invalid value for calendar type; it must be one of IntlDateFormatter::TRADITIONAL (locale's default calendar) or IntlDateFormatter::GREGORIAN. Alternatively, it can be an IntlCalendar object in %s on line %d

View File

@@ -10,15 +10,19 @@ ini_set("date.timezone", 'Atlantic/Azores');
$df = new IntlDateFormatter(NULL, 0, 0);
var_dump($df->setTimeZone(array()));
var_dump($df->setTimeZone('non existing timezone'));
try {
$df->setTimeZone(array());
} catch (IntlException $e) {
echo $e->getMessage() . PHP_EOL;
}
try {
$df->setTimeZone('non existing timezone');
} catch (IntlException $e) {
echo $e->getMessage();
}
?>
--EXPECTF--
Warning: Array to string conversion in %s on line %d
Warning: IntlDateFormatter::setTimeZone(): datefmt_set_timezone: No such time zone: 'Array' in %s on line %d
bool(false)
Warning: IntlDateFormatter::setTimeZone(): datefmt_set_timezone: No such time zone: 'non existing timezone' in %s on line %d
bool(false)
datefmt_set_timezone: No such time zone: 'Array'
datefmt_set_timezone: No such time zone: 'non existing timezone'

View File

@@ -37,7 +37,11 @@ function ut_main()
$res_str .= "-----------";
$res_str .= "\nTrying to set timezone_id= $timezone_id_entry";
if (ut_datefmt_set_timezone_id( $fmt , $timezone_id_entry ) !== $result) die("ut_datefmt_set_timezone_id failed");
try {
ut_datefmt_set_timezone_id( $fmt , $timezone_id_entry );
} catch (IntlException $e) {
echo $e->getMessage() . PHP_EOL;
}
$timezone_id = ut_datefmt_get_timezone_id( $fmt );
$res_str .= "\nAfter call to set_timezone_id : timezone_id= $timezone_id";
$formatted = ut_datefmt_format( $fmt, 0);
@@ -58,9 +62,8 @@ include_once( 'ut_common.inc' );
ut_run();
?>
--EXPECTF--
Warning: IntlDateFormatter::setTimeZone(): datefmt_set_timezone: No such time zone: 'CN' in %sut_common.inc on line %d
Warning: datefmt_set_timezone(): datefmt_set_timezone: No such time zone: 'CN' in %sut_common.inc on line %d
datefmt_set_timezone: No such time zone: 'CN'
datefmt_set_timezone: No such time zone: 'CN'
After creation of the dateformatter : timezone_id= US/Pacific
-----------

View File

@@ -37,7 +37,11 @@ function ut_main()
$res_str .= "-----------";
$res_str .= "\nTrying to set timezone_id= $timezone_id_entry";
if (ut_datefmt_set_timezone_id( $fmt , $timezone_id_entry ) !== $result) die("ut_datefmt_set_timezone_id failed");
try {
ut_datefmt_set_timezone_id( $fmt , $timezone_id_entry );
} catch (IntlException $e) {
echo $e->getMessage() . PHP_EOL;
}
$timezone_id = ut_datefmt_get_timezone_id( $fmt );
$res_str .= "\nAfter call to set_timezone_id : timezone_id= $timezone_id";
$formatted = ut_datefmt_format( $fmt, 0);
@@ -58,9 +62,8 @@ include_once( 'ut_common.inc' );
ut_run();
?>
--EXPECTF--
Warning: IntlDateFormatter::setTimeZone(): datefmt_set_timezone: No such time zone: 'CN' in %sut_common.inc on line %d
Warning: datefmt_set_timezone(): datefmt_set_timezone: No such time zone: 'CN' in %sut_common.inc on line %d
datefmt_set_timezone: No such time zone: 'CN'
datefmt_set_timezone: No such time zone: 'CN'
After creation of the dateformatter : timezone_id= US/Pacific
-----------

View File

@@ -22,6 +22,7 @@
#include <unicode/timezone.h>
#include <unicode/calendar.h>
#include "../intl_convertcpp.h"
#include "../intl_common.h"
#include "../common/common_date.h"
@@ -147,24 +148,15 @@ U_CFUNC TimeZone *timezone_process_timezone_argument(zval *zv_timezone,
instanceof_function(Z_OBJCE_P(zv_timezone), TimeZone_ce_ptr)) {
TimeZone_object *to = Z_INTL_TIMEZONE_P(zv_timezone);
/* TODO Throw proper Error exceptions for uninitialized classes and failure to clone */
if (to->utimezone == NULL) {
spprintf(&message, 0, "%s: passed IntlTimeZone is not "
zend_throw_error(IntlException_ce_ptr, "%s: passed IntlTimeZone is not "
"properly constructed", func);
if (message) {
intl_errors_set(outside_error, U_ILLEGAL_ARGUMENT_ERROR, message, 1);
efree(message);
}
zval_ptr_dtor_str(&local_zv_tz);
return NULL;
}
timeZone = to->utimezone->clone();
if (UNEXPECTED(timeZone == NULL)) {
spprintf(&message, 0, "%s: could not clone TimeZone", func);
if (message) {
intl_errors_set(outside_error, U_MEMORY_ALLOCATION_ERROR, message, 1);
efree(message);
}
zend_throw_error(IntlException_ce_ptr, "%s: could not clone TimeZone", func);
zval_ptr_dtor_str(&local_zv_tz);
return NULL;
}
@@ -185,32 +177,20 @@ U_CFUNC TimeZone *timezone_process_timezone_argument(zval *zv_timezone,
}
if (intl_stringFromChar(id, Z_STRVAL_P(zv_timezone), Z_STRLEN_P(zv_timezone),
&status) == FAILURE) {
spprintf(&message, 0, "%s: Time zone identifier given is not a "
zend_throw_error(IntlException_ce_ptr, "%s: Time zone identifier given is not a "
"valid UTF-8 string", func);
if (message) {
intl_errors_set(outside_error, status, message, 1);
efree(message);
}
zval_ptr_dtor_str(&local_zv_tz);
return NULL;
}
timeZone = TimeZone::createTimeZone(id);
if (UNEXPECTED(timeZone == NULL)) {
spprintf(&message, 0, "%s: Could not create time zone", func);
if (message) {
intl_errors_set(outside_error, U_MEMORY_ALLOCATION_ERROR, message, 1);
efree(message);
}
zend_throw_error(IntlException_ce_ptr, "%s: Could not create time zone", func);
zval_ptr_dtor_str(&local_zv_tz);
return NULL;
}
if (*timeZone == TimeZone::getUnknown()) {
spprintf(&message, 0, "%s: No such time zone: '%s'",
zend_throw_error(IntlException_ce_ptr, "%s: No such time zone: '%s'",
func, Z_STRVAL_P(zv_timezone));
if (message) {
intl_errors_set(outside_error, U_ILLEGAL_ARGUMENT_ERROR, message, 1);
efree(message);
}
zval_ptr_dtor_str(&local_zv_tz);
delete timeZone;
return NULL;