diff options
-rw-r--r-- | Zend/zend_execute_API.c | 10 | ||||
-rw-r--r-- | Zend/zend_reflection_api.c | 18 | ||||
-rw-r--r-- | ext/reflection/php_reflection.c | 18 |
3 files changed, 29 insertions, 17 deletions
diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c index 85919fde93..305d20dc17 100644 --- a/Zend/zend_execute_API.c +++ b/Zend/zend_execute_API.c @@ -952,15 +952,15 @@ ZEND_API int zend_lookup_class(char *name, int name_length, zend_class_entry *** return FAILURE; } - if (EG(exception)) { + if (EG(exception) && exception) { free_alloca(lc_name); zend_error(E_ERROR, "Function %s(%s) threw an exception of type '%s'", ZEND_AUTOLOAD_FUNC_NAME, name, Z_OBJCE_P(EG(exception))->name); return FAILURE; } - EG(exception) = exception; - - /* If an exception is thrown retval_ptr will be NULL but we bailout before we reach this point */ - zval_ptr_dtor(&retval_ptr); + if (!EG(exception)) { + EG(exception) = exception; + zval_ptr_dtor(&retval_ptr); + } retval = zend_hash_find(EG(class_table), lc_name, name_length + 1, (void **) ce); free_alloca(lc_name); diff --git a/Zend/zend_reflection_api.c b/Zend/zend_reflection_api.c index 75ef5917a3..395c7a754c 100644 --- a/Zend/zend_reflection_api.c +++ b/Zend/zend_reflection_api.c @@ -1027,15 +1027,19 @@ static void _reflection_export(INTERNAL_FUNCTION_PARAMETERS, zend_class_entry *c result = zend_call_function(&fci, &fcc TSRMLS_CC); + if (retval_ptr) { + zval_ptr_dtor(&retval_ptr); + } + RETURN_ON_EXCEPTION - if (result == FAILURE) { + if (EG(exception)) { zval_dtor(&reflector); - _DO_THROW("Could not create reflector"); + return; } - - if (retval_ptr) { - zval_ptr_dtor(&retval_ptr); + if (result == FAILURE || EG(exception)) { + zval_dtor(&reflector); + _DO_THROW("Could not create reflector"); } /* Call static reflection::export */ @@ -2263,7 +2267,9 @@ static void reflection_class_object_ctor(INTERNAL_FUNCTION_PARAMETERS, int is_ob } else { convert_to_string_ex(&argument); if (zend_lookup_class(Z_STRVAL_P(argument), Z_STRLEN_P(argument), &ce TSRMLS_CC) == FAILURE) { - zend_throw_exception_ex(reflection_exception_ptr, -1 TSRMLS_CC, "Class %s does not exist", Z_STRVAL_P(argument)); + if (!EG(exception)) { + zend_throw_exception_ex(reflection_exception_ptr, -1 TSRMLS_CC, "Class %s does not exist", Z_STRVAL_P(argument)); + } return; } diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index 75ef5917a3..395c7a754c 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -1027,15 +1027,19 @@ static void _reflection_export(INTERNAL_FUNCTION_PARAMETERS, zend_class_entry *c result = zend_call_function(&fci, &fcc TSRMLS_CC); + if (retval_ptr) { + zval_ptr_dtor(&retval_ptr); + } + RETURN_ON_EXCEPTION - if (result == FAILURE) { + if (EG(exception)) { zval_dtor(&reflector); - _DO_THROW("Could not create reflector"); + return; } - - if (retval_ptr) { - zval_ptr_dtor(&retval_ptr); + if (result == FAILURE || EG(exception)) { + zval_dtor(&reflector); + _DO_THROW("Could not create reflector"); } /* Call static reflection::export */ @@ -2263,7 +2267,9 @@ static void reflection_class_object_ctor(INTERNAL_FUNCTION_PARAMETERS, int is_ob } else { convert_to_string_ex(&argument); if (zend_lookup_class(Z_STRVAL_P(argument), Z_STRLEN_P(argument), &ce TSRMLS_CC) == FAILURE) { - zend_throw_exception_ex(reflection_exception_ptr, -1 TSRMLS_CC, "Class %s does not exist", Z_STRVAL_P(argument)); + if (!EG(exception)) { + zend_throw_exception_ex(reflection_exception_ptr, -1 TSRMLS_CC, "Class %s does not exist", Z_STRVAL_P(argument)); + } return; } |