]> granicus.if.org Git - php/commitdiff
Add Zend class/interface arginfo stubs
authorChristoph M. Becker <cmbecker69@gmx.de>
Tue, 15 Oct 2019 12:30:23 +0000 (14:30 +0200)
committerChristoph M. Becker <cmbecker69@gmx.de>
Tue, 15 Oct 2019 14:21:00 +0000 (16:21 +0200)
We also change `Generator::throw()` to expect a `Throwable` in the
first place, and we now throw a TypeError instead of returning `false`
from `Exception::getTraceAsString()`.

15 files changed:
Zend/tests/generators/throw_not_an_exception.phpt
Zend/zend_closures.c
Zend/zend_closures.stub.php [new file with mode: 0644]
Zend/zend_closures_arginfo.h [new file with mode: 0644]
Zend/zend_exceptions.c
Zend/zend_exceptions.stub.php [new file with mode: 0644]
Zend/zend_exceptions_arginfo.h [new file with mode: 0644]
Zend/zend_generators.c
Zend/zend_generators.stub.php [new file with mode: 0644]
Zend/zend_generators_arginfo.h [new file with mode: 0644]
Zend/zend_interfaces.c
Zend/zend_interfaces.stub.php [new file with mode: 0644]
Zend/zend_interfaces_arginfo.h [new file with mode: 0644]
ext/standard/tests/serialize/bug69152.phpt
sapi/cli/tests/005.phpt

index 920d8eb8473b2f1202d2d966034da426193121d0..abf9a3c894099dc891e47232519bc1f11f6d75d8 100644 (file)
@@ -12,9 +12,8 @@ $gen->throw(new stdClass);
 
 ?>
 --EXPECTF--
-Fatal error: Uncaught Error: Cannot throw objects that do not implement Throwable in %s:%d
+Fatal error: Uncaught TypeError: Generator::throw() expects parameter 1 to be Throwable, object given in %s:%d
 Stack trace:
-#0 [internal function]: gen()
-#1 %s(%d): Generator->throw(Object(stdClass))
-#2 {main}
+#0 %s(%d): Generator->throw(Object(stdClass))
+#1 {main}
   thrown in %s on line %d
index f5d692ad32ecbcc251b32c7df9fe6a804b6f0d3d..26184d3d3598570fc7b5821ab6e8476cd4340538 100644 (file)
@@ -26,6 +26,7 @@
 #include "zend_objects.h"
 #include "zend_objects_API.h"
 #include "zend_globals.h"
+#include "zend_closures_arginfo.h"
 
 #define ZEND_CLOSURE_PRINT_NAME "Closure object"
 
@@ -591,32 +592,12 @@ ZEND_COLD ZEND_METHOD(Closure, __construct)
 }
 /* }}} */
 
-ZEND_BEGIN_ARG_INFO_EX(arginfo_closure_bindto, 0, 0, 1)
-       ZEND_ARG_INFO(0, newthis)
-       ZEND_ARG_INFO(0, newscope)
-ZEND_END_ARG_INFO()
-
-ZEND_BEGIN_ARG_INFO_EX(arginfo_closure_bind, 0, 0, 2)
-       ZEND_ARG_INFO(0, closure)
-       ZEND_ARG_INFO(0, newthis)
-       ZEND_ARG_INFO(0, newscope)
-ZEND_END_ARG_INFO()
-
-ZEND_BEGIN_ARG_INFO_EX(arginfo_closure_call, 0, 0, 1)
-       ZEND_ARG_INFO(0, newthis)
-       ZEND_ARG_VARIADIC_INFO(0, parameters)
-ZEND_END_ARG_INFO()
-
-ZEND_BEGIN_ARG_INFO_EX(arginfo_closure_fromcallable, 0, 0, 1)
-       ZEND_ARG_INFO(0, callable)
-ZEND_END_ARG_INFO()
-
 static const zend_function_entry closure_functions[] = {
-       ZEND_ME(Closure, __construct, NULL, ZEND_ACC_PRIVATE)
-       ZEND_ME(Closure, bind, arginfo_closure_bind, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
-       ZEND_MALIAS(Closure, bindTo, bind, arginfo_closure_bindto, ZEND_ACC_PUBLIC)
-       ZEND_ME(Closure, call, arginfo_closure_call, ZEND_ACC_PUBLIC)
-       ZEND_ME(Closure, fromCallable, arginfo_closure_fromcallable, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
+       ZEND_ME(Closure, __construct, arginfo_class_Closure___construct, ZEND_ACC_PRIVATE)
+       ZEND_ME(Closure, bind, arginfo_class_Closure_bind, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
+       ZEND_MALIAS(Closure, bindTo, bind, arginfo_class_Closure_bindTo, ZEND_ACC_PUBLIC)
+       ZEND_ME(Closure, call, arginfo_class_Closure_call, ZEND_ACC_PUBLIC)
+       ZEND_ME(Closure, fromCallable, arginfo_class_Closure_fromCallable, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
        ZEND_FE_END
 };
 
diff --git a/Zend/zend_closures.stub.php b/Zend/zend_closures.stub.php
new file mode 100644 (file)
index 0000000..cc859b2
--- /dev/null
@@ -0,0 +1,17 @@
+<?php
+
+Class Closure
+{
+    private function __construct() {}
+
+    /** @return ?Closure */
+    static function bind(Closure $closure, ?object $newthis, $newscope = UNKNOWN) {}
+
+    /** @return ?Closure */
+    function bindTo(?object $newthis, $newscope = UNKNOWN) {}
+
+    function call(object $newthis, ...$parameters) {}
+
+    /** @return Closure */
+    function fromCallable(callable $callable) {}
+}
diff --git a/Zend/zend_closures_arginfo.h b/Zend/zend_closures_arginfo.h
new file mode 100644 (file)
index 0000000..91d019d
--- /dev/null
@@ -0,0 +1,24 @@
+/* This is a generated file, edit the .stub.php file instead. */
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Closure___construct, 0, 0, 0)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Closure_bind, 0, 0, 2)
+       ZEND_ARG_OBJ_INFO(0, closure, Closure, 0)
+       ZEND_ARG_TYPE_INFO(0, newthis, IS_OBJECT, 1)
+       ZEND_ARG_INFO(0, newscope)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Closure_bindTo, 0, 0, 1)
+       ZEND_ARG_TYPE_INFO(0, newthis, IS_OBJECT, 1)
+       ZEND_ARG_INFO(0, newscope)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Closure_call, 0, 0, 1)
+       ZEND_ARG_TYPE_INFO(0, newthis, IS_OBJECT, 0)
+       ZEND_ARG_VARIADIC_INFO(0, parameters)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Closure_fromCallable, 0, 0, 1)
+       ZEND_ARG_INFO(0, callable)
+ZEND_END_ARG_INFO()
index 6dfb374c2cf83d63ba5ccf83bbe211b4f7f94e1d..eb248b1ff2aff4282c980cf303a4d725c7b9ce1f 100644 (file)
@@ -27,6 +27,7 @@
 #include "zend_vm.h"
 #include "zend_dtrace.h"
 #include "zend_smart_str.h"
+#include "zend_exceptions_arginfo.h"
 
 ZEND_API zend_class_entry *zend_ce_throwable;
 ZEND_API zend_class_entry *zend_ce_exception;
@@ -631,7 +632,8 @@ ZEND_METHOD(exception, getTraceAsString)
 
        trace = zend_read_property_ex(base_ce, object, ZSTR_KNOWN(ZEND_STR_TRACE), 1, &rv);
        if (Z_TYPE_P(trace) != IS_ARRAY) {
-               RETURN_FALSE;
+               zend_type_error("trace is not an array");
+               return;
        }
        ZEND_HASH_FOREACH_NUM_KEY_VAL(Z_ARRVAL_P(trace), index, frame) {
                if (Z_TYPE_P(frame) != IS_ARRAY) {
@@ -759,14 +761,14 @@ ZEND_METHOD(exception, __toString)
 
 /** {{{ Throwable method definition */
 static const zend_function_entry zend_funcs_throwable[] = {
-       ZEND_ABSTRACT_ME(throwable, getMessage,       NULL)
-       ZEND_ABSTRACT_ME(throwable, getCode,          NULL)
-       ZEND_ABSTRACT_ME(throwable, getFile,          NULL)
-       ZEND_ABSTRACT_ME(throwable, getLine,          NULL)
-       ZEND_ABSTRACT_ME(throwable, getTrace,         NULL)
-       ZEND_ABSTRACT_ME(throwable, getPrevious,      NULL)
-       ZEND_ABSTRACT_ME(throwable, getTraceAsString, NULL)
-       ZEND_ABSTRACT_ME(throwable, __toString,       NULL)
+       ZEND_ABSTRACT_ME(throwable, getMessage,       arginfo_class_Throwable_getMessage)
+       ZEND_ABSTRACT_ME(throwable, getCode,          arginfo_class_Throwable_getCode)
+       ZEND_ABSTRACT_ME(throwable, getFile,          arginfo_class_Throwable_getFile)
+       ZEND_ABSTRACT_ME(throwable, getLine,          arginfo_class_Throwable_getLine)
+       ZEND_ABSTRACT_ME(throwable, getTrace,         arginfo_class_Throwable_getTrace)
+       ZEND_ABSTRACT_ME(throwable, getPrevious,      arginfo_class_Throwable_getPrevious)
+       ZEND_ABSTRACT_ME(throwable, getTraceAsString, arginfo_class_Throwable_getTraceAsString)
+       ZEND_ABSTRACT_ME(throwable, __toString,       arginfo_class_Throwable___toString)
        ZEND_FE_END
 };
 /* }}} */
@@ -781,39 +783,24 @@ static const zend_function_entry zend_funcs_throwable[] = {
  * And never try to change the state of exceptions and never implement anything
  * that gives the user anything to accomplish this.
  */
-ZEND_BEGIN_ARG_INFO_EX(arginfo_exception___construct, 0, 0, 0)
-       ZEND_ARG_INFO(0, message)
-       ZEND_ARG_INFO(0, code)
-       ZEND_ARG_INFO(0, previous)
-ZEND_END_ARG_INFO()
-
 static const zend_function_entry default_exception_functions[] = {
-       ZEND_ME(exception, __clone, NULL, ZEND_ACC_PRIVATE|ZEND_ACC_FINAL)
-       ZEND_ME(exception, __construct, arginfo_exception___construct, ZEND_ACC_PUBLIC)
-       ZEND_ME(exception, __wakeup, NULL, ZEND_ACC_PUBLIC)
-       ZEND_ME(exception, getMessage, NULL, ZEND_ACC_PUBLIC|ZEND_ACC_FINAL)
-       ZEND_ME(exception, getCode, NULL, ZEND_ACC_PUBLIC|ZEND_ACC_FINAL)
-       ZEND_ME(exception, getFile, NULL, ZEND_ACC_PUBLIC|ZEND_ACC_FINAL)
-       ZEND_ME(exception, getLine, NULL, ZEND_ACC_PUBLIC|ZEND_ACC_FINAL)
-       ZEND_ME(exception, getTrace, NULL, ZEND_ACC_PUBLIC|ZEND_ACC_FINAL)
-       ZEND_ME(exception, getPrevious, NULL, ZEND_ACC_PUBLIC|ZEND_ACC_FINAL)
-       ZEND_ME(exception, getTraceAsString, NULL, ZEND_ACC_PUBLIC|ZEND_ACC_FINAL)
-       ZEND_ME(exception, __toString, NULL, 0)
+       ZEND_ME(exception, __clone, arginfo_class_Exception___clone, ZEND_ACC_PRIVATE|ZEND_ACC_FINAL)
+       ZEND_ME(exception, __construct, arginfo_class_Exception___construct, ZEND_ACC_PUBLIC)
+       ZEND_ME(exception, __wakeup, arginfo_class_Exception___wakeup, ZEND_ACC_PUBLIC)
+       ZEND_ME(exception, getMessage, arginfo_class_Exception_getMessage, ZEND_ACC_PUBLIC|ZEND_ACC_FINAL)
+       ZEND_ME(exception, getCode, arginfo_class_Exception_getCode, ZEND_ACC_PUBLIC|ZEND_ACC_FINAL)
+       ZEND_ME(exception, getFile, arginfo_class_Exception_getFile, ZEND_ACC_PUBLIC|ZEND_ACC_FINAL)
+       ZEND_ME(exception, getLine, arginfo_class_Exception_getLine, ZEND_ACC_PUBLIC|ZEND_ACC_FINAL)
+       ZEND_ME(exception, getTrace, arginfo_class_Exception_getTrace, ZEND_ACC_PUBLIC|ZEND_ACC_FINAL)
+       ZEND_ME(exception, getPrevious, arginfo_class_Exception_getPrevious, ZEND_ACC_PUBLIC|ZEND_ACC_FINAL)
+       ZEND_ME(exception, getTraceAsString, arginfo_class_Exception_getTraceAsString, ZEND_ACC_PUBLIC|ZEND_ACC_FINAL)
+       ZEND_ME(exception, __toString, arginfo_class_Exception___toString, 0)
        ZEND_FE_END
 };
 
-ZEND_BEGIN_ARG_INFO_EX(arginfo_error_exception___construct, 0, 0, 0)
-       ZEND_ARG_INFO(0, message)
-       ZEND_ARG_INFO(0, code)
-       ZEND_ARG_INFO(0, severity)
-       ZEND_ARG_INFO(0, filename)
-       ZEND_ARG_INFO(0, lineno)
-       ZEND_ARG_INFO(0, previous)
-ZEND_END_ARG_INFO()
-
 static const zend_function_entry error_exception_functions[] = {
-       ZEND_ME(error_exception, __construct, arginfo_error_exception___construct, ZEND_ACC_PUBLIC)
-       ZEND_ME(error_exception, getSeverity, NULL, ZEND_ACC_PUBLIC|ZEND_ACC_FINAL)
+       ZEND_ME(error_exception, __construct, arginfo_class_ErrorException___construct, ZEND_ACC_PUBLIC)
+       ZEND_ME(error_exception, getSeverity, arginfo_class_ErrorException_getSeverity, ZEND_ACC_PUBLIC|ZEND_ACC_FINAL)
        ZEND_FE_END
 };
 /* }}} */
diff --git a/Zend/zend_exceptions.stub.php b/Zend/zend_exceptions.stub.php
new file mode 100644 (file)
index 0000000..96d581c
--- /dev/null
@@ -0,0 +1,68 @@
+<?php
+
+interface Throwable
+{
+    /** @return string */
+    function getMessage();
+
+    /** @return int */
+    function getCode();
+
+    /** @return string */
+    function getFile();
+
+    /** @return int */
+    function getLine();
+
+    /** @return array */
+    function getTrace();
+
+    /** @return ?Throwable */
+    function getPrevious();
+
+    /** @return string */
+    function getTraceAsString();
+
+    /** @return string */
+    function __toString();
+}
+
+class Exception implements Throwable
+{
+    final private function __clone() {}
+
+    function __construct(string $message = UNKNOWN, int $code = 0, ?Throwable $previous = null) {}
+
+    function __wakeup() {}
+
+    /** @return string */
+    final function getMessage() {}
+
+    /** @return int */
+    final function getCode() {}
+
+    /** @return string */
+    final function getFile() {}
+
+    /** @return int */
+    final function getLine() {}
+
+    /** @return array */
+    final function getTrace() {}
+
+    /** @return ?Throwable */
+    final function getPrevious() {}
+
+    /** @return string */
+    final function getTraceAsString() {}
+
+    /** @return string */
+    function __toString() {}
+}
+
+class ErrorException extends Exception
+{
+    function __construct(string $message = UNKNOWN, int $code = 0, int $severity = E_ERROR, string $filename = UNKNOWN, int $lineno = 0, ?Throwable $previous = null) {}
+
+    final function getSeverity() {}
+}
diff --git a/Zend/zend_exceptions_arginfo.h b/Zend/zend_exceptions_arginfo.h
new file mode 100644 (file)
index 0000000..c2f83e4
--- /dev/null
@@ -0,0 +1,55 @@
+/* This is a generated file, edit the .stub.php file instead. */
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Throwable_getMessage, 0, 0, 0)
+ZEND_END_ARG_INFO()
+
+#define arginfo_class_Throwable_getCode arginfo_class_Throwable_getMessage
+
+#define arginfo_class_Throwable_getFile arginfo_class_Throwable_getMessage
+
+#define arginfo_class_Throwable_getLine arginfo_class_Throwable_getMessage
+
+#define arginfo_class_Throwable_getTrace arginfo_class_Throwable_getMessage
+
+#define arginfo_class_Throwable_getPrevious arginfo_class_Throwable_getMessage
+
+#define arginfo_class_Throwable_getTraceAsString arginfo_class_Throwable_getMessage
+
+#define arginfo_class_Throwable___toString arginfo_class_Throwable_getMessage
+
+#define arginfo_class_Exception___clone arginfo_class_Throwable_getMessage
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Exception___construct, 0, 0, 0)
+       ZEND_ARG_TYPE_INFO(0, message, IS_STRING, 0)
+       ZEND_ARG_TYPE_INFO(0, code, IS_LONG, 0)
+       ZEND_ARG_OBJ_INFO(0, previous, Throwable, 1)
+ZEND_END_ARG_INFO()
+
+#define arginfo_class_Exception___wakeup arginfo_class_Throwable_getMessage
+
+#define arginfo_class_Exception_getMessage arginfo_class_Throwable_getMessage
+
+#define arginfo_class_Exception_getCode arginfo_class_Throwable_getMessage
+
+#define arginfo_class_Exception_getFile arginfo_class_Throwable_getMessage
+
+#define arginfo_class_Exception_getLine arginfo_class_Throwable_getMessage
+
+#define arginfo_class_Exception_getTrace arginfo_class_Throwable_getMessage
+
+#define arginfo_class_Exception_getPrevious arginfo_class_Throwable_getMessage
+
+#define arginfo_class_Exception_getTraceAsString arginfo_class_Throwable_getMessage
+
+#define arginfo_class_Exception___toString arginfo_class_Throwable_getMessage
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_class_ErrorException___construct, 0, 0, 0)
+       ZEND_ARG_TYPE_INFO(0, message, IS_STRING, 0)
+       ZEND_ARG_TYPE_INFO(0, code, IS_LONG, 0)
+       ZEND_ARG_TYPE_INFO(0, severity, IS_LONG, 0)
+       ZEND_ARG_TYPE_INFO(0, filename, IS_STRING, 0)
+       ZEND_ARG_TYPE_INFO(0, lineno, IS_LONG, 0)
+       ZEND_ARG_OBJ_INFO(0, previous, Throwable, 1)
+ZEND_END_ARG_INFO()
+
+#define arginfo_class_ErrorException_getSeverity arginfo_class_Throwable_getMessage
index d8e61fffefd14baa7369a8ae28727be4e90e8069..432c1198d95516e637f7a50d76d2934b4c99b3e1 100644 (file)
@@ -23,6 +23,7 @@
 #include "zend_exceptions.h"
 #include "zend_generators.h"
 #include "zend_closures.h"
+#include "zend_generators_arginfo.h"
 
 ZEND_API zend_class_entry *zend_ce_generator;
 ZEND_API zend_class_entry *zend_ce_ClosedGeneratorException;
@@ -1007,7 +1008,7 @@ ZEND_METHOD(Generator, throw)
        zend_generator *generator;
 
        ZEND_PARSE_PARAMETERS_START(1, 1)
-               Z_PARAM_ZVAL(exception)
+               Z_PARAM_OBJECT_OF_CLASS(exception, zend_ce_throwable);
        ZEND_PARSE_PARAMETERS_END();
 
        Z_TRY_ADDREF_P(exception);
@@ -1172,26 +1173,15 @@ zend_object_iterator *zend_generator_get_iterator(zend_class_entry *ce, zval *ob
 }
 /* }}} */
 
-ZEND_BEGIN_ARG_INFO(arginfo_generator_void, 0)
-ZEND_END_ARG_INFO()
-
-ZEND_BEGIN_ARG_INFO_EX(arginfo_generator_send, 0, 0, 1)
-       ZEND_ARG_INFO(0, value)
-ZEND_END_ARG_INFO()
-
-ZEND_BEGIN_ARG_INFO_EX(arginfo_generator_throw, 0, 0, 1)
-       ZEND_ARG_INFO(0, exception)
-ZEND_END_ARG_INFO()
-
 static const zend_function_entry generator_functions[] = {
-       ZEND_ME(Generator, rewind,   arginfo_generator_void, ZEND_ACC_PUBLIC)
-       ZEND_ME(Generator, valid,    arginfo_generator_void, ZEND_ACC_PUBLIC)
-       ZEND_ME(Generator, current,  arginfo_generator_void, ZEND_ACC_PUBLIC)
-       ZEND_ME(Generator, key,      arginfo_generator_void, ZEND_ACC_PUBLIC)
-       ZEND_ME(Generator, next,     arginfo_generator_void, ZEND_ACC_PUBLIC)
-       ZEND_ME(Generator, send,     arginfo_generator_send, ZEND_ACC_PUBLIC)
-       ZEND_ME(Generator, throw,    arginfo_generator_throw, ZEND_ACC_PUBLIC)
-       ZEND_ME(Generator, getReturn,arginfo_generator_void, ZEND_ACC_PUBLIC)
+       ZEND_ME(Generator, rewind,   arginfo_class_Generator_rewind, ZEND_ACC_PUBLIC)
+       ZEND_ME(Generator, valid,    arginfo_class_Generator_valid, ZEND_ACC_PUBLIC)
+       ZEND_ME(Generator, current,  arginfo_class_Generator_current, ZEND_ACC_PUBLIC)
+       ZEND_ME(Generator, key,      arginfo_class_Generator_key, ZEND_ACC_PUBLIC)
+       ZEND_ME(Generator, next,     arginfo_class_Generator_next, ZEND_ACC_PUBLIC)
+       ZEND_ME(Generator, send,     arginfo_class_Generator_send, ZEND_ACC_PUBLIC)
+       ZEND_ME(Generator, throw,    arginfo_class_Generator_throw, ZEND_ACC_PUBLIC)
+       ZEND_ME(Generator, getReturn,arginfo_class_Generator_getReturn, ZEND_ACC_PUBLIC)
        ZEND_FE_END
 };
 
