File Coverage

CallbackDispatcher.xsi
Criterion Covered Total %
statement 15 16 93.7
branch 17 38 44.7
condition n/a
subroutine n/a
pod n/a
total 32 54 59.2


line stmt bran cond sub pod time code
1             MODULE = Panda::Lib PACKAGE = Panda::Lib::CallbackDispatcher
2             PROTOTYPES: DISABLE
3              
4             BOOT {
5 11 50         xs::register_package(aTHX_ "Panda::Lib::CallbackDispatcher", "Panda::Lib");
6 11 50         xs::register_package(aTHX_ "Panda::Lib::CallbackDispatcherEvent", "Panda::Lib");
7             }
8              
9             TYPEMAP: << END
10             XSCallbackDispatcher::Event* T_OPTR
11             END
12              
13             xs::lib::XSCallbackDispatcher* xs::lib::XSCallbackDispatcher::new () {
14 1 50         RETVAL = new XSCallbackDispatcher();
15             }
16              
17             void xs::lib::XSCallbackDispatcher::DESTROY () {}
18              
19             void xs::lib::XSCallbackDispatcher::add(CV* cb) {
20 2 50         THIS->add(CallbackCVWrapperSimple(cb));
    50          
21             }
22              
23             void xs::lib::XSCallbackDispatcher::add_ext(CV* cb) {
24 1 50         static HV* event_class = gv_stashpvn("Panda::Lib::CallbackDispatcherEvent", 0, 0);
    50          
    50          
    0          
25 2           SvIntrPtr cb_ptr = cb;
26 9 50         THIS->add(CallbackCVWrapperExt([=](XSCallbackDispatcher::Event& event, SV** args, size_t items) {
    50          
27 1           SV* full_args[items+1];
28 1 50         full_args[0] = typemap_outcast(&event, event_class);
29 1           memcpy(&full_args[1], args, items*sizeof(SV*));
30 1 50         return xs::call_sub_scalar(aTHX_ cb_ptr.get(), full_args, items+1);
31 1 50         }, cb));
32             }
33              
34             void xs::lib::XSCallbackDispatcher::remove(CV* cb) {
35 2 50         THIS->remove_object(CallbackCVWrapperSimple(cb));
36 2 50         THIS->remove_object(CallbackCVWrapperExt(nullptr, cb));
    50          
37             }
38              
39             void xs::lib::XSCallbackDispatcher::call(...) {
40 7 50         THIS->operator()(&ST(1), items - 1);
41             }
42              
43             MODULE = Panda::Lib PACKAGE = Panda::Lib::CallbackDispatcherEvent
44             PROTOTYPES: DISABLE
45              
46             SV* XSCallbackDispatcher::Event::next (...) {
47 0 0         RETVAL = THIS->next(&ST(1), items - 1).value_or(&PL_sv_undef);
48             }