Only fires if no RERAISE has been fired since the last EXCEPTION_HANDLED, preventing duplicate events from chained cleanup handlers.
(
vm: &VirtualMachine,
code: &PyRef<PyCode>,
offset: u32,
exception: &PyObjectRef,
)
| 943 | /// Only fires if no RERAISE has been fired since the last EXCEPTION_HANDLED, |
| 944 | /// preventing duplicate events from chained cleanup handlers. |
| 945 | pub fn fire_reraise( |
| 946 | vm: &VirtualMachine, |
| 947 | code: &PyRef<PyCode>, |
| 948 | offset: u32, |
| 949 | exception: &PyObjectRef, |
| 950 | ) -> PyResult<()> { |
| 951 | if RERAISE_PENDING.with(|f| f.get()) { |
| 952 | return Ok(()); |
| 953 | } |
| 954 | RERAISE_PENDING.with(|f| f.set(true)); |
| 955 | let result = fire( |
| 956 | vm, |
| 957 | EVENT_RERAISE, |
| 958 | code, |
| 959 | offset, |
| 960 | &[vm.ctx.new_int(offset).into(), exception.clone()], |
| 961 | ); |
| 962 | if result.is_err() { |
| 963 | RERAISE_PENDING.with(|f| f.set(false)); |
| 964 | } |
| 965 | result |
| 966 | } |
| 967 | |
| 968 | pub fn fire_exception_handled( |
| 969 | vm: &VirtualMachine, |