From 7af377f2424b3603fe8b3988554d8f2742f3621c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1t=C3=A9=20Kocsis?= Date: Sat, 11 Apr 2020 11:59:05 +0200 Subject: [PATCH] Generate method entries from stubs for a couple of extensions --- Zend/zend_API.h | 27 +++++++++++++------------- build/gen_stub.php | 14 ++++++------- ext/com_dotnet/com_extension.c | 21 +++----------------- ext/com_dotnet/com_extension_arginfo.h | 25 ++++++++++++++++++++++++ ext/com_dotnet/com_persist.stub.php | 20 ++++++++++--------- ext/date/php_date_arginfo.h | 14 ++++++------- ext/dom/documenttype.c | 11 ----------- ext/dom/dom_arginfo.h | 5 +++++ ext/dom/dom_fe.h | 1 - ext/dom/php_dom.c | 2 +- ext/fileinfo/fileinfo.c | 13 +------------ ext/fileinfo/fileinfo.stub.php | 8 +++++++- ext/fileinfo/fileinfo_arginfo.h | 9 +++++++++ ext/hash/hash.c | 9 ++------- ext/hash/hash_arginfo.h | 7 +++++++ ext/json/json.c | 9 +-------- ext/json/json_arginfo.h | 6 ++++++ ext/zend_test/test.c | 21 +++++--------------- ext/zend_test/test.stub.php | 7 ++++--- ext/zend_test/test_arginfo.h | 16 +++++++++++++++ 20 files changed, 130 insertions(+), 115 deletions(-) diff --git a/Zend/zend_API.h b/Zend/zend_API.h index fbf725adeeb24..eb42e7798c87b 100644 --- a/Zend/zend_API.h +++ b/Zend/zend_API.h @@ -73,19 +73,20 @@ typedef struct _zend_fcall_info_cache { #define ZEND_RAW_FENTRY(zend_name, name, arg_info, flags) { zend_name, name, arg_info, (uint32_t) (sizeof(arg_info)/sizeof(struct _zend_internal_arg_info)-1), flags }, /* Same as ZEND_NAMED_FE */ -#define ZEND_RAW_NAMED_FE(zend_name, name, arg_info) ZEND_RAW_FENTRY(#zend_name, name, arg_info, 0) - -#define ZEND_NAMED_FE(zend_name, name, arg_info) ZEND_RAW_FENTRY(#zend_name, name, arg_info, 0) -#define ZEND_FE(name, arg_info) ZEND_RAW_FENTRY(#name, zif_##name, arg_info, 0) -#define ZEND_DEP_FE(name, arg_info) ZEND_RAW_FENTRY(#name, zif_##name, arg_info, ZEND_ACC_DEPRECATED) -#define ZEND_FALIAS(name, alias, arg_info) ZEND_RAW_FENTRY(#name, zif_##alias, arg_info, 0) -#define ZEND_DEP_FALIAS(name, alias, arg_info) ZEND_RAW_FENTRY(#name, zif_##alias, arg_info, ZEND_ACC_DEPRECATED) -#define ZEND_NAMED_ME(zend_name, name, arg_info, flags) ZEND_FENTRY(zend_name, name, arg_info, flags) -#define ZEND_ME(classname, name, arg_info, flags) ZEND_RAW_FENTRY(#name, zim_##classname##_##name, arg_info, flags) -#define ZEND_DEP_ME(classname, name, arg_info, flags) ZEND_RAW_FENTRY(#name, zim_##classname##_##name, arg_info, flags | ZEND_ACC_DEPRECATED) -#define ZEND_ABSTRACT_ME(classname, name, arg_info) ZEND_RAW_FENTRY(#name, NULL, arg_info, ZEND_ACC_PUBLIC|ZEND_ACC_ABSTRACT) -#define ZEND_MALIAS(classname, name, alias, arg_info, flags) ZEND_RAW_FENTRY(#name, zim_##classname##_##alias, arg_info, flags) -#define ZEND_ME_MAPPING(name, func_name, arg_info, flags) ZEND_RAW_FENTRY(#name, zif_##func_name, arg_info, flags) +#define ZEND_RAW_NAMED_FE(zend_name, name, arg_info) ZEND_RAW_FENTRY(#zend_name, name, arg_info, 0) + +#define ZEND_NAMED_FE(zend_name, name, arg_info) ZEND_RAW_FENTRY(#zend_name, name, arg_info, 0) +#define ZEND_FE(name, arg_info) ZEND_RAW_FENTRY(#name, zif_##name, arg_info, 0) +#define ZEND_DEP_FE(name, arg_info) ZEND_RAW_FENTRY(#name, zif_##name, arg_info, ZEND_ACC_DEPRECATED) +#define ZEND_FALIAS(name, alias, arg_info) ZEND_RAW_FENTRY(#name, zif_##alias, arg_info, 0) +#define ZEND_DEP_FALIAS(name, alias, arg_info) ZEND_RAW_FENTRY(#name, zif_##alias, arg_info, ZEND_ACC_DEPRECATED) +#define ZEND_NAMED_ME(zend_name, name, arg_info, flags) ZEND_FENTRY(zend_name, name, arg_info, flags) +#define ZEND_ME(classname, name, arg_info, flags) ZEND_RAW_FENTRY(#name, zim_##classname##_##name, arg_info, flags) +#define ZEND_DEP_ME(classname, name, arg_info, flags) ZEND_RAW_FENTRY(#name, zim_##classname##_##name, arg_info, flags | ZEND_ACC_DEPRECATED) +#define ZEND_ABSTRACT_ME(classname, name, arg_info) ZEND_RAW_FENTRY(#name, NULL, arg_info, ZEND_ACC_PUBLIC|ZEND_ACC_ABSTRACT) +#define ZEND_ABSTRACT_ME_WITH_FLAGS(classname, name, arg_info, flags) ZEND_RAW_FENTRY(#name, NULL, arg_info, flags) +#define ZEND_MALIAS(classname, name, alias, arg_info, flags) ZEND_RAW_FENTRY(#name, zim_##classname##_##alias, arg_info, flags) +#define ZEND_ME_MAPPING(name, func_name, arg_info, flags) ZEND_RAW_FENTRY(#name, zif_##func_name, arg_info, flags) #define ZEND_NS_FENTRY(ns, zend_name, name, arg_info, flags) ZEND_RAW_FENTRY(ZEND_NS_NAME(ns, #zend_name), name, arg_info, flags) diff --git a/build/gen_stub.php b/build/gen_stub.php index 1cbb21d74cc65..2170daa4d7d43 100755 --- a/build/gen_stub.php +++ b/build/gen_stub.php @@ -447,8 +447,8 @@ public function getFunctionEntry(): string { } else { if ($this->flags & Class_::MODIFIER_ABSTRACT) { return sprintf( - "\tZEND_ABSTRACT_ME(%s, %s, %s)\n", - $this->name->className, $this->name->name, $this->getArgInfoName() + "\tZEND_ABSTRACT_ME_WITH_FLAGS(%s, %s, %s, %s)\n", + $this->name->className, $this->name->name, $this->getArgInfoName(), $this->getFlagsAsString() ); } @@ -797,8 +797,8 @@ function parseStubFile(string $fileName): FileInfo { $flags |= Class_::MODIFIER_ABSTRACT; } - if ($flags & Class_::MODIFIER_ABSTRACT && !($flags & Class_::MODIFIER_PUBLIC)) { - throw new Exception("Abstract non-public methods are not supported"); + if (!($flags & Class_::VISIBILITY_MODIFIER_MASK)) { + throw new Exception("Method visibility modifier is required"); } $methodInfos[] = parseFunctionLike( @@ -984,9 +984,9 @@ function (FuncInfo $funcInfo) use(&$generatedFunctionDeclarations) { } ); - $code .= "\n\n"; - - $code .= generateFunctionEntries(null, $fileInfo->funcInfos); + if (empty($fileInfo->funcInfos) === false) { + $code .= generateFunctionEntries(null, $fileInfo->funcInfos); + } foreach ($fileInfo->classInfos as $classInfo) { $code .= generateFunctionEntries($classInfo->name, $classInfo->funcInfos); diff --git a/ext/com_dotnet/com_extension.c b/ext/com_dotnet/com_extension.c index b37e4b8ffe12f..14094aa039203 100644 --- a/ext/com_dotnet/com_extension.c +++ b/ext/com_dotnet/com_extension.c @@ -37,21 +37,6 @@ zend_class_entry *php_com_exception_class_entry, *php_com_saproxy_class_entry; -static const zend_function_entry com_variant_funcs[] = { - PHP_ME(variant, __construct, arginfo_class_variant___construct, ZEND_ACC_PUBLIC) - PHP_FE_END -}; - -static const zend_function_entry com_com_funcs[] = { - PHP_ME(com, __construct, arginfo_class_com___construct, ZEND_ACC_PUBLIC) - PHP_FE_END -}; - -static const zend_function_entry com_dotnet_funcs[] = { - PHP_ME(dotnet, __construct, arginfo_class_dotnet___construct, ZEND_ACC_PUBLIC) - PHP_FE_END -}; - /* {{{ com_dotnet_module_entry */ zend_module_entry com_dotnet_module_entry = { @@ -196,14 +181,14 @@ PHP_MINIT_FUNCTION(com_dotnet) /* php_com_saproxy_class_entry->constructor->common.fn_flags |= ZEND_ACC_PROTECTED; */ php_com_saproxy_class_entry->get_iterator = php_com_saproxy_iter_get; - INIT_CLASS_ENTRY(ce, "variant", com_variant_funcs); + INIT_CLASS_ENTRY(ce, "variant", class_variant_methods); ce.create_object = php_com_object_new; php_com_variant_class_entry = zend_register_internal_class(&ce); php_com_variant_class_entry->get_iterator = php_com_iter_get; php_com_variant_class_entry->serialize = zend_class_serialize_deny; php_com_variant_class_entry->unserialize = zend_class_unserialize_deny; - INIT_CLASS_ENTRY(ce, "com", com_com_funcs); + INIT_CLASS_ENTRY(ce, "com", class_com_methods); ce.create_object = php_com_object_new; tmp = zend_register_internal_class_ex(&ce, php_com_variant_class_entry); tmp->get_iterator = php_com_iter_get; @@ -211,7 +196,7 @@ PHP_MINIT_FUNCTION(com_dotnet) tmp->unserialize = zend_class_unserialize_deny; #if HAVE_MSCOREE_H - INIT_CLASS_ENTRY(ce, "dotnet", com_dotnet_funcs); + INIT_CLASS_ENTRY(ce, "dotnet", class_dotnet_methods); ce.create_object = php_com_object_new; tmp = zend_register_internal_class_ex(&ce, php_com_variant_class_entry); tmp->get_iterator = php_com_iter_get; diff --git a/ext/com_dotnet/com_extension_arginfo.h b/ext/com_dotnet/com_extension_arginfo.h index 47e41ef2683c5..f4b924358ce13 100644 --- a/ext/com_dotnet/com_extension_arginfo.h +++ b/ext/com_dotnet/com_extension_arginfo.h @@ -163,6 +163,11 @@ ZEND_FUNCTION(com_event_sink); ZEND_FUNCTION(com_print_typeinfo); ZEND_FUNCTION(com_message_pump); ZEND_FUNCTION(com_load_typelib); +ZEND_METHOD(variant, __construct); +ZEND_METHOD(com, __construct); +#if HAVE_MSCOREE_H +ZEND_METHOD(dotnet, __construct); +#endif static const zend_function_entry ext_functions[] = { @@ -200,3 +205,23 @@ static const zend_function_entry ext_functions[] = { ZEND_FE(com_load_typelib, arginfo_com_load_typelib) ZEND_FE_END }; + + +static const zend_function_entry class_variant_methods[] = { + ZEND_ME(variant, __construct, arginfo_class_variant___construct, ZEND_ACC_PUBLIC) + ZEND_FE_END +}; + + +static const zend_function_entry class_com_methods[] = { + ZEND_ME(com, __construct, arginfo_class_com___construct, ZEND_ACC_PUBLIC) + ZEND_FE_END +}; + + +static const zend_function_entry class_dotnet_methods[] = { +#if HAVE_MSCOREE_H + ZEND_ME(dotnet, __construct, arginfo_class_dotnet___construct, ZEND_ACC_PUBLIC) +#endif + ZEND_FE_END +}; diff --git a/ext/com_dotnet/com_persist.stub.php b/ext/com_dotnet/com_persist.stub.php index 5f183b175a72d..c4155bceb1a45 100644 --- a/ext/com_dotnet/com_persist.stub.php +++ b/ext/com_dotnet/com_persist.stub.php @@ -1,21 +1,23 @@ ce_flags |= ZEND_ACC_FINAL; php_hashcontext_ce->create_object = php_hashcontext_create; diff --git a/ext/hash/hash_arginfo.h b/ext/hash/hash_arginfo.h index 65b2612823f35..156c7ad2d2766 100644 --- a/ext/hash/hash_arginfo.h +++ b/ext/hash/hash_arginfo.h @@ -148,6 +148,7 @@ ZEND_FUNCTION(mhash_count); #if defined(PHP_MHASH_BC) ZEND_FUNCTION(mhash); #endif +ZEND_METHOD(HashContext, __construct); static const zend_function_entry ext_functions[] = { @@ -183,3 +184,9 @@ static const zend_function_entry ext_functions[] = { #endif ZEND_FE_END }; + + +static const zend_function_entry class_HashContext_methods[] = { + ZEND_ME(HashContext, __construct, arginfo_class_HashContext___construct, ZEND_ACC_PRIVATE) + ZEND_FE_END +}; diff --git a/ext/json/json.c b/ext/json/json.c index c64378fd565de..68990f5ca41bd 100644 --- a/ext/json/json.c +++ b/ext/json/json.c @@ -37,13 +37,6 @@ PHP_JSON_API zend_class_entry *php_json_exception_ce; PHP_JSON_API ZEND_DECLARE_MODULE_GLOBALS(json) -/* {{{ JsonSerializable methods */ -static const zend_function_entry json_serializable_interface[] = { - PHP_ABSTRACT_ME(JsonSerializable, jsonSerialize, arginfo_class_JsonSerializable_jsonSerialize) - PHP_FE_END -}; -/* }}} */ - /* Register constant for options and errors */ #define PHP_JSON_REGISTER_CONSTANT(_name, _value) \ REGISTER_LONG_CONSTANT(_name, _value, CONST_CS | CONST_PERSISTENT); @@ -53,7 +46,7 @@ static PHP_MINIT_FUNCTION(json) { zend_class_entry ce; - INIT_CLASS_ENTRY(ce, "JsonSerializable", json_serializable_interface); + INIT_CLASS_ENTRY(ce, "JsonSerializable", class_JsonSerializable_methods); php_json_serializable_ce = zend_register_internal_interface(&ce); INIT_CLASS_ENTRY(ce, "JsonException", NULL); diff --git a/ext/json/json_arginfo.h b/ext/json/json_arginfo.h index 9107e088e2280..3cc3bbbba8f3a 100644 --- a/ext/json/json_arginfo.h +++ b/ext/json/json_arginfo.h @@ -36,3 +36,9 @@ static const zend_function_entry ext_functions[] = { ZEND_FE(json_last_error_msg, arginfo_json_last_error_msg) ZEND_FE_END }; + + +static const zend_function_entry class_JsonSerializable_methods[] = { + ZEND_ABSTRACT_ME_WITH_FLAGS(JsonSerializable, jsonSerialize, arginfo_class_JsonSerializable_jsonSerialize, ZEND_ACC_PUBLIC|ZEND_ACC_ABSTRACT) + ZEND_FE_END +}; diff --git a/ext/zend_test/test.c b/ext/zend_test/test.c index f7c2913fac288..ab152e0a45602 100644 --- a/ext/zend_test/test.c +++ b/ext/zend_test/test.c @@ -181,33 +181,22 @@ static zend_function *zend_test_class_static_method_get(zend_class_entry *ce, ze } /* }}} */ -static ZEND_METHOD(_ZendTestClass, __toString) /* {{{ */ { +ZEND_METHOD(_ZendTestClass, __toString) /* {{{ */ { RETURN_EMPTY_STRING(); } /* }}} */ /* Internal function returns bool, we return int. */ -static ZEND_METHOD(_ZendTestClass, is_object) /* {{{ */ { +ZEND_METHOD(_ZendTestClass, is_object) /* {{{ */ { RETURN_LONG(42); } /* }}} */ -static ZEND_METHOD(_ZendTestTrait, testMethod) /* {{{ */ { +ZEND_METHOD(_ZendTestTrait, testMethod) /* {{{ */ { RETURN_TRUE; } /* }}} */ -static const zend_function_entry zend_test_class_methods[] = { - ZEND_ME(_ZendTestClass, is_object, arginfo_class__ZendTestClass_is_object, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) - ZEND_ME(_ZendTestClass, __toString, arginfo_class__ZendTestClass___toString, ZEND_ACC_DEPRECATED) - ZEND_FE_END -}; - -static const zend_function_entry zend_test_trait_methods[] = { - ZEND_ME(_ZendTestTrait, testMethod, arginfo_class__ZendTestTrait_testMethod, ZEND_ACC_PUBLIC) - ZEND_FE_END -}; - PHP_MINIT_FUNCTION(zend_test) { zend_class_entry class_entry; @@ -215,7 +204,7 @@ PHP_MINIT_FUNCTION(zend_test) INIT_CLASS_ENTRY(class_entry, "_ZendTestInterface", NULL); zend_test_interface = zend_register_internal_interface(&class_entry); zend_declare_class_constant_long(zend_test_interface, ZEND_STRL("DUMMY"), 0); - INIT_CLASS_ENTRY(class_entry, "_ZendTestClass", zend_test_class_methods); + INIT_CLASS_ENTRY(class_entry, "_ZendTestClass", class__ZendTestClass_methods); zend_test_class = zend_register_internal_class(&class_entry); zend_class_implements(zend_test_class, 1, zend_test_interface); zend_test_class->create_object = zend_test_class_new; @@ -275,7 +264,7 @@ PHP_MINIT_FUNCTION(zend_test) memcpy(&zend_test_class_handlers, &std_object_handlers, sizeof(zend_object_handlers)); zend_test_class_handlers.get_method = zend_test_class_method_get; - INIT_CLASS_ENTRY(class_entry, "_ZendTestTrait", zend_test_trait_methods); + INIT_CLASS_ENTRY(class_entry, "_ZendTestTrait", class__ZendTestTrait_methods); zend_test_trait = zend_register_internal_class(&class_entry); zend_test_trait->ce_flags |= ZEND_ACC_TRAIT; zend_declare_property_null(zend_test_trait, "testProp", sizeof("testProp")-1, ZEND_ACC_PUBLIC); diff --git a/ext/zend_test/test.stub.php b/ext/zend_test/test.stub.php index 84724fd2557b1..f3360fa7f304b 100644 --- a/ext/zend_test/test.stub.php +++ b/ext/zend_test/test.stub.php @@ -3,13 +3,14 @@ /** @generate-function-entries */ class _ZendTestClass { - public static function is_object(): int; + public static function is_object(): int {} - public function __toString(): string; + /** @deprecated */ + public function __toString(): string {} } trait _ZendTestTrait { - public function testMethod(): bool; + public function testMethod(): bool {} } function zend_test_array_return(): array {} diff --git a/ext/zend_test/test_arginfo.h b/ext/zend_test/test_arginfo.h index bb0f32caeec6e..659d4eba66119 100644 --- a/ext/zend_test/test_arginfo.h +++ b/ext/zend_test/test_arginfo.h @@ -45,6 +45,9 @@ ZEND_FUNCTION(zend_create_unterminated_string); ZEND_FUNCTION(zend_terminate_string); ZEND_FUNCTION(zend_leak_variable); ZEND_FUNCTION(zend_leak_bytes); +ZEND_METHOD(_ZendTestClass, is_object); +ZEND_METHOD(_ZendTestClass, __toString); +ZEND_METHOD(_ZendTestTrait, testMethod); static const zend_function_entry ext_functions[] = { @@ -58,3 +61,16 @@ static const zend_function_entry ext_functions[] = { ZEND_FE(zend_leak_bytes, arginfo_zend_leak_bytes) ZEND_FE_END }; + + +static const zend_function_entry class__ZendTestClass_methods[] = { + ZEND_ME(_ZendTestClass, is_object, arginfo_class__ZendTestClass_is_object, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) + ZEND_ME(_ZendTestClass, __toString, arginfo_class__ZendTestClass___toString, ZEND_ACC_PUBLIC|ZEND_ACC_DEPRECATED) + ZEND_FE_END +}; + + +static const zend_function_entry class__ZendTestTrait_methods[] = { + ZEND_ME(_ZendTestTrait, testMethod, arginfo_class__ZendTestTrait_testMethod, ZEND_ACC_PUBLIC) + ZEND_FE_END +};