Skip to content

Commit 5c3d14d

Browse files
committed
Merge branch 'PHP-7.1'
2 parents a5eb57c + e7a7065 commit 5c3d14d

File tree

2 files changed

+77
-0
lines changed

2 files changed

+77
-0
lines changed

ext/spl/spl_fixedarray.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -346,6 +346,21 @@ static zval *spl_fixedarray_object_read_dimension(zval *object, zval *offset, in
346346

347347
intern = Z_SPLFIXEDARRAY_P(object);
348348

349+
if (type == BP_VAR_IS && intern->fptr_offset_has) {
350+
SEPARATE_ARG_IF_REF(offset);
351+
zend_call_method_with_1_params(object, intern->std.ce, &intern->fptr_offset_has, "offsetexists", rv, offset);
352+
if (UNEXPECTED(Z_ISUNDEF_P(rv))) {
353+
zval_ptr_dtor(offset);
354+
return NULL;
355+
}
356+
if (!i_zend_is_true(rv)) {
357+
zval_ptr_dtor(offset);
358+
zval_ptr_dtor(rv);
359+
return &EG(uninitialized_zval);
360+
}
361+
zval_ptr_dtor(rv);
362+
}
363+
349364
if (intern->fptr_offset_get) {
350365
zval tmp;
351366
if (!offset) {

ext/spl/tests/bug74478.phpt

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
--TEST--
2+
Bug #74478: null coalescing operator failing with SplFixedArray
3+
--FILE--
4+
<?php
5+
6+
class MyFixedArray extends \SplFixedArray
7+
{
8+
public function offsetExists($name) {
9+
echo "offsetExists($name)\n";
10+
return parent::offsetExists($name);
11+
}
12+
public function offsetGet($name) {
13+
echo "offsetGet($name)\n";
14+
return parent::offsetGet($name);
15+
}
16+
public function offsetSet($name, $value) {
17+
echo "offsetSet($name)\n";
18+
return parent::offsetSet($name, $value);
19+
}
20+
public function offsetUnset($name) {
21+
echo "offsetUnset($name)\n";
22+
return parent::offsetUnset($name);
23+
}
24+
25+
};
26+
27+
$fixedData = new MyFixedArray(10);
28+
var_dump(isset($fixedData[0][1][2]));
29+
var_dump(isset($fixedData[0]->foo));
30+
var_dump($fixedData[0] ?? 42);
31+
var_dump($fixedData[0][1][2] ?? 42);
32+
33+
$fixedData[0] = new MyFixedArray(10);
34+
$fixedData[0][1] = new MyFixedArray(10);
35+
var_dump(isset($fixedData[0][1][2]));
36+
var_dump($fixedData[0][1][2] ?? 42);
37+
38+
?>
39+
--EXPECT--
40+
offsetExists(0)
41+
bool(false)
42+
offsetExists(0)
43+
bool(false)
44+
offsetExists(0)
45+
int(42)
46+
offsetExists(0)
47+
int(42)
48+
offsetSet(0)
49+
offsetGet(0)
50+
offsetSet(1)
51+
offsetExists(0)
52+
offsetGet(0)
53+
offsetExists(1)
54+
offsetGet(1)
55+
offsetExists(2)
56+
bool(false)
57+
offsetExists(0)
58+
offsetGet(0)
59+
offsetExists(1)
60+
offsetGet(1)
61+
offsetExists(2)
62+
int(42)

0 commit comments

Comments
 (0)