More robust tests for threads
[gitmo/Mouse.git] / xs-src / MouseTypeConstraints.xs
index 6f69f2f..5260d88 100644 (file)
@@ -84,7 +84,7 @@ mouse_tc_Bool(pTHX_ SV* const data PERL_UNUSED_DECL, SV* const sv) {
         }
     }
     else{
-        /* false must be boolean */
+        /* any false value must be boolean */
         return TRUE;
     }
 }
@@ -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;
@@ -271,6 +261,7 @@ mouse_parameterized_HashRef(pTHX_ SV* const param, SV* const sv) {
             SV* const value = hv_iterval(hv, he);
             SvGETMAGIC(value);
             if(!mouse_tc_check(aTHX_ param, value)){
+                hv_iterinit(hv); /* reset */
                 return FALSE;
             }
         }
@@ -581,13 +572,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)){
@@ -631,8 +620,7 @@ CODE:
         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);