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 )