void *
Perl_default_protect(pTHX_ int *excpt, protect_body_t body, ...)
{
+ void *ret;
+ va_list args;
+ va_start(args, body);
+ ret = vdefault_protect(excpt, body, &args);
+ va_end(args);
+ return ret;
+}
+
+void *
+Perl_vdefault_protect(pTHX_ int *excpt, protect_body_t body, va_list *args)
+{
dTHR;
dJMPENV;
- va_list args;
int ex;
void *ret;
JMPENV_PUSH(ex);
if (ex)
ret = NULL;
- else {
- va_start(args, body);
- ret = CALL_FPTR(body)(aTHX_ args);
- va_end(args);
- }
+ else
+ ret = CALL_FPTR(body)(aTHX_ *args);
*excpt = ex;
JMPENV_POP;
return ret;
#ifdef USE_THREADS
dTHR;
SV **svp = &THREADSV(i); /* XXX Change to save by offset */
- DEBUG_S(PerlIO_printf(PerlIO_stderr(), "save_threadsv %u: %p %p:%s\n",
+ DEBUG_S(PerlIO_printf(Perl_debug_log, "save_threadsv %u: %p %p:%s\n",
i, svp, *svp, SvPEEK(*svp)));
save_svref(svp);
return svp;
}
void
-Perl_save_destructor(pTHX_ DESTRUCTORFUNC_t f, void* p)
+Perl_save_destructor(pTHX_ DESTRUCTORFUNC_NOCONTEXT_t f, void* p)
{
dTHR;
SSCHECK(3);
}
void
+Perl_save_destructor_x(pTHX_ DESTRUCTORFUNC_t f, void* p)
+{
+ dTHR;
+ SSCHECK(3);
+ SSPUSHDXPTR(f);
+ SSPUSHPTR(p);
+ SSPUSHINT(SAVEt_DESTRUCTOR_X);
+}
+
+void
Perl_save_aelem(pTHX_ AV *av, I32 idx, SV **sptr)
{
dTHR;
ptr = SSPOPPTR;
restore_sv:
sv = *(SV**)ptr;
- DEBUG_S(PerlIO_printf(PerlIO_stderr(),
+ DEBUG_S(PerlIO_printf(Perl_debug_log,
"restore svref: %p %p:%s -> %p:%s\n",
ptr, sv, SvPEEK(sv), value, SvPEEK(value)));
if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv) &&
break;
case SAVEt_DESTRUCTOR:
ptr = SSPOPPTR;
- CALLDESTRUCTOR(aTHXo_ ptr);
+ (*SSPOPDPTR)(ptr);
+ break;
+ case SAVEt_DESTRUCTOR_X:
+ ptr = SSPOPPTR;
+ (*SSPOPDXPTR)(aTHXo_ ptr);
break;
case SAVEt_REGCONTEXT:
case SAVEt_ALLOC: