From: Xinchen Hui Date: Sun, 12 Jun 2016 07:17:03 +0000 (+0800) Subject: EG(fake_scope) was always set to NULL wrongly X-Git-Tag: php-7.1.0alpha3~42^2~26 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ae3be78ce8f73a3b4b80a4eb81eddd6b3d019bb1;p=php EG(fake_scope) was always set to NULL wrongly --- diff --git a/Zend/zend_objects.c b/Zend/zend_objects.c index b5f19b3045..1e358996ed 100644 --- a/Zend/zend_objects.c +++ b/Zend/zend_objects.c @@ -91,9 +91,8 @@ ZEND_API void zend_objects_destroy_object(zend_object *object) if (destructor) { zend_object *old_exception; zval obj; - zend_class_entry *orig_fake_scope = NULL; + zend_class_entry *orig_fake_scope; - EG(fake_scope) = NULL; if (destructor->op_array.fn_flags & (ZEND_ACC_PRIVATE|ZEND_ACC_PROTECTED)) { if (destructor->op_array.fn_flags & ZEND_ACC_PRIVATE) { /* Ensure that if we're calling a private function, we're allowed to do so. @@ -106,14 +105,12 @@ ZEND_API void zend_objects_destroy_object(zend_object *object) "Call to private %s::__destruct() from context '%s'", ZSTR_VAL(object->ce->name), scope ? ZSTR_VAL(scope->name) : ""); - EG(fake_scope) = orig_fake_scope; return; } } else { zend_error(E_WARNING, "Call to private %s::__destruct() from context '' during shutdown ignored", ZSTR_VAL(object->ce->name)); - EG(fake_scope) = orig_fake_scope; return; } } else { @@ -127,21 +124,19 @@ ZEND_API void zend_objects_destroy_object(zend_object *object) "Call to protected %s::__destruct() from context '%s'", ZSTR_VAL(object->ce->name), scope ? ZSTR_VAL(scope->name) : ""); - EG(fake_scope) = orig_fake_scope; return; } } else { zend_error(E_WARNING, "Call to protected %s::__destruct() from context '' during shutdown ignored", ZSTR_VAL(object->ce->name)); - EG(fake_scope) = orig_fake_scope; return; } } } + GC_REFCOUNT(object)++; ZVAL_OBJ(&obj, object); - Z_ADDREF(obj); /* Make sure that destructors are protected from previously thrown exceptions. * For example, if an exception was thrown in a function and when the function's @@ -156,6 +151,8 @@ ZEND_API void zend_objects_destroy_object(zend_object *object) EG(exception) = NULL; } } + orig_fake_scope = EG(fake_scope); + EG(fake_scope) = NULL; zend_call_method_with_0_params(&obj, object->ce, &destructor, ZEND_DESTRUCTOR_FUNC_NAME, NULL); if (old_exception) { if (EG(exception)) {