@@ -217,18 +217,26 @@ static void _free_function(zend_function *fptr) /* {{{ */
217
217
}
218
218
/* }}} */
219
219
220
+ static void reflection_free_property_reference (property_reference * reference )
221
+ {
222
+ zend_string_release_ex (reference -> unmangled_name , 0 );
223
+ efree (reference );
224
+ }
225
+
226
+ static void reflection_free_parameter_reference (parameter_reference * reference )
227
+ {
228
+ _free_function (reference -> fptr );
229
+ efree (reference );
230
+ }
231
+
220
232
static void reflection_free_objects_storage (zend_object * object ) /* {{{ */
221
233
{
222
234
reflection_object * intern = reflection_object_from_obj (object );
223
- parameter_reference * reference ;
224
- property_reference * prop_reference ;
225
235
226
236
if (intern -> ptr ) {
227
237
switch (intern -> ref_type ) {
228
238
case REF_TYPE_PARAMETER :
229
- reference = (parameter_reference * )intern -> ptr ;
230
- _free_function (reference -> fptr );
231
- efree (intern -> ptr );
239
+ reflection_free_parameter_reference (intern -> ptr );
232
240
break ;
233
241
case REF_TYPE_TYPE :
234
242
{
@@ -243,9 +251,7 @@ static void reflection_free_objects_storage(zend_object *object) /* {{{ */
243
251
_free_function (intern -> ptr );
244
252
break ;
245
253
case REF_TYPE_PROPERTY :
246
- prop_reference = (property_reference * )intern -> ptr ;
247
- zend_string_release_ex (prop_reference -> unmangled_name , 0 );
248
- efree (intern -> ptr );
254
+ reflection_free_property_reference (intern -> ptr );
249
255
break ;
250
256
case REF_TYPE_ATTRIBUTE : {
251
257
attribute_reference * attr_ref = intern -> ptr ;
@@ -2546,6 +2552,10 @@ ZEND_METHOD(ReflectionParameter, __construct)
2546
2552
}
2547
2553
}
2548
2554
2555
+ if (intern -> ptr ) {
2556
+ reflection_free_parameter_reference (intern -> ptr );
2557
+ }
2558
+
2549
2559
ref = (parameter_reference * ) emalloc (sizeof (parameter_reference ));
2550
2560
ref -> arg_info = & arg_info [position ];
2551
2561
ref -> offset = (uint32_t )position ;
@@ -2555,11 +2565,15 @@ ZEND_METHOD(ReflectionParameter, __construct)
2555
2565
intern -> ptr = ref ;
2556
2566
intern -> ref_type = REF_TYPE_PARAMETER ;
2557
2567
intern -> ce = ce ;
2568
+ zval_ptr_dtor (& intern -> obj );
2558
2569
if (reference && is_closure ) {
2559
2570
ZVAL_COPY_VALUE (& intern -> obj , reference );
2571
+ } else {
2572
+ ZVAL_UNDEF (& intern -> obj );
2560
2573
}
2561
2574
2562
2575
prop_name = reflection_prop_name (object );
2576
+ zval_ptr_dtor (prop_name );
2563
2577
if (has_internal_arg_info (fptr )) {
2564
2578
ZVAL_STRING (prop_name , ((zend_internal_arg_info * )arg_info )[position ].name );
2565
2579
} else {
@@ -4015,10 +4029,12 @@ static void reflection_class_object_ctor(INTERNAL_FUNCTION_PARAMETERS, int is_ob
4015
4029
object = ZEND_THIS ;
4016
4030
intern = Z_REFLECTION_P (object );
4017
4031
4032
+ /* Note: class entry name is interned, no need to destroy them */
4018
4033
if (arg_obj ) {
4019
4034
ZVAL_STR_COPY (reflection_prop_name (object ), arg_obj -> ce -> name );
4020
4035
intern -> ptr = arg_obj -> ce ;
4021
4036
if (is_object ) {
4037
+ zval_ptr_dtor (& intern -> obj );
4022
4038
ZVAL_OBJ_COPY (& intern -> obj , arg_obj );
4023
4039
}
4024
4040
} else {
@@ -5510,13 +5526,20 @@ ZEND_METHOD(ReflectionProperty, __construct)
5510
5526
}
5511
5527
}
5512
5528
5513
- ZVAL_STR_COPY (reflection_prop_name (object ), name );
5529
+ zval * prop_name = reflection_prop_name (object );
5530
+ zval_ptr_dtor (prop_name );
5531
+ ZVAL_STR_COPY (prop_name , name );
5532
+ /* Note: class name are always interned, no need to destroy them */
5514
5533
if (dynam_prop == 0 ) {
5515
5534
ZVAL_STR_COPY (reflection_prop_class (object ), property_info -> ce -> name );
5516
5535
} else {
5517
5536
ZVAL_STR_COPY (reflection_prop_class (object ), ce -> name );
5518
5537
}
5519
5538
5539
+ if (intern -> ptr ) {
5540
+ reflection_free_property_reference (intern -> ptr );
5541
+ }
5542
+
5520
5543
reference = (property_reference * ) emalloc (sizeof (property_reference ));
5521
5544
reference -> prop = dynam_prop ? NULL : property_info ;
5522
5545
reference -> unmangled_name = zend_string_copy (name );
@@ -5949,7 +5972,9 @@ ZEND_METHOD(ReflectionExtension, __construct)
5949
5972
RETURN_THROWS ();
5950
5973
}
5951
5974
free_alloca (lcname , use_heap );
5952
- ZVAL_STRING (reflection_prop_name (object ), module -> name );
5975
+ zval * prop_name = reflection_prop_name (object );
5976
+ zval_ptr_dtor (prop_name );
5977
+ ZVAL_STRING (prop_name , module -> name );
5953
5978
intern -> ptr = module ;
5954
5979
intern -> ref_type = REF_TYPE_OTHER ;
5955
5980
intern -> ce = NULL ;
0 commit comments