Checking in changes prior to tagging of version 0.48. Changelog diff is:
[gitmo/Mouse.git] / xs-src / Mouse.xs
index b3d411c..df7ca48 100644 (file)
@@ -249,8 +249,9 @@ mouse_class_initialize_object(pTHX_ SV* const meta, SV* const object, HV* const
     assert(args);
     assert(SvTYPE(args) == SVt_PVHV);
 
-    ENTER;
-    SAVETMPS;
+    if(mg_find((SV*)args, PERL_MAGIC_tied)){
+        croak("You cannot use tied HASH reference as initializing arguments");
+    }
 
     if(!ignore_triggers){
         triggers_queue = newAV_mortal();
@@ -309,8 +310,6 @@ mouse_class_initialize_object(pTHX_ SV* const meta, SV* const object, HV* const
         set_slot(object, newSVpvs_flags("__METACLASS__", SVs_TEMP), meta);
     }
 
-    FREETMPS;
-    LEAVE;
 }
 
 static SV*
@@ -349,7 +348,12 @@ mouse_buildall(pTHX_ AV* const xc, SV* const object, SV* const args) {
         PUSHs(args);
         PUTBACK;
 
-        call_sv(AvARRAY(buildall)[i], G_VOID | G_DISCARD);
+        call_sv(AvARRAY(buildall)[i], G_VOID);
+
+        /* discard a scalar which G_VOID returns */
+        SPAGAIN;
+        (void)POPs;
+        PUTBACK;
     }
 }
 
@@ -586,10 +590,9 @@ CODE:
     AV* demolishall;
     I32 len, i;
 
-    PERL_UNUSED_VAR(ix);
-
     if(!IsObject(object)){
-        croak("You must not call DESTROY as a class method");
+        croak("You must not call %s as a class method",
+            ix == 0 ? "DESTROY" : "DEMOLISHALL");
     }
 
     if(SvOK(meta)){
@@ -628,8 +631,14 @@ CODE:
             XPUSHs(object);
             PUTBACK;
 
-            call_sv(AvARRAY(demolishall)[i], G_VOID | G_DISCARD | G_EVAL);
-            if(SvTRUE(ERRSV)){
+            call_sv(AvARRAY(demolishall)[i], G_VOID | G_EVAL);
+
+            /* discard a scalar which G_VOID returns */
+            SPAGAIN;
+            (void)POPs;
+            PUTBACK;
+
+            if(sv_true(ERRSV)){
                 SV* const e = newSVsv(ERRSV);
 
                 FREETMPS;
@@ -663,8 +672,5 @@ CODE:
     if(!IsHashRef(args)){
         croak("You must pass a HASH reference to BUILDALL");
     }
-    if(mg_find(SvRV(args), PERL_MAGIC_tied)){
-        croak("You cannot use tie HASH reference as args");
-    }
     mouse_buildall(aTHX_ xc, self, args);
 }