@@ -217,18 +217,26 @@ static void _free_function(zend_function *fptr) /* {{{ */
217217}
218218/* }}} */ 
219219
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+ 
220232static  void  reflection_free_objects_storage (zend_object  * object ) /* {{{ */ 
221233{
222234	reflection_object  * intern  =  reflection_object_from_obj (object );
223- 	parameter_reference  * reference ;
224- 	property_reference  * prop_reference ;
225235
226236	if  (intern -> ptr ) {
227237		switch  (intern -> ref_type ) {
228238		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 );
232240			break ;
233241		case  REF_TYPE_TYPE :
234242		{
@@ -243,9 +251,7 @@ static void reflection_free_objects_storage(zend_object *object) /* {{{ */
243251			_free_function (intern -> ptr );
244252			break ;
245253		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 );
249255			break ;
250256		case  REF_TYPE_ATTRIBUTE : {
251257			attribute_reference  * attr_ref  =  intern -> ptr ;
@@ -2546,6 +2552,10 @@ ZEND_METHOD(ReflectionParameter, __construct)
25462552		}
25472553	}
25482554
2555+ 	if  (intern -> ptr ) {
2556+ 		reflection_free_parameter_reference (intern -> ptr );
2557+ 	}
2558+ 
25492559	ref  =  (parameter_reference * ) emalloc (sizeof (parameter_reference ));
25502560	ref -> arg_info  =  & arg_info [position ];
25512561	ref -> offset  =  (uint32_t )position ;
@@ -2555,11 +2565,15 @@ ZEND_METHOD(ReflectionParameter, __construct)
25552565	intern -> ptr  =  ref ;
25562566	intern -> ref_type  =  REF_TYPE_PARAMETER ;
25572567	intern -> ce  =  ce ;
2568+ 	zval_ptr_dtor (& intern -> obj );
25582569	if  (reference  &&  is_closure ) {
25592570		ZVAL_COPY_VALUE (& intern -> obj , reference );
2571+ 	} else  {
2572+ 		ZVAL_UNDEF (& intern -> obj );
25602573	}
25612574
25622575	prop_name  =  reflection_prop_name (object );
2576+ 	zval_ptr_dtor (prop_name );
25632577	if  (has_internal_arg_info (fptr )) {
25642578		ZVAL_STRING (prop_name , ((zend_internal_arg_info * )arg_info )[position ].name );
25652579	} else  {
@@ -4015,10 +4029,12 @@ static void reflection_class_object_ctor(INTERNAL_FUNCTION_PARAMETERS, int is_ob
40154029	object  =  ZEND_THIS ;
40164030	intern  =  Z_REFLECTION_P (object );
40174031
4032+ 	/* Note: class entry name is interned, no need to destroy them */ 
40184033	if  (arg_obj ) {
40194034		ZVAL_STR_COPY (reflection_prop_name (object ), arg_obj -> ce -> name );
40204035		intern -> ptr  =  arg_obj -> ce ;
40214036		if  (is_object ) {
4037+ 			zval_ptr_dtor (& intern -> obj );
40224038			ZVAL_OBJ_COPY (& intern -> obj , arg_obj );
40234039		}
40244040	} else  {
@@ -5510,13 +5526,20 @@ ZEND_METHOD(ReflectionProperty, __construct)
55105526		}
55115527	}
55125528
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 */ 
55145533	if  (dynam_prop  ==  0 ) {
55155534		ZVAL_STR_COPY (reflection_prop_class (object ), property_info -> ce -> name );
55165535	} else  {
55175536		ZVAL_STR_COPY (reflection_prop_class (object ), ce -> name );
55185537	}
55195538
5539+ 	if  (intern -> ptr ) {
5540+ 		reflection_free_property_reference (intern -> ptr );
5541+ 	}
5542+ 
55205543	reference  =  (property_reference * ) emalloc (sizeof (property_reference ));
55215544	reference -> prop  =  dynam_prop  ? NULL  : property_info ;
55225545	reference -> unmangled_name  =  zend_string_copy (name );
@@ -5949,7 +5972,9 @@ ZEND_METHOD(ReflectionExtension, __construct)
59495972		RETURN_THROWS ();
59505973	}
59515974	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 );
59535978	intern -> ptr  =  module ;
59545979	intern -> ref_type  =  REF_TYPE_OTHER ;
59555980	intern -> ce  =  NULL ;
0 commit comments