Upgrade to ExtUtils-MakeMaker-6.50
[p5sagit/p5-mst-13.2.git] / ext / attrs / attrs.xs
1 #define PERL_NO_GET_CONTEXT
2 #include "EXTERN.h"
3 #include "perl.h"
4 #include "XSUB.h"
5
6 static cv_flags_t
7 get_flag(const char *attr)
8 {
9     if (strnEQ(attr, "method", 6))
10         return CVf_METHOD;
11     else if (strnEQ(attr, "locked", 6))
12         return CVf_LOCKED;
13     else
14         return 0;
15 }
16
17 MODULE = attrs          PACKAGE = attrs
18
19 void
20 import(...)
21     ALIAS:
22         unimport = 1
23     PREINIT:
24         int i;
25     PPCODE:
26        if (items < 1)
27            Perl_croak(aTHX_ "Usage: %s(Class, ...)", GvNAME(CvGV(cv)));
28         if (!PL_compcv || !(cv = CvOUTSIDE(PL_compcv)))
29             croak("can't set attributes outside a subroutine scope");
30         if (ckWARN(WARN_DEPRECATED))
31             Perl_warner(aTHX_ packWARN(WARN_DEPRECATED),
32                         "pragma \"attrs\" is deprecated, "
33                         "use \"sub NAME : ATTRS\" instead");
34         for (i = 1; i < items; i++) {
35             const char * const attr = SvPV_nolen(ST(i));
36             const cv_flags_t flag = get_flag(attr);
37             if (!flag)
38                 croak("invalid attribute name %s", attr);
39             if (ix)
40                 CvFLAGS(cv) &= ~flag;
41             else
42                 CvFLAGS(cv) |= flag;
43         }
44
45 void
46 get(sub)
47 SV *    sub
48     PPCODE:
49         if (SvROK(sub)) {
50             sub = SvRV(sub);
51             if (SvTYPE(sub) != SVt_PVCV)
52                 sub = Nullsv;
53         }
54         else {
55             STRLEN len;
56             const char * const name = SvPV(sub, len);
57             sub = (SV*)get_cvn_flags(name, len, SvUTF8(sub));
58         }
59         if (!sub)
60             croak("invalid subroutine reference or name");
61         if (CvFLAGS(sub) & CVf_METHOD)
62             XPUSHs(sv_2mortal(newSVpvn("method", 6)));
63         if (CvFLAGS(sub) & CVf_LOCKED)
64             XPUSHs(sv_2mortal(newSVpvn("locked", 6)));
65