diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index 8a954a1a089f2..cceb29298cb81 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -45,6 +45,9 @@ #include "zend_smart_str.h" #include "zend_enum.h" #include "zend_fibers.h" + +#define REFLECTION_ATTRIBUTE_IS_INSTANCEOF (1 << 1) + #include "php_reflection_arginfo.h" /* Key used to avoid leaking addresses in ReflectionProperty::getId() */ @@ -115,12 +118,6 @@ PHPAPI zend_class_entry *reflection_fiber_ptr; target = intern->ptr; \ } while (0) -/* Class constants */ -#define REGISTER_REFLECTION_CLASS_CONST_LONG(class_name, const_name, value) \ - zend_declare_class_constant_long(reflection_ ## class_name ## _ptr, const_name, sizeof(const_name)-1, (zend_long)value); - -#define REFLECTION_ATTRIBUTE_IS_INSTANCEOF (1 << 1) - /* {{{ Object structure */ /* Struct for properties */ @@ -7135,8 +7132,6 @@ PHP_MINIT_FUNCTION(reflection) /* {{{ */ reflection_function_ptr = register_class_ReflectionFunction(reflection_function_abstract_ptr); reflection_function_ptr->create_object = reflection_objects_new; - REGISTER_REFLECTION_CLASS_CONST_LONG(function, "IS_DEPRECATED", ZEND_ACC_DEPRECATED); - reflection_generator_ptr = register_class_ReflectionGenerator(); reflection_generator_ptr->create_object = reflection_objects_new; @@ -7158,42 +7153,18 @@ PHP_MINIT_FUNCTION(reflection) /* {{{ */ reflection_method_ptr = register_class_ReflectionMethod(reflection_function_abstract_ptr); reflection_method_ptr->create_object = reflection_objects_new; - REGISTER_REFLECTION_CLASS_CONST_LONG(method, "IS_STATIC", ZEND_ACC_STATIC); - REGISTER_REFLECTION_CLASS_CONST_LONG(method, "IS_PUBLIC", ZEND_ACC_PUBLIC); - REGISTER_REFLECTION_CLASS_CONST_LONG(method, "IS_PROTECTED", ZEND_ACC_PROTECTED); - REGISTER_REFLECTION_CLASS_CONST_LONG(method, "IS_PRIVATE", ZEND_ACC_PRIVATE); - REGISTER_REFLECTION_CLASS_CONST_LONG(method, "IS_ABSTRACT", ZEND_ACC_ABSTRACT); - REGISTER_REFLECTION_CLASS_CONST_LONG(method, "IS_FINAL", ZEND_ACC_FINAL); - reflection_class_ptr = register_class_ReflectionClass(reflector_ptr); reflection_class_ptr->create_object = reflection_objects_new; - /* IS_IMPLICIT_ABSTRACT is not longer used */ - REGISTER_REFLECTION_CLASS_CONST_LONG(class, "IS_IMPLICIT_ABSTRACT", ZEND_ACC_IMPLICIT_ABSTRACT_CLASS); - REGISTER_REFLECTION_CLASS_CONST_LONG(class, "IS_EXPLICIT_ABSTRACT", ZEND_ACC_EXPLICIT_ABSTRACT_CLASS); - REGISTER_REFLECTION_CLASS_CONST_LONG(class, "IS_FINAL", ZEND_ACC_FINAL); - REGISTER_REFLECTION_CLASS_CONST_LONG(class, "IS_READONLY", ZEND_ACC_READONLY_CLASS); - reflection_object_ptr = register_class_ReflectionObject(reflection_class_ptr); reflection_object_ptr->create_object = reflection_objects_new; reflection_property_ptr = register_class_ReflectionProperty(reflector_ptr); reflection_property_ptr->create_object = reflection_objects_new; - REGISTER_REFLECTION_CLASS_CONST_LONG(property, "IS_STATIC", ZEND_ACC_STATIC); - REGISTER_REFLECTION_CLASS_CONST_LONG(property, "IS_READONLY", ZEND_ACC_READONLY); - REGISTER_REFLECTION_CLASS_CONST_LONG(property, "IS_PUBLIC", ZEND_ACC_PUBLIC); - REGISTER_REFLECTION_CLASS_CONST_LONG(property, "IS_PROTECTED", ZEND_ACC_PROTECTED); - REGISTER_REFLECTION_CLASS_CONST_LONG(property, "IS_PRIVATE", ZEND_ACC_PRIVATE); - reflection_class_constant_ptr = register_class_ReflectionClassConstant(reflector_ptr); reflection_class_constant_ptr->create_object = reflection_objects_new; - REGISTER_REFLECTION_CLASS_CONST_LONG(class_constant, "IS_PUBLIC", ZEND_ACC_PUBLIC); - REGISTER_REFLECTION_CLASS_CONST_LONG(class_constant, "IS_PROTECTED", ZEND_ACC_PROTECTED); - REGISTER_REFLECTION_CLASS_CONST_LONG(class_constant, "IS_PRIVATE", ZEND_ACC_PRIVATE); - REGISTER_REFLECTION_CLASS_CONST_LONG(class_constant, "IS_FINAL", ZEND_ACC_FINAL); - reflection_extension_ptr = register_class_ReflectionExtension(reflector_ptr); reflection_extension_ptr->create_object = reflection_objects_new; @@ -7218,8 +7189,6 @@ PHP_MINIT_FUNCTION(reflection) /* {{{ */ reflection_fiber_ptr = register_class_ReflectionFiber(); reflection_fiber_ptr->create_object = reflection_objects_new; - REGISTER_REFLECTION_CLASS_CONST_LONG(attribute, "IS_INSTANCEOF", REFLECTION_ATTRIBUTE_IS_INSTANCEOF); - REFLECTION_G(key_initialized) = 0; return SUCCESS; diff --git a/ext/reflection/php_reflection.stub.php b/ext/reflection/php_reflection.stub.php index b0c23cb1197b1..73a71762dba39 100644 --- a/ext/reflection/php_reflection.stub.php +++ b/ext/reflection/php_reflection.stub.php @@ -113,6 +113,12 @@ public function getAttributes(?string $name = null, int $flags = 0): array {} class ReflectionFunction extends ReflectionFunctionAbstract { + /** + * @var int + * @cvalue ZEND_ACC_DEPRECATED + */ + public const IS_DEPRECATED = UNKNOWN; + public function __construct(Closure|string $function) {} public function __toString(): string {} @@ -161,6 +167,37 @@ public function getExecutingGenerator(): Generator {} class ReflectionMethod extends ReflectionFunctionAbstract { + /** + * @var int + * @cvalue ZEND_ACC_STATIC + */ + public const IS_STATIC = UNKNOWN; + /** + * @var int + * @cvalue ZEND_ACC_PUBLIC + */ + public const IS_PUBLIC = UNKNOWN; + /** + * @var int + * @cvalue ZEND_ACC_PROTECTED + */ + public const IS_PROTECTED = UNKNOWN; + /** + * @var int + * @cvalue ZEND_ACC_PRIVATE + */ + public const IS_PRIVATE = UNKNOWN; + /** + * @var int + * @cvalue ZEND_ACC_ABSTRACT + */ + public const IS_ABSTRACT = UNKNOWN; + /** + * @var int + * @cvalue ZEND_ACC_FINAL + */ + public const IS_FINAL = UNKNOWN; + public string $class; public function __construct(object|string $objectOrMethod, ?string $method = null) {} @@ -215,6 +252,28 @@ public function setAccessible(bool $accessible): void {} /** @not-serializable */ class ReflectionClass implements Reflector { + /** + * @var int + * @cvalue ZEND_ACC_IMPLICIT_ABSTRACT_CLASS + * @todo deprecate + */ + public const IS_IMPLICIT_ABSTRACT = UNKNOWN; + /** + * @var int + * @cvalue ZEND_ACC_EXPLICIT_ABSTRACT_CLASS + */ + public const IS_EXPLICIT_ABSTRACT = UNKNOWN; + /** + * @var int + * @cvalue ZEND_ACC_FINAL + */ + public const IS_FINAL = UNKNOWN; + /** + * @var int + * @cvalue ZEND_ACC_READONLY_CLASS + */ + public const IS_READONLY = UNKNOWN; + public string $name; private function __clone(): void {} @@ -391,6 +450,32 @@ public function __construct(object $object) {} /** @not-serializable */ class ReflectionProperty implements Reflector { + /** + * @var int + * @cvalue ZEND_ACC_STATIC + */ + public const IS_STATIC = UNKNOWN; + /** + * @var int + * @cvalue ZEND_ACC_READONLY + */ + public const IS_READONLY = UNKNOWN; + /** + * @var int + * @cvalue ZEND_ACC_PUBLIC + */ + public const IS_PUBLIC = UNKNOWN; + /** + * @var int + * @cvalue ZEND_ACC_PROTECTED + */ + public const IS_PROTECTED = UNKNOWN; + /** + * @var int + * @cvalue ZEND_ACC_PRIVATE + */ + public const IS_PRIVATE = UNKNOWN; + public string $name; public string $class; @@ -461,6 +546,27 @@ public function getAttributes(?string $name = null, int $flags = 0): array {} /** @not-serializable */ class ReflectionClassConstant implements Reflector { + /** + * @var int + * @cvalue ZEND_ACC_PUBLIC + */ + public const IS_PUBLIC = UNKNOWN; + /** + * @var int + * @cvalue ZEND_ACC_PROTECTED + */ + public const IS_PROTECTED = UNKNOWN; + /** + * @var int + * @cvalue ZEND_ACC_PRIVATE + */ + public const IS_PRIVATE = UNKNOWN; + /** + * @var int + * @cvalue ZEND_ACC_FINAL + */ + public const IS_FINAL = UNKNOWN; + public string $name; public string $class; @@ -704,6 +810,12 @@ private function __construct() {} /** @not-serializable */ class ReflectionAttribute implements Reflector { + /** + * @var int + * @cvalue REFLECTION_ATTRIBUTE_IS_INSTANCEOF + */ + public const IS_INSTANCEOF = UNKNOWN; + public function getName(): string {} public function getTarget(): int {} public function isRepeated(): bool {} diff --git a/ext/reflection/php_reflection_arginfo.h b/ext/reflection/php_reflection_arginfo.h index caac7ec44dfcb..81ef6b69f15d1 100644 --- a/ext/reflection/php_reflection_arginfo.h +++ b/ext/reflection/php_reflection_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 9daec020902840b7f678d787e61e91f7e16ad4da */ + * Stub hash: 25b36d66ab7fb88b8d44d51e15e530ebff2e1e2c */ ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(arginfo_class_Reflection_getModifierNames, 0, 1, IS_ARRAY, 0) ZEND_ARG_TYPE_INFO(0, modifiers, IS_LONG, 0) @@ -1246,6 +1246,12 @@ static zend_class_entry *register_class_ReflectionFunction(zend_class_entry *cla INIT_CLASS_ENTRY(ce, "ReflectionFunction", class_ReflectionFunction_methods); class_entry = zend_register_internal_class_ex(&ce, class_entry_ReflectionFunctionAbstract); + zval const_IS_DEPRECATED_value; + ZVAL_LONG(&const_IS_DEPRECATED_value, ZEND_ACC_DEPRECATED); + zend_string *const_IS_DEPRECATED_name = zend_string_init_interned("IS_DEPRECATED", sizeof("IS_DEPRECATED") - 1, 1); + zend_declare_class_constant_ex(class_entry, const_IS_DEPRECATED_name, &const_IS_DEPRECATED_value, ZEND_ACC_PUBLIC, NULL); + zend_string_release(const_IS_DEPRECATED_name); + return class_entry; } @@ -1267,6 +1273,42 @@ static zend_class_entry *register_class_ReflectionMethod(zend_class_entry *class INIT_CLASS_ENTRY(ce, "ReflectionMethod", class_ReflectionMethod_methods); class_entry = zend_register_internal_class_ex(&ce, class_entry_ReflectionFunctionAbstract); + zval const_IS_STATIC_value; + ZVAL_LONG(&const_IS_STATIC_value, ZEND_ACC_STATIC); + zend_string *const_IS_STATIC_name = zend_string_init_interned("IS_STATIC", sizeof("IS_STATIC") - 1, 1); + zend_declare_class_constant_ex(class_entry, const_IS_STATIC_name, &const_IS_STATIC_value, ZEND_ACC_PUBLIC, NULL); + zend_string_release(const_IS_STATIC_name); + + zval const_IS_PUBLIC_value; + ZVAL_LONG(&const_IS_PUBLIC_value, ZEND_ACC_PUBLIC); + zend_string *const_IS_PUBLIC_name = zend_string_init_interned("IS_PUBLIC", sizeof("IS_PUBLIC") - 1, 1); + zend_declare_class_constant_ex(class_entry, const_IS_PUBLIC_name, &const_IS_PUBLIC_value, ZEND_ACC_PUBLIC, NULL); + zend_string_release(const_IS_PUBLIC_name); + + zval const_IS_PROTECTED_value; + ZVAL_LONG(&const_IS_PROTECTED_value, ZEND_ACC_PROTECTED); + zend_string *const_IS_PROTECTED_name = zend_string_init_interned("IS_PROTECTED", sizeof("IS_PROTECTED") - 1, 1); + zend_declare_class_constant_ex(class_entry, const_IS_PROTECTED_name, &const_IS_PROTECTED_value, ZEND_ACC_PUBLIC, NULL); + zend_string_release(const_IS_PROTECTED_name); + + zval const_IS_PRIVATE_value; + ZVAL_LONG(&const_IS_PRIVATE_value, ZEND_ACC_PRIVATE); + zend_string *const_IS_PRIVATE_name = zend_string_init_interned("IS_PRIVATE", sizeof("IS_PRIVATE") - 1, 1); + zend_declare_class_constant_ex(class_entry, const_IS_PRIVATE_name, &const_IS_PRIVATE_value, ZEND_ACC_PUBLIC, NULL); + zend_string_release(const_IS_PRIVATE_name); + + zval const_IS_ABSTRACT_value; + ZVAL_LONG(&const_IS_ABSTRACT_value, ZEND_ACC_ABSTRACT); + zend_string *const_IS_ABSTRACT_name = zend_string_init_interned("IS_ABSTRACT", sizeof("IS_ABSTRACT") - 1, 1); + zend_declare_class_constant_ex(class_entry, const_IS_ABSTRACT_name, &const_IS_ABSTRACT_value, ZEND_ACC_PUBLIC, NULL); + zend_string_release(const_IS_ABSTRACT_name); + + zval const_IS_FINAL_value; + ZVAL_LONG(&const_IS_FINAL_value, ZEND_ACC_FINAL); + zend_string *const_IS_FINAL_name = zend_string_init_interned("IS_FINAL", sizeof("IS_FINAL") - 1, 1); + zend_declare_class_constant_ex(class_entry, const_IS_FINAL_name, &const_IS_FINAL_value, ZEND_ACC_PUBLIC, NULL); + zend_string_release(const_IS_FINAL_name); + zval property_class_default_value; ZVAL_UNDEF(&property_class_default_value); zend_string *property_class_name = zend_string_init("class", sizeof("class") - 1, 1); @@ -1285,6 +1327,30 @@ static zend_class_entry *register_class_ReflectionClass(zend_class_entry *class_ class_entry->ce_flags |= ZEND_ACC_NOT_SERIALIZABLE; zend_class_implements(class_entry, 1, class_entry_Reflector); + zval const_IS_IMPLICIT_ABSTRACT_value; + ZVAL_LONG(&const_IS_IMPLICIT_ABSTRACT_value, ZEND_ACC_IMPLICIT_ABSTRACT_CLASS); + zend_string *const_IS_IMPLICIT_ABSTRACT_name = zend_string_init_interned("IS_IMPLICIT_ABSTRACT", sizeof("IS_IMPLICIT_ABSTRACT") - 1, 1); + zend_declare_class_constant_ex(class_entry, const_IS_IMPLICIT_ABSTRACT_name, &const_IS_IMPLICIT_ABSTRACT_value, ZEND_ACC_PUBLIC, NULL); + zend_string_release(const_IS_IMPLICIT_ABSTRACT_name); + + zval const_IS_EXPLICIT_ABSTRACT_value; + ZVAL_LONG(&const_IS_EXPLICIT_ABSTRACT_value, ZEND_ACC_EXPLICIT_ABSTRACT_CLASS); + zend_string *const_IS_EXPLICIT_ABSTRACT_name = zend_string_init_interned("IS_EXPLICIT_ABSTRACT", sizeof("IS_EXPLICIT_ABSTRACT") - 1, 1); + zend_declare_class_constant_ex(class_entry, const_IS_EXPLICIT_ABSTRACT_name, &const_IS_EXPLICIT_ABSTRACT_value, ZEND_ACC_PUBLIC, NULL); + zend_string_release(const_IS_EXPLICIT_ABSTRACT_name); + + zval const_IS_FINAL_value; + ZVAL_LONG(&const_IS_FINAL_value, ZEND_ACC_FINAL); + zend_string *const_IS_FINAL_name = zend_string_init_interned("IS_FINAL", sizeof("IS_FINAL") - 1, 1); + zend_declare_class_constant_ex(class_entry, const_IS_FINAL_name, &const_IS_FINAL_value, ZEND_ACC_PUBLIC, NULL); + zend_string_release(const_IS_FINAL_name); + + zval const_IS_READONLY_value; + ZVAL_LONG(&const_IS_READONLY_value, ZEND_ACC_READONLY_CLASS); + zend_string *const_IS_READONLY_name = zend_string_init_interned("IS_READONLY", sizeof("IS_READONLY") - 1, 1); + zend_declare_class_constant_ex(class_entry, const_IS_READONLY_name, &const_IS_READONLY_value, ZEND_ACC_PUBLIC, NULL); + zend_string_release(const_IS_READONLY_name); + zval property_name_default_value; ZVAL_UNDEF(&property_name_default_value); zend_string *property_name_name = zend_string_init("name", sizeof("name") - 1, 1); @@ -1313,6 +1379,36 @@ static zend_class_entry *register_class_ReflectionProperty(zend_class_entry *cla class_entry->ce_flags |= ZEND_ACC_NOT_SERIALIZABLE; zend_class_implements(class_entry, 1, class_entry_Reflector); + zval const_IS_STATIC_value; + ZVAL_LONG(&const_IS_STATIC_value, ZEND_ACC_STATIC); + zend_string *const_IS_STATIC_name = zend_string_init_interned("IS_STATIC", sizeof("IS_STATIC") - 1, 1); + zend_declare_class_constant_ex(class_entry, const_IS_STATIC_name, &const_IS_STATIC_value, ZEND_ACC_PUBLIC, NULL); + zend_string_release(const_IS_STATIC_name); + + zval const_IS_READONLY_value; + ZVAL_LONG(&const_IS_READONLY_value, ZEND_ACC_READONLY); + zend_string *const_IS_READONLY_name = zend_string_init_interned("IS_READONLY", sizeof("IS_READONLY") - 1, 1); + zend_declare_class_constant_ex(class_entry, const_IS_READONLY_name, &const_IS_READONLY_value, ZEND_ACC_PUBLIC, NULL); + zend_string_release(const_IS_READONLY_name); + + zval const_IS_PUBLIC_value; + ZVAL_LONG(&const_IS_PUBLIC_value, ZEND_ACC_PUBLIC); + zend_string *const_IS_PUBLIC_name = zend_string_init_interned("IS_PUBLIC", sizeof("IS_PUBLIC") - 1, 1); + zend_declare_class_constant_ex(class_entry, const_IS_PUBLIC_name, &const_IS_PUBLIC_value, ZEND_ACC_PUBLIC, NULL); + zend_string_release(const_IS_PUBLIC_name); + + zval const_IS_PROTECTED_value; + ZVAL_LONG(&const_IS_PROTECTED_value, ZEND_ACC_PROTECTED); + zend_string *const_IS_PROTECTED_name = zend_string_init_interned("IS_PROTECTED", sizeof("IS_PROTECTED") - 1, 1); + zend_declare_class_constant_ex(class_entry, const_IS_PROTECTED_name, &const_IS_PROTECTED_value, ZEND_ACC_PUBLIC, NULL); + zend_string_release(const_IS_PROTECTED_name); + + zval const_IS_PRIVATE_value; + ZVAL_LONG(&const_IS_PRIVATE_value, ZEND_ACC_PRIVATE); + zend_string *const_IS_PRIVATE_name = zend_string_init_interned("IS_PRIVATE", sizeof("IS_PRIVATE") - 1, 1); + zend_declare_class_constant_ex(class_entry, const_IS_PRIVATE_name, &const_IS_PRIVATE_value, ZEND_ACC_PUBLIC, NULL); + zend_string_release(const_IS_PRIVATE_name); + zval property_name_default_value; ZVAL_UNDEF(&property_name_default_value); zend_string *property_name_name = zend_string_init("name", sizeof("name") - 1, 1); @@ -1337,6 +1433,30 @@ static zend_class_entry *register_class_ReflectionClassConstant(zend_class_entry class_entry->ce_flags |= ZEND_ACC_NOT_SERIALIZABLE; zend_class_implements(class_entry, 1, class_entry_Reflector); + zval const_IS_PUBLIC_value; + ZVAL_LONG(&const_IS_PUBLIC_value, ZEND_ACC_PUBLIC); + zend_string *const_IS_PUBLIC_name = zend_string_init_interned("IS_PUBLIC", sizeof("IS_PUBLIC") - 1, 1); + zend_declare_class_constant_ex(class_entry, const_IS_PUBLIC_name, &const_IS_PUBLIC_value, ZEND_ACC_PUBLIC, NULL); + zend_string_release(const_IS_PUBLIC_name); + + zval const_IS_PROTECTED_value; + ZVAL_LONG(&const_IS_PROTECTED_value, ZEND_ACC_PROTECTED); + zend_string *const_IS_PROTECTED_name = zend_string_init_interned("IS_PROTECTED", sizeof("IS_PROTECTED") - 1, 1); + zend_declare_class_constant_ex(class_entry, const_IS_PROTECTED_name, &const_IS_PROTECTED_value, ZEND_ACC_PUBLIC, NULL); + zend_string_release(const_IS_PROTECTED_name); + + zval const_IS_PRIVATE_value; + ZVAL_LONG(&const_IS_PRIVATE_value, ZEND_ACC_PRIVATE); + zend_string *const_IS_PRIVATE_name = zend_string_init_interned("IS_PRIVATE", sizeof("IS_PRIVATE") - 1, 1); + zend_declare_class_constant_ex(class_entry, const_IS_PRIVATE_name, &const_IS_PRIVATE_value, ZEND_ACC_PUBLIC, NULL); + zend_string_release(const_IS_PRIVATE_name); + + zval const_IS_FINAL_value; + ZVAL_LONG(&const_IS_FINAL_value, ZEND_ACC_FINAL); + zend_string *const_IS_FINAL_name = zend_string_init_interned("IS_FINAL", sizeof("IS_FINAL") - 1, 1); + zend_declare_class_constant_ex(class_entry, const_IS_FINAL_name, &const_IS_FINAL_value, ZEND_ACC_PUBLIC, NULL); + zend_string_release(const_IS_FINAL_name); + zval property_name_default_value; ZVAL_UNDEF(&property_name_default_value); zend_string *property_name_name = zend_string_init("name", sizeof("name") - 1, 1); @@ -1468,6 +1588,12 @@ static zend_class_entry *register_class_ReflectionAttribute(zend_class_entry *cl class_entry->ce_flags |= ZEND_ACC_NOT_SERIALIZABLE; zend_class_implements(class_entry, 1, class_entry_Reflector); + zval const_IS_INSTANCEOF_value; + ZVAL_LONG(&const_IS_INSTANCEOF_value, REFLECTION_ATTRIBUTE_IS_INSTANCEOF); + zend_string *const_IS_INSTANCEOF_name = zend_string_init_interned("IS_INSTANCEOF", sizeof("IS_INSTANCEOF") - 1, 1); + zend_declare_class_constant_ex(class_entry, const_IS_INSTANCEOF_name, &const_IS_INSTANCEOF_value, ZEND_ACC_PUBLIC, NULL); + zend_string_release(const_IS_INSTANCEOF_name); + return class_entry; }