resync with mainline
[p5sagit/p5-mst-13.2.git] / ext / attrs / attrs.xs
CommitLineData
c5be433b 1#define PERL_NO_GET_CONTEXT
77a005ab 2#include "EXTERN.h"
3#include "perl.h"
4#include "XSUB.h"
5
6static cv_flags_t
f0f333f4 7get_flag(char *attr)
77a005ab 8{
9 if (strnEQ(attr, "method", 6))
10 return CVf_METHOD;
11 else if (strnEQ(attr, "locked", 6))
12 return CVf_LOCKED;
c529f79d 13 else if (strnEQ(attr, "lvalue", 6))
14 return CVf_LVALUE;
77a005ab 15 else
16 return 0;
17}
18
19MODULE = attrs PACKAGE = attrs
20
21void
f0f333f4 22import(Class, ...)
23char * Class
77a005ab 24 ALIAS:
25 unimport = 1
26 PREINIT:
27 int i;
28 CV *cv;
29 PPCODE:
3280af22 30 if (!PL_compcv || !(cv = CvOUTSIDE(PL_compcv)))
77a005ab 31 croak("can't set attributes outside a subroutine scope");
32 for (i = 1; i < items; i++) {
2d8e6c8d 33 STRLEN n_a;
34 char *attr = SvPV(ST(i), n_a);
77a005ab 35 cv_flags_t flag = get_flag(attr);
36 if (!flag)
37 croak("invalid attribute name %s", attr);
38 if (ix)
39 CvFLAGS(cv) &= ~flag;
40 else
41 CvFLAGS(cv) |= flag;
42 }
43
44void
45get(sub)
46SV * sub
47 PPCODE:
48 if (SvROK(sub)) {
49 sub = SvRV(sub);
50 if (SvTYPE(sub) != SVt_PVCV)
51 sub = Nullsv;
52 }
53 else {
2d8e6c8d 54 STRLEN n_a;
55 char *name = SvPV(sub, n_a);
77a005ab 56 sub = (SV*)perl_get_cv(name, FALSE);
57 }
58 if (!sub)
59 croak("invalid subroutine reference or name");
60 if (CvFLAGS(sub) & CVf_METHOD)
79cb57f6 61 XPUSHs(sv_2mortal(newSVpvn("method", 6)));
77a005ab 62 if (CvFLAGS(sub) & CVf_LOCKED)
79cb57f6 63 XPUSHs(sv_2mortal(newSVpvn("locked", 6)));
77a005ab 64