/* scope.c
*
- * Copyright (c) 1991-1999, Larry Wall
+ * Copyright (c) 1991-2000, Larry Wall
*
* You may distribute under the terms of either the GNU General Public
* License or the Artistic License, as specified in the README file.
#define PERL_IN_SCOPE_C
#include "perl.h"
+#if defined(PERL_FLEXIBLE_EXCEPTIONS)
void *
Perl_default_protect(pTHX_ volatile JMPENV *pcur_env, int *excpt,
protect_body_t body, ...)
int ex;
void *ret;
- DEBUG_l(Perl_deb(aTHX_ "Setting up local jumplevel %p, was %p\n",
- pcur_env, PL_top_env));
JMPENV_PUSH(ex);
if (ex)
ret = NULL;
JMPENV_POP;
return ret;
}
+#endif
SV**
Perl_stack_grow(pTHX_ SV **sp, SV **p, int n)
Perl_new_stackinfo(pTHX_ I32 stitems, I32 cxitems)
{
PERL_SI *si;
- PERL_CONTEXT *cxt;
New(56, si, 1, PERL_SI);
si->si_stack = newAV();
AvREAL_off(si->si_stack);
return save_scalar_at(sptr);
}
-/* Like save_svref(), but doesn't deal with magic. Can be used to
+/* Like save_sptr(), but also SvREFCNT_dec()s the new value. Can be used to
* restore a global SV to its prior contents, freeing new value. */
void
Perl_save_generic_svref(pTHX_ SV **sptr)
SSPUSHINT(SAVEt_GENERIC_SVREF);
}
+/* Like save_pptr(), but also Safefree()s the new value if it is different
+ * from the old one. Can be used to restore a global char* to its prior
+ * contents, freeing new value. */
+void
+Perl_save_generic_pvref(pTHX_ char **str)
+{
+ dTHR;
+ SSCHECK(3);
+ SSPUSHPTR(str);
+ SSPUSHPTR(*str);
+ SSPUSHINT(SAVEt_GENERIC_PVREF);
+}
+
void
Perl_save_gp(pTHX_ GV *gv, I32 empty)
{
av = GvAVn(gv);
if (SvMAGIC(oav)) {
SvMAGIC(av) = SvMAGIC(oav);
- SvFLAGS(av) |= SvMAGICAL(oav);
+ SvFLAGS((SV*)av) |= SvMAGICAL(oav);
SvMAGICAL_off(oav);
SvMAGIC(oav) = 0;
PL_localizing = 1;
hv = GvHVn(gv);
if (SvMAGIC(ohv)) {
SvMAGIC(hv) = SvMAGIC(ohv);
- SvFLAGS(hv) |= SvMAGICAL(ohv);
+ SvFLAGS((SV*)hv) |= SvMAGICAL(ohv);
SvMAGICAL_off(ohv);
SvMAGIC(ohv) = 0;
PL_localizing = 1;
register AV *av;
register HV *hv;
register void* ptr;
+ register char* str;
I32 i;
if (base < -1)
ptr = &GvSV(gv);
SvREFCNT_dec(gv);
goto restore_sv;
+ case SAVEt_GENERIC_PVREF: /* generic pv */
+ str = (char*)SSPOPPTR;
+ ptr = SSPOPPTR;
+ if (*(char**)ptr != str) {
+ Safefree(*(char**)ptr);
+ *(char**)ptr = str;
+ }
+ break;
case SAVEt_GENERIC_SVREF: /* generic sv */
value = (SV*)SSPOPPTR;
ptr = SSPOPPTR;
- if (ptr) {
- sv = *(SV**)ptr;
- *(SV**)ptr = value;
- SvREFCNT_dec(sv);
- }
+ sv = *(SV**)ptr;
+ *(SV**)ptr = value;
+ SvREFCNT_dec(sv);
SvREFCNT_dec(value);
break;
case SAVEt_SVREF: /* scalar reference */
if (GvAV(gv)) {
AV *goner = GvAV(gv);
SvMAGIC(av) = SvMAGIC(goner);
- SvFLAGS(av) |= SvMAGICAL(goner);
+ SvFLAGS((SV*)av) |= SvMAGICAL(goner);
SvMAGICAL_off(goner);
SvMAGIC(goner) = 0;
SvREFCNT_dec(goner);
}
*(I32*)&PL_hints = (I32)SSPOPINT;
break;
+ case SAVEt_COMPPAD:
+ PL_comppad = (AV*)SSPOPPTR;
+ if (PL_comppad)
+ PL_curpad = AvARRAY(PL_comppad);
+ else
+ PL_curpad = Null(SV**);
+ break;
default:
Perl_croak(aTHX_ "panic: leave_scope inconsistency");
}
PerlIO_printf(Perl_debug_log, "BLK_EVAL.OLD_OP_TYPE = %s (%s)\n",
PL_op_name[cx->blk_eval.old_op_type],
PL_op_desc[cx->blk_eval.old_op_type]);
- PerlIO_printf(Perl_debug_log, "BLK_EVAL.OLD_NAME = %s\n",
- cx->blk_eval.old_name);
+ if (cx->blk_eval.old_namesv)
+ PerlIO_printf(Perl_debug_log, "BLK_EVAL.OLD_NAME = %s\n",
+ SvPVX(cx->blk_eval.old_namesv));
PerlIO_printf(Perl_debug_log, "BLK_EVAL.OLD_EVAL_ROOT = 0x%"UVxf"\n",
PTR2UV(cx->blk_eval.old_eval_root));
break;