STATIC SV *vmg_data_new(pTHX_ SV *ctor, SV *sv, AV *args) {
#define vmg_data_new(C, S, A) vmg_data_new(aTHX_ (C), (S), (A))
SV *nsv;
+ I32 i, alen = (args == NULL) ? 0 : av_len(args);
dSP;
int count;
SAVETMPS;
PUSHMARK(SP);
- XPUSHs(sv_2mortal(newRV_inc(sv)));
- if (args != NULL) {
- I32 i, alen = av_len(args);
- for (i = 0; i < alen; ++i) { XPUSHs(*av_fetch(args, i, 0)); }
- }
+ EXTEND(SP, alen + 1);
+ PUSHs(sv_2mortal(newRV_inc(sv)));
+ for (i = 0; i < alen; ++i)
+ PUSHs(*av_fetch(args, i, 0));
PUTBACK;
count = call_sv(ctor, G_SCALAR);
w = SV2MGWIZ(wiz);
- SvREFCNT_inc(wiz); /* Fake survival - it's gonna be deleted anyway */
-#if PERL_VERSION_GE(5, 9, 5)
- SvREFCNT_inc(wiz); /* One more push */
-#endif
if (hv_delete(MY_CXT.wizz, buf, sprintf(buf, "%u", w->sig), 0)) {
--MY_CXT.count;
}
+ SvFLAGS(wiz) |= SVf_BREAK;
+ FREETMPS;
if (w->cb_data != NULL) { SvREFCNT_dec(SvRV(w->cb_data)); }
if (w->cb_get != NULL) { SvREFCNT_dec(SvRV(w->cb_get)); }