@@ -317,27 +317,31 @@ static void free_internal_attribute(zval *v)
317317 pefree (Z_PTR_P (v ), 1 );
318318}
319319
320- ZEND_API zend_internal_attribute * zend_internal_attribute_register (zend_class_entry * ce , uint32_t flags )
320+ ZEND_API zend_internal_attribute * zend_internal_attribute_register (zend_class_entry * ce )
321321{
322322 zend_internal_attribute * internal_attr ;
323+ zend_attribute * attr ;
323324
324325 if (ce -> type != ZEND_INTERNAL_CLASS ) {
325326 zend_error_noreturn (E_ERROR , "Only internal classes can be registered as compiler attribute" );
326327 }
327328
328- internal_attr = pemalloc (sizeof (zend_internal_attribute ), 1 );
329- internal_attr -> ce = ce ;
330- internal_attr -> flags = flags ;
331- internal_attr -> validator = NULL ;
329+ ZEND_HASH_FOREACH_PTR (ce -> attributes , attr ) {
330+ if (zend_string_equals (attr -> name , zend_ce_attribute -> name )) {
331+ internal_attr = pemalloc (sizeof (zend_internal_attribute ), 1 );
332+ internal_attr -> ce = ce ;
333+ internal_attr -> flags = Z_LVAL (attr -> args [0 ].value );
334+ internal_attr -> validator = NULL ;
332335
333- zend_string * lcname = zend_string_tolower_ex (ce -> name , 1 );
336+ zend_string * lcname = zend_string_tolower_ex (ce -> name , 1 );
337+ zend_hash_update_ptr (& internal_attributes , lcname , internal_attr );
338+ zend_string_release (lcname );
334339
335- zend_hash_update_ptr (& internal_attributes , lcname , internal_attr );
336- zend_attribute * attr = zend_add_class_attribute (ce , zend_ce_attribute -> name , 1 );
337- ZVAL_LONG (& attr -> args [0 ].value , flags );
338- zend_string_release (lcname );
340+ return internal_attr ;
341+ }
342+ } ZEND_HASH_FOREACH_END ();
339343
340- return internal_attr ;
344+ zend_error_noreturn ( E_ERROR , "Classes must be first marked as attribute before being able to be registered as internal attribute class" ) ;
341345}
342346
343347ZEND_API zend_internal_attribute * zend_internal_attribute_get (zend_string * lcname )
@@ -352,27 +356,18 @@ void zend_register_attribute_ce(void)
352356 zend_hash_init (& internal_attributes , 8 , NULL , free_internal_attribute , 1 );
353357
354358 zend_ce_attribute = register_class_Attribute ();
355- attr = zend_internal_attribute_register (zend_ce_attribute , ZEND_ATTRIBUTE_TARGET_CLASS );
359+ attr = zend_internal_attribute_register (zend_ce_attribute );
356360 attr -> validator = validate_attribute ;
357361
358- zend_declare_class_constant_long (zend_ce_attribute , ZEND_STRL ("TARGET_CLASS" ), ZEND_ATTRIBUTE_TARGET_CLASS );
359- zend_declare_class_constant_long (zend_ce_attribute , ZEND_STRL ("TARGET_FUNCTION" ), ZEND_ATTRIBUTE_TARGET_FUNCTION );
360- zend_declare_class_constant_long (zend_ce_attribute , ZEND_STRL ("TARGET_METHOD" ), ZEND_ATTRIBUTE_TARGET_METHOD );
361- zend_declare_class_constant_long (zend_ce_attribute , ZEND_STRL ("TARGET_PROPERTY" ), ZEND_ATTRIBUTE_TARGET_PROPERTY );
362- zend_declare_class_constant_long (zend_ce_attribute , ZEND_STRL ("TARGET_CLASS_CONSTANT" ), ZEND_ATTRIBUTE_TARGET_CLASS_CONST );
363- zend_declare_class_constant_long (zend_ce_attribute , ZEND_STRL ("TARGET_PARAMETER" ), ZEND_ATTRIBUTE_TARGET_PARAMETER );
364- zend_declare_class_constant_long (zend_ce_attribute , ZEND_STRL ("TARGET_ALL" ), ZEND_ATTRIBUTE_TARGET_ALL );
365- zend_declare_class_constant_long (zend_ce_attribute , ZEND_STRL ("IS_REPEATABLE" ), ZEND_ATTRIBUTE_IS_REPEATABLE );
366-
367362 zend_ce_return_type_will_change_attribute = register_class_ReturnTypeWillChange ();
368- zend_internal_attribute_register (zend_ce_return_type_will_change_attribute , ZEND_ATTRIBUTE_TARGET_METHOD );
363+ zend_internal_attribute_register (zend_ce_return_type_will_change_attribute );
369364
370365 zend_ce_allow_dynamic_properties = register_class_AllowDynamicProperties ();
371- attr = zend_internal_attribute_register (zend_ce_allow_dynamic_properties , ZEND_ATTRIBUTE_TARGET_CLASS );
366+ attr = zend_internal_attribute_register (zend_ce_allow_dynamic_properties );
372367 attr -> validator = validate_allow_dynamic_properties ;
373368
374369 zend_ce_sensitive_parameter = register_class_SensitiveParameter ();
375- attr = zend_internal_attribute_register (zend_ce_sensitive_parameter , ZEND_ATTRIBUTE_TARGET_PARAMETER );
370+ zend_internal_attribute_register (zend_ce_sensitive_parameter );
376371
377372 memcpy (& attributes_object_handlers_sensitive_parameter_value , & std_object_handlers , sizeof (zend_object_handlers ));
378373 attributes_object_handlers_sensitive_parameter_value .get_properties_for = attributes_sensitive_parameter_value_get_properties_for ;
0 commit comments