יובל קוג'מן (Yuval Kogman)

NAME

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

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

USAGE

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

See B::Utils for an explanation.

MACROS

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)

TRAMPOLINE(hook)

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

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

TRAMPOLINE_SAVE_OP

Save the value of PL_op.

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

TRAMPOLINE_RESTORE_OP

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

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

TRAMPOLINE_SAVE_ARGS

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.

Requires ax and items to be defined, calls SPAGAIN.

TRAMPOLINE_RESTORE_ARGS

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.

TYPES

b_hooks_xsub_callasop_hook_t

A function pointer type describing a Perl push/pop function:

        OP *(*foo) (pTHX)

FUNCTION

void b_hooks_xsub_callasop_setup_trampoline (pTHX_ b_hooks_xsub_callasop_setup_trampoline)

The underlying implementation of the TRAMPOLINE macro.

Using the macro is reccomended.

VERSION CONTROL

http://github.com/nothingmuch/b-hooks-xsub-callasop

AUTHOR

Yuval Kogman, Florian Ragwitz

COPYRIGHT & LICENSE

        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.



Hosting generously
sponsored by Bytemark