cast to CV to avoid warning
[gitmo/Moose.git] / Moose.xs
index b187946..f5d4b57 100644 (file)
--- a/Moose.xs
+++ b/Moose.xs
@@ -150,11 +150,12 @@ typedef struct {
  * 00000000 00000000 00000000 00000000
  *                             ^       trigger
  *                              ^      weak
- *                               ^     tc refcnt
+ *                               ^     tc.sv is refcounted
  *                                 ^^^ tc_kind
  *                                ^    coerce
  *                        ^^^          default_kind
  *                       ^             lazy
+ *                      ^              def.sv is refcounted
  *                 ^                   required
  * ^^^^^^^                             if 0 then nothing special (just hash)? FIXME TBD
  */
@@ -383,6 +384,28 @@ STATIC bool check_sv_type (TC type, SV *sv) {
     return 0;
 }
 
+STATIC bool check_sv_cv (pTHX_ SV *cv, SV *sv) {
+    bool ret;
+    dSP;
+
+    ENTER;
+    SAVETMPS;
+    PUSHMARK(SP);
+    XPUSHs(sv);
+    PUTBACK;
+
+    call_sv(cv, G_SCALAR);
+
+    SPAGAIN;
+    ret = SvTRUE(POPs);
+
+    PUTBACK;
+    FREETMPS;
+    LEAVE;
+
+    return ret;
+}
+
 STATIC bool check_type_constraint(pTHX_ tc_kind kind, TC_CHECK tc_check, SV *type_constraint, SV *sv) {
     switch (kind) {
         case tc_none:
@@ -398,6 +421,8 @@ STATIC bool check_type_constraint(pTHX_ tc_kind kind, TC_CHECK tc_check, SV *typ
             return tc_check.fptr(aTHX_ type_constraint, sv);
             break;
         case tc_cv:
+            return check_sv_cv(aTHX_ tc_check.sv, sv);
+            break;
         case tc_op:
             croak("todo");
             break;
@@ -513,7 +538,7 @@ STATIC void init_attr (MI *mi, ATTR *attr, AV *desc) {
     attr->type_constraint = newSVsv(tc);
     SvREFCNT_inc(attr->trigger);
     SvREFCNT_inc(attr->initializer);
-    if ( flags & ATTR_TCREFCNT ) SvREFCNT_inc(attr->tc_check.sv);
+    if ( flags & ATTR_TCREFCNT )  SvREFCNT_inc(attr->tc_check.sv);
     if ( flags & ATTR_DEFREFCNT ) SvREFCNT_inc(attr->def.sv);
 
     attr->slot_sv = newSVpvn_share(pv, len, hash);
@@ -559,14 +584,15 @@ STATIC void delete_mi (pTHX_ MI *mi) {
         /* clear the pointers to this meta attr from all the CVs */
         SV **cvs = AvARRAY(attr->cvs);
         for ( j = av_len(attr->cvs); j >= 0; j-- ) {
-            CV *cv = cvs[j];
+            CV *cv = (CV *)cvs[j];
             XSANY.any_i32 = 0;
         }
 
         SvREFCNT_dec(attr->cvs);
         SvREFCNT_dec(attr->slot_sv);
         SvREFCNT_dec(attr->type_constraint);
-        if ( attr->flags & ATTR_TCREFCNT ) SvREFCNT_dec(attr->tc_check.sv);
+        if ( attr->flags & ATTR_TCREFCNT )  SvREFCNT_dec(attr->tc_check.sv);
+        if ( attr->flags & ATTR_DEFREFCNT ) SvREFCNT_dec(attr->def.sv);
         SvREFCNT_dec(attr->initializer);
         SvREFCNT_dec(attr->trigger);
         SvREFCNT_dec(attr->meta_attr);