Add $attr->insertion_order
[gitmo/Mouse.git] / xs-src / MouseUtil.xs
index 3c02d18..2d557a6 100644 (file)
@@ -120,6 +120,30 @@ mouse_throw_error(SV* const metaobject, SV* const data /* not used */, const cha
     }
 }
 
+/* workaround Perl-RT #69939 */
+I32
+mouse_call_sv_safe(pTHX_ SV* const sv, I32 const flags) {
+    I32 count;
+    ENTER;
+    /* Don't do SAVETMPS */
+
+    SAVESPTR(ERRSV);
+    ERRSV = sv_newmortal();
+
+    count = Perl_call_sv(aTHX_ sv, flags | G_EVAL);
+
+    if(sv_true(ERRSV)){
+        SV* const err = sv_mortalcopy(ERRSV);
+        LEAVE;
+        sv_setsv(ERRSV, err);
+        croak(NULL); /* rethrow */
+    }
+
+    LEAVE;
+
+    return count;
+}
+
 void
 mouse_must_defined(pTHX_ SV* const value, const char* const name) {
     assert(value);
@@ -199,7 +223,7 @@ mouse_call0 (pTHX_ SV* const self, SV* const method) {
     XPUSHs(self);
     PUTBACK;
 
-    call_sv(method, G_SCALAR | G_METHOD);
+    call_sv_safe(method, G_SCALAR | G_METHOD);
 
     SPAGAIN;
     ret = POPs;
@@ -219,7 +243,7 @@ mouse_call1 (pTHX_ SV* const self, SV* const method, SV* const arg1) {
     PUSHs(arg1);
     PUTBACK;
 
-    call_sv(method, G_SCALAR | G_METHOD);
+    call_sv_safe(method, G_SCALAR | G_METHOD);
 
     SPAGAIN;
     ret = POPs;
@@ -324,7 +348,7 @@ mouse_install_sub(pTHX_ GV* const gv, SV* const code_ref) {
             }
         }
 
-        CvGV(cv) = gv;
+        CvGV_set(cv, gv);
         CvANON_off(cv);
     }
 }
@@ -350,7 +374,9 @@ CODE:
     }
     {
         dMY_CXT;
-        if(MY_CXT.metas) croak("Cannot set metaclass storage more than once");
+        if(MY_CXT.metas && ckWARN(WARN_REDEFINE)){
+            Perl_warner(aTHX_ packWARN(WARN_REDEFINE), "Metaclass storage more than once");
+        }
         MY_CXT.metas = metas;
         SvREFCNT_inc_simple_void_NN(metas);
     }