summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2017-05-24 18:02:22 +0200
committerNikita Popov <nikita.ppv@gmail.com>2017-05-24 18:02:22 +0200
commit5c3d14d43f85102452f93425a3fd323a62b07c5d (patch)
tree8281f894de82efef2331ae517a4e677124c4a791
parenta5eb57c96e8e851793d419cd4a4b4815a2cb44cb (diff)
parente7a706502475872928848f6606390eb77d274fdf (diff)
downloadphp-git-5c3d14d43f85102452f93425a3fd323a62b07c5d.tar.gz
Merge branch 'PHP-7.1'
-rw-r--r--ext/spl/spl_fixedarray.c15
-rw-r--r--ext/spl/tests/bug74478.phpt62
2 files changed, 77 insertions, 0 deletions
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