Refactor how prehashed hash keys work.
[gitmo/Class-MOP.git] / xs / Package.xs
1 #include "mop.h"
2
3 MODULE = Class::MOP::Package   PACKAGE = Class::MOP::Package
4
5 PROTOTYPES: DISABLE
6
7 void
8 get_all_package_symbols(self, filter=TYPE_FILTER_NONE)
9     SV *self
10     type_filter_t filter
11     PREINIT:
12         HV *stash = NULL;
13         HV *symbols = NULL;
14         register HE *he;
15     PPCODE:
16         if ( ! SvROK(self) ) {
17             die("Cannot call get_all_package_symbols as a class method");
18         }
19
20         if (GIMME_V == G_VOID) {
21             XSRETURN_EMPTY;
22         }
23
24         PUTBACK;
25
26         if ( (he = hv_fetch_ent((HV *)SvRV(self), KEY_FOR(package), 0, HASH_FOR(package))) ) {
27             stash = gv_stashsv(HeVAL(he), 0);
28         }
29
30
31         if (!stash) {
32             XSRETURN_UNDEF;
33         }
34
35         symbols = mop_get_all_package_symbols(stash, filter);
36         PUSHs(sv_2mortal(newRV_noinc((SV *)symbols)));
37
38 void
39 name(self)
40     SV *self
41     PREINIT:
42         register HE *he;
43     PPCODE:
44         if ( ! SvROK(self) ) {
45             die("Cannot call name as a class method");
46         }
47
48         if ( (he = hv_fetch_ent((HV *)SvRV(self), KEY_FOR(package), 0, HASH_FOR(package))) )
49             XPUSHs(HeVAL(he));
50         else
51             ST(0) = &PL_sv_undef;