@@ -115,15 +115,18 @@ void zend_exception_set_previous(zend_object *exception, zend_object *add_previo
115
115
ex = & zv ;
116
116
do {
117
117
ancestor = zend_read_property_ex (i_get_exception_base (add_previous ), add_previous , ZSTR_KNOWN (ZEND_STR_PREVIOUS ), 1 , & rv );
118
+ ZVAL_DEREF (ancestor );
118
119
while (Z_TYPE_P (ancestor ) == IS_OBJECT ) {
119
120
if (Z_OBJ_P (ancestor ) == Z_OBJ_P (ex )) {
120
121
OBJ_RELEASE (add_previous );
121
122
return ;
122
123
}
123
124
ancestor = zend_read_property_ex (i_get_exception_base (Z_OBJ_P (ancestor )), Z_OBJ_P (ancestor ), ZSTR_KNOWN (ZEND_STR_PREVIOUS ), 1 , & rv );
125
+ ZVAL_DEREF (ancestor );
124
126
}
125
127
base_ce = i_get_exception_base (Z_OBJ_P (ex ));
126
128
previous = zend_read_property_ex (base_ce , Z_OBJ_P (ex ), ZSTR_KNOWN (ZEND_STR_PREVIOUS ), 1 , & rv );
129
+ ZVAL_DEREF (previous );
127
130
if (Z_TYPE_P (previous ) == IS_NULL ) {
128
131
zend_update_property_ex (base_ce , Z_OBJ_P (ex ), ZSTR_KNOWN (ZEND_STR_PREVIOUS ), & pv );
129
132
GC_DELREF (add_previous );
@@ -626,6 +629,7 @@ ZEND_METHOD(Exception, getTraceAsString)
626
629
RETURN_THROWS ();
627
630
}
628
631
632
+ ZVAL_DEREF (trace );
629
633
/* Type should be guaranteed by property type. */
630
634
ZEND_ASSERT (Z_TYPE_P (trace ) == IS_ARRAY );
631
635
RETURN_NEW_STR (zend_trace_to_string (Z_ARRVAL_P (trace ), /* include_main */ true));
@@ -639,7 +643,7 @@ ZEND_METHOD(Exception, getPrevious)
639
643
640
644
ZEND_PARSE_PARAMETERS_NONE ();
641
645
642
- ZVAL_COPY (return_value , GET_PROPERTY_SILENT (ZEND_THIS , ZEND_STR_PREVIOUS ));
646
+ ZVAL_COPY_DEREF (return_value , GET_PROPERTY_SILENT (ZEND_THIS , ZEND_STR_PREVIOUS ));
643
647
} /* }}} */
644
648
645
649
/* {{{ Obtain the string representation of the Exception object */
@@ -719,21 +723,23 @@ ZEND_METHOD(Exception, __toString)
719
723
720
724
Z_PROTECT_RECURSION_P (exception );
721
725
exception = GET_PROPERTY (exception , ZEND_STR_PREVIOUS );
722
- if (exception && Z_TYPE_P (exception ) == IS_OBJECT && Z_IS_RECURSIVE_P (exception )) {
726
+ ZVAL_DEREF (exception );
727
+ if (Z_TYPE_P (exception ) == IS_OBJECT && Z_IS_RECURSIVE_P (exception )) {
723
728
break ;
724
729
}
725
730
}
726
731
zend_string_release_ex (fname , 0 );
727
732
728
733
exception = ZEND_THIS ;
729
734
/* Reset apply counts */
730
- while (exception && Z_TYPE_P (exception ) == IS_OBJECT && (base_ce = i_get_exception_base (Z_OBJ_P (exception ))) && instanceof_function (Z_OBJCE_P (exception ), base_ce )) {
735
+ while (Z_TYPE_P (exception ) == IS_OBJECT && (base_ce = i_get_exception_base (Z_OBJ_P (exception ))) && instanceof_function (Z_OBJCE_P (exception ), base_ce )) {
731
736
if (Z_IS_RECURSIVE_P (exception )) {
732
737
Z_UNPROTECT_RECURSION_P (exception );
733
738
} else {
734
739
break ;
735
740
}
736
741
exception = GET_PROPERTY (exception , ZEND_STR_PREVIOUS );
742
+ ZVAL_DEREF (exception );
737
743
}
738
744
739
745
exception = ZEND_THIS ;
0 commit comments