X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=xs-src%2Fmouse_accessor.xs;h=6222f746bc646a2b9c9a8a4abf907b44524e66ee;hb=a5df48e596d4b685f53bf59ef581d6999ab14eb6;hp=54c2db655aa795b40101f2f02674245ab895e812;hpb=935400114c35ad1b2481c48ff471e180e9c93d93;p=gitmo%2FMouse.git diff --git a/xs-src/mouse_accessor.xs b/xs-src/mouse_accessor.xs index 54c2db6..6222f74 100644 --- a/xs-src/mouse_accessor.xs +++ b/xs-src/mouse_accessor.xs @@ -45,7 +45,7 @@ static MGVTBL mouse_accessor_vtbl; /* MAGIC identity */ CV* mouse_instantiate_xs_accessor(pTHX_ SV* const attr, XSUBADDR_t const accessor_impl){ - SV* const slot = mcall0s(attr, "name"); + SV* const slot = mcall0(attr, mouse_name); AV* const xa = newAV(); CV* xsub; MAGIC* mg; @@ -91,7 +91,7 @@ mouse_instantiate_xs_accessor(pTHX_ SV* const attr, XSUBADDR_t const accessor_im else{ mouse_throw_error(attr, tc, "Can not auto de-reference the type constraint '%"SVf"'", - mcall0s(tc, "name")); + mcall0(tc, mouse_name)); } } @@ -135,7 +135,6 @@ static SV* mouse_apply_type_constraint(pTHX_ AV* const xa, SV* value, U16 const flags){ SV* const tc = MOUSE_xa_tc(xa); SV* tc_code; - int ok; if(flags & MOUSEf_ATTR_SHOULD_COERCE){ value = mcall1s(tc, "coerce", value); @@ -160,33 +159,10 @@ mouse_apply_type_constraint(pTHX_ AV* const xa, SV* value, U16 const flags){ tc_code = MOUSE_xa_tc_code(xa); } - if(SvIOK(tc_code)){ /* built-in type constraints */ - ok = mouse_tc_check(aTHX_ SvIVX(tc_code), value); - } - else { - dSP; - - ENTER; - SAVETMPS; - - PUSHMARK(SP); - XPUSHs(value); - PUTBACK; - - call_sv(tc_code, G_SCALAR); - - SPAGAIN; - ok = SvTRUEx(POPs); - PUTBACK; - - FREETMPS; - LEAVE; - } - - if(!ok){ + if(!mouse_tc_check(aTHX_ tc_code, value)){ mouse_throw_error(MOUSE_xa_attribute(xa), value, "Attribute (%"SVf") does not pass the type constraint because: %"SVf, - mcall0s(MOUSE_xa_attribute(xa), "name"), + mcall0(MOUSE_xa_attribute(xa), mouse_name), mcall1s(tc, "get_message", value)); } @@ -196,9 +172,8 @@ mouse_apply_type_constraint(pTHX_ AV* const xa, SV* value, U16 const flags){ /* pushes return values, does auto-deref if needed */ static void -mouse_push_values(pTHX_ AV* const xa, SV* const value, U16 const flags){ +mouse_push_values(pTHX_ SV* const value, U16 const flags){ dSP; - PERL_UNUSED_ARG(xa); if(flags & MOUSEf_ATTR_SHOULD_AUTO_DEREF && GIMME_V == G_ARRAY){ if(!(value && SvOK(value))){ @@ -246,7 +221,6 @@ mouse_push_values(pTHX_ AV* const xa, SV* const value, U16 const flags){ static void mouse_attr_get(pTHX_ SV* const self, MAGIC* const mg){ - AV* const xa = MOUSE_mg_xa(mg); U16 const flags = MOUSE_mg_flags(mg); SV* const slot = MOUSE_mg_slot(mg); SV* value; @@ -255,7 +229,9 @@ mouse_attr_get(pTHX_ SV* const self, MAGIC* const mg){ /* check_lazy */ if( !value && flags & MOUSEf_ATTR_IS_LAZY ){ + AV* const xa = MOUSE_mg_xa(mg); SV* const attr = MOUSE_xa_attribute(xa); + /* get default value by $attr->default or $attr->builder */ if(flags & MOUSEf_ATTR_HAS_DEFAULT){ value = mcall0s(attr, "default"); @@ -282,17 +258,16 @@ mouse_attr_get(pTHX_ SV* const self, MAGIC* const mg){ value = mouse_instance_set_slot(aTHX_ self, slot, value); } - mouse_push_values(aTHX_ xa, value, flags); + mouse_push_values(aTHX_ value, flags); } static void mouse_attr_set(pTHX_ SV* const self, MAGIC* const mg, SV* value){ - AV* const xa = MOUSE_mg_xa(mg); U16 const flags = MOUSE_mg_flags(mg); SV* const slot = MOUSE_mg_slot(mg); if(flags & MOUSEf_ATTR_HAS_TC){ - value = mouse_apply_type_constraint(aTHX_ xa, value, flags); + value = mouse_apply_type_constraint(aTHX_ MOUSE_mg_xa(mg), value, flags); } mouse_instance_set_slot(aTHX_ self, slot, value); @@ -302,7 +277,7 @@ mouse_attr_set(pTHX_ SV* const self, MAGIC* const mg, SV* value){ } if(flags & MOUSEf_ATTR_HAS_TRIGGER){ - SV* const trigger = mcall0s(MOUSE_xa_attribute(xa), "trigger"); + SV* const trigger = mcall0s(MOUSE_mg_attribute(mg), "trigger"); dSP; PUSHMARK(SP); @@ -315,7 +290,7 @@ mouse_attr_set(pTHX_ SV* const self, MAGIC* const mg, SV* value){ /* need not SPAGAIN */ } - mouse_push_values(aTHX_ xa, value, flags); + mouse_push_values(aTHX_ value, flags); } XS(mouse_xs_accessor)