@@ -293,10 +293,7 @@ ZEND_METHOD(exception, __construct)
293
293
#define CHECK_EXC_TYPE (name , type ) \
294
294
pvalue = zend_read_property(i_get_exception_base(object), (object), name, sizeof(name) - 1, 1, &value); \
295
295
if (Z_TYPE_P(pvalue) != IS_NULL && Z_TYPE_P(pvalue) != type) { \
296
- zval tmp; \
297
- ZVAL_STRINGL(&tmp, name, sizeof(name) - 1); \
298
- Z_OBJ_HANDLER_P(object, unset_property)(object, &tmp, NULL); \
299
- zval_ptr_dtor(&tmp); \
296
+ zend_unset_property(i_get_exception_base(object), object, name, sizeof(name)-1); \
300
297
}
301
298
302
299
ZEND_METHOD (exception , __wakeup )
@@ -309,7 +306,12 @@ ZEND_METHOD(exception, __wakeup)
309
306
CHECK_EXC_TYPE ("file" , IS_STRING );
310
307
CHECK_EXC_TYPE ("line" , IS_LONG );
311
308
CHECK_EXC_TYPE ("trace" , IS_ARRAY );
312
- CHECK_EXC_TYPE ("previous" , IS_OBJECT );
309
+ pvalue = zend_read_property (i_get_exception_base (object ), object , "previous" , sizeof ("previous" )- 1 , 1 , & value );
310
+ if (pvalue && Z_TYPE_P (pvalue ) != IS_NULL && (Z_TYPE_P (pvalue ) != IS_OBJECT ||
311
+ !instanceof_function (Z_OBJCE_P (pvalue ), i_get_exception_base (object )) ||
312
+ pvalue == object )) {
313
+ zend_unset_property (i_get_exception_base (object ), object , "previous" , sizeof ("previous" )- 1 );
314
+ }
313
315
}
314
316
/* }}} */
315
317
@@ -771,10 +773,24 @@ ZEND_METHOD(exception, __toString)
771
773
zend_string_release (file );
772
774
zval_ptr_dtor (& trace );
773
775
776
+ Z_OBJPROP_P (exception )-> u .v .nApplyCount ++ ;
774
777
exception = GET_PROPERTY (exception , "previous" );
778
+ if (exception && Z_TYPE_P (exception ) == IS_OBJECT && Z_OBJPROP_P (exception )-> u .v .nApplyCount > 0 ) {
779
+ exception = NULL ;
780
+ }
775
781
}
776
782
zval_dtor (& fname );
777
783
784
+ /* Reset apply counts */
785
+ while (exception && Z_TYPE_P (exception ) == IS_OBJECT && (base_ce = i_get_exception_base (exception )) && instanceof_function (Z_OBJCE_P (exception ), base_ce )) {
786
+ if (Z_OBJPROP_P (exception )-> u .v .nApplyCount ) {
787
+ Z_OBJPROP_P (exception )-> u .v .nApplyCount -- ;
788
+ } else {
789
+ break ;
790
+ }
791
+ exception = GET_PROPERTY (exception , "previous" );
792
+ }
793
+
778
794
exception = getThis ();
779
795
base_ce = i_get_exception_base (exception );
780
796
0 commit comments