Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions NEWS
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,11 @@ PHP NEWS
registrations are freed while still reachable from the cycle collector.
(Ilia Alshanetsky)

- Intl:
. Fixed cloning IntlDateFormatter and MessageFormatter losing PHP-side state
such as dateType, timeType, calendar and the message pattern.
(Ilia Alshanetsky)

- MBString:
. Fixed bug GH-23106 (mb_strpos() reads past the end of a haystack ending in
a truncated UTF-8 sequence). (Lazizbek Ergashev)
Expand Down
3 changes: 3 additions & 0 deletions TSRM/TSRM.c
Original file line number Diff line number Diff line change
Expand Up @@ -305,6 +305,7 @@ TSRM_API ts_rsrc_id ts_allocate_id(ts_rsrc_id *rsrc_id, size_t size, ts_allocate
_tmp = (tsrm_resource_type *) realloc(resource_types_table, sizeof(tsrm_resource_type)*id_count);
if (!_tmp) {
TSRM_ERROR((TSRM_ERROR_LEVEL_ERROR, "Unable to allocate storage for resource"));
id_count--;
*rsrc_id = 0;
tsrm_mutex_unlock(tsmm_mutex);
return 0;
Expand Down Expand Up @@ -384,6 +385,7 @@ TSRM_API ts_rsrc_id ts_allocate_fast_id_at(ts_rsrc_id *rsrc_id, size_t *offset,
_tmp = (tsrm_resource_type *) realloc(resource_types_table, sizeof(tsrm_resource_type)*id_count);
if (!_tmp) {
TSRM_ERROR((TSRM_ERROR_LEVEL_ERROR, "Unable to allocate storage for resource"));
id_count--;
*rsrc_id = 0;
tsrm_mutex_unlock(tsmm_mutex);
return 0;
Expand Down Expand Up @@ -419,6 +421,7 @@ TSRM_API ts_rsrc_id ts_allocate_tls_id(ts_rsrc_id *rsrc_id, void *(*tls_addr)(vo
_tmp = (tsrm_resource_type *) realloc(resource_types_table, sizeof(tsrm_resource_type)*id_count);
if (!_tmp) {
TSRM_ERROR((TSRM_ERROR_LEVEL_ERROR, "Unable to allocate storage for resource"));
id_count--;
*rsrc_id = 0;
tsrm_mutex_unlock(tsmm_mutex);
return 0;
Expand Down
7 changes: 7 additions & 0 deletions ext/intl/dateformat/dateformat_class.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,13 @@ zend_object *IntlDateFormatter_object_clone(zend_object *object)
/* clone standard parts */
zend_objects_clone_members(&new_dfo->zo, &dfo->zo);

new_dfo->date_type = dfo->date_type;
new_dfo->time_type = dfo->time_type;
new_dfo->calendar = dfo->calendar;
if (dfo->requested_locale != NULL) {
new_dfo->requested_locale = estrdup(dfo->requested_locale);
}

/* clone formatter object */
if (DATE_FORMAT_OBJECT(dfo) != NULL) {
UErrorCode error = U_ZERO_ERROR;
Expand Down
6 changes: 6 additions & 0 deletions ext/intl/msgformat/msgformat_class.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,12 @@ U_CFUNC zend_object *MessageFormatter_object_clone(zend_object *object)
/* clone standard parts */
zend_objects_clone_members(&new_mfo->zo, &mfo->zo);

if (mfo->mf_data.orig_format != NULL) {
new_mfo->mf_data.orig_format = estrndup(mfo->mf_data.orig_format, mfo->mf_data.orig_format_len);
new_mfo->mf_data.orig_format_len = mfo->mf_data.orig_format_len;
}
new_mfo->mf_data.tz_set = mfo->mf_data.tz_set;

/* clone formatter object */
if (MSG_FORMAT_OBJECT(mfo) != NULL) {
UErrorCode error = U_ZERO_ERROR;
Expand Down
37 changes: 37 additions & 0 deletions ext/intl/tests/clone_preserves_php_fields.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
--TEST--
Cloning IntlDateFormatter and MessageFormatter preserves PHP-side fields
--EXTENSIONS--
intl
--FILE--
<?php
$d = new IntlDateFormatter('de_DE', IntlDateFormatter::LONG, IntlDateFormatter::MEDIUM, 'UTC', IntlDateFormatter::GREGORIAN);
$c = clone $d;
var_dump($c->getDateType());
var_dump($c->getTimeType());
var_dump($c->getCalendar());
var_dump($c->format(strtotime('2024-01-02 03:04:05 UTC')));
$c->setCalendar(IntlDateFormatter::GREGORIAN);
var_dump($c->getPattern());

$m = new MessageFormatter('en_US', '{0, number}');
$mc = clone $m;
var_dump($mc->getPattern());
var_dump($mc->format([1.5]));

date_default_timezone_set('UTC');
$t = new MessageFormatter('en_US', '{0,time,short}');
$dt = new DateTimeImmutable('2024-01-02 03:04:05', new DateTimeZone('UTC'));
$t->format([$dt]);
$tc = clone $t;
date_default_timezone_set('America/New_York');
var_dump($t->format([$dt]) === $tc->format([$dt]));
?>
--EXPECT--
int(1)
int(2)
int(1)
string(26) "2. Januar 2024 um 03:04:05"
string(23) "d. MMMM y 'um' HH:mm:ss"
string(11) "{0, number}"
string(3) "1.5"
bool(true)