typedef int (*check_fptr_t)(pTHX_ SV* const data, SV* const sv);
+/*
+ NOTE: mouse_tc_check() handles GETMAGIC
+*/
int
mouse_tc_check(pTHX_ SV* const tc_code, SV* const sv) {
CV* const cv = (CV*)SvRV(tc_code);
assert(SvTYPE(cv) == SVt_PVCV);
+ SvGETMAGIC(sv);
if(CvXSUB(cv) == XS_Mouse_constraint_check){ /* built-in type constraints */
MAGIC* const mg = (MAGIC*)CvXSUBANY(cv).any_ptr;
call_sv(tc_code, G_SCALAR);
SPAGAIN;
- ok = SvTRUEx(POPs);
+ ok = sv_true(POPs);
PUTBACK;
FREETMPS;
mouse_tc_Bool(pTHX_ SV* const data PERL_UNUSED_DECL, SV* const sv) {
assert(sv);
- if(SvTRUE(sv)){
+ if(sv_true(sv)){
if(SvIOKp(sv)){
return SvIVX(sv) == 1;
}
if(SvIOKp(sv)){
return TRUE;
}
- else if(SvNOKp(sv)){
+ else if(SvNOKp(sv)) {
NV const nv = SvNVX(sv);
- return nv > 0 ? (nv == (NV)(UV)nv) : (nv == (NV)(IV)nv);
+ NV mod = Perl_fmod( nv, 1 );
+ return mod == 0;
}
else if(SvPOKp(sv)){
int const num_type = grok_number(SvPVX(sv), SvCUR(sv), NULL);
I32 i;
for(i = 0; i < len; i++){
SV* const value = *av_fetch(av, i, TRUE);
- SvGETMAGIC(value);
if(!mouse_tc_check(aTHX_ param, value)){
return FALSE;
}
hv_iterinit(hv);
while((he = hv_iternext(hv))){
SV* const value = hv_iterval(hv, he);
- SvGETMAGIC(value);
if(!mouse_tc_check(aTHX_ param, value)){
hv_iterinit(hv); /* reset */
return FALSE;
call_sv((SV*)instance_isa, G_SCALAR);
SPAGAIN;
-
- retval = SvTRUEx(POPs);
-
+ retval = sv_true(POPs);
PUTBACK;
FREETMPS;
call_method("can", G_SCALAR);
SPAGAIN;
- ok = SvTRUE(TOPs);
- (void)POPs;
+ ok = sv_true(POPs);
PUTBACK;
FREETMPS;
I32 len;
I32 i;
- SvGETMAGIC(methods);
- if(!IsArrayRef(methods)){
- croak("You must pass an ARRAY ref method names");
- }
+ must_ref(methods, "an ARRAY ref for method names", SVt_PVAV);
av = (AV*)SvRV(methods);
len = av_len(av) + 1;
INSTALL_SIMPLE_READER(TypeConstraint, parent);
INSTALL_SIMPLE_READER(TypeConstraint, message);
+ INSTALL_SIMPLE_READER(TypeConstraint, type_parameter);
+
INSTALL_SIMPLE_READER_WITH_KEY(TypeConstraint, _compiled_type_constraint, compiled_type_constraint);
INSTALL_SIMPLE_READER(TypeConstraint, _compiled_type_coercion); /* Mouse specific */
INSTALL_SIMPLE_PREDICATE_WITH_KEY(TypeConstraint, has_coercion, _compiled_type_coercion);
+ INSTALL_SIMPLE_PREDICATE_WITH_KEY(TypeConstraint, __is_parameterized, type_parameter); /* Mouse specific */
void
compile_type_constraint(SV* self)
else{
check = newRV_inc((SV*)mouse_tc_generate(aTHX_ NULL, (check_fptr_t)mouse_types_check, (SV*)checks));
}
- set_slots(self, "compiled_type_constraint", check);
+ (void)set_slots(self, "compiled_type_constraint", check);
}