Use new macro CvGV_set() (see perl5133delta)
[gitmo/Mouse.git] / xs-src / MouseUtil.xs
index e562748..2d557a6 100644 (file)
@@ -120,27 +120,28 @@ mouse_throw_error(SV* const metaobject, SV* const data /* not used */, const cha
     }
 }
 
-/* workaround RT #69939 */
+/* workaround Perl-RT #69939 */
 I32
 mouse_call_sv_safe(pTHX_ SV* const sv, I32 const flags) {
-    const PERL_CONTEXT* const cx = &cxstack[cxstack_ix];
-    assert( (flags & G_EVAL) == 0 );
-    //warn("%d 0x%x 0x%x", (int)cx->cx_type, (int)cx->cx_type, (int)PL_in_eval);
-    if(!(cx->cx_type & (CXt_EVAL|CXp_TRYBLOCK))) {
-        I32 count;
-        //SAVESPTR(ERRSV);
-        //ERRSV = sv_newmortal();
-
-        count = Perl_call_sv(aTHX_ sv, flags | G_EVAL);
-
-        if(sv_true(ERRSV)){
-            croak(NULL); /* rethrow */
-        }
-        return count;
-    }
-    else {
-        return Perl_call_sv(aTHX_ sv, 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
@@ -347,7 +348,7 @@ mouse_install_sub(pTHX_ GV* const gv, SV* const code_ref) {
             }
         }
 
-        CvGV(cv) = gv;
+        CvGV_set(cv, gv);
         CvANON_off(cv);
     }
 }