From db6e60e744ab0d98d10b74cff3e897d5ff2f7574 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 21 May 2021 11:39:22 +0200 Subject: [PATCH] Pass flags to #[Attribute] on internal attributes While the specified restriction was checked, the #[Attribute] attribute did not specify the flags parameter, so that Reflection returned incorrect information. In particular, Attribute itself has a CLASS target, not an ALL target. --- .../attributes/007_self_reflect_attribute.phpt | 6 ++++-- Zend/zend_attributes.c | 17 +++++++++-------- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/Zend/tests/attributes/007_self_reflect_attribute.phpt b/Zend/tests/attributes/007_self_reflect_attribute.phpt index b95542f87eb..9d3c8937f6f 100644 --- a/Zend/tests/attributes/007_self_reflect_attribute.phpt +++ b/Zend/tests/attributes/007_self_reflect_attribute.phpt @@ -12,12 +12,14 @@ foreach ($attributes as $attribute) { $a = $attribute->newInstance(); var_dump(get_class($a)); - var_dump($a->flags == Attribute::TARGET_ALL); + var_dump($a->flags == Attribute::TARGET_CLASS); } ?> --EXPECT-- string(9) "Attribute" -array(0) { +array(1) { + [0]=> + int(1) } string(9) "Attribute" bool(true) diff --git a/Zend/zend_attributes.c b/Zend/zend_attributes.c index f8d384301af..58cd813f7df 100644 --- a/Zend/zend_attributes.c +++ b/Zend/zend_attributes.c @@ -235,24 +235,25 @@ static void free_internal_attribute(zval *v) ZEND_API zend_internal_attribute *zend_internal_attribute_register(zend_class_entry *ce, uint32_t flags) { - zend_internal_attribute *attr; + zend_internal_attribute *internal_attr; if (ce->type != ZEND_INTERNAL_CLASS) { zend_error_noreturn(E_ERROR, "Only internal classes can be registered as compiler attribute"); } - attr = pemalloc(sizeof(zend_internal_attribute), 1); - attr->ce = ce; - attr->flags = flags; - attr->validator = NULL; + internal_attr = pemalloc(sizeof(zend_internal_attribute), 1); + internal_attr->ce = ce; + internal_attr->flags = flags; + internal_attr->validator = NULL; zend_string *lcname = zend_string_tolower_ex(ce->name, 1); - zend_hash_update_ptr(&internal_attributes, lcname, attr); - zend_add_class_attribute(ce, zend_ce_attribute->name, 0); + zend_hash_update_ptr(&internal_attributes, lcname, internal_attr); + zend_attribute *attr = zend_add_class_attribute(ce, zend_ce_attribute->name, 1); + ZVAL_LONG(&attr->args[0].value, flags); zend_string_release(lcname); - return attr; + return internal_attr; } ZEND_API zend_internal_attribute *zend_internal_attribute_get(zend_string *lcname)