* 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
*/
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:
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;
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);
/* 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);