1
2#include "EXTERN.h"
3#include "perl.h"
4#include "XSUB.h"
5#include "ppport.h"
6
7/*
8get_code_info:
9  Pass in a coderef, returns:
10  [ $pkg_name, $coderef_name ] ie:
11  [ 'Foo::Bar', 'new' ]
12*/
13
14MODULE = Sub::Identify   PACKAGE = Sub::Identify
15
16PROTOTYPES: ENABLE
17
18void
19get_code_info(coderef)
20    SV* coderef
21    PREINIT:
22        char* name;
23        char* pkg;
24    PPCODE:
25        if (SvOK(coderef) && SvROK(coderef) && SvTYPE(SvRV(coderef)) == SVt_PVCV) {
26            coderef = SvRV(coderef);
27            if (CvGV(coderef)) {
28                name = GvNAME( CvGV(coderef) );
29                pkg = HvNAME( GvSTASH(CvGV(coderef)) );
30                EXTEND(SP, 2);
31                PUSHs(sv_2mortal(newSVpvn(pkg, strlen(pkg))));
32                PUSHs(sv_2mortal(newSVpvn(name, strlen(name))));
33            }
34            else {
35                /* sub is being compiled: bail out and return nothing. */
36            }
37        }
38