Remove useless check code
[gitmo/Mouse.git] / xs-src / Mouse.xs
1 #include "mouse.h"
2
3 SV* mouse_package;
4 SV* mouse_namespace;
5
6 MODULE = Mouse  PACKAGE = Mouse::Util
7
8 PROTOTYPES: DISABLE
9
10 BOOT:
11     mouse_package   = newSVpvs_share("package");
12     mouse_namespace = newSVpvs_share("namespace");
13
14
15 bool
16 is_class_loaded(SV* sv = &PL_sv_undef)
17
18 void
19 get_code_info(CV* code)
20 PREINIT:
21     GV* gv;
22     HV* stash;
23 PPCODE:
24     if((gv = CvGV(code)) && isGV(gv) && (stash = GvSTASH(gv))){
25         EXTEND(SP, 2);
26         mPUSHs(newSVpvn_share(HvNAME_get(stash), HvNAMELEN_get(stash), 0U));
27         mPUSHs(newSVpvn_share(GvNAME_get(gv), GvNAMELEN_get(gv), 0U));
28     }
29
30 SV*
31 get_code_package(CV* code)
32 PREINIT:
33     HV* stash;
34 CODE:
35     if(CvGV(code) && isGV(CvGV(code)) && (stash = GvSTASH(CvGV(code)))){
36         RETVAL = newSVpvn_share(HvNAME_get(stash), HvNAMELEN_get(stash), 0U);
37     }
38     else{
39         RETVAL = &PL_sv_no;
40     }
41 OUTPUT:
42     RETVAL
43
44 MODULE = Mouse  PACKAGE = Mouse::Meta::Module
45
46 BOOT:
47     INSTALL_SIMPLE_READER_WITH_KEY(Module, name, package);
48     INSTALL_SIMPLE_READER_WITH_KEY(Module, _method_map, methods);
49     INSTALL_SIMPLE_READER_WITH_KEY(Module, _attribute_map, attributes);
50
51 HV*
52 namespace(SV* self)
53 CODE:
54 {
55     SV* const package = mouse_instance_get_slot(self, mouse_package);
56     if(!(package && SvOK(package))){
57         croak("No package name");
58     }
59     RETVAL = gv_stashsv(package, GV_ADDMULTI);
60 }
61 OUTPUT:
62     RETVAL
63
64 CV*
65 _get_code_ref(SV* self, SV* name)
66 CODE:
67 {
68     SV* const stash_ref = mcall0(self, mouse_namespace); /* $self->namespace */
69     HV* stash;
70     HE* he;
71     if(!(SvROK(stash_ref) && SvTYPE(SvRV(stash_ref)) == SVt_PVHV)){
72         croak("namespace() didn't return a HASH reference");
73     }
74     stash = (HV*)SvRV(stash_ref);
75     he = hv_fetch_ent(stash, name, FALSE, 0U);
76     if(he){
77         GV* const gv = (GV*)hv_iterval(stash, he);
78         if(isGV(gv)){
79             RETVAL = GvCVu(gv);
80         }
81         else{ /* special constant or stub */
82             STRLEN len;
83             const char* const pv = SvPV_const(name, len);
84             gv_init(gv, stash, pv, len, GV_ADDMULTI);
85             RETVAL = GvCVu(gv);
86         }
87     }
88     else{
89         RETVAL = NULL;
90     }
91
92     if(!RETVAL){
93         XSRETURN_UNDEF;
94     }
95 }
96 OUTPUT:
97     RETVAL
98
99
100 MODULE = Mouse  PACKAGE = Mouse::Meta::Class
101
102 BOOT:
103     INSTALL_SIMPLE_READER(Class, roles);
104     INSTALL_SIMPLE_PREDICATE_WITH_KEY(Class, is_anon_class, anon_serial_id);
105
106 void
107 linearized_isa(SV* self)
108 PPCODE:
109 {
110     SV* const stash_ref = mcall0(self, mouse_namespace); /* $self->namespace */
111     AV* linearized_isa;
112     I32 len;
113     I32 i;
114     if(!(SvROK(stash_ref) && SvTYPE(SvRV(stash_ref)) == SVt_PVHV)){
115         croak("namespace() didn't return a HASH reference");
116     }
117     linearized_isa = mro_get_linear_isa((HV*)SvRV(stash_ref));
118     len = AvFILLp(linearized_isa) + 1;
119     EXTEND(SP, len);
120     for(i = 0; i < len; i++){
121         PUSHs(AvARRAY(linearized_isa)[i]);
122     }
123 }
124
125 MODULE = Mouse  PACKAGE = Mouse::Meta::Role
126
127 BOOT:
128     INSTALL_SIMPLE_READER_WITH_KEY(Role, get_roles, roles);
129     INSTALL_SIMPLE_PREDICATE_WITH_KEY(Role, is_anon_role, anon_serial_id);
130
131 MODULE = Mouse  PACKAGE = Mouse::Meta::Attribute
132
133 BOOT:
134     /* readers */
135     INSTALL_SIMPLE_READER(Attribute, name);
136     INSTALL_SIMPLE_READER(Attribute, associated_class);
137     INSTALL_SIMPLE_READER(Attribute, accessor);
138     INSTALL_SIMPLE_READER(Attribute, reader);
139     INSTALL_SIMPLE_READER(Attribute, writer);
140     INSTALL_SIMPLE_READER(Attribute, predicate);
141     INSTALL_SIMPLE_READER(Attribute, clearer);
142     INSTALL_SIMPLE_READER(Attribute, handles);
143
144     INSTALL_SIMPLE_READER_WITH_KEY(Attribute, _is_metadata, is);
145     INSTALL_SIMPLE_READER_WITH_KEY(Attribute, is_required, required);
146     INSTALL_SIMPLE_READER(Attribute, default);
147     INSTALL_SIMPLE_READER_WITH_KEY(Attribute, is_lazy, lazy);
148     INSTALL_SIMPLE_READER_WITH_KEY(Attribute, is_lazy_build, lazy_build);
149     INSTALL_SIMPLE_READER_WITH_KEY(Attribute, is_weak_ref, weak_ref);
150     INSTALL_SIMPLE_READER(Attribute, init_arg);
151     INSTALL_SIMPLE_READER(Attribute, type_constraint);
152     INSTALL_SIMPLE_READER(Attribute, trigger);
153     INSTALL_SIMPLE_READER(Attribute, builder);
154     INSTALL_SIMPLE_READER_WITH_KEY(Attribute, should_auto_deref, auto_deref);
155     INSTALL_SIMPLE_READER_WITH_KEY(Attribute, should_coerce, coerce);
156     INSTALL_SIMPLE_READER(Attribute, documentation);
157
158     /* predicates */
159     INSTALL_SIMPLE_PREDICATE_WITH_KEY(Attribute, has_accessor, accessor);
160     INSTALL_SIMPLE_PREDICATE_WITH_KEY(Attribute, has_reader, reader);
161     INSTALL_SIMPLE_PREDICATE_WITH_KEY(Attribute, has_writer, writer);
162     INSTALL_SIMPLE_PREDICATE_WITH_KEY(Attribute, has_predicate, predicate);
163     INSTALL_SIMPLE_PREDICATE_WITH_KEY(Attribute, has_clearer, clearer);
164     INSTALL_SIMPLE_PREDICATE_WITH_KEY(Attribute, has_handles, handles);
165
166     INSTALL_SIMPLE_PREDICATE_WITH_KEY(Attribute, has_default, default);
167     INSTALL_SIMPLE_PREDICATE_WITH_KEY(Attribute, has_type_constraint, type_constraint);
168     INSTALL_SIMPLE_PREDICATE_WITH_KEY(Attribute, has_trigger, trigger);
169     INSTALL_SIMPLE_PREDICATE_WITH_KEY(Attribute, has_builder, builder);
170     INSTALL_SIMPLE_PREDICATE_WITH_KEY(Attribute, has_documentation, documentation);
171
172 MODULE = Mouse  PACKAGE = Mouse::Meta::TypeConstraint
173
174 BOOT:
175     INSTALL_SIMPLE_READER(TypeConstraint, name);
176     INSTALL_SIMPLE_READER(TypeConstraint, parent);
177     INSTALL_SIMPLE_READER(TypeConstraint, message);
178
179     INSTALL_SIMPLE_READER_WITH_KEY(TypeConstraint, _compiled_type_constraint, compiled_type_constraint);
180     INSTALL_SIMPLE_READER(TypeConstraint, _compiled_type_coercion); /* Mouse specific */
181
182     INSTALL_SIMPLE_PREDICATE_WITH_KEY(TypeConstraint, has_coercion, _compiled_type_coercion);
183