Fix #79393: Null coalescing operator failing with SplFixedArray

We favor the KISS principle over optimization[1] – SPL is already
special enough.

[1] <352f3d4476 (r112498098)>ff
This commit is contained in:
Christoph M. Becker 2020-03-18 17:39:27 +01:00
parent 51c57a9c67
commit 47c745555c
3 changed files with 31 additions and 13 deletions

2
NEWS
View File

@ -18,6 +18,8 @@ PHP NEWS
- Spl:
. Fixed bug #75673 (SplStack::unserialize() behavior). (cmb)
. Fixed bug #79393 (Null coalescing operator failing with SplFixedArray).
(cmb)
- Zip:
. Fixed Bug #79296 (ZipArchive::open fails on empty file). (Remi)

View File

@ -336,25 +336,16 @@ static inline zval *spl_fixedarray_object_read_dimension_helper(spl_fixedarray_o
}
/* }}} */
static int spl_fixedarray_object_has_dimension(zval *object, zval *offset, int check_empty);
static zval *spl_fixedarray_object_read_dimension(zval *object, zval *offset, int type, zval *rv) /* {{{ */
{
spl_fixedarray_object *intern;
intern = Z_SPLFIXEDARRAY_P(object);
if (type == BP_VAR_IS && intern->fptr_offset_has) {
SEPARATE_ARG_IF_REF(offset);
zend_call_method_with_1_params(object, intern->std.ce, &intern->fptr_offset_has, "offsetexists", rv, offset);
if (UNEXPECTED(Z_ISUNDEF_P(rv))) {
zval_ptr_dtor(offset);
return NULL;
}
if (!i_zend_is_true(rv)) {
zval_ptr_dtor(offset);
zval_ptr_dtor(rv);
return &EG(uninitialized_zval);
}
zval_ptr_dtor(rv);
if (type == BP_VAR_IS && !spl_fixedarray_object_has_dimension(object, offset, 0)) {
return &EG(uninitialized_zval);
}
if (intern->fptr_offset_get) {

View File

@ -0,0 +1,25 @@
--TEST--
Bug #79393 (Null coalescing operator failing with SplFixedArray)
--FILE--
<?php
$foo = new SplFixedArray(5);
$foo[0] = 'bar1';
$foo[1] = 'bar2';
$foo[2] = 0;
$foo[3] = false;
$foo[4] = '';
var_dump($foo[0] ?? null);
var_dump($foo[1] ?? null);
var_dump($foo[2] ?? null);
var_dump($foo[3] ?? null);
var_dump($foo[4] ?? null);
var_dump($foo[5] ?? null);
?>
--EXPECT--
string(4) "bar1"
string(4) "bar2"
int(0)
bool(false)
string(0) ""
NULL