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