@@ -25,6 +25,10 @@ static zif_handler dd_http_response_code = NULL;
2525static zif_handler dd_set_error_handler = NULL ;
2626static zif_handler dd_set_exception_handler = NULL ;
2727static zif_handler dd_restore_exception_handler = NULL ;
28+ #if PHP_VERSION_ID >= 80500
29+ static zif_handler dd_get_error_handler = NULL ;
30+ static zif_handler dd_get_exception_handler = NULL ;
31+ #endif
2832
2933static void dd_check_exception_in_header (int old_response_code ) {
3034 int new_response_code = SG (sapi_headers ).http_response_code ;
@@ -197,6 +201,38 @@ static PHP_FUNCTION(ddtrace_restore_exception_handler) {
197201 }
198202}
199203
204+ #if PHP_VERSION_ID >= 80500
205+ static PHP_FUNCTION (ddtrace_get_error_handler ) {
206+ dd_get_error_handler (INTERNAL_FUNCTION_PARAM_PASSTHRU );
207+
208+ // Unwrap the handler if it's our wrapper
209+ if (Z_TYPE_P (return_value ) == IS_OBJECT && Z_OBJCE_P (return_value ) == & dd_exception_or_error_handler_ce ) {
210+ zval * handler = dd_exception_or_error_handler_handler (Z_OBJ_P (return_value ));
211+ zval_ptr_dtor (return_value );
212+ if (Z_ISUNDEF_P (handler )) {
213+ ZVAL_NULL (return_value );
214+ } else {
215+ ZVAL_COPY (return_value , handler );
216+ }
217+ }
218+ }
219+
220+ static PHP_FUNCTION (ddtrace_get_exception_handler ) {
221+ dd_get_exception_handler (INTERNAL_FUNCTION_PARAM_PASSTHRU );
222+
223+ // Unwrap the handler if it's our wrapper
224+ if (Z_TYPE_P (return_value ) == IS_OBJECT && Z_OBJCE_P (return_value ) == & dd_exception_or_error_handler_ce ) {
225+ zval * handler = dd_exception_or_error_handler_handler (Z_OBJ_P (return_value ));
226+ zval_ptr_dtor (return_value );
227+ if (Z_ISUNDEF_P (handler )) {
228+ ZVAL_NULL (return_value );
229+ } else {
230+ ZVAL_COPY (return_value , handler );
231+ }
232+ }
233+ }
234+ #endif
235+
200236static zend_internal_function ddtrace_exception_or_error_handler ;
201237
202238ZEND_BEGIN_ARG_INFO_EX (arginfo_ddtrace_exception_or_error_handler , 0 , 0 , 1 )
@@ -497,6 +533,10 @@ void ddtrace_exception_handlers_startup(void) {
497533 {ZEND_STRL ("set_exception_handler" ), & dd_set_exception_handler , ZEND_FN (ddtrace_set_exception_handler )},
498534 {ZEND_STRL ("restore_exception_handler" ), & dd_restore_exception_handler ,
499535 ZEND_FN (ddtrace_restore_exception_handler )},
536+ #if PHP_VERSION_ID >= 80500
537+ {ZEND_STRL ("get_error_handler" ), & dd_get_error_handler , ZEND_FN (ddtrace_get_error_handler )},
538+ {ZEND_STRL ("get_exception_handler" ), & dd_get_exception_handler , ZEND_FN (ddtrace_get_exception_handler )},
539+ #endif
500540 };
501541 size_t handlers_len = sizeof handlers / sizeof handlers [0 ];
502542 for (size_t i = 0 ; i < handlers_len ; ++ i ) {
0 commit comments