diff --git a/Zend/zend.c b/Zend/zend.c index 4d024444a4be9..bb076fa819839 100644 --- a/Zend/zend.c +++ b/Zend/zend.c @@ -1813,7 +1813,6 @@ ZEND_API void zend_free_recorded_errors(void) ZEND_API ZEND_COLD void zend_throw_error(zend_class_entry *exception_ce, const char *format, ...) /* {{{ */ { va_list va; - char *message = NULL; if (!exception_ce) { exception_ce = zend_ce_error; @@ -1825,16 +1824,16 @@ ZEND_API ZEND_COLD void zend_throw_error(zend_class_entry *exception_ce, const c } va_start(va, format); - zend_vspprintf(&message, 0, format, va); + zend_string *message = zend_vstrpprintf(0, format, va); //TODO: we can't convert compile-time errors to exceptions yet??? if (EG(current_execute_data) && !CG(in_compilation)) { - zend_throw_exception(exception_ce, message, 0); + zend_throw_exception_zstr(exception_ce, message, 0); } else { - zend_error_noreturn(E_ERROR, "%s", message); + zend_error_noreturn(E_ERROR, "%s", ZSTR_VAL(message)); } - efree(message); + zend_string_release_ex(message, false); va_end(va); } /* }}} */ @@ -1865,24 +1864,22 @@ ZEND_API ZEND_COLD void zend_illegal_container_offset(const zend_string *contain ZEND_API ZEND_COLD void zend_type_error(const char *format, ...) /* {{{ */ { va_list va; - char *message = NULL; va_start(va, format); - zend_vspprintf(&message, 0, format, va); - zend_throw_exception(zend_ce_type_error, message, 0); - efree(message); + zend_string *message = zend_vstrpprintf(0, format, va); + zend_throw_exception_zstr(zend_ce_type_error, message, 0); + zend_string_release_ex(message, false); va_end(va); } /* }}} */ ZEND_API ZEND_COLD void zend_argument_count_error(const char *format, ...) /* {{{ */ { va_list va; - char *message = NULL; va_start(va, format); - zend_vspprintf(&message, 0, format, va); - zend_throw_exception(zend_ce_argument_count_error, message, 0); - efree(message); + zend_string *message = zend_vstrpprintf(0, format, va); + zend_throw_exception_zstr(zend_ce_argument_count_error, message, 0); + zend_string_release_ex(message, false); va_end(va); } /* }}} */ @@ -1890,12 +1887,11 @@ ZEND_API ZEND_COLD void zend_argument_count_error(const char *format, ...) /* {{ ZEND_API ZEND_COLD void zend_value_error(const char *format, ...) /* {{{ */ { va_list va; - char *message = NULL; va_start(va, format); - zend_vspprintf(&message, 0, format, va); - zend_throw_exception(zend_ce_value_error, message, 0); - efree(message); + zend_string *message = zend_vstrpprintf(0, format, va); + zend_throw_exception_zstr(zend_ce_value_error, message, 0); + zend_string_release_ex(message, false); va_end(va); } /* }}} */ diff --git a/Zend/zend_exceptions.c b/Zend/zend_exceptions.c index 191d8f7fe6aec..52af3697d763a 100644 --- a/Zend/zend_exceptions.c +++ b/Zend/zend_exceptions.c @@ -853,7 +853,7 @@ void zend_register_default_exception(void) /* {{{ */ } /* }}} */ -static zend_object *zend_throw_exception_zstr(zend_class_entry *exception_ce, zend_string *message, zend_long code) /* {{{ */ +ZEND_API ZEND_COLD zend_object *zend_throw_exception_zstr(zend_class_entry *exception_ce, zend_string *message, zend_long code) /* {{{ */ { zval ex, tmp; diff --git a/Zend/zend_exceptions.h b/Zend/zend_exceptions.h index 24d9f4efd80a3..0db86fd539544 100644 --- a/Zend/zend_exceptions.h +++ b/Zend/zend_exceptions.h @@ -54,6 +54,7 @@ ZEND_API void zend_register_default_classes(void); /* exception_ce NULL, zend_ce_exception, zend_ce_error, or a derived class * message NULL or the message of the exception */ +ZEND_API ZEND_COLD zend_object *zend_throw_exception_zstr(zend_class_entry *exception_ce, zend_string *message, zend_long code); ZEND_API ZEND_COLD zend_object *zend_throw_exception(zend_class_entry *exception_ce, const char *message, zend_long code); ZEND_API ZEND_COLD zend_object *zend_throw_exception_ex(zend_class_entry *exception_ce, zend_long code, const char *format, ...) ZEND_ATTRIBUTE_FORMAT(printf, 3, 4); ZEND_API ZEND_COLD void zend_throw_exception_object(zval *exception); diff --git a/ext/ffi/ffi.c b/ext/ffi/ffi.c index 86b8d29209f40..aeb510e60afc5 100644 --- a/ext/ffi/ffi.c +++ b/ext/ffi/ffi.c @@ -3687,18 +3687,17 @@ void zend_ffi_cleanup_dcl(zend_ffi_dcl *dcl) /* {{{ */ static void zend_ffi_throw_parser_error(const char *format, ...) /* {{{ */ { va_list va; - char *message = NULL; va_start(va, format); - zend_vspprintf(&message, 0, format, va); + zend_string *message = zend_vstrpprintf(0, format, va); if (EG(current_execute_data)) { - zend_throw_exception(zend_ffi_parser_exception_ce, message, 0); + zend_throw_exception_zstr(zend_ffi_parser_exception_ce, message, 0); } else { - zend_error(E_WARNING, "FFI Parser: %s", message); + zend_error(E_WARNING, "FFI Parser: %s", ZSTR_VAL(message)); } - efree(message); + zend_string_release_ex(message, false); va_end(va); } /* }}} */ @@ -5790,18 +5789,17 @@ ZEND_GET_MODULE(ffi) void zend_ffi_parser_error(const char *format, ...) /* {{{ */ { va_list va; - char *message = NULL; va_start(va, format); - zend_vspprintf(&message, 0, format, va); + zend_string *message = zend_vstrpprintf(0, format, va); if (EG(current_execute_data)) { - zend_throw_exception(zend_ffi_parser_exception_ce, message, 0); + zend_throw_exception_zstr(zend_ffi_parser_exception_ce, message, 0); } else { - zend_error(E_WARNING, "FFI Parser: %s", message); + zend_error(E_WARNING, "FFI Parser: %s", ZSTR_VAL(message)); } - efree(message); + zend_string_release_ex(message, false); va_end(va); LONGJMP(FFI_G(bailout), FAILURE); diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index a86ce16feb407..cb8cdc9a682dd 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -7379,7 +7379,7 @@ ZEND_METHOD(ReflectionAttribute, newInstance) ); ZEND_ASSERT(delayed_target_validation != NULL); #endif - zend_throw_exception(zend_ce_error, ZSTR_VAL(attr->data->validation_error), 0); + zend_throw_exception_zstr(zend_ce_error, attr->data->validation_error, 0); RETURN_THROWS(); } diff --git a/ext/standard/assert.c b/ext/standard/assert.c index 258447576e1f4..e350ae18705d2 100644 --- a/ext/standard/assert.c +++ b/ext/standard/assert.c @@ -232,7 +232,7 @@ PHP_FUNCTION(assert) } if (ASSERTG(exception)) { - zend_throw_exception(assertion_error_ce, description_str ? ZSTR_VAL(description_str) : NULL, E_ERROR); + zend_throw_exception_zstr(assertion_error_ce, description_str, E_ERROR); if (ASSERTG(bail)) { /* When bail is turned on, the exception will not be caught. */ zend_exception_error(EG(exception), E_ERROR);