@@ -317,27 +317,39 @@ static void free_internal_attribute(zval *v)
317
317
pefree (Z_PTR_P (v ), 1 );
318
318
}
319
319
320
- ZEND_API zend_internal_attribute * zend_internal_attribute_register (zend_class_entry * ce , uint32_t flags )
320
+ ZEND_API zend_internal_attribute * zend_mark_internal_attribute (zend_class_entry * ce )
321
321
{
322
322
zend_internal_attribute * internal_attr ;
323
+ zend_attribute * attr ;
323
324
324
325
if (ce -> type != ZEND_INTERNAL_CLASS ) {
325
326
zend_error_noreturn (E_ERROR , "Only internal classes can be registered as compiler attribute" );
326
327
}
327
328
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 ;
332
335
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 );
334
339
335
- zend_hash_update_ptr (& internal_attributes , lcname , internal_attr );
340
+ return internal_attr ;
341
+ }
342
+ } ZEND_HASH_FOREACH_END ();
343
+
344
+ zend_error_noreturn (E_ERROR , "Classes must be first marked as attribute before being able to be registered as internal attribute class" );
345
+ }
346
+
347
+ ZEND_API zend_internal_attribute * zend_internal_attribute_register (zend_class_entry * ce , uint32_t flags )
348
+ {
336
349
zend_attribute * attr = zend_add_class_attribute (ce , zend_ce_attribute -> name , 1 );
337
350
ZVAL_LONG (& attr -> args [0 ].value , flags );
338
- zend_string_release (lcname );
339
351
340
- return internal_attr ;
352
+ return zend_mark_internal_attribute ( ce ) ;
341
353
}
342
354
343
355
ZEND_API zend_internal_attribute * zend_internal_attribute_get (zend_string * lcname )
@@ -352,32 +364,23 @@ void zend_register_attribute_ce(void)
352
364
zend_hash_init (& internal_attributes , 8 , NULL , free_internal_attribute , 1 );
353
365
354
366
zend_ce_attribute = register_class_Attribute ();
355
- attr = zend_internal_attribute_register (zend_ce_attribute , ZEND_ATTRIBUTE_TARGET_CLASS );
367
+ attr = zend_mark_internal_attribute (zend_ce_attribute );
356
368
attr -> validator = validate_attribute ;
357
369
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
-
367
370
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 );
371
+ zend_mark_internal_attribute (zend_ce_return_type_will_change_attribute );
369
372
370
373
zend_ce_allow_dynamic_properties = register_class_AllowDynamicProperties ();
371
- attr = zend_internal_attribute_register (zend_ce_allow_dynamic_properties , ZEND_ATTRIBUTE_TARGET_CLASS );
374
+ attr = zend_mark_internal_attribute (zend_ce_allow_dynamic_properties );
372
375
attr -> validator = validate_allow_dynamic_properties ;
373
376
374
377
zend_ce_sensitive_parameter = register_class_SensitiveParameter ();
375
- attr = zend_internal_attribute_register (zend_ce_sensitive_parameter , ZEND_ATTRIBUTE_TARGET_PARAMETER );
378
+ zend_mark_internal_attribute (zend_ce_sensitive_parameter );
376
379
377
380
memcpy (& attributes_object_handlers_sensitive_parameter_value , & std_object_handlers , sizeof (zend_object_handlers ));
378
381
attributes_object_handlers_sensitive_parameter_value .get_properties_for = attributes_sensitive_parameter_value_get_properties_for ;
379
382
380
- /* This is not an actual attribute, thus the zend_internal_attribute_register () call is missing. */
383
+ /* This is not an actual attribute, thus the zend_mark_internal_attribute () call is missing. */
381
384
zend_ce_sensitive_parameter_value = register_class_SensitiveParameterValue ();
382
385
zend_ce_sensitive_parameter_value -> create_object = attributes_sensitive_parameter_value_new ;
383
386
}
0 commit comments