B::Hooks::XSUB::CallAsOp - Invoke code from an XSUB in opcode context
#include "hook_xsub_callasop.h" static TRAMPOLINE_HOOK(foo) { printf("IM IN UR CALLER MUNGING UR STACK\n"); return NORMAL; /* you must always return like from a PP function, see also the RETURN macro */ /* or you can also delegate: */ return PL_ppaddr[OP_FOO](aTHX); } MODULE = Some::XS PACKAGE = Some::XS void foo () PPCODE: TRAMPOLINE(foo); # later, in Perl land... # the trampoline hook is invoked in an opcode context, instead of as an XSUB Some::XS::foo();
This module requires ExtUtils::Depends to be used in your XS modules.
See B::Utils for an explanation.
Declares a function with PP's calling conventions. It's the same as perl's own PP macro but without the Perl_ prefix (you can also use it for declaring a function pointer)
Given a function pointer hook, trampoline to it on the next PL_op dispatch.
hook
This will PUTBACK, invoke b_hooks_xsub_callasop_setup_trampoline, and then return from the current XSUB with no value.
PUTBACK
b_hooks_xsub_callasop_setup_trampoline
Save the value of PL_op.
PL_op
Must be called before the TRAMPOLINE macro, and followed by TRAMPOLINE_RESTORE_OP
TRAMPOLINE
TRAMPOLINE_RESTORE_OP
Must be called inside your TRAMPOLINE_HOOK to set PL_op to what it was just before the trampiline.
TRAMPOLINE_HOOK
The op_next of the restored op and the trampoline op are the same, so you should still use return NORMAL.
op_next
return NORMAL
Saves the args given to the xsub in a temporary buffer.
This must be called before the TRAMPOLINE macro, and followed by TRAMPOLINE_RESTORE_ARGS.
TRAMPOLINE_RESTORE_ARGS
Requires ax and items to be defined, calls SPAGAIN.
ax
items
SPAGAIN
Appends the args from the buffer back to the stack, and then invokes SPAGAIN.
Does not modify ax, you need to add a mark yourself and use it if you need it.
A function pointer type describing a Perl push/pop function:
OP *(*foo) (pTHX)
The underlying implementation of the TRAMPOLINE macro.
Using the macro is reccomended.
http://github.com/nothingmuch/b-hooks-xsub-callasop
Yuval Kogman, Florian Ragwitz
Copyright (c) 2009 Yuval Kogman. All rights reserved This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
To install B::Hooks::XSUB::CallAsOp, copy and paste the appropriate command in to your terminal.
cpanm
cpanm B::Hooks::XSUB::CallAsOp
CPAN shell
perl -MCPAN -e shell install B::Hooks::XSUB::CallAsOp
For more information on module installation, please visit the detailed CPAN module installation guide.