diff --git a/Zend/zend_generators.stub.php b/Zend/zend_generators.stub.php
new file mode 100644 (file)
index 0000000..759bd4c
--- /dev/null
@@ -0,0 +1,20 @@
+<?php
+
+final class Generator implements Iterator
+{
+    function rewind(): void {}
+
+    function valid(): bool {}
+
+    function current() {}
+
+    function key() {}
+
+    function next(): void {}
+
+    function send($value) {}
+
+    function throw(Throwable $exception) {}
+
+    function getReturn() {}
+}
diff --git a/Zend/zend_generators_arginfo.h b/Zend/zend_generators_arginfo.h
new file mode 100644 (file)
index 0000000..56d4dde
--- /dev/null
@@ -0,0 +1,22 @@
+/* This is a generated file, edit the .stub.php file instead. */
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Generator_rewind, 0, 0, 0)
+ZEND_END_ARG_INFO()
+
+#define arginfo_class_Generator_valid arginfo_class_Generator_rewind
+
+#define arginfo_class_Generator_current arginfo_class_Generator_rewind
+
+#define arginfo_class_Generator_key arginfo_class_Generator_rewind
+
+#define arginfo_class_Generator_next arginfo_class_Generator_rewind
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Generator_send, 0, 0, 1)
+       ZEND_ARG_INFO(0, value)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Generator_throw, 0, 0, 1)
+       ZEND_ARG_OBJ_INFO(0, exception, Throwable, 0)
+ZEND_END_ARG_INFO()
+
+#define arginfo_class_Generator_getReturn arginfo_class_Generator_rewind
index da8f4aae601745216a89e659ad3e0a57d2bb0f6d..5d58b3e178e402305e2a4c08011c97830d0e9801 100644 (file)
@@ -20,6 +20,7 @@
 #include "zend_API.h"
 #include "zend_interfaces.h"
 #include "zend_exceptions.h"
