X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=xs-src%2FMouseTypeConstraints.xs;h=2f4a6b125c599e51aac2c6de35e6f1faa0a52577;hb=12872cc1793844cd99267d224a03a39f21e3a373;hp=b88ba95fbd8a625a04aeb2f5ca252a28b7f27143;hpb=a4b901ac53a9eb592740cd6fb20a136e142671db;p=gitmo%2FMouse.git diff --git a/xs-src/MouseTypeConstraints.xs b/xs-src/MouseTypeConstraints.xs index b88ba95..2f4a6b1 100644 --- a/xs-src/MouseTypeConstraints.xs +++ b/xs-src/MouseTypeConstraints.xs @@ -149,21 +149,11 @@ mouse_tc_RoleName(pTHX_ SV* const data PERL_UNUSED_DECL, SV* const sv) { assert(sv); if(is_class_loaded(sv)){ int ok; - SV* meta; - dSP; ENTER; SAVETMPS; - PUSHMARK(SP); - XPUSHs(sv); - PUTBACK; - call_pv("Mouse::Util::get_metaclass_by_name", G_SCALAR); - SPAGAIN; - meta = POPs; - PUTBACK; - - ok = is_an_instance_of("Mouse::Meta::Role", meta); + ok = is_an_instance_of("Mouse::Meta::Role", get_metaclass(sv)); FREETMPS; LEAVE; @@ -188,19 +178,19 @@ mouse_tc_ScalarRef(pTHX_ SV* const data PERL_UNUSED_DECL, SV* const sv) { int mouse_tc_ArrayRef(pTHX_ SV* const data PERL_UNUSED_DECL, SV* const sv) { assert(sv); - return SvROK(sv) && !SvOBJECT(SvRV(sv)) && SvTYPE(SvRV(sv)) == SVt_PVAV; + return IsArrayRef(sv); } int mouse_tc_HashRef(pTHX_ SV* const data PERL_UNUSED_DECL, SV* const sv) { assert(sv); - return SvROK(sv) && !SvOBJECT(SvRV(sv)) && SvTYPE(SvRV(sv)) == SVt_PVHV; + return IsHashRef(sv); } int mouse_tc_CodeRef(pTHX_ SV* const data PERL_UNUSED_DECL, SV* const sv) { assert(sv); - return SvROK(sv) && !SvOBJECT(SvRV(sv))&& SvTYPE(SvRV(sv)) == SVt_PVCV; + return IsCodeRef(sv); } int @@ -244,7 +234,7 @@ mouse_tc_Object(pTHX_ SV* const data PERL_UNUSED_DECL, SV* const sv) { static int mouse_parameterized_ArrayRef(pTHX_ SV* const param, SV* const sv) { - if(mouse_tc_ArrayRef(aTHX_ NULL, sv)){ + if(IsArrayRef(sv)){ AV* const av = (AV*)SvRV(sv); I32 const len = av_len(av) + 1; I32 i; @@ -546,7 +536,7 @@ CODE: { check_fptr_t fptr; SV* const tc_code = mcall0s(param, "_compiled_type_constraint"); - if(!(SvROK(tc_code) && SvTYPE(SvRV(tc_code)) == SVt_PVCV)){ + if(!IsCodeRef(tc_code)){ croak("_compiled_type_constraint didn't return a CODE reference"); } @@ -581,13 +571,11 @@ void compile_type_constraint(SV* self) CODE: { - AV* const checks = newAV(); + AV* const checks = newAV_mortal(); SV* check; /* check function */ SV* parent; SV* types_ref; - sv_2mortal((SV*)checks); - for(parent = get_slots(self, "parent"); parent; parent = get_slots(parent, "parent")){ check = get_slots(parent, "hand_optimized_type_constraint"); if(check && SvOK(check)){ @@ -625,14 +613,13 @@ CODE: I32 len; I32 i; - if(!mouse_tc_ArrayRef(aTHX_ NULL, types_ref)){ + if(!IsArrayRef(types_ref)){ croak("Not an ARRAY reference"); } types = (AV*)SvRV(types_ref); len = av_len(types) + 1; - union_checks = newAV(); - sv_2mortal((SV*)union_checks); + union_checks = newAV_mortal(); for(i = 0; i < len; i++){ SV* const tc = *av_fetch(types, i, TRUE);