mirror of
https://github.com/php/php-src.git
synced 2024-09-21 18:07:23 +00:00
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:
parent
51c57a9c67
commit
47c745555c
2
NEWS
2
NEWS
@ -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)
|
||||
|
@ -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) {
|
||||
|
25
ext/spl/tests/bug79393.phpt
Normal file
25
ext/spl/tests/bug79393.phpt
Normal 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
|
Loading…
Reference in New Issue
Block a user