Commit | Line | Data |
d846ade3 |
1 | #include "mop.h" |
2 | |
3 | static bool |
4 | find_method (const char *key, STRLEN keylen, SV *val, void *ud) |
5 | { |
6 | bool *found_method = (bool *)ud; |
2dba318b |
7 | PERL_UNUSED_ARG(key); |
8 | PERL_UNUSED_ARG(keylen); |
9 | PERL_UNUSED_ARG(val); |
d846ade3 |
10 | *found_method = TRUE; |
11 | return FALSE; |
12 | } |
13 | |
4154c4d0 |
14 | static bool |
15 | check_version (SV *klass, SV *required_version) |
16 | { |
17 | bool ret = 0; |
18 | |
19 | dSP; |
20 | ENTER; |
21 | SAVETMPS; |
22 | PUSHMARK(SP); |
23 | EXTEND(SP, 2); |
24 | PUSHs(klass); |
25 | PUSHs(required_version); |
26 | PUTBACK; |
27 | |
28 | call_method("VERSION", G_DISCARD|G_VOID|G_EVAL); |
29 | |
30 | SPAGAIN; |
31 | |
32 | if (!SvTRUE(ERRSV)) { |
33 | ret = 1; |
34 | } |
35 | |
36 | PUTBACK; |
37 | FREETMPS; |
38 | LEAVE; |
39 | |
40 | return ret; |
41 | } |
42 | |
53362bcb |
43 | EXTERN_C XS(boot_Class__MOP__Mixin__HasAttributes); |
9b871d79 |
44 | EXTERN_C XS(boot_Class__MOP__Mixin__HasMethods); |
25bcd95c |
45 | EXTERN_C XS(boot_Class__MOP__Package); |
9b871d79 |
46 | EXTERN_C XS(boot_Class__MOP__Mixin__AttributeCore); |
25bcd95c |
47 | EXTERN_C XS(boot_Class__MOP__Method); |
53362bcb |
48 | EXTERN_C XS(boot_Class__MOP__Method__Inlined); |
49 | EXTERN_C XS(boot_Class__MOP__Method__Generated); |
50 | EXTERN_C XS(boot_Class__MOP__Class); |
51 | EXTERN_C XS(boot_Class__MOP__Attribute); |
52 | EXTERN_C XS(boot_Class__MOP__Instance); |
25bcd95c |
53 | |
d846ade3 |
54 | MODULE = Class::MOP PACKAGE = Class::MOP |
55 | |
56 | PROTOTYPES: DISABLE |
57 | |
58 | BOOT: |
22932438 |
59 | mop_prehash_keys(); |
d846ade3 |
60 | |
53362bcb |
61 | MOP_CALL_BOOT (boot_Class__MOP__Mixin__HasAttributes); |
9b871d79 |
62 | MOP_CALL_BOOT (boot_Class__MOP__Mixin__HasMethods); |
e3dcef7f |
63 | MOP_CALL_BOOT (boot_Class__MOP__Package); |
9b871d79 |
64 | MOP_CALL_BOOT (boot_Class__MOP__Mixin__AttributeCore); |
e3dcef7f |
65 | MOP_CALL_BOOT (boot_Class__MOP__Method); |
53362bcb |
66 | MOP_CALL_BOOT (boot_Class__MOP__Method__Inlined); |
67 | MOP_CALL_BOOT (boot_Class__MOP__Method__Generated); |
68 | MOP_CALL_BOOT (boot_Class__MOP__Class); |
69 | MOP_CALL_BOOT (boot_Class__MOP__Attribute); |
70 | MOP_CALL_BOOT (boot_Class__MOP__Instance); |
d846ade3 |
71 | |
72 | # use prototype here to be compatible with get_code_info from Sub::Identify |
73 | void |
74 | get_code_info(coderef) |
75 | SV *coderef |
76 | PROTOTYPE: $ |
77 | PREINIT: |
78 | char *pkg = NULL; |
79 | char *name = NULL; |
80 | PPCODE: |
704f58f9 |
81 | SvGETMAGIC(coderef); |
e1f52a8a |
82 | if (mop_get_code_info(coderef, &pkg, &name)) { |
d846ade3 |
83 | EXTEND(SP, 2); |
efc98200 |
84 | mPUSHs(newSVpv(pkg, 0)); |
85 | mPUSHs(newSVpv(name, 0)); |
d846ade3 |
86 | } |
87 | |
d846ade3 |
88 | void |
4154c4d0 |
89 | is_class_loaded(klass, options=NULL) |
d846ade3 |
90 | SV *klass |
4154c4d0 |
91 | HV *options |
d846ade3 |
92 | PREINIT: |
93 | HV *stash; |
94 | bool found_method = FALSE; |
95 | PPCODE: |
704f58f9 |
96 | SvGETMAGIC(klass); |
97 | if (!(SvPOKp(klass) && SvCUR(klass))) { /* XXX: SvPOK does not work with magical scalars */ |
d846ade3 |
98 | XSRETURN_NO; |
99 | } |
100 | |
101 | stash = gv_stashsv(klass, 0); |
102 | if (!stash) { |
103 | XSRETURN_NO; |
104 | } |
105 | |
4154c4d0 |
106 | if (options && hv_exists_ent(options, KEY_FOR(_version), HASH_FOR(_version))) { |
107 | HE *required_version = hv_fetch_ent(options, KEY_FOR(_version), 0, HASH_FOR(_version)); |
108 | if (check_version (klass, HeVAL(required_version))) { |
109 | XSRETURN_YES; |
110 | } |
111 | |
112 | XSRETURN_NO; |
113 | } |
114 | |
22932438 |
115 | if (hv_exists_ent (stash, KEY_FOR(VERSION), HASH_FOR(VERSION))) { |
116 | HE *version = hv_fetch_ent(stash, KEY_FOR(VERSION), 0, HASH_FOR(VERSION)); |
d846ade3 |
117 | SV *version_sv; |
118 | if (version && HeVAL(version) && (version_sv = GvSV(HeVAL(version)))) { |
119 | if (SvROK(version_sv)) { |
120 | SV *version_sv_ref = SvRV(version_sv); |
121 | |
122 | if (SvOK(version_sv_ref)) { |
123 | XSRETURN_YES; |
124 | } |
125 | } |
126 | else if (SvOK(version_sv)) { |
127 | XSRETURN_YES; |
128 | } |
129 | } |
130 | } |
131 | |
22932438 |
132 | if (hv_exists_ent (stash, KEY_FOR(ISA), HASH_FOR(ISA))) { |
133 | HE *isa = hv_fetch_ent(stash, KEY_FOR(ISA), 0, HASH_FOR(ISA)); |
d9d8a21b |
134 | if (isa && HeVAL(isa) && GvAV(HeVAL(isa)) && av_len(GvAV(HeVAL(isa))) != -1) { |
d846ade3 |
135 | XSRETURN_YES; |
136 | } |
137 | } |
138 | |
e1f52a8a |
139 | mop_get_package_symbols(stash, TYPE_FILTER_CODE, find_method, &found_method); |
d846ade3 |
140 | if (found_method) { |
141 | XSRETURN_YES; |
142 | } |
143 | |
144 | XSRETURN_NO; |