Skip to content

Commit 3a1ff20

Browse files
committed
Fix IntlDateFormatter::parseToCalendar() reference type system breaks
1 parent 4ff41cf commit 3a1ff20

File tree

2 files changed

+31
-6
lines changed

2 files changed

+31
-6
lines changed

ext/intl/dateformat/dateformat_parse.c

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -186,12 +186,12 @@ PHP_METHOD(IntlDateFormatter, parseToCalendar)
186186
DATE_FORMAT_METHOD_FETCH_OBJECT;
187187

188188
if (z_parse_pos) {
189-
zend_long long_parse_pos;
190-
ZVAL_DEREF(z_parse_pos);
189+
zval *z_parse_pos_tmp = z_parse_pos;
190+
ZVAL_DEREF(z_parse_pos_tmp);
191191
bool failed = false;
192-
long_parse_pos = zval_try_get_long(z_parse_pos, &failed);
192+
zend_long long_parse_pos = zval_try_get_long(z_parse_pos_tmp, &failed);
193193
if (failed) {
194-
zend_argument_type_error(2, "must be of type int, %s given", zend_zval_value_name(z_parse_pos));
194+
zend_argument_type_error(2, "must be of type int, %s given", zend_zval_value_name(z_parse_pos_tmp));
195195
RETURN_THROWS();
196196
}
197197
if (ZEND_LONG_INT_OVFL(long_parse_pos)) {
@@ -206,8 +206,7 @@ PHP_METHOD(IntlDateFormatter, parseToCalendar)
206206
}
207207
internal_parse_to_timestamp( dfo, ZSTR_VAL(text_to_parse), ZSTR_LEN(text_to_parse), z_parse_pos ? &parse_pos : NULL, true, return_value);
208208
if (z_parse_pos) {
209-
zval_ptr_dtor(z_parse_pos);
210-
ZVAL_LONG(z_parse_pos, parse_pos);
209+
ZEND_TRY_ASSIGN_REF_LONG(z_parse_pos, parse_pos);
211210
}
212211
}
213212

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
--TEST--
2+
IntlDateFormatter::parseToCalendar() reference type system breaks
3+
--EXTENSIONS--
4+
intl
5+
--FILE--
6+
<?php
7+
class Test {
8+
public float $prop = 0.0;
9+
}
10+
$test = new Test;
11+
$offset =& $test->prop;
12+
13+
$oIntlDateFormatter = new IntlDateFormatter("en_GB");
14+
$oIntlDateFormatter->setTimeZone('Europe/Berlin');
15+
$oIntlDateFormatter->setPattern('VV');
16+
var_dump($oIntlDateFormatter->parseToCalendar('America/Los_Angeles', $offset));
17+
var_dump($offset);
18+
var_dump($test);
19+
?>
20+
--EXPECTF--
21+
int(%d)
22+
float(%f)
23+
object(Test)#%d (1) {
24+
["prop"]=>
25+
&float(%f)
26+
}

0 commit comments

Comments
 (0)