diff options
| author | Nikita Popov <nikita.ppv@gmail.com> | 2017-05-24 18:01:56 +0200 |
|---|---|---|
| committer | Nikita Popov <nikita.ppv@gmail.com> | 2017-05-24 18:02:13 +0200 |
| commit | e7a706502475872928848f6606390eb77d274fdf (patch) | |
| tree | 818916d3cdcc707286f8194ae32572cb555492f7 | |
| parent | e535b80257b2ef3a515d0833a40e96788ba830e2 (diff) | |
| parent | 872e43d6e55e4af84681b259198ee688287cd40d (diff) | |
| download | php-git-e7a706502475872928848f6606390eb77d274fdf.tar.gz | |
Merge branch 'PHP-7.0' into PHP-7.1
| -rw-r--r-- | NEWS | 4 | ||||
| -rw-r--r-- | ext/spl/spl_fixedarray.c | 15 | ||||
| -rw-r--r-- | ext/spl/tests/bug74478.phpt | 62 |
3 files changed, 80 insertions, 1 deletions
@@ -2,7 +2,9 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ?? ??? 2017, PHP 7.1.7 - +- SPL: + . Fixed bug #74478 (null coalescing operator failing with SplFixedArray). + (jhdxr) 8 Jun 2017, PHP 7.1.6 diff --git a/ext/spl/spl_fixedarray.c b/ext/spl/spl_fixedarray.c index 9fb74902a7..3dd5b0656f 100644 --- a/ext/spl/spl_fixedarray.c +++ b/ext/spl/spl_fixedarray.c @@ -346,6 +346,21 @@ static zval *spl_fixedarray_object_read_dimension(zval *object, zval *offset, in 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 (intern->fptr_offset_get) { zval tmp; if (!offset) { diff --git a/ext/spl/tests/bug74478.phpt b/ext/spl/tests/bug74478.phpt new file mode 100644 index 0000000000..da63984d5c --- /dev/null +++ b/ext/spl/tests/bug74478.phpt @@ -0,0 +1,62 @@ +--TEST--
+Bug #74478: null coalescing operator failing with SplFixedArray
+--FILE--
+<?php
+
+class MyFixedArray extends \SplFixedArray
+{
+ public function offsetExists($name) {
+ echo "offsetExists($name)\n";
+ return parent::offsetExists($name);
+ }
+ public function offsetGet($name) {
+ echo "offsetGet($name)\n";
+ return parent::offsetGet($name);
+ }
+ public function offsetSet($name, $value) {
+ echo "offsetSet($name)\n";
+ return parent::offsetSet($name, $value);
+ }
+ public function offsetUnset($name) {
+ echo "offsetUnset($name)\n";
+ return parent::offsetUnset($name);
+ }
+
+};
+
+$fixedData = new MyFixedArray(10);
+var_dump(isset($fixedData[0][1][2]));
+var_dump(isset($fixedData[0]->foo));
+var_dump($fixedData[0] ?? 42);
+var_dump($fixedData[0][1][2] ?? 42);
+
+$fixedData[0] = new MyFixedArray(10);
+$fixedData[0][1] = new MyFixedArray(10);
+var_dump(isset($fixedData[0][1][2]));
+var_dump($fixedData[0][1][2] ?? 42);
+
+?>
+--EXPECT--
+offsetExists(0)
+bool(false)
+offsetExists(0)
+bool(false)
+offsetExists(0)
+int(42)
+offsetExists(0)
+int(42)
+offsetSet(0)
+offsetGet(0)
+offsetSet(1)
+offsetExists(0)
+offsetGet(0)
+offsetExists(1)
+offsetGet(1)
+offsetExists(2)
+bool(false)
+offsetExists(0)
+offsetGet(0)
+offsetExists(1)
+offsetGet(1)
+offsetExists(2)
+int(42)
\ No newline at end of file |
