Use bit-or, not simple assignment
[gitmo/Mouse.git] / xs-src / mouse_accessor.xs
index 54c2db6..6222f74 100644 (file)
@@ -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)