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:
2
NEWS
2
NEWS
@@ -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.
|
||||
|
||||
12
UPGRADING
12
UPGRADING
@@ -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
|
||||
========================================
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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
|
||||
-----------
|
||||
|
||||
@@ -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
|
||||
-----------
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user