Fix RT #54203 (reported by chocolateboy) that setters might return undef.
[gitmo/Mouse.git] / xs-src / Mouse.xs
index a7d8dec..0a7d3f9 100644 (file)
@@ -253,9 +253,6 @@ mouse_class_initialize_object(pTHX_ SV* const meta, SV* const object, HV* const
         croak("You cannot use tied HASH reference as initializing arguments");
     }
 
-    ENTER;
-    SAVETMPS;
-
     if(!ignore_triggers){
         triggers_queue = newAV_mortal();
     }
@@ -274,7 +271,7 @@ mouse_class_initialize_object(pTHX_ SV* const meta, SV* const object, HV* const
             if(flags & MOUSEf_ATTR_HAS_TC){
                 value = mouse_xa_apply_type_constraint(aTHX_ xa, value, flags);
             }
-            set_slot(object, slot, value);
+            value = set_slot(object, slot, value);
             if(SvROK(value) && flags & MOUSEf_ATTR_IS_WEAK_REF){
                 weaken_slot(object, slot);
             }
@@ -310,11 +307,9 @@ mouse_class_initialize_object(pTHX_ SV* const meta, SV* const object, HV* const
     }
 
     if(MOUSE_xc_flags(xc) & MOUSEf_XC_IS_ANON){
-        set_slot(object, newSVpvs_flags("__METACLASS__", SVs_TEMP), meta);
+        (void)set_slot(object, newSVpvs_flags("__METACLASS__", SVs_TEMP), meta);
     }
 
-    FREETMPS;
-    LEAVE;
 }
 
 static SV*
@@ -353,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;
     }
 }
 
@@ -439,7 +439,7 @@ CODE:
     }
     sv_setsv_mg((SV*)gv, code_ref); /* *gv = $code_ref */
 
-    set_slot(methods, name, code); /* $self->{methods}{$name} = $code */
+    (void)set_slot(methods, name, code); /* $self->{methods}{$name} = $code */
 
     /* name the CODE ref if it's anonymous */
     {
@@ -590,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)){
@@ -632,7 +631,13 @@ CODE:
             XPUSHs(object);
             PUTBACK;
 
-            call_sv(AvARRAY(demolishall)[i], G_VOID | G_DISCARD | G_EVAL);
+            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);