Commit | Line | Data |
c5be433b |
1 | #define PERL_NO_GET_CONTEXT |
b295d113 |
2 | #include "EXTERN.h" |
3 | #include "perl.h" |
4 | #include "XSUB.h" |
e8edd1e6 |
5 | #include "byterun.h" |
b295d113 |
6 | |
e8edd1e6 |
7 | static void |
8 | freadpv(U32 len, void *data, XPV *pv) |
9 | { |
c5be433b |
10 | dTHX; |
e8edd1e6 |
11 | New(666, pv->xpv_pv, len, char); |
0cb96387 |
12 | PerlIO_read((PerlIO*)data, (void*)pv->xpv_pv, len); |
e8edd1e6 |
13 | pv->xpv_len = len; |
14 | pv->xpv_cur = len - 1; |
15 | } |
b295d113 |
16 | |
17 | static I32 |
0cb96387 |
18 | byteloader_filter(pTHXo_ int idx, SV *buf_sv, int maxlen) |
b295d113 |
19 | { |
a6c40364 |
20 | dTHR; |
b295d113 |
21 | OP *saveroot = PL_main_root; |
22 | OP *savestart = PL_main_start; |
e8edd1e6 |
23 | struct bytestream bs; |
b295d113 |
24 | |
25 | bs.data = PL_rsfp; |
4f63d024 |
26 | bs.pfgetc = (int(*) (void*))fgetc; |
27 | bs.pfread = (int(*) (char*,size_t,size_t,void*))fread; |
28 | bs.pfreadpv = freadpv; |
e8edd1e6 |
29 | |
0cb96387 |
30 | byterun(aTHXo_ bs); |
b295d113 |
31 | |
32 | if (PL_in_eval) { |
33 | OP *o; |
34 | |
35 | PL_eval_start = PL_main_start; |
36 | |
37 | o = newSVOP(OP_CONST, 0, newSViv(1)); |
38 | PL_eval_root = newLISTOP(OP_LINESEQ, 0, PL_main_root, o); |
39 | PL_main_root->op_next = o; |
40 | PL_eval_root = newUNOP(OP_LEAVEEVAL, 0, PL_eval_root); |
41 | o->op_next = PL_eval_root; |
42 | |
43 | PL_main_root = saveroot; |
44 | PL_main_start = savestart; |
45 | } |
46 | |
47 | return 0; |
48 | } |
49 | |
50 | MODULE = ByteLoader PACKAGE = ByteLoader |
51 | |
52 | PROTOTYPES: ENABLE |
53 | |
54 | void |
55 | import(...) |
56 | PPCODE: |
57 | filter_add(byteloader_filter, NULL); |
58 | |
59 | void |
60 | unimport(...) |
61 | PPCODE: |
62 | filter_del(byteloader_filter); |