source: trunk/essentials/dev-lang/perl/ext/attrs/attrs.xs

Last change on this file was 3181, checked in by bird, 18 years ago

perl 5.8.8

File size: 1.4 KB
Line 
1#define PERL_NO_GET_CONTEXT
2#include "EXTERN.h"
3#include "perl.h"
4#include "XSUB.h"
5
6static cv_flags_t
7get_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
17MODULE = attrs PACKAGE = attrs
18
19void
20import(...)
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
45void
46get(sub)
47SV * sub
48 PPCODE:
49 if (SvROK(sub)) {
50 sub = SvRV(sub);
51 if (SvTYPE(sub) != SVt_PVCV)
52 sub = Nullsv;
53 }
54 else {
55 const char * const name = SvPV_nolen(sub);
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)
61 XPUSHs(sv_2mortal(newSVpvn("method", 6)));
62 if (CvFLAGS(sub) & CVf_LOCKED)
63 XPUSHs(sv_2mortal(newSVpvn("locked", 6)));
64
Note: See TracBrowser for help on using the repository browser.