+#include "zend_interfaces_arginfo.h"
 
 ZEND_API zend_class_entry *zend_ce_traversable;
 ZEND_API zend_class_entry *zend_ce_aggregate;
@@ -533,57 +534,37 @@ static int zend_implement_countable(zend_class_entry *interface, zend_class_entr
 
 /* {{{ function tables */
 static const zend_function_entry zend_funcs_aggregate[] = {
-       ZEND_ABSTRACT_ME(iterator, getIterator, NULL)
+       ZEND_ABSTRACT_ME(iterator, getIterator, arginfo_class_IteratorAggregate_getIterator)
        ZEND_FE_END
 };
 
 static const zend_function_entry zend_funcs_iterator[] = {
-       ZEND_ABSTRACT_ME(iterator, current,  NULL)
-       ZEND_ABSTRACT_ME(iterator, next,     NULL)
-       ZEND_ABSTRACT_ME(iterator, key,      NULL)
-       ZEND_ABSTRACT_ME(iterator, valid,    NULL)
-       ZEND_ABSTRACT_ME(iterator, rewind,   NULL)
+       ZEND_ABSTRACT_ME(iterator, current,  arginfo_class_Iterator_current)
+       ZEND_ABSTRACT_ME(iterator, next,     arginfo_class_Iterator_next)
+       ZEND_ABSTRACT_ME(iterator, key,      arginfo_class_Iterator_key)
+       ZEND_ABSTRACT_ME(iterator, valid,    arginfo_class_Iterator_valid)
+       ZEND_ABSTRACT_ME(iterator, rewind,   arginfo_class_Iterator_rewind)
        ZEND_FE_END
 };
 
 static const zend_function_entry *zend_funcs_traversable = NULL;
 
-ZEND_BEGIN_ARG_INFO_EX(arginfo_arrayaccess_offset, 0, 0, 1)
-       ZEND_ARG_INFO(0, offset)
-ZEND_END_ARG_INFO()
-
-ZEND_BEGIN_ARG_INFO_EX(arginfo_arrayaccess_offset_get, 0, 0, 1) /* actually this should be return by ref but atm cannot be */
-       ZEND_ARG_INFO(0, offset)
-ZEND_END_ARG_INFO()
-
-ZEND_BEGIN_ARG_INFO_EX(arginfo_arrayaccess_offset_value, 0, 0, 2)
-       ZEND_ARG_INFO(0, offset)
-       ZEND_ARG_INFO(0, value)
-ZEND_END_ARG_INFO()
-
 static const zend_function_entry zend_funcs_arrayaccess[] = {
-       ZEND_ABSTRACT_ME(arrayaccess, offsetExists, arginfo_arrayaccess_offset)
-       ZEND_ABSTRACT_ME(arrayaccess, offsetGet,    arginfo_arrayaccess_offset_get)
-       ZEND_ABSTRACT_ME(arrayaccess, offsetSet,    arginfo_arrayaccess_offset_value)
-       ZEND_ABSTRACT_ME(arrayaccess, offsetUnset,  arginfo_arrayaccess_offset)
+       ZEND_ABSTRACT_ME(arrayaccess, offsetExists, arginfo_class_ArrayAccess_offsetExists)
+       ZEND_ABSTRACT_ME(arrayaccess, offsetGet,    arginfo_class_ArrayAccess_offsetGet)
+       ZEND_ABSTRACT_ME(arrayaccess, offsetSet,    arginfo_class_ArrayAccess_offsetSet)
+       ZEND_ABSTRACT_ME(arrayaccess, offsetUnset,  arginfo_class_ArrayAccess_offsetUnset)
        ZEND_FE_END
 };
 
-ZEND_BEGIN_ARG_INFO(arginfo_serializable_serialize, 0)
-       ZEND_ARG_INFO(0, serialized)
-ZEND_END_ARG_INFO()
-
 static const zend_function_entry zend_funcs_serializable[] = {
-       ZEND_ABSTRACT_ME(serializable, serialize,   NULL)
-       ZEND_FENTRY(unserialize, NULL, arginfo_serializable_serialize, ZEND_ACC_PUBLIC|ZEND_ACC_ABSTRACT)
+       ZEND_ABSTRACT_ME(serializable, serialize, arginfo_class_Serializable_serialize)
+       ZEND_FENTRY(unserialize, NULL, arginfo_class_Serializable_unserialize, ZEND_ACC_PUBLIC|ZEND_ACC_ABSTRACT)
        ZEND_FE_END
 };
 
-ZEND_BEGIN_ARG_INFO(arginfo_countable_count, 0)
-ZEND_END_ARG_INFO()
-
 static const zend_function_entry zend_funcs_countable[] = {
-       ZEND_ABSTRACT_ME(Countable, count, arginfo_countable_count)
+       ZEND_ABSTRACT_ME(Countable, count, arginfo_class_Countable_count)
        ZEND_FE_END
 };
 /* }}} */
diff --git a/Zend/zend_interfaces.stub.php b/Zend/zend_interfaces.stub.php
new file mode 100644 (file)
index 0000000..882a21e
--- /dev/null
@@ -0,0 +1,51 @@
+<?php
+
+interface Traversable {}
+
+interface IteratorAggregate extends Traversable
+{
+    /** @return Traversable */
+    function getIterator();
+}
+
+interface Iterator extends Traversable
+{
+    function current();
+
+    /** @return void */
+    function next();
+
+    function key();
+
+    /** @return bool */
+    function valid();
+
+    /** @return void */
+    function rewind();
+}
+
+interface ArrayAccess
+{
+    function offsetExists($offset);
+
+    /* actually this should be return by ref but atm cannot be */
+    function offsetGet($offset);
+
+    function offsetSet($offset, $value);
+
+    function offsetUnset($offset);
+}
+
+interface Serializable
+{
+    /** @return string */
+    function serialize();
+
+    function unserialize(string $serialized);
+}
+
+interface Countable
+{
+    /** @return int */
+    function count();
+}
diff --git a/Zend/zend_interfaces_arginfo.h b/Zend/zend_interfaces_arginfo.h
new file mode 100644 (file)
index 0000000..fee5705
--- /dev/null
@@ -0,0 +1,35 @@
+/* This is a generated file, edit the .stub.php file instead. */
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_class_IteratorAggregate_getIterator, 0, 0, 0)
+ZEND_END_ARG_INFO()
+
+#define arginfo_class_Iterator_current arginfo_class_IteratorAggregate_getIterator
+
+#define arginfo_class_Iterator_next arginfo_class_IteratorAggregate_getIterator
+
+#define arginfo_class_Iterator_key arginfo_class_IteratorAggregate_getIterator
+
+#define arginfo_class_Iterator_valid arginfo_class_IteratorAggregate_getIterator
+
+#define arginfo_class_Iterator_rewind arginfo_class_IteratorAggregate_getIterator
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_class_ArrayAccess_offsetExists, 0, 0, 1)
+       ZEND_ARG_INFO(0, offset)
+ZEND_END_ARG_INFO()
+
+#define arginfo_class_ArrayAccess_offsetGet arginfo_class_ArrayAccess_offsetExists
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_class_ArrayAccess_offsetSet, 0, 0, 2)
+       ZEND_ARG_INFO(0, offset)
+       ZEND_ARG_INFO(0, value)
+ZEND_END_ARG_INFO()
+
+#define arginfo_class_ArrayAccess_offsetUnset arginfo_class_ArrayAccess_offsetExists
+
+#define arginfo_class_Serializable_serialize arginfo_class_IteratorAggregate_getIterator
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Serializable_unserialize, 0, 0, 1)
+       ZEND_ARG_TYPE_INFO(0, serialized, IS_STRING, 0)
+ZEND_END_ARG_INFO()
+
+#define arginfo_class_Countable_count arginfo_class_IteratorAggregate_getIterator
index c4dbcd6926be5260120a5724b811dd0e219d68be..abd0281a12b26509b37cdf56043d802936535360 100644 (file)
@@ -9,8 +9,6 @@ $x->test();
 
 ?>
 --EXPECTF--
