(
execute_data: *mut sys::zend_execute_data, retval: *mut sys::zval,
)
| 451 | |
| 452 | #[allow(static_mut_refs)] |
| 453 | unsafe extern "C" fn observer_end( |
| 454 | execute_data: *mut sys::zend_execute_data, retval: *mut sys::zval, |
| 455 | ) { |
| 456 | unsafe { |
| 457 | let Some(execute_data) = ExecuteData::try_from_mut_ptr(execute_data) else { |
| 458 | return; |
| 459 | }; |
| 460 | trace!(execute_data_ptr=?execute_data.as_ptr(), "start observer_end"); |
| 461 | |
| 462 | let Some((_, result)) = RESULT_MAP.remove(&execute_data.as_ptr()) else { |
| 463 | return; |
| 464 | }; |
| 465 | |
| 466 | let mut null = ZVal::from(()); |
| 467 | let ret = match ZVal::try_from_mut_ptr(retval) { |
| 468 | Some(ret) => ret, |
| 469 | None => &mut null, |
| 470 | }; |
| 471 | |
| 472 | let Ok((function_name, class_name)) = get_function_and_class_name(execute_data) else { |
| 473 | return; |
| 474 | }; |
| 475 | |
| 476 | trace!( |
| 477 | ?function_name, |
| 478 | ?class_name, |
| 479 | "observer_end function and class name" |
| 480 | ); |
| 481 | |
| 482 | let Some(function_name) = function_name else { |
| 483 | return; |
| 484 | }; |
| 485 | |
| 486 | let Some((_, after)) = select_plugin_hook(class_name.as_deref(), &function_name) else { |
| 487 | return; |
| 488 | }; |
| 489 | |
| 490 | let request_id = infer_request_id(execute_data); |
| 491 | trace!( |
| 492 | ?request_id, |
| 493 | ?function_name, |
| 494 | ?class_name, |
| 495 | "observer_end infer request id" |
| 496 | ); |
| 497 | |
| 498 | if let Err(err) = catch_unwind_result(AssertUnwindSafe(|| { |
| 499 | after(request_id, result, execute_data, ret) |
| 500 | })) { |
| 501 | error!( |
| 502 | ?request_id, |
| 503 | ?function_name, |
| 504 | ?class_name, |
| 505 | ?err, |
| 506 | "run observer_end hook failed" |
| 507 | ); |
| 508 | }; |
| 509 | } |
| 510 | } |
nothing calls this directly
no test coverage detected