B-Hooks-XSUB-CallAsOp

 view release on metacpan or  search on metacpan

lib/B/Hooks/XSUB/CallAsOp.pm  view on Meta::CPAN

use strict;
use warnings;

package B::Hooks::XSUB::CallAsOp;

require 5.008001;
use parent qw(DynaLoader);

our $VERSION = '0.02';
$VERSION = eval $VERSION;

sub dl_load_flags { 0x01 }

__PACKAGE__->bootstrap($VERSION);

1;

__END__

=pod

=head1 NAME

B::Hooks::XSUB::CallAsOp - Invoke code from an XSUB in opcode context

=head1 SYNOPSIS

	#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();

=head1 USAGE

This module requires L<ExtUtils::Depends> to be used in your XS modules.

See L<B::Utils> for an explanation.

=head1 MACROS

=over 4

=item TRAMPOLINE_HOOK(hook_name)

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)

=item TRAMPOLINE(hook)

Given a function pointer C<hook>, trampoline to it on the next PL_op dispatch.

This will C<PUTBACK>, invoke C<b_hooks_xsub_callasop_setup_trampoline>, and
then return from the current XSUB with no value.

=item TRAMPOLINE_SAVE_OP

Save the value of C<PL_op>.

Must be called before the C<TRAMPOLINE> macro, and followed by C<TRAMPOLINE_RESTORE_OP>

=item TRAMPOLINE_RESTORE_OP

Must be called inside your C<TRAMPOLINE_HOOK> to set C<PL_op> to what it was
just before the trampiline.

The C<op_next> of the restored op and the trampoline op are the same, so you
should still use C<return NORMAL>.

=item TRAMPOLINE_SAVE_ARGS

Saves the args given to the xsub in a temporary buffer.

This must be called before the C<TRAMPOLINE> macro, and followed by C<TRAMPOLINE_RESTORE_ARGS>.

Requires C<ax> and C<items> to be defined, calls C<SPAGAIN>.

=item TRAMPOLINE_RESTORE_ARGS

Appends the args from the buffer back to the stack, and then invokes C<SPAGAIN>.

Does B<not> modify ax, you need to add a mark yourself and use it if you need
it.

=back



( run in 1.295 second using v1.01-cache-2.11-cpan-71847e10f99 )