B-Hooks-XSUB-CallAsOp
view release on metacpan or search on metacpan
CallAsOp.xs view on Meta::CPAN
/* stashes PL_op before the trampoline hack. this allows cont_reset,
* cont_invoke and cont_shift to have a proper value for PL_op */
void b_hooks_xsub_callasop_trampoline_save_op (pTHX) {
dMY_CXT;
assert(MY_CXT.saved_op == NULL);
assert(PL_op);
assert(PL_op->op_next);
MY_CXT.saved_op = PL_op;
}
/* restore PL_op's state to what it was before the trampoline */
void b_hooks_xsub_callasop_trampoline_restore_op (pTHX) {
dMY_CXT;
assert(MY_CXT.saved_op != NULL);
assert(MY_CXT.saved_op->op_next);
PL_op = MY_CXT.saved_op;
MY_CXT.saved_op = NULL;
}
static TRAMPOLINE_HOOK(test_hook)
{
dSP;
dMARK;
PUSHMARK(SP);
TRAMPOLINE_RESTORE_OP;
TRAMPOLINE_RESTORE_ARGS; /* should be magic */
PUTBACK;
return PL_ppaddr[OP_ENTERSUB](aTHX);
}
MODULE = B::Hooks::XSUB::CallAsOp PACKAGE = B::Hooks::XSUB::CallAsOp
PROTOTYPES: DISABLE
BOOT:
{
MY_CXT_INIT;
MY_CXT.hook = NULL;
MY_CXT.saved_args = NULL;
MY_CXT.saved_items = 0;
MY_CXT.saved_op = NULL;
}
void __test (...)
PPCODE:
TRAMPOLINE_SAVE_OP;
TRAMPOLINE_SAVE_ARGS;
assert(SP == &ST(-1));
TRAMPOLINE(test_hook);
( run in 1.580 second using v1.01-cache-2.11-cpan-71847e10f99 )