-Exception in %s:%d
-Stack trace:
-#0 {main}
-
-Fatal error: main(): The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition "unknown" of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide an autoloader to load the class definition in %s on line %d
+Fatal error: Uncaught TypeError: trace is not an array in %s:%d
+%a
+  thrown in %s on line %d
index 0a366b6975218bc7a361ac9f37da922bd7e6143a..d268104606350b0158c60eee3e7dee033fab8f02 100644 (file)
@@ -37,7 +37,7 @@ string(183) "Class [ <internal:Core> class stdClass ] {
 }
 
 "
-string(1607) "Class [ <internal:Core> class Exception implements Throwable ] {
+string(1969) "Class [ <internal:Core> class Exception implements Throwable ] {
 
   - Constants [0] {
   }
@@ -60,42 +60,72 @@ string(1607) "Class [ <internal:Core> class Exception implements Throwable ] {
 
   - Methods [11] {
     Method [ <internal:Core> final private method __clone ] {
+
+      - Parameters [0] {
+      }
     }
 
     Method [ <internal:Core, ctor> public method __construct ] {
 
       - Parameters [3] {
-        Parameter #0 [ <optional> $message ]
-        Parameter #1 [ <optional> $code ]
-        Parameter #2 [ <optional> $previous ]
+        Parameter #0 [ <optional> string $message ]
+        Parameter #1 [ <optional> int $code ]
+        Parameter #2 [ <optional> ?Throwable $previous ]
       }
     }
 
     Method [ <internal:Core> public method __wakeup ] {
+
+      - Parameters [0] {
+      }
     }
 
     Method [ <internal:Core, prototype Throwable> final public method getMessage ] {
+
+      - Parameters [0] {
+      }
     }
 
     Method [ <internal:Core, prototype Throwable> final public method getCode ] {
+
+      - Parameters [0] {
+      }
     }
 
     Method [ <internal:Core, prototype Throwable> final public method getFile ] {
+
+      - Parameters [0] {
+      }
     }
 
     Method [ <internal:Core, prototype Throwable> final public method getLine ] {
+
+      - Parameters [0] {
+      }
     }
 
     Method [ <internal:Core, prototype Throwable> final public method getTrace ] {
+
+      - Parameters [0] {
+      }
     }
 
     Method [ <internal:Core, prototype Throwable> final public method getPrevious ] {
+
+      - Parameters [0] {
+      }
     }
 
     Method [ <internal:Core, prototype Throwable> final public method getTraceAsString ] {
+
+      - Parameters [0] {
+      }
     }
 
     Method [ <internal:Core, prototype Throwable> public method __toString ] {
+
+      - Parameters [0] {
+      }
     }
   }
 }