Commit | Line | Data |
d846ade3 |
1 | #ifndef __MOP_H__ |
2 | #define __MOP_H__ |
3 | |
4 | #include "EXTERN.h" |
5 | #include "perl.h" |
6 | #include "XSUB.h" |
7 | |
8 | #define NEED_newRV_noinc |
9 | #define NEED_sv_2pv_flags |
10 | #define NEED_sv_2pv_nolen |
11 | #include "ppport.h" |
12 | |
13 | #define MOP_CALL_BOOT(name) \ |
e3dcef7f |
14 | { \ |
15 | EXTERN_C XS(name); \ |
16 | mop_call_xs(aTHX_ name, cv, mark); \ |
17 | } |
d846ade3 |
18 | |
19 | void mop_call_xs (pTHX_ void (*subaddr) (pTHX_ CV *), CV *cv, SV **mark); |
20 | |
22932438 |
21 | #define DECLARE_KEY(name) { #name, #name, NULL, 0 } |
22 | #define DECLARE_KEY_WITH_VALUE(name, value) { #name, value, NULL, 0 } |
23 | |
24 | typedef enum { |
25 | KEY_name, |
26 | KEY_package, |
27 | KEY_package_name, |
28 | KEY_body, |
29 | KEY_package_cache_flag, |
30 | KEY_methods, |
31 | KEY_VERSION, |
32 | KEY_ISA, |
33 | key_last, |
34 | } mop_prehashed_key_t; |
35 | |
36 | #define KEY_FOR(name) mop_prehashed_key_for(KEY_ ##name) |
37 | #define HASH_FOR(name) mop_prehashed_hash_for(KEY_ ##name) |
38 | |
39 | void mop_prehash_keys (void); |
40 | inline SV *mop_prehashed_key_for (mop_prehashed_key_t key); |
41 | inline U32 mop_prehashed_hash_for (mop_prehashed_key_t key); |
d846ade3 |
42 | |
7ec7b950 |
43 | #define INSTALL_SIMPLE_READER(klass, name) \ |
44 | { \ |
45 | CV *cv = newXS("Class::MOP::" #klass "::" #name, mop_xs_simple_reader, __FILE__); \ |
46 | CvXSUBANY(cv).any_i32 = KEY_ ##name; \ |
47 | } |
48 | |
49 | #define INSTALL_SIMPLE_READER_WITH_KEY(klass, name, key) \ |
50 | { \ |
51 | CV *cv = newXS("Class::MOP::" #klass "::" #name, mop_xs_simple_reader, __FILE__); \ |
52 | CvXSUBANY(cv).any_i32 = KEY_ ##key; \ |
53 | } |
54 | |
7ec7b950 |
55 | XS(mop_xs_simple_reader); |
56 | |
e1f52a8a |
57 | extern SV *mop_method_metaclass; |
58 | extern SV *mop_associated_metaclass; |
59 | extern SV *mop_wrap; |
d846ade3 |
60 | |
61 | UV mop_check_package_cache_flag(pTHX_ HV *stash); |
e1f52a8a |
62 | int mop_get_code_info (SV *coderef, char **pkg, char **name); |
d846ade3 |
63 | SV *mop_call0(pTHX_ SV *const self, SV *const method); |
64 | |
65 | typedef enum { |
66 | TYPE_FILTER_NONE, |
67 | TYPE_FILTER_CODE, |
68 | TYPE_FILTER_ARRAY, |
69 | TYPE_FILTER_IO, |
70 | TYPE_FILTER_HASH, |
71 | TYPE_FILTER_SCALAR, |
72 | } type_filter_t; |
73 | |
74 | typedef bool (*get_package_symbols_cb_t) (const char *, STRLEN, SV *, void *); |
75 | |
e1f52a8a |
76 | void mop_get_package_symbols(HV *stash, type_filter_t filter, get_package_symbols_cb_t cb, void *ud); |
77 | HV *mop_get_all_package_symbols (HV *stash, type_filter_t filter); |
d846ade3 |
78 | |
79 | #endif |