… | |
… | |
3 | #include "XSUB.h" |
3 | #include "XSUB.h" |
4 | |
4 | |
5 | typedef CV *B__CV; |
5 | typedef CV *B__CV; |
6 | |
6 | |
7 | static OP *(*old_entersub)(pTHX); |
7 | static OP *(*old_entersub)(pTHX); |
8 | |
|
|
9 | int count = 1; |
|
|
10 | |
8 | |
11 | // this is, of course, a slower entersub |
9 | // this is, of course, a slower entersub |
12 | static OP * |
10 | static OP * |
13 | faster_entersub (pTHX) |
11 | faster_entersub (pTHX) |
14 | { |
12 | { |
… | |
… | |
53 | |
51 | |
54 | IV |
52 | IV |
55 | ppaddr (int optype) |
53 | ppaddr (int optype) |
56 | CODE: |
54 | CODE: |
57 | RETVAL = optype == OP_ENTERSUB |
55 | RETVAL = optype == OP_ENTERSUB |
58 | ? old_entersub |
56 | ? (IV)old_entersub |
59 | : PL_ppaddr [optype]; |
57 | : (IV)PL_ppaddr [optype]; |
60 | OUTPUT: |
58 | OUTPUT: |
61 | RETVAL |
59 | RETVAL |
62 | |
60 | |
63 | void |
61 | void |
64 | hook_entersub () |
62 | hook_entersub () |
… | |
… | |
70 | patch_cv (B::CV cv, void *ptr) |
68 | patch_cv (B::CV cv, void *ptr) |
71 | CODE: |
69 | CODE: |
72 | { |
70 | { |
73 | OP *op; |
71 | OP *op; |
74 | |
72 | |
|
|
73 | if (!ptr) |
|
|
74 | croak ("NULL not allowed as code address for patch_cv"); |
|
|
75 | |
75 | NewOp (0, op, 1, OP); |
76 | NewOp (0, op, 1, OP); |
76 | |
77 | |
77 | op->op_sibling = CvSTART (cv); |
78 | op->op_sibling = CvSTART (cv); |
78 | op->op_type = OP_NULL; |
79 | op->op_type = OP_NULL; |
79 | op->op_ppaddr = ptr; |
80 | op->op_ppaddr = ptr; |