summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMáté Kocsis <kocsismate@woohoolabs.com>2020-03-06 10:01:10 +0100
committerMáté Kocsis <kocsismate@woohoolabs.com>2020-03-10 11:41:48 +0100
commitd2b902f174b2e8c98bf5d4e257924a96b1323776 (patch)
tree68230827162b0392db375008a4841e1b3538f395
parent9d0eccd980535eff78141ebaddea18372c05d6a6 (diff)
downloadphp-git-d2b902f174b2e8c98bf5d4e257924a96b1323776.tar.gz
Add some stubs for SPL
Closes GH-5245
-rwxr-xr-xext/spl/php_spl.stub.php3
-rw-r--r--ext/spl/spl_array.c174
-rwxr-xr-xext/spl/spl_array.stub.php225
-rw-r--r--ext/spl/spl_array_arginfo.h136
-rw-r--r--ext/spl/spl_fixedarray.c58
-rwxr-xr-xext/spl/spl_fixedarray.stub.php64
-rw-r--r--ext/spl/spl_fixedarray_arginfo.h46
-rw-r--r--ext/spl/tests/bug71412.phpt2
8 files changed, 550 insertions, 158 deletions
diff --git a/ext/spl/php_spl.stub.php b/ext/spl/php_spl.stub.php
index 8bf6e79c74..b9c5335b70 100755
--- a/ext/spl/php_spl.stub.php
+++ b/ext/spl/php_spl.stub.php
@@ -1,7 +1,5 @@
<?php
-/* ext/spl/php_spl.c */
-
function class_implements($what, bool $autoload = true): array|false {}
function class_parents($instance, bool $autoload = true): array|false {}
@@ -27,7 +25,6 @@ function spl_object_hash(object $obj): string {}
function spl_object_id(object $obj): int {}
-/* ext/spl/spl_iterators.c */
function iterator_apply(Traversable $iterator, callable $function, ?array $args = null): int {}
function iterator_count(Traversable $iterator): int {}
diff --git a/ext/spl/spl_array.c b/ext/spl/spl_array.c
index bc1713ee84..434dfc634f 100644
--- a/ext/spl/spl_array.c
+++ b/ext/spl/spl_array.c
@@ -27,6 +27,7 @@
#include "zend_exceptions.h"
#include "php_spl.h"
+#include "spl_array_arginfo.h"
#include "spl_functions.h"
#include "spl_engine.h"
#include "spl_iterators.h"
@@ -780,6 +781,10 @@ SPL_METHOD(Array, getArrayCopy)
zval *object = ZEND_THIS;
spl_array_object *intern = Z_SPLARRAY_P(object);
+ if (zend_parse_parameters_none() == FAILURE) {
+ RETURN_THROWS();
+ }
+
RETURN_ARR(zend_array_dup(spl_array_get_hash_table(intern)));
} /* }}} */
@@ -1196,7 +1201,7 @@ SPL_METHOD(Array, __construct)
return; /* nothing to do */
}
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "z|lC", &array, &ar_flags, &ce_get_iterator) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "|zlC", &array, &ar_flags, &ce_get_iterator) == FAILURE) {
RETURN_THROWS();
}
@@ -1225,7 +1230,7 @@ SPL_METHOD(ArrayIterator, __construct)
return; /* nothing to do */
}
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "z|l", &array, &ar_flags) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "|zl", &array, &ar_flags) == FAILURE) {
RETURN_THROWS();
}
@@ -1673,7 +1678,7 @@ SPL_METHOD(Array, serialize)
smart_str buf = {0};
if (zend_parse_parameters_none() == FAILURE) {
- return;
+ RETURN_THROWS();
}
PHP_VAR_SERIALIZE_INIT(var_hash);
@@ -1702,11 +1707,7 @@ SPL_METHOD(Array, serialize)
/* done */
PHP_VAR_SERIALIZE_DESTROY(var_hash);
- if (buf.s) {
- RETURN_NEW_STR(buf.s);
- }
-
- RETURN_NULL();
+ RETURN_NEW_STR(buf.s);
} /* }}} */
/* {{{ proto void ArrayObject::unserialize(string serialized)
@@ -1892,122 +1893,69 @@ SPL_METHOD(Array, __unserialize)
}
/* }}} */
-/* {{{ arginfo and function table */
-ZEND_BEGIN_ARG_INFO_EX(arginfo_array___construct, 0, 0, 0)
- ZEND_ARG_INFO(0, input)
- ZEND_ARG_INFO(0, flags)
- ZEND_ARG_INFO(0, iterator_class)
-ZEND_END_ARG_INFO()
-
-/* ArrayIterator::__construct and ArrayObject::__construct have different signatures */
-ZEND_BEGIN_ARG_INFO_EX(arginfo_array_iterator___construct, 0, 0, 0)
- ZEND_ARG_INFO(0, array)
- ZEND_ARG_INFO(0, flags)
-ZEND_END_ARG_INFO()
-
-ZEND_BEGIN_ARG_INFO_EX(arginfo_array_offsetGet, 0, 0, 1)
- ZEND_ARG_INFO(0, index)
-ZEND_END_ARG_INFO()
-
-ZEND_BEGIN_ARG_INFO_EX(arginfo_array_offsetSet, 0, 0, 2)
- ZEND_ARG_INFO(0, index)
- ZEND_ARG_INFO(0, newval)
-ZEND_END_ARG_INFO()
-
-ZEND_BEGIN_ARG_INFO(arginfo_array_append, 0)
- ZEND_ARG_INFO(0, value)
-ZEND_END_ARG_INFO()
-
-ZEND_BEGIN_ARG_INFO(arginfo_array_seek, 0)
- ZEND_ARG_INFO(0, position)
-ZEND_END_ARG_INFO()
-
-ZEND_BEGIN_ARG_INFO(arginfo_array_exchangeArray, 0)
- ZEND_ARG_INFO(0, input)
-ZEND_END_ARG_INFO()
-
-ZEND_BEGIN_ARG_INFO(arginfo_array_setFlags, 0)
- ZEND_ARG_INFO(0, flags)
-ZEND_END_ARG_INFO()
-
-ZEND_BEGIN_ARG_INFO(arginfo_array_setIteratorClass, 0)
- ZEND_ARG_INFO(0, iteratorClass)
-ZEND_END_ARG_INFO()
-
-ZEND_BEGIN_ARG_INFO(arginfo_array_uXsort, 0)
- ZEND_ARG_INFO(0, cmp_function)
-ZEND_END_ARG_INFO();
-
-ZEND_BEGIN_ARG_INFO(arginfo_array_unserialize, 0)
- ZEND_ARG_INFO(0, serialized)
-ZEND_END_ARG_INFO();
-
-ZEND_BEGIN_ARG_INFO(arginfo_array_void, 0)
-ZEND_END_ARG_INFO()
-
static const zend_function_entry spl_funcs_ArrayObject[] = {
- SPL_ME(Array, __construct, arginfo_array___construct, ZEND_ACC_PUBLIC)
- SPL_ME(Array, offsetExists, arginfo_array_offsetGet, ZEND_ACC_PUBLIC)
- SPL_ME(Array, offsetGet, arginfo_array_offsetGet, ZEND_ACC_PUBLIC)
- SPL_ME(Array, offsetSet, arginfo_array_offsetSet, ZEND_ACC_PUBLIC)
- SPL_ME(Array, offsetUnset, arginfo_array_offsetGet, ZEND_ACC_PUBLIC)
- SPL_ME(Array, append, arginfo_array_append, ZEND_ACC_PUBLIC)
- SPL_ME(Array, getArrayCopy, arginfo_array_void, ZEND_ACC_PUBLIC)
- SPL_ME(Array, count, arginfo_array_void, ZEND_ACC_PUBLIC)
- SPL_ME(Array, getFlags, arginfo_array_void, ZEND_ACC_PUBLIC)
- SPL_ME(Array, setFlags, arginfo_array_setFlags, ZEND_ACC_PUBLIC)
- SPL_ME(Array, asort, arginfo_array_void, ZEND_ACC_PUBLIC)
- SPL_ME(Array, ksort, arginfo_array_void, ZEND_ACC_PUBLIC)
- SPL_ME(Array, uasort, arginfo_array_uXsort, ZEND_ACC_PUBLIC)
- SPL_ME(Array, uksort, arginfo_array_uXsort, ZEND_ACC_PUBLIC)
- SPL_ME(Array, natsort, arginfo_array_void, ZEND_ACC_PUBLIC)
- SPL_ME(Array, natcasesort, arginfo_array_void, ZEND_ACC_PUBLIC)
- SPL_ME(Array, unserialize, arginfo_array_unserialize, ZEND_ACC_PUBLIC)
- SPL_ME(Array, serialize, arginfo_array_void, ZEND_ACC_PUBLIC)
- SPL_ME(Array, __unserialize, arginfo_array_unserialize, ZEND_ACC_PUBLIC)
- SPL_ME(Array, __serialize, arginfo_array_void, ZEND_ACC_PUBLIC)
+ SPL_ME(Array, __construct, arginfo_class_ArrayObject___construct, ZEND_ACC_PUBLIC)
+ SPL_ME(Array, offsetExists, arginfo_class_ArrayObject_offsetExists, ZEND_ACC_PUBLIC)
+ SPL_ME(Array, offsetGet, arginfo_class_ArrayObject_offsetGet, ZEND_ACC_PUBLIC)
+ SPL_ME(Array, offsetSet, arginfo_class_ArrayObject_offsetSet, ZEND_ACC_PUBLIC)
+ SPL_ME(Array, offsetUnset, arginfo_class_ArrayObject_offsetUnset, ZEND_ACC_PUBLIC)
+ SPL_ME(Array, append, arginfo_class_ArrayObject_append, ZEND_ACC_PUBLIC)
+ SPL_ME(Array, getArrayCopy, arginfo_class_ArrayObject_getArrayCopy, ZEND_ACC_PUBLIC)
+ SPL_ME(Array, count, arginfo_class_ArrayObject_count, ZEND_ACC_PUBLIC)
+ SPL_ME(Array, getFlags, arginfo_class_ArrayObject_getFlags, ZEND_ACC_PUBLIC)
+ SPL_ME(Array, setFlags, arginfo_class_ArrayObject_setFlags, ZEND_ACC_PUBLIC)
+ SPL_ME(Array, asort, arginfo_class_ArrayObject_asort, ZEND_ACC_PUBLIC)
+ SPL_ME(Array, ksort, arginfo_class_ArrayObject_ksort, ZEND_ACC_PUBLIC)
+ SPL_ME(Array, uasort, arginfo_class_ArrayObject_uasort, ZEND_ACC_PUBLIC)
+ SPL_ME(Array, uksort, arginfo_class_ArrayObject_uksort, ZEND_ACC_PUBLIC)
+ SPL_ME(Array, natsort, arginfo_class_ArrayObject_natsort, ZEND_ACC_PUBLIC)
+ SPL_ME(Array, natcasesort, arginfo_class_ArrayObject_natcasesort, ZEND_ACC_PUBLIC)
+ SPL_ME(Array, unserialize, arginfo_class_ArrayObject_unserialize, ZEND_ACC_PUBLIC)
+ SPL_ME(Array, serialize, arginfo_class_ArrayObject_serialize, ZEND_ACC_PUBLIC)
+ SPL_ME(Array, __unserialize, arginfo_class_ArrayObject___unserialize, ZEND_ACC_PUBLIC)
+ SPL_ME(Array, __serialize, arginfo_class_ArrayObject___serialize, ZEND_ACC_PUBLIC)
/* ArrayObject specific */
- SPL_ME(Array, getIterator, arginfo_array_void, ZEND_ACC_PUBLIC)
- SPL_ME(Array, exchangeArray, arginfo_array_exchangeArray, ZEND_ACC_PUBLIC)
- SPL_ME(Array, setIteratorClass, arginfo_array_setIteratorClass, ZEND_ACC_PUBLIC)
- SPL_ME(Array, getIteratorClass, arginfo_array_void, ZEND_ACC_PUBLIC)
+ SPL_ME(Array, getIterator, arginfo_class_ArrayObject_getIterator, ZEND_ACC_PUBLIC)
+ SPL_ME(Array, exchangeArray, arginfo_class_ArrayObject_exchangeArray, ZEND_ACC_PUBLIC)
+ SPL_ME(Array, setIteratorClass, arginfo_class_ArrayObject_setIteratorClass, ZEND_ACC_PUBLIC)
+ SPL_ME(Array, getIteratorClass, arginfo_class_ArrayObject_getIteratorClass, ZEND_ACC_PUBLIC)
PHP_FE_END
};
static const zend_function_entry spl_funcs_ArrayIterator[] = {
- SPL_ME(ArrayIterator, __construct, arginfo_array_iterator___construct, ZEND_ACC_PUBLIC)
- SPL_ME(Array, offsetExists, arginfo_array_offsetGet, ZEND_ACC_PUBLIC)
- SPL_ME(Array, offsetGet, arginfo_array_offsetGet, ZEND_ACC_PUBLIC)
- SPL_ME(Array, offsetSet, arginfo_array_offsetSet, ZEND_ACC_PUBLIC)
- SPL_ME(Array, offsetUnset, arginfo_array_offsetGet, ZEND_ACC_PUBLIC)
- SPL_ME(Array, append, arginfo_array_append, ZEND_ACC_PUBLIC)
- SPL_ME(Array, getArrayCopy, arginfo_array_void, ZEND_ACC_PUBLIC)
- SPL_ME(Array, count, arginfo_array_void, ZEND_ACC_PUBLIC)
- SPL_ME(Array, getFlags, arginfo_array_void, ZEND_ACC_PUBLIC)
- SPL_ME(Array, setFlags, arginfo_array_setFlags, ZEND_ACC_PUBLIC)
- SPL_ME(Array, asort, arginfo_array_void, ZEND_ACC_PUBLIC)
- SPL_ME(Array, ksort, arginfo_array_void, ZEND_ACC_PUBLIC)
- SPL_ME(Array, uasort, arginfo_array_uXsort, ZEND_ACC_PUBLIC)
- SPL_ME(Array, uksort, arginfo_array_uXsort, ZEND_ACC_PUBLIC)
- SPL_ME(Array, natsort, arginfo_array_void, ZEND_ACC_PUBLIC)
- SPL_ME(Array, natcasesort, arginfo_array_void, ZEND_ACC_PUBLIC)
- SPL_ME(Array, unserialize, arginfo_array_unserialize, ZEND_ACC_PUBLIC)
- SPL_ME(Array, serialize, arginfo_array_void, ZEND_ACC_PUBLIC)
- SPL_ME(Array, __unserialize, arginfo_array_unserialize, ZEND_ACC_PUBLIC)
- SPL_ME(Array, __serialize, arginfo_array_void, ZEND_ACC_PUBLIC)
+ SPL_ME(ArrayIterator, __construct, arginfo_class_ArrayIterator___construct, ZEND_ACC_PUBLIC)
+ SPL_ME(Array, offsetExists, arginfo_class_ArrayIterator_offsetExists, ZEND_ACC_PUBLIC)
+ SPL_ME(Array, offsetGet, arginfo_class_ArrayIterator_offsetGet, ZEND_ACC_PUBLIC)
+ SPL_ME(Array, offsetSet, arginfo_class_ArrayIterator_offsetSet, ZEND_ACC_PUBLIC)
+ SPL_ME(Array, offsetUnset, arginfo_class_ArrayIterator_offsetUnset, ZEND_ACC_PUBLIC)
+ SPL_ME(Array, append, arginfo_class_ArrayIterator_append, ZEND_ACC_PUBLIC)
+ SPL_ME(Array, getArrayCopy, arginfo_class_ArrayIterator_getArrayCopy, ZEND_ACC_PUBLIC)
+ SPL_ME(Array, count, arginfo_class_ArrayIterator_count, ZEND_ACC_PUBLIC)
+ SPL_ME(Array, getFlags, arginfo_class_ArrayIterator_getFlags, ZEND_ACC_PUBLIC)
+ SPL_ME(Array, setFlags, arginfo_class_ArrayIterator_setFlags, ZEND_ACC_PUBLIC)
+ SPL_ME(Array, asort, arginfo_class_ArrayIterator_asort, ZEND_ACC_PUBLIC)
+ SPL_ME(Array, ksort, arginfo_class_ArrayIterator_ksort, ZEND_ACC_PUBLIC)
+ SPL_ME(Array, uasort, arginfo_class_ArrayIterator_uasort, ZEND_ACC_PUBLIC)
+ SPL_ME(Array, uksort, arginfo_class_ArrayIterator_uksort, ZEND_ACC_PUBLIC)
+ SPL_ME(Array, natsort, arginfo_class_ArrayIterator_natsort, ZEND_ACC_PUBLIC)
+ SPL_ME(Array, natcasesort, arginfo_class_ArrayIterator_natcasesort, ZEND_ACC_PUBLIC)
+ SPL_ME(Array, unserialize, arginfo_class_ArrayIterator_unserialize, ZEND_ACC_PUBLIC)
+ SPL_ME(Array, serialize, arginfo_class_ArrayIterator_serialize, ZEND_ACC_PUBLIC)
+ SPL_ME(Array, __unserialize, arginfo_class_ArrayIterator___unserialize, ZEND_ACC_PUBLIC)
+ SPL_ME(Array, __serialize, arginfo_class_ArrayIterator___serialize, ZEND_ACC_PUBLIC)
/* ArrayIterator specific */
- SPL_ME(Array, rewind, arginfo_array_void, ZEND_ACC_PUBLIC)
- SPL_ME(Array, current, arginfo_array_void, ZEND_ACC_PUBLIC)
- SPL_ME(Array, key, arginfo_array_void, ZEND_ACC_PUBLIC)
- SPL_ME(Array, next, arginfo_array_void, ZEND_ACC_PUBLIC)
- SPL_ME(Array, valid, arginfo_array_void, ZEND_ACC_PUBLIC)
- SPL_ME(Array, seek, arginfo_array_seek, ZEND_ACC_PUBLIC)
+ SPL_ME(Array, rewind, arginfo_class_ArrayIterator_rewind, ZEND_ACC_PUBLIC)
+ SPL_ME(Array, current, arginfo_class_ArrayIterator_current, ZEND_ACC_PUBLIC)
+ SPL_ME(Array, key, arginfo_class_ArrayIterator_key, ZEND_ACC_PUBLIC)
+ SPL_ME(Array, next, arginfo_class_ArrayIterator_next, ZEND_ACC_PUBLIC)
+ SPL_ME(Array, valid, arginfo_class_ArrayIterator_valid, ZEND_ACC_PUBLIC)
+ SPL_ME(Array, seek, arginfo_class_ArrayIterator_seek, ZEND_ACC_PUBLIC)
PHP_FE_END
};
static const zend_function_entry spl_funcs_RecursiveArrayIterator[] = {
- SPL_ME(Array, hasChildren, arginfo_array_void, ZEND_ACC_PUBLIC)
- SPL_ME(Array, getChildren, arginfo_array_void, ZEND_ACC_PUBLIC)
+ SPL_ME(Array, hasChildren, arginfo_class_RecursiveArrayIterator_hasChildren, ZEND_ACC_PUBLIC)
+ SPL_ME(Array, getChildren, arginfo_class_RecursiveArrayIterator_getChildren, ZEND_ACC_PUBLIC)
PHP_FE_END
};
/* }}} */
diff --git a/ext/spl/spl_array.stub.php b/ext/spl/spl_array.stub.php
new file mode 100755
index 0000000000..aa9996c193
--- /dev/null
+++ b/ext/spl/spl_array.stub.php
@@ -0,0 +1,225 @@
+<?php
+
+class ArrayObject implements IteratorAggregate, ArrayAccess, Serializable, Countable
+{
+ /** @param array|object $input */
+ public function __construct($input = [], int $flags = 0, string $iterator_class = ArrayIterator::class) {}
+
+ /**
+ * @param mixed $index
+ * @return bool
+ */
+ public function offsetExists($index) {}
+
+ /**
+ * @param mixed $index
+ * @return mixed
+ */
+ public function offsetGet($index) {}
+
+ /**
+ * @param mixed $index
+ * @param mixed $value
+ * @return void
+ */
+ public function offsetSet($index, $value) {}
+
+ /**
+ * @param mixed $index
+ * @return void
+ */
+ public function offsetUnset($index) {}
+
+ /**
+ * @param mixed $value
+ * @return void
+ */
+ public function append($value) {}
+
+ /** @return array */
+ public function getArrayCopy() {}
+
+ /** @return int */
+ public function count() {}
+
+ /** @return int */
+ public function getFlags() {}
+
+ /** @return void */
+ public function setFlags(int $flags) {}
+
+ /**
+ * @param int $sort_flags
+ * @return bool
+ */
+ public function asort($sort_flags = SORT_REGULAR) {}
+
+ /**
+ * @param int $sort_flags
+ * @return bool
+ */
+ public function ksort($sort_flags = SORT_REGULAR) {}
+
+ /**
+ * @param callback $cmp_function
+ * @return bool
+ */
+ public function uasort($cmp_function) {}
+
+ /**
+ * @param callback $cmp_function
+ * @return bool
+ */
+ public function uksort($cmp_function) {}
+
+ /** @return bool */
+ public function natsort() {}
+
+ /** @return bool */
+ public function natcasesort() {}
+
+ /** @return void */
+ public function unserialize(string $serialized) {}
+
+ /** @return string */
+ public function serialize() {}
+
+ /** @return array */
+ public function __serialize() {}
+
+ /** @return void */
+ public function __unserialize(array $data) {}
+
+ /** @return Iterator */
+ public function getIterator() {}
+
+ /**
+ * @param array|object $input
+ * @return array|null
+ */
+ public function exchangeArray($input) {}
+
+ /** @return void */
+ public function setIteratorClass(string $iteratorClass) {}
+
+ /** @return string */
+ public function getIteratorClass() {}
+}
+
+class ArrayIterator implements SeekableIterator, ArrayAccess, Serializable, Countable
+{
+ /** @param array|object $array */
+ public function __construct($array = [], int $flags = 0) {}
+
+ /**
+ * @param mixed $index
+ * @return bool
+ */
+ public function offsetExists($index) {}
+
+ /**
+ * @param mixed $index
+ * @return mixed
+ */
+ public function offsetGet($index) {}
+
+ /**
+ * @param mixed $index
+ * @param mixed $value
+ * @return void
+ */
+ public function offsetSet($index, $value) {}
+
+ /**
+ * @param mixed $index
+ * @return void
+ */
+ public function offsetUnset($index) {}
+
+ /**
+ * @param mixed $value
+ * @return void
+ */
+ public function append($value) {}
+
+ /** @return array */
+ public function getArrayCopy() {}
+
+ /** @return int */
+ public function count() {}
+
+ /** @return int */
+ public function getFlags() {}
+
+ /** @return void */
+ public function setFlags(int $flags) {}
+
+ /**
+ * @param int $sort_flags
+ * @return bool
+ */
+ public function asort($sort_flags = SORT_REGULAR) {}
+
+ /**
+ * @param int $sort_flags
+ * @return bool
+ */
+ public function ksort($sort_flags = SORT_REGULAR) {}
+
+ /**
+ * @param callback $cmp_function
+ * @return bool
+ */
+ public function uasort($cmp_function) {}
+
+ /**
+ * @param callback $cmp_function
+ * @return bool
+ */
+ public function uksort($cmp_function) {}
+
+ /** @return bool */
+ public function natsort() {}
+
+ /** @return bool */
+ public function natcasesort() {}
+
+ /** @return void */
+ public function unserialize(string $serialized) {}
+
+ /** @return string */
+ public function serialize() {}
+
+ /** @return array */
+ public function __serialize() {}
+
+ /** @return void */
+ public function __unserialize(array $data) {}
+
+ /** @return void */
+ public function rewind() {}
+
+ /** @return mixed */
+ public function current() {}
+
+ /** @return mixed */
+ public function key() {}
+
+ /** @return void */
+ public function next() {}
+
+ /** @return bool */
+ public function valid() {}
+
+ /** @return void */
+ public function seek(int $position) {}
+}
+
+class RecursiveArrayIterator extends ArrayIterator implements RecursiveIterator
+{
+ /** @return bool */
+ public function hasChildren() {}
+
+ /** @return RecursiveArrayIterator|null */
+ public function getChildren() {}
+}
diff --git a/ext/spl/spl_array_arginfo.h b/ext/spl/spl_array_arginfo.h
new file mode 100644
index 0000000000..57cc430ca7
--- /dev/null
+++ b/ext/spl/spl_array_arginfo.h
@@ -0,0 +1,136 @@
+/* This is a generated file, edit the .stub.php file instead. */
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_class_ArrayObject___construct, 0, 0, 0)
+ ZEND_ARG_INFO(0, input)
+ ZEND_ARG_TYPE_INFO(0, flags, IS_LONG, 0)
+ ZEND_ARG_TYPE_INFO(0, iterator_class, IS_STRING, 0)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_class_ArrayObject_offsetExists, 0, 0, 1)
+ ZEND_ARG_INFO(0, index)
+ZEND_END_ARG_INFO()
+
+#define arginfo_class_ArrayObject_offsetGet arginfo_class_ArrayObject_offsetExists
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_class_ArrayObject_offsetSet, 0, 0, 2)
+ ZEND_ARG_INFO(0, index)
+ ZEND_ARG_INFO(0, value)
+ZEND_END_ARG_INFO()
+
+#define arginfo_class_ArrayObject_offsetUnset arginfo_class_ArrayObject_offsetExists
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_class_ArrayObject_append, 0, 0, 1)
+ ZEND_ARG_INFO(0, value)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_class_ArrayObject_getArrayCopy, 0, 0, 0)
+ZEND_END_ARG_INFO()
+
+#define arginfo_class_ArrayObject_count arginfo_class_ArrayObject_getArrayCopy
+
+#define arginfo_class_ArrayObject_getFlags arginfo_class_ArrayObject_getArrayCopy
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_class_ArrayObject_setFlags, 0, 0, 1)
+ ZEND_ARG_TYPE_INFO(0, flags, IS_LONG, 0)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_class_ArrayObject_asort, 0, 0, 0)
+ ZEND_ARG_INFO(0, sort_flags)
+ZEND_END_ARG_INFO()
+
+#define arginfo_class_ArrayObject_ksort arginfo_class_ArrayObject_asort
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_class_ArrayObject_uasort, 0, 0, 1)
+ ZEND_ARG_INFO(0, cmp_function)
+ZEND_END_ARG_INFO()
+
+#define arginfo_class_ArrayObject_uksort arginfo_class_ArrayObject_uasort
+
+#define arginfo_class_ArrayObject_natsort arginfo_class_ArrayObject_getArrayCopy
+
+#define arginfo_class_ArrayObject_natcasesort arginfo_class_ArrayObject_getArrayCopy
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_class_ArrayObject_unserialize, 0, 0, 1)
+ ZEND_ARG_TYPE_INFO(0, serialized, IS_STRING, 0)
+ZEND_END_ARG_INFO()
+
+#define arginfo_class_ArrayObject_serialize arginfo_class_ArrayObject_getArrayCopy
+
+#define arginfo_class_ArrayObject___serialize arginfo_class_ArrayObject_getArrayCopy
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_class_ArrayObject___unserialize, 0, 0, 1)
+ ZEND_ARG_TYPE_INFO(0, data, IS_ARRAY, 0)
+ZEND_END_ARG_INFO()
+
+#define arginfo_class_ArrayObject_getIterator arginfo_class_ArrayObject_getArrayCopy
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_class_ArrayObject_exchangeArray, 0, 0, 1)
+ ZEND_ARG_INFO(0, input)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_class_ArrayObject_setIteratorClass, 0, 0, 1)
+ ZEND_ARG_TYPE_INFO(0, iteratorClass, IS_STRING, 0)
+ZEND_END_ARG_INFO()
+
+#define arginfo_class_ArrayObject_getIteratorClass arginfo_class_ArrayObject_getArrayCopy
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_class_ArrayIterator___construct, 0, 0, 0)
+ ZEND_ARG_INFO(0, array)
+ ZEND_ARG_TYPE_INFO(0, flags, IS_LONG, 0)
+ZEND_END_ARG_INFO()
+
+#define arginfo_class_ArrayIterator_offsetExists arginfo_class_ArrayObject_offsetExists
+
+#define arginfo_class_ArrayIterator_offsetGet arginfo_class_ArrayObject_offsetExists
+
+#define arginfo_class_ArrayIterator_offsetSet arginfo_class_ArrayObject_offsetSet
+
+#define arginfo_class_ArrayIterator_offsetUnset arginfo_class_ArrayObject_offsetExists
+
+#define arginfo_class_ArrayIterator_append arginfo_class_ArrayObject_append
+
+#define arginfo_class_ArrayIterator_getArrayCopy arginfo_class_ArrayObject_getArrayCopy
+
+#define arginfo_class_ArrayIterator_count arginfo_class_ArrayObject_getArrayCopy
+
+#define arginfo_class_ArrayIterator_getFlags arginfo_class_ArrayObject_getArrayCopy
+
+#define arginfo_class_ArrayIterator_setFlags arginfo_class_ArrayObject_setFlags
+
+#define arginfo_class_ArrayIterator_asort arginfo_class_ArrayObject_asort
+
+#define arginfo_class_ArrayIterator_ksort arginfo_class_ArrayObject_asort
+
+#define arginfo_class_ArrayIterator_uasort arginfo_class_ArrayObject_uasort
+
+#define arginfo_class_ArrayIterator_uksort arginfo_class_ArrayObject_uasort
+
+#define arginfo_class_ArrayIterator_natsort arginfo_class_ArrayObject_getArrayCopy
+
+#define arginfo_class_ArrayIterator_natcasesort arginfo_class_ArrayObject_getArrayCopy
+
+#define arginfo_class_ArrayIterator_unserialize arginfo_class_ArrayObject_unserialize
+
+#define arginfo_class_ArrayIterator_serialize arginfo_class_ArrayObject_getArrayCopy
+
+#define arginfo_class_ArrayIterator___serialize arginfo_class_ArrayObject_getArrayCopy
+
+#define arginfo_class_ArrayIterator___unserialize arginfo_class_ArrayObject___unserialize
+
+#define arginfo_class_ArrayIterator_rewind arginfo_class_ArrayObject_getArrayCopy
+
+#define arginfo_class_ArrayIterator_current arginfo_class_ArrayObject_getArrayCopy
+
+#define arginfo_class_ArrayIterator_key arginfo_class_ArrayObject_getArrayCopy
+
+#define arginfo_class_ArrayIterator_next arginfo_class_ArrayObject_getArrayCopy
+
+#define arginfo_class_ArrayIterator_valid arginfo_class_ArrayObject_getArrayCopy
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_class_ArrayIterator_seek, 0, 0, 1)
+ ZEND_ARG_TYPE_INFO(0, position, IS_LONG, 0)
+ZEND_END_ARG_INFO()
+
+#define arginfo_class_RecursiveArrayIterator_hasChildren arginfo_class_ArrayObject_getArrayCopy
+
+#define arginfo_class_RecursiveArrayIterator_getChildren arginfo_class_ArrayObject_getArrayCopy
diff --git a/ext/spl/spl_fixedarray.c b/ext/spl/spl_fixedarray.c
index b423774d8e..099398de6a 100644
--- a/ext/spl/spl_fixedarray.c
+++ b/ext/spl/spl_fixedarray.c
@@ -25,6 +25,7 @@
#include "zend_exceptions.h"
#include "php_spl.h"
+#include "spl_fixedarray_arginfo.h"
#include "spl_functions.h"
#include "spl_engine.h"
#include "spl_fixedarray.h"
@@ -1000,48 +1001,23 @@ zend_object_iterator *spl_fixedarray_get_iterator(zend_class_entry *ce, zval *ob
}
/* }}} */
-ZEND_BEGIN_ARG_INFO_EX(arginfo_splfixedarray_construct, 0, 0, 0)
- ZEND_ARG_INFO(0, size)
-ZEND_END_ARG_INFO()
-
-ZEND_BEGIN_ARG_INFO_EX(arginfo_fixedarray_offsetGet, 0, 0, 1)
- ZEND_ARG_INFO(0, index)
-ZEND_END_ARG_INFO()
-
-ZEND_BEGIN_ARG_INFO_EX(arginfo_fixedarray_offsetSet, 0, 0, 2)
- ZEND_ARG_INFO(0, index)
- ZEND_ARG_INFO(0, newval)
-ZEND_END_ARG_INFO()
-
-ZEND_BEGIN_ARG_INFO(arginfo_fixedarray_setSize, 0)
- ZEND_ARG_INFO(0, value)
-ZEND_END_ARG_INFO()
-
-ZEND_BEGIN_ARG_INFO_EX(arginfo_fixedarray_fromArray, 0, 0, 1)
- ZEND_ARG_INFO(0, array)
- ZEND_ARG_INFO(0, save_indexes)
-ZEND_END_ARG_INFO()
-
-ZEND_BEGIN_ARG_INFO(arginfo_splfixedarray_void, 0)
-ZEND_END_ARG_INFO()
-
static const zend_function_entry spl_funcs_SplFixedArray[] = { /* {{{ */
- SPL_ME(SplFixedArray, __construct, arginfo_splfixedarray_construct,ZEND_ACC_PUBLIC)
- SPL_ME(SplFixedArray, __wakeup, arginfo_splfixedarray_void, ZEND_ACC_PUBLIC)
- SPL_ME(SplFixedArray, count, arginfo_splfixedarray_void, ZEND_ACC_PUBLIC)
- SPL_ME(SplFixedArray, toArray, arginfo_splfixedarray_void, ZEND_ACC_PUBLIC)
- SPL_ME(SplFixedArray, fromArray, arginfo_fixedarray_fromArray, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
- SPL_ME(SplFixedArray, getSize, arginfo_splfixedarray_void, ZEND_ACC_PUBLIC)
- SPL_ME(SplFixedArray, setSize, arginfo_fixedarray_setSize, ZEND_ACC_PUBLIC)
- SPL_ME(SplFixedArray, offsetExists, arginfo_fixedarray_offsetGet, ZEND_ACC_PUBLIC)
- SPL_ME(SplFixedArray, offsetGet, arginfo_fixedarray_offsetGet, ZEND_ACC_PUBLIC)
- SPL_ME(SplFixedArray, offsetSet, arginfo_fixedarray_offsetSet, ZEND_ACC_PUBLIC)
- SPL_ME(SplFixedArray, offsetUnset, arginfo_fixedarray_offsetGet, ZEND_ACC_PUBLIC)
- SPL_ME(SplFixedArray, rewind, arginfo_splfixedarray_void, ZEND_ACC_PUBLIC)
- SPL_ME(SplFixedArray, current, arginfo_splfixedarray_void, ZEND_ACC_PUBLIC)
- SPL_ME(SplFixedArray, key, arginfo_splfixedarray_void, ZEND_ACC_PUBLIC)
- SPL_ME(SplFixedArray, next, arginfo_splfixedarray_void, ZEND_ACC_PUBLIC)
- SPL_ME(SplFixedArray, valid, arginfo_splfixedarray_void, ZEND_ACC_PUBLIC)
+ SPL_ME(SplFixedArray, __construct, arginfo_class_SplFixedArray___construct, ZEND_ACC_PUBLIC)
+ SPL_ME(SplFixedArray, __wakeup, arginfo_class_SplFixedArray___wakeup, ZEND_ACC_PUBLIC)
+ SPL_ME(SplFixedArray, count, arginfo_class_SplFixedArray_count, ZEND_ACC_PUBLIC)
+ SPL_ME(SplFixedArray, toArray, arginfo_class_SplFixedArray_toArray, ZEND_ACC_PUBLIC)
+ SPL_ME(SplFixedArray, fromArray, arginfo_class_SplFixedArray_fromArray, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
+ SPL_ME(SplFixedArray, getSize, arginfo_class_SplFixedArray_getSize, ZEND_ACC_PUBLIC)
+ SPL_ME(SplFixedArray, setSize, arginfo_class_SplFixedArray_setSize, ZEND_ACC_PUBLIC)
+ SPL_ME(SplFixedArray, offsetExists, arginfo_class_SplFixedArray_offsetExists, ZEND_ACC_PUBLIC)
+ SPL_ME(SplFixedArray, offsetGet, arginfo_class_SplFixedArray_offsetGet, ZEND_ACC_PUBLIC)
+ SPL_ME(SplFixedArray, offsetSet, arginfo_class_SplFixedArray_offsetSet, ZEND_ACC_PUBLIC)
+ SPL_ME(SplFixedArray, offsetUnset, arginfo_class_SplFixedArray_offsetUnset, ZEND_ACC_PUBLIC)
+ SPL_ME(SplFixedArray, rewind, arginfo_class_SplFixedArray_rewind, ZEND_ACC_PUBLIC)
+ SPL_ME(SplFixedArray, current, arginfo_class_SplFixedArray_current, ZEND_ACC_PUBLIC)
+ SPL_ME(SplFixedArray, key, arginfo_class_SplFixedArray_key, ZEND_ACC_PUBLIC)
+ SPL_ME(SplFixedArray, next, arginfo_class_SplFixedArray_next, ZEND_ACC_PUBLIC)
+ SPL_ME(SplFixedArray, valid, arginfo_class_SplFixedArray_valid, ZEND_ACC_PUBLIC)
PHP_FE_END
};
/* }}} */
diff --git a/ext/spl/spl_fixedarray.stub.php b/ext/spl/spl_fixedarray.stub.php
new file mode 100755
index 0000000000..4785f8d6e1
--- /dev/null
+++ b/ext/spl/spl_fixedarray.stub.php
@@ -0,0 +1,64 @@
+<?php
+
+class SplFixedArray implements Iterator, ArrayAccess, Countable
+{
+ public function __construct(int $size = 0) {}
+
+ /** @return void */
+ public function __wakeup() {}
+
+ /** @return int */
+ public function count() {}
+
+ /** @return array */
+ public function toArray() {}
+
+ /** @return SplFixedArray */
+ public static function fromArray(array $array, bool $save_indexes = true) {}
+
+ /** @return int */
+ public function getSize() {}
+
+ /** @return bool */
+ public function setSize(int $size) {}
+
+ /**
+ * @param mixed $index
+ * @return bool
+ */
+ public function offsetExists($index) {}
+
+ /**
+ * @param mixed $index
+ * @return mixed
+ */
+ public function offsetGet($index) {}
+
+ /**
+ * @param mixed $index
+ * @param mixed $value
+ * @return void
+ */
+ public function offsetSet($index, $value) {}
+
+ /**
+ * @param int $index
+ * @return void
+ */
+ public function offsetUnset($index) {}
+
+ /** @return void */
+ public function rewind() {}
+
+ /** @return mixed */
+ public function current() {}
+
+ /** @return int */
+ public function key() {}
+
+ /** @return void */
+ public function next() {}
+
+ /** @return bool */
+ public function valid() {}
+}
diff --git a/ext/spl/spl_fixedarray_arginfo.h b/ext/spl/spl_fixedarray_arginfo.h
new file mode 100644
index 0000000000..d25d2313bc
--- /dev/null
+++ b/ext/spl/spl_fixedarray_arginfo.h
@@ -0,0 +1,46 @@
+/* This is a generated file, edit the .stub.php file instead. */
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_class_SplFixedArray___construct, 0, 0, 0)
+ ZEND_ARG_TYPE_INFO(0, size, IS_LONG, 0)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_class_SplFixedArray___wakeup, 0, 0, 0)
+ZEND_END_ARG_INFO()
+
+#define arginfo_class_SplFixedArray_count arginfo_class_SplFixedArray___wakeup
+
+#define arginfo_class_SplFixedArray_toArray arginfo_class_SplFixedArray___wakeup
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_class_SplFixedArray_fromArray, 0, 0, 1)
+ ZEND_ARG_TYPE_INFO(0, array, IS_ARRAY, 0)
+ ZEND_ARG_TYPE_INFO(0, save_indexes, _IS_BOOL, 0)
+ZEND_END_ARG_INFO()
+
+#define arginfo_class_SplFixedArray_getSize arginfo_class_SplFixedArray___wakeup
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_class_SplFixedArray_setSize, 0, 0, 1)
+ ZEND_ARG_TYPE_INFO(0, size, IS_LONG, 0)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_class_SplFixedArray_offsetExists, 0, 0, 1)
+ ZEND_ARG_INFO(0, index)
+ZEND_END_ARG_INFO()
+
+#define arginfo_class_SplFixedArray_offsetGet arginfo_class_SplFixedArray_offsetExists
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_class_SplFixedArray_offsetSet, 0, 0, 2)
+ ZEND_ARG_INFO(0, index)
+ ZEND_ARG_INFO(0, value)
+ZEND_END_ARG_INFO()
+
+#define arginfo_class_SplFixedArray_offsetUnset arginfo_class_SplFixedArray_offsetExists
+
+#define arginfo_class_SplFixedArray_rewind arginfo_class_SplFixedArray___wakeup
+
+#define arginfo_class_SplFixedArray_current arginfo_class_SplFixedArray___wakeup
+
+#define arginfo_class_SplFixedArray_key arginfo_class_SplFixedArray___wakeup
+
+#define arginfo_class_SplFixedArray_next arginfo_class_SplFixedArray___wakeup
+
+#define arginfo_class_SplFixedArray_valid arginfo_class_SplFixedArray___wakeup
diff --git a/ext/spl/tests/bug71412.phpt b/ext/spl/tests/bug71412.phpt
index 7857f27ace..ac4b0e701a 100644
--- a/ext/spl/tests/bug71412.phpt
+++ b/ext/spl/tests/bug71412.phpt
@@ -9,6 +9,6 @@ Method [ <internal:SPL, ctor> public method __construct ] {
- Parameters [2] {
Parameter #0 [ <optional> $array ]
- Parameter #1 [ <optional> $flags ]
+ Parameter #1 [ <optional> int $flags ]
}
}