Provided by: libdevel-callchecker-perl_0.008-2build3_amd64 bug

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.

perl v5.38.2                                       2024-03-31                            Devel::CallChecker(3pm)