summaryrefslogtreecommitdiff
path: root/Zend/zend_objects.c
diff options
context:
space:
mode:
authorMarcus Boerger <helly@php.net>2008-08-14 10:24:52 +0000
committerMarcus Boerger <helly@php.net>2008-08-14 10:24:52 +0000
commit32f9d0e180af2d809bf70e40850fc75e6d663945 (patch)
treed5ad09ae92ff108bf761c268b543dc2a0235e4b2 /Zend/zend_objects.c
parent261b4d0965bf0011c677c2ed431de77719a9cb46 (diff)
downloadphp-git-32f9d0e180af2d809bf70e40850fc75e6d663945.tar.gz
- MFH Improve exception linking
Diffstat (limited to 'Zend/zend_objects.c')
-rw-r--r--Zend/zend_objects.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/Zend/zend_objects.c b/Zend/zend_objects.c
index 3e88eeefef..12aebc7c56 100644
--- a/Zend/zend_objects.c
+++ b/Zend/zend_objects.c
@@ -53,7 +53,6 @@ ZEND_API void zend_objects_destroy_object(zend_object *object, zend_object_handl
if (destructor) {
zval *obj;
- zval *old_exception;
if (destructor->op_array.fn_flags & (ZEND_ACC_PRIVATE|ZEND_ACC_PROTECTED)) {
if (destructor->op_array.fn_flags & ZEND_ACC_PRIVATE) {
@@ -96,10 +95,12 @@ ZEND_API void zend_objects_destroy_object(zend_object *object, zend_object_handl
* For example, if an exception was thrown in a function and when the function's
* local variable destruction results in a destructor being called.
*/
- old_exception = EG(exception);
- EG(exception) = NULL;
+ if (EG(exception) && Z_OBJ_HANDLE_P(EG(exception)) == handle) {
+ zend_error(E_ERROR, "Attempt to destruct pending exception");
+ }
+ zend_exception_save(TSRMLS_C);
zend_call_method_with_0_params(&obj, object->ce, &destructor, ZEND_DESTRUCTOR_FUNC_NAME, NULL);
- zend_exception_set_previous(old_exception TSRMLS_CC);
+ zend_exception_restore(TSRMLS_C);
zval_ptr_dtor(&obj);
}
}