B::Bytecode patches
[p5sagit/p5-mst-13.2.git] / ext / ByteLoader / ByteLoader.xs
1 #define PERL_NO_GET_CONTEXT
2 #include "EXTERN.h"
3 #include "perl.h"
4 #include "XSUB.h"
5 #include "byterun.h"
6
7 static I32
8 byteloader_filter(pTHXo_ int idx, SV *buf_sv, int maxlen)
9 {
10     dTHR;
11     OP *saveroot = PL_main_root;
12     OP *savestart = PL_main_start;
13
14     byterun(aTHXo);
15
16     if (PL_in_eval) {
17         OP *o;
18
19         PL_eval_start = PL_main_start;
20
21         o = newSVOP(OP_CONST, 0, newSViv(1));
22         PL_eval_root = newLISTOP(OP_LINESEQ, 0, PL_main_root, o);
23         PL_main_root->op_next = o;
24         PL_eval_root = newUNOP(OP_LEAVEEVAL, 0, PL_eval_root);
25         o->op_next = PL_eval_root;
26     
27         PL_main_root = saveroot;
28         PL_main_start = savestart;
29     }
30
31     return 0;
32 }
33
34 MODULE = ByteLoader             PACKAGE = ByteLoader
35
36 PROTOTYPES:     ENABLE
37
38 void
39 import(...)
40   PPCODE:
41     filter_add(byteloader_filter, NULL);
42
43 void
44 unimport(...)
45   PPCODE:
46     filter_del(byteloader_filter);