line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
#include |
2
|
|
|
|
|
|
|
#include |
3
|
|
|
|
|
|
|
#include |
4
|
|
|
|
|
|
|
#include |
5
|
|
|
|
|
|
|
#include |
6
|
|
|
|
|
|
|
#include |
7
|
|
|
|
|
|
|
|
8
|
|
|
|
|
|
|
namespace xs { |
9
|
|
|
|
|
|
|
|
10
|
|
|
|
|
|
|
using panda::string; |
11
|
|
|
|
|
|
|
|
12
|
|
|
|
|
|
|
#ifdef PERL_IMPLICIT_CONTEXT |
13
|
|
|
|
|
|
|
PerlInterpreter* my_perl_auto_t::main_interp = PERL_GET_THX; |
14
|
|
|
|
|
|
|
#endif |
15
|
|
|
|
|
|
|
|
16
|
|
|
|
|
|
|
my_perl_auto_t my_perl; |
17
|
|
|
|
|
|
|
|
18
|
36
|
|
|
|
|
|
static std::vector> end_cbs; |
19
|
36
|
|
|
|
|
|
static const auto mt_id = std::this_thread::get_id(); |
20
|
|
|
|
|
|
|
|
21
|
0
|
|
|
|
|
|
void at_perl_destroy (const panda::function& f) { |
22
|
0
|
|
|
|
|
|
end_cbs.push_back(f); |
23
|
0
|
|
|
|
|
|
} |
24
|
|
|
|
|
|
|
|
25
|
36
|
|
|
|
|
|
void __call_at_perl_destroy () { |
26
|
36
|
50
|
|
|
|
|
for (auto& f : end_cbs) f(); |
|
|
0
|
|
|
|
|
|
27
|
36
|
|
|
|
|
|
Sv::__at_perl_destroy(); |
28
|
36
|
|
|
|
|
|
Scalar::__at_perl_destroy(); |
29
|
36
|
|
|
|
|
|
Simple::__at_perl_destroy(); |
30
|
36
|
|
|
|
|
|
} |
31
|
|
|
|
|
|
|
|
32
|
0
|
|
|
|
|
|
void __call_at_thread_create () { |
33
|
|
|
|
|
|
|
#ifdef PERL_IMPLICIT_CONTEXT |
34
|
|
|
|
|
|
|
my_perl_auto_t::main_interp = nullptr; |
35
|
|
|
|
|
|
|
#endif |
36
|
0
|
|
|
|
|
|
} |
37
|
|
|
|
|
|
|
|
38
|
136
|
|
|
|
|
|
void __boot_module (const char* rawmod, void (*bootfunc)(pTHX_ CV*), const char* version, const char* file) { |
39
|
272
|
|
|
|
|
|
string bs("::bootstrap"); |
40
|
272
|
50
|
|
|
|
|
string module(strlen(rawmod) + bs.length() + 1); |
41
|
136
|
50
|
|
|
|
|
module.assign(rawmod); |
42
|
|
|
|
|
|
|
|
43
|
136
|
|
|
|
|
|
auto len = module.length(); |
44
|
136
|
50
|
|
|
|
|
auto ptr = module.buf(); |
45
|
2414
|
100
|
|
|
|
|
for (size_t i = 0; i < len; ++i) { |
46
|
2278
|
100
|
|
|
|
|
if (ptr[i] != '_' || i >= len - 1 || ptr[i+1] != '_') continue; |
|
|
50
|
|
|
|
|
|
|
|
50
|
|
|
|
|
|
47
|
204
|
|
|
|
|
|
ptr[i] = ':'; |
48
|
204
|
|
|
|
|
|
ptr[i+1] = ':'; |
49
|
204
|
|
|
|
|
|
++i; |
50
|
|
|
|
|
|
|
} |
51
|
|
|
|
|
|
|
|
52
|
272
|
50
|
|
|
|
|
auto xsname = module + bs; |
53
|
|
|
|
|
|
|
|
54
|
272
|
50
|
|
|
|
|
Sub sub = newXS(xsname.c_str(), bootfunc, file); |
|
|
50
|
|
|
|
|
|
|
|
50
|
|
|
|
|
|
55
|
136
|
50
|
|
|
|
|
sub.call(Simple(module), Simple(version)); |
|
|
50
|
|
|
|
|
|
|
|
50
|
|
|
|
|
|
56
|
136
|
|
|
|
|
|
} |
57
|
|
|
|
|
|
|
|
58
|
0
|
|
|
|
|
|
bool is_perl_thread () { |
59
|
0
|
0
|
|
|
|
|
if (std::this_thread::get_id() == mt_id) return true; |
60
|
|
|
|
|
|
|
#ifndef PERL_IMPLICIT_CONTEXT |
61
|
0
|
|
|
|
|
|
return false; |
62
|
|
|
|
|
|
|
#else |
63
|
|
|
|
|
|
|
return (PerlInterpreter*)my_perl; |
64
|
|
|
|
|
|
|
#endif |
65
|
|
|
|
|
|
|
} |
66
|
|
|
|
|
|
|
|
67
|
144
|
50
|
|
|
|
|
} |
|
|
50
|
|
|
|
|
|