Tweaks
[gitmo/Mouse.git] / xs-src / MouseAccessor.xs
index ca0bb90..27be7b9 100644 (file)
@@ -1,9 +1,9 @@
 #include "mouse.h"
 
-#define CHECK_INSTANCE(instance) STMT_START{      \
-        if(!IsHashRef(instance)){                 \
-            croak("Invalid object instance");     \
-        }                                         \
+#define CHECK_INSTANCE(instance) STMT_START{                           \
+        if(!(SvROK(instance) && SvTYPE(SvRV(instance)) == SVt_PVHV)){  \
+            croak("Invalid object instance");                          \
+        }                                                              \
     } STMT_END
 
 
@@ -144,14 +144,22 @@ mouse_attr_set(pTHX_ SV* const self, MAGIC* const mg, SV* value){
         SV* const trigger = mcall0s(MOUSE_mg_attribute(mg), "trigger");
         dSP;
 
+        /* NOTE: triggers can remove value, so
+                 value must be copied here,
+                 revealed by Net::Google::DataAPI (DANJOU).
+         */
+        value = sv_mortalcopy(value);
+
         PUSHMARK(SP);
         EXTEND(SP, 2);
         PUSHs(self);
         PUSHs(value);
 
         PUTBACK;
-        call_sv(trigger, G_VOID | G_DISCARD);
+        call_sv_safe(trigger, G_VOID | G_DISCARD);
         /* need not SPAGAIN */
+
+        assert(SvTYPE(value) != SVTYPEMASK);
     }
 
     PUSH_VALUE(value, flags);