File Coverage

/usr/local/lib/perl5/site_perl/5.26.1/x86_64-linux/XS/Framework.x/i/xs/catch.h
Criterion Covered Total %
statement 6 6 100.0
branch 64 600 10.6
condition n/a
subroutine n/a
pod n/a
total 70 606 11.5


line stmt bran cond sub pod time code
1             #pragma once
2             #include <xs/Sub.h>
3             #include <functional>
4             #include <panda/exception.h>
5              
6             namespace xs {
7              
8             using CatchHandlerSimple = std::function<Sv()>;
9             using CatchHandler = std::function<Sv(const Sub&)>;
10              
11             using ExceptionProcessor = std::function<Sv(Sv& ex, const Sub&)>;
12             using ExceptionProcessorSimple = std::function<Sv(Sv& ex)>;
13              
14             void add_catch_handler (CatchHandlerSimple f);
15             void add_catch_handler (CatchHandler f);
16              
17             void add_exception_processor(ExceptionProcessor f);
18             void add_exception_processor(ExceptionProcessorSimple f);
19              
20             Sv _exc2sv (const Sub&);
21              
22 19526           template <typename F> static inline auto throw_guard (CV* context, F&& f) -> decltype(f()) {
23             SV* exc;
24 19526 50         try { return f(); }
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    100          
    100          
    100          
    50          
    0          
    50          
    0          
    50          
    50          
    100          
    50          
    50          
    0          
    50          
    0          
    50          
    0          
    50          
    0          
    50          
    50          
    0          
    0          
    0          
    50          
    50          
    0          
    0          
    50          
    0          
    0          
    50          
    50          
    0          
    0          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    50          
    50          
    50          
    50          
    50          
    50          
25 24           catch (...) {
26 24 0         auto tmp = xs::_exc2sv(context);
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    50          
    50          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
27 12 0         if (tmp) exc = tmp.detach();
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    50          
    50          
    50          
    0          
    0          
    0          
    0          
    0          
    0          
    50          
    50          
    0          
    0          
    0          
    0          
    0          
    0          
    50          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
28             else exc = newSVpvs("<empty exception>");
29             }
30 12           croak_sv(sv_2mortal(exc));
31             }
32              
33             }