# Devel::CallChecker - phpMan

## NAME
    [Devel::CallChecker] - custom op checking attached to subroutines

## SYNOPSIS
        # to generate header prior to XS compilation

        perl -[MDevel::CallChecker]=callchecker0_h \
            -e 'print callchecker0_h' > callchecker0.h

        # in Perl part of module

        use [Devel::CallChecker];

        /* in XS */

        #include "callchecker0.h"

        cv_get_call_checker(cv, &ckfun, &ckobj);
        static OP *my_ckfun(pTHX_ OP *o, GV *namegv, SV *ckobj);
        cv_set_call_checker(cv, my_ckfun, ckobj);

## DESCRIPTION
    This module makes some new features of the Perl 5.14.0 C API available
    to XS modules running on older versions of Perl. The features are
    centred around the function "cv_set_call_checker", which allows XS code
    to attach a magical annotation to a Perl subroutine, resulting in
    resolvable calls to that subroutine being mutated at compile time by
    arbitrary C code. This module makes "cv_set_call_checker" and several
    supporting functions available. (It is possible to achieve the effect of
    "cv_set_call_checker" from XS code on much earlier Perl versions, but it
    is painful to achieve without the centralised facility.)

    This module provides the implementation of the functions at runtime (on
    Perls where they are not provided by the core). It also, at compile
    time, supplies the C header file and link library which provide access
    to the functions. In normal use, "callchecker0_h" and
    "callchecker_linkable" should be called at build time (not authoring
    time) for the module that wishes to use the C functions.

## CONSTANTS
    callchecker0_h
        Content of a C header file, intended to be named ""callchecker0.h"".
        It is to be included in XS code, and "perl.h" must be included
        first. When the XS module is loaded at runtime, the
        "[Devel::CallChecker]" module must be loaded first. This will result
        in the Perl API functions "rv2cv_op_cv", "ck_entersub_args_list",
        "ck_entersub_args_proto", "ck_entersub_args_proto_or_list",
        "cv_get_call_checker", and "cv_set_call_checker", as defined below
        and in the Perl 5.14.0 API, being available to the XS code.

    callchecker_linkable
        List of names of files that must be used as additional objects when
        linking an XS module that uses the C functions supplied by this
        module. This list will be empty on many platforms.

## C FUNCTIONS
    rv2cv_op_cv
        Examines an op, which is expected to identify a subroutine at
        runtime, and attempts to determine at compile time which subroutine
        it identifies. This is normally used during Perl compilation to
        determine whether a prototype can be applied to a function call.
        *cvop* is the op being considered, normally an "rv2cv" op. A pointer
        to the identified subroutine is returned, if it could be determined
        statically, and a null pointer is returned if it was not possible to
        determine statically.

        Whether the subroutine is statically identifiable is determined in
        accordance with the prevailing standards of the Perl version being
        used. The same criteria are used that the core uses to determine
        whether to apply a prototype to a subroutine call. From version
        5.11.2 onwards, the subroutine can be determined if the RV that the
        "rv2cv" is to operate on is provided by a suitable "gv" or "const"
        op. Prior to 5.11.2, only a "gv" op will do. A "gv" op is suitable
        if the GV's CV slot is populated. A "const" op is suitable if the
        constant value must be an RV pointing to a CV. Details of this
        process may change in future versions of Perl.

        If the "rv2cv" op has the "OPpENTERSUB_AMPER" flag set then no
        attempt is made to identify the subroutine statically: this flag is
        used to suppress compile-time magic on a subroutine call, forcing it
        to use default runtime behaviour.

        If *flags* has the bit "RV2CVOPCV_MARK_EARLY" set, then the handling
        of a GV reference is modified. If a GV was examined and its CV slot
        was found to be empty, then the "gv" op has the "OPpEARLY_CV" flag
        set. If the op is not optimised away, and the CV slot is later
        populated with a subroutine having a prototype, that flag eventually
        triggers the warning "called too early to check prototype".

        If *flags* has the bit "RV2CVOPCV_RETURN_NAME_GV" set, then instead
        of returning a pointer to the subroutine it returns a pointer to the
        GV giving the most appropriate name for the subroutine in this
        context. Normally this is just the "CvGV" of the subroutine, but for
        an anonymous ("CvANON") subroutine that is referenced through a GV
        it will be the referencing GV. The resulting "GV*" is cast to "CV*"
        to be returned. A null pointer is returned as usual if there is no
        statically-determinable subroutine.

            CV *rv2cv_op_cv(OP *cvop, U32 flags)

    cv_get_call_checker
        Retrieves the function that will be used to fix up a call to *cv*.
        Specifically, the function is applied to an "entersub" op tree for a
        subroutine call, not marked with "&", where the callee can be
        identified at compile time as *cv*.

        The C-level function pointer is returned in **ckfun_p*, and an SV
        argument for it is returned in **ckobj_p*. The function is intended
        to be called in this manner:

            entersubop = (*ckfun_p)(aTHX_ entersubop, namegv, (*ckobj_p));

        In this call, *entersubop* is a pointer to the "entersub" op, which
        may be replaced by the check function, and *namegv* is a GV
        supplying the name that should be used by the check function to
        refer to the callee of the "entersub" op if it needs to emit any
        diagnostics. It is permitted to apply the check function in
        non-standard situations, such as to a call to a different subroutine
        or to a method call.

        By default, the function is Perl_ck_entersub_args_proto_or_list, and
        the SV parameter is *cv* itself. This implements standard prototype
        processing. It can be changed, for a particular subroutine, by
        "cv_set_call_checker".

            void cv_get_call_checker(CV *cv, Perl_call_checker *ckfun_p,
                    SV **ckobj_p)

    cv_set_call_checker
        Sets the function that will be used to fix up a call to *cv*.
        Specifically, the function is applied to an "entersub" op tree for a
        subroutine call, not marked with "&", where the callee can be
        identified at compile time as *cv*.

        The C-level function pointer is supplied in *ckfun*, and an SV
        argument for it is supplied in *ckobj*. The function is intended to
        be called in this manner:

            entersubop = ckfun(aTHX_ entersubop, namegv, ckobj);

        In this call, *entersubop* is a pointer to the "entersub" op, which
        may be replaced by the check function, and *namegv* is a GV
        supplying the name that should be used by the check function to
        refer to the callee of the "entersub" op if it needs to emit any
        diagnostics. It is permitted to apply the check function in
        non-standard situations, such as to a call to a different subroutine
        or to a method call.

        The current setting for a particular CV can be retrieved by
        "cv_get_call_checker".

            void cv_set_call_checker(CV *cv, Perl_call_checker ckfun,
                    SV *ckobj)

    ck_entersub_args_list
        Performs the default fixup of the arguments part of an "entersub" op
        tree. This consists of applying list context to each of the argument
        ops. This is the standard treatment used on a call marked with "&",
        or a method call, or a call through a subroutine reference, or any
        other call where the callee can't be identified at compile time, or
        a call where the callee has no prototype.

            OP *ck_entersub_args_list(OP *entersubop)

    ck_entersub_args_proto
        Performs the fixup of the arguments part of an "entersub" op tree
        based on a subroutine prototype. This makes various modifications to
        the argument ops, from applying context up to inserting "refgen"
        ops, and checking the number and syntactic types of arguments, as
        directed by the prototype. This is the standard treatment used on a
        subroutine call, not marked with "&", where the callee can be
        identified at compile time and has a prototype.

        *protosv* supplies the subroutine prototype to be applied to the
        call. It may be a normal defined scalar, of which the string value
        will be used. Alternatively, for convenience, it may be a subroutine
        object (a "CV*" that has been cast to "SV*") which has a prototype.
        The prototype supplied, in whichever form, does not need to match
        the actual callee referenced by the op tree.

        If the argument ops disagree with the prototype, for example by
        having an unacceptable number of arguments, a valid op tree is
        returned anyway. The error is reflected in the parser state,
        normally resulting in a single exception at the top level of parsing
        which covers all the compilation errors that occurred. In the error
        message, the callee is referred to by the name defined by the
        *namegv* parameter.

            OP *ck_entersub_args_proto(OP *entersubop, GV *namegv,
                    SV *protosv)

    ck_entersub_args_proto_or_list
        Performs the fixup of the arguments part of an "entersub" op tree
        either based on a subroutine prototype or using default list-context
        processing. This is the standard treatment used on a subroutine
        call, not marked with "&", where the callee can be identified at
        compile time.

        *protosv* supplies the subroutine prototype to be applied to the
        call, or indicates that there is no prototype. It may be a normal
        scalar, in which case if it is defined then the string value will be
        used as a prototype, and if it is undefined then there is no
        prototype. Alternatively, for convenience, it may be a subroutine
        object (a "CV*" that has been cast to "SV*"), of which the prototype
        will be used if it has one. The prototype (or lack thereof)
        supplied, in whichever form, does not need to match the actual
        callee referenced by the op tree.

        If the argument ops disagree with the prototype, for example by
        having an unacceptable number of arguments, a valid op tree is
        returned anyway. The error is reflected in the parser state,
        normally resulting in a single exception at the top level of parsing
        which covers all the compilation errors that occurred. In the error
        message, the callee is referred to by the name defined by the
        *namegv* parameter.

            OP *ck_entersub_args_proto_or_list(OP *entersubop, GV *namegv,
                    SV *protosv)

## SEE ALSO
    [B::CallChecker], [Devel::CallParser], "cv_set_call_checker" in perlapi

## AUTHOR
    Andrew Main (Zefram) <<zefram@fysh.org>>

## COPYRIGHT
    Copyright (C) 2011, 2012, 2013, 2015, 2017 Andrew Main (Zefram)
    <<zefram@fysh.org>>

## LICENSE
    This module is free software; you can redistribute it and/or modify it
    under the same terms as Perl itself.

