This is a live mirror of the Perl 5 development currently hosted at
https://github.com/perl/perl5
https://perl5.git.perl.org
/
perl5.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
t/lib/common.pl must convert $^X to an absolute path before changing directory.
[perl5.git]
/
scope.c
diff --git
a/scope.c
b/scope.c
index
5da2554
..
5445da9
100644
(file)
--- a/
scope.c
+++ b/
scope.c
@@
-77,7
+77,7
@@
Perl_cxinc(pTHX)
dVAR;
const IV old_max = cxstack_max;
cxstack_max = GROW(cxstack_max);
dVAR;
const IV old_max = cxstack_max;
cxstack_max = GROW(cxstack_max);
- Renew(cxstack, cxstack_max + 1, PERL_CONTEXT);
/* XXX should fix CXINC macro */
+ Renew(cxstack, cxstack_max + 1, PERL_CONTEXT);
/* Without any kind of initialising deep enough recursion
* will end up reading uninitialised PERL_CONTEXTs. */
PoisonNew(cxstack + old_max + 1, cxstack_max - old_max, PERL_CONTEXT);
/* Without any kind of initialising deep enough recursion
* will end up reading uninitialised PERL_CONTEXTs. */
PoisonNew(cxstack + old_max + 1, cxstack_max - old_max, PERL_CONTEXT);
@@
-93,7
+93,7
@@
Perl_push_scope(pTHX)
Renew(PL_scopestack, PL_scopestack_max, I32);
#ifdef DEBUGGING
Renew(PL_scopestack_name, PL_scopestack_max, const char*);
Renew(PL_scopestack, PL_scopestack_max, I32);
#ifdef DEBUGGING
Renew(PL_scopestack_name, PL_scopestack_max, const char*);
-#endif
DEBUGGING
+#endif
}
#ifdef DEBUGGING
PL_scopestack_name[PL_scopestack_ix] = "unknown";
}
#ifdef DEBUGGING
PL_scopestack_name[PL_scopestack_ix] = "unknown";
@@
-202,7
+202,7
@@
Perl_save_pushptrptr(pTHX_ void *const ptr1, void *const ptr2, const int type)
SSCHECK(3);
SSPUSHPTR(ptr1);
SSPUSHPTR(ptr2);
SSCHECK(3);
SSPUSHPTR(ptr1);
SSPUSHPTR(ptr2);
- SSPUSH
INT
(type);
+ SSPUSH
UV
(type);
}
SV *
}
SV *
@@
-271,7
+271,7
@@
Perl_save_set_svflags(pTHX_ SV* sv, U32 mask, U32 val)
SSPUSHPTR(sv);
SSPUSHINT(mask);
SSPUSHINT(val);
SSPUSHPTR(sv);
SSPUSHINT(mask);
SSPUSHINT(val);
- SSPUSH
INT
(SAVEt_SET_SVFLAGS);
+ SSPUSH
UV
(SAVEt_SET_SVFLAGS);
}
void
}
void
@@
-281,7
+281,15
@@
Perl_save_gp(pTHX_ GV *gv, I32 empty)
PERL_ARGS_ASSERT_SAVE_GP;
PERL_ARGS_ASSERT_SAVE_GP;
- save_pushptrptr(SvREFCNT_inc(gv), GvGP(gv), SAVEt_GP);
+ SSCHECK(4);
+ SSPUSHINT(SvFAKE(gv));
+ SSPUSHPTR(GvGP(gv));
+ SSPUSHPTR(SvREFCNT_inc(gv));
+ SSPUSHUV(SAVEt_GP);
+
+ /* Don't let the localized GV coerce into non-glob, otherwise we would
+ * not be able to restore GP upon leave from context if that happened */
+ SvFAKE_off(gv);
if (empty) {
GP *gp = Perl_newGP(aTHX_ gv);
if (empty) {
GP *gp = Perl_newGP(aTHX_ gv);
@@
-365,10
+373,9
@@
Perl_save_bool(pTHX_ bool *boolp)
PERL_ARGS_ASSERT_SAVE_BOOL;
PERL_ARGS_ASSERT_SAVE_BOOL;
- SSCHECK(3);
- SSPUSHBOOL(*boolp);
+ SSCHECK(2);
SSPUSHPTR(boolp);
SSPUSHPTR(boolp);
- SSPUSH
INT(SAVEt_BOOL
);
+ SSPUSH
UV(SAVEt_BOOL | (*boolp << 8)
);
}
void
}
void
@@
-378,17
+385,23
@@
Perl_save_pushi32ptr(pTHX_ const I32 i, void *const ptr, const int type)
SSCHECK(3);
SSPUSHINT(i);
SSPUSHPTR(ptr);
SSCHECK(3);
SSPUSHINT(i);
SSPUSHPTR(ptr);
- SSPUSH
INT
(type);
+ SSPUSH
UV
(type);
}
void
Perl_save_int(pTHX_ int *intp)
{
dVAR;
}
void
Perl_save_int(pTHX_ int *intp)
{
dVAR;
+ const UV shifted = (UV)*intp << SAVE_TIGHT_SHIFT;
PERL_ARGS_ASSERT_SAVE_INT;
PERL_ARGS_ASSERT_SAVE_INT;
- save_pushi32ptr(*intp, intp, SAVEt_INT);
+ if ((int)(shifted >> SAVE_TIGHT_SHIFT) == *intp) {
+ SSCHECK(2);
+ SSPUSHPTR(intp);
+ SSPUSHUV(SAVEt_INT_SMALL | shifted);
+ } else
+ save_pushi32ptr(*intp, intp, SAVEt_INT);
}
void
}
void
@@
-398,7
+411,9
@@
Perl_save_I8(pTHX_ I8 *bytep)
PERL_ARGS_ASSERT_SAVE_I8;
PERL_ARGS_ASSERT_SAVE_I8;
- save_pushi32ptr(*bytep, bytep, SAVEt_I8);
+ SSCHECK(2);
+ SSPUSHPTR(bytep);
+ SSPUSHUV(SAVEt_I8 | ((UV)*bytep << 8));
}
void
}
void
@@
-408,17
+423,25
@@
Perl_save_I16(pTHX_ I16 *intp)
PERL_ARGS_ASSERT_SAVE_I16;
PERL_ARGS_ASSERT_SAVE_I16;
- save_pushi32ptr(*intp, intp, SAVEt_I16);
+ SSCHECK(2);
+ SSPUSHPTR(intp);
+ SSPUSHUV(SAVEt_I16 | ((UV)*intp << 8));
}
void
Perl_save_I32(pTHX_ I32 *intp)
{
dVAR;
}
void
Perl_save_I32(pTHX_ I32 *intp)
{
dVAR;
+ const UV shifted = (UV)*intp << SAVE_TIGHT_SHIFT;
PERL_ARGS_ASSERT_SAVE_I32;
PERL_ARGS_ASSERT_SAVE_I32;
- save_pushi32ptr(*intp, intp, SAVEt_I32);
+ if ((I32)(shifted >> SAVE_TIGHT_SHIFT) == *intp) {
+ SSCHECK(2);
+ SSPUSHPTR(intp);
+ SSPUSHUV(SAVEt_I32_SMALL | shifted);
+ } else
+ save_pushi32ptr(*intp, intp, SAVEt_I32);
}
/* Cannot use save_sptr() to store a char* since the SV** cast will
}
/* Cannot use save_sptr() to store a char* since the SV** cast will
@@
-463,7
+486,7
@@
Perl_save_padsv_and_mortalize(pTHX_ PADOFFSET off)
SSPUSHPTR(SvREFCNT_inc_simple_NN(PL_curpad[off]));
SSPUSHPTR(PL_comppad);
SSPUSHLONG((long)off);
SSPUSHPTR(SvREFCNT_inc_simple_NN(PL_curpad[off]));
SSPUSHPTR(PL_comppad);
SSPUSHLONG((long)off);
- SSPUSH
INT
(SAVEt_PADSV_AND_MORTALIZE);
+ SSPUSH
UV
(SAVEt_PADSV_AND_MORTALIZE);
}
void
}
void
@@
-492,20
+515,25
@@
Perl_save_pushptr(pTHX_ void *const ptr, const int type)
dVAR;
SSCHECK(2);
SSPUSHPTR(ptr);
dVAR;
SSCHECK(2);
SSPUSHPTR(ptr);
- SSPUSH
INT
(type);
+ SSPUSH
UV
(type);
}
void
Perl_save_clearsv(pTHX_ SV **svp)
{
dVAR;
}
void
Perl_save_clearsv(pTHX_ SV **svp)
{
dVAR;
+ const UV offset = svp - PL_curpad;
+ const UV offset_shifted = offset << SAVE_TIGHT_SHIFT;
PERL_ARGS_ASSERT_SAVE_CLEARSV;
ASSERT_CURPAD_ACTIVE("save_clearsv");
PERL_ARGS_ASSERT_SAVE_CLEARSV;
ASSERT_CURPAD_ACTIVE("save_clearsv");
- SSCHECK(2);
- SSPUSHLONG((long)(svp-PL_curpad));
- SSPUSHINT(SAVEt_CLEARSV);
+ if ((offset_shifted >> SAVE_TIGHT_SHIFT) != offset)
+ Perl_croak(aTHX_ "panic: pad offset %"UVuf" out of range (%p-%p)",
+ offset, svp, PL_curpad);
+
+ SSCHECK(1);
+ SSPUSHUV(offset_shifted | SAVEt_CLEARSV);
SvPADSTALE_off(*svp); /* mark lexical as active */
}
SvPADSTALE_off(*svp); /* mark lexical as active */
}
@@
-555,7
+583,7
@@
Perl_save_destructor(pTHX_ DESTRUCTORFUNC_NOCONTEXT_t f, void* p)
SSCHECK(3);
SSPUSHDPTR(f);
SSPUSHPTR(p);
SSCHECK(3);
SSPUSHDPTR(f);
SSPUSHPTR(p);
- SSPUSH
INT
(SAVEt_DESTRUCTOR);
+ SSPUSH
UV
(SAVEt_DESTRUCTOR);
}
void
}
void
@@
-565,7
+593,7
@@
Perl_save_destructor_x(pTHX_ DESTRUCTORFUNC_t f, void* p)
SSCHECK(3);
SSPUSHDXPTR(f);
SSPUSHPTR(p);
SSCHECK(3);
SSPUSHDXPTR(f);
SSPUSHPTR(p);
- SSPUSH
INT
(SAVEt_DESTRUCTOR_X);
+ SSPUSH
UV
(SAVEt_DESTRUCTOR_X);
}
void
}
void
@@
-594,7
+622,7
@@
S_save_pushptri32ptr(pTHX_ void *const ptr1, const I32 i, void *const ptr2,
SSPUSHPTR(ptr1);
SSPUSHINT(i);
SSPUSHPTR(ptr2);
SSPUSHPTR(ptr1);
SSPUSHINT(i);
SSPUSHPTR(ptr2);
- SSPUSH
INT
(type);
+ SSPUSH
UV
(type);
}
void
}
void
@@
-619,7
+647,7
@@
Perl_save_aelem_flags(pTHX_ AV *av, I32 idx, SV **sptr, const U32 flags)
* won't actually be stored in the array - so it won't get
* reaped when the localize ends. Ensure it gets reaped by
* mortifying it instead. DAPM */
* won't actually be stored in the array - so it won't get
* reaped when the localize ends. Ensure it gets reaped by
* mortifying it instead. DAPM */
- if (SvTIED_mg(
sv, PERL_MAGIC_tiedelem
))
+ if (SvTIED_mg(
(const SV *)av, PERL_MAGIC_tied
))
sv_2mortal(sv);
}
sv_2mortal(sv);
}
@@
-636,7
+664,7
@@
Perl_save_helem_flags(pTHX_ HV *hv, SV *key, SV **sptr, const U32 flags)
SSPUSHPTR(SvREFCNT_inc_simple(hv));
SSPUSHPTR(newSVsv(key));
SSPUSHPTR(SvREFCNT_inc(*sptr));
SSPUSHPTR(SvREFCNT_inc_simple(hv));
SSPUSHPTR(newSVsv(key));
SSPUSHPTR(SvREFCNT_inc(*sptr));
- SSPUSH
INT
(SAVEt_HELEM);
+ SSPUSH
UV
(SAVEt_HELEM);
save_scalar_at(sptr, flags);
if (flags & SAVEf_KEEPOLDELEM)
return;
save_scalar_at(sptr, flags);
if (flags & SAVEf_KEEPOLDELEM)
return;
@@
-645,7
+673,7
@@
Perl_save_helem_flags(pTHX_ HV *hv, SV *key, SV **sptr, const U32 flags)
* won't actually be stored in the hash - so it won't get
* reaped when the localize ends. Ensure it gets reaped by
* mortifying it instead. DAPM */
* won't actually be stored in the hash - so it won't get
* reaped when the localize ends. Ensure it gets reaped by
* mortifying it instead. DAPM */
- if (SvTIED_mg(
sv, PERL_MAGIC_tiedelem
))
+ if (SvTIED_mg(
(const SV *)hv, PERL_MAGIC_tied
))
sv_2mortal(sv);
}
sv_2mortal(sv);
}
@@
-667,13
+695,17
@@
Perl_save_alloc(pTHX_ I32 size, I32 pad)
dVAR;
register const I32 start = pad + ((char*)&PL_savestack[PL_savestack_ix]
- (char*)PL_savestack);
dVAR;
register const I32 start = pad + ((char*)&PL_savestack[PL_savestack_ix]
- (char*)PL_savestack);
- register const I32 elems = 1 + ((size + pad - 1) / sizeof(*PL_savestack));
+ const UV elems = 1 + ((size + pad - 1) / sizeof(*PL_savestack));
+ const UV elems_shifted = elems << SAVE_TIGHT_SHIFT;
- SSGROW(elems + 2);
+ if ((elems_shifted >> SAVE_TIGHT_SHIFT) != elems)
+ Perl_croak(aTHX_ "panic: save_alloc elems %"UVuf" out of range (%ld-%ld)",
+ elems, size, pad);
+
+ SSGROW(elems + 1);
PL_savestack_ix += elems;
PL_savestack_ix += elems;
- SSPUSHINT(elems);
- SSPUSHINT(SAVEt_ALLOC);
+ SSPUSHUV(SAVEt_ALLOC | elems_shifted);
return start;
}
return start;
}
@@
-694,10
+726,14
@@
Perl_leave_scope(pTHX_ I32 base)
if (base < -1)
Perl_croak(aTHX_ "panic: corrupt saved stack index");
if (base < -1)
Perl_croak(aTHX_ "panic: corrupt saved stack index");
+ DEBUG_l(Perl_deb(aTHX_ "savestack: releasing items %ld -> %ld\n",
+ (long)PL_savestack_ix, (long)base));
while (PL_savestack_ix > base) {
while (PL_savestack_ix > base) {
+ UV uv = SSPOPUV;
+ const U8 type = (U8)uv & SAVE_MASK;
TAINT_NOT;
TAINT_NOT;
- switch (
SSPOPINT
) {
+ switch (
type
) {
case SAVEt_ITEM: /* normal string */
value = MUTABLE_SV(SSPOPPTR);
sv = MUTABLE_SV(SSPOPPTR);
case SAVEt_ITEM: /* normal string */
value = MUTABLE_SV(SSPOPPTR);
sv = MUTABLE_SV(SSPOPPTR);
@@
-772,13
+808,21
@@
Perl_leave_scope(pTHX_ I32 base)
PL_localizing = 0;
}
break;
PL_localizing = 0;
}
break;
+ case SAVEt_INT_SMALL:
+ ptr = SSPOPPTR;
+ *(int*)ptr = (int)(uv >> SAVE_TIGHT_SHIFT);
+ break;
case SAVEt_INT: /* int reference */
ptr = SSPOPPTR;
*(int*)ptr = (int)SSPOPINT;
break;
case SAVEt_BOOL: /* bool reference */
ptr = SSPOPPTR;
case SAVEt_INT: /* int reference */
ptr = SSPOPPTR;
*(int*)ptr = (int)SSPOPINT;
break;
case SAVEt_BOOL: /* bool reference */
ptr = SSPOPPTR;
- *(bool*)ptr = (bool)SSPOPBOOL;
+ *(bool*)ptr = cBOOL(uv >> 8);
+ break;
+ case SAVEt_I32_SMALL:
+ ptr = SSPOPPTR;
+ *(I32*)ptr = (I32)(uv >> SAVE_TIGHT_SHIFT);
break;
case SAVEt_I32: /* I32 reference */
ptr = SSPOPPTR;
break;
case SAVEt_I32: /* I32 reference */
ptr = SSPOPPTR;
@@
-810,10
+854,11
@@
Perl_leave_scope(pTHX_ I32 base)
*(AV**)ptr = MUTABLE_AV(SSPOPPTR);
break;
case SAVEt_GP: /* scalar reference */
*(AV**)ptr = MUTABLE_AV(SSPOPPTR);
break;
case SAVEt_GP: /* scalar reference */
- ptr = SSPOPPTR;
gv = MUTABLE_GV(SSPOPPTR);
gp_free(gv);
gv = MUTABLE_GV(SSPOPPTR);
gp_free(gv);
- GvGP(gv) = (GP*)ptr;
+ GvGP(gv) = (GP*)SSPOPPTR;
+ if (SSPOPINT)
+ SvFAKE_on(gv);
/* putting a method back into circulation ("local")*/
if (GvCVu(gv) && (hv=GvSTASH(gv)) && HvNAME_get(hv))
mro_method_changed_in(hv);
/* putting a method back into circulation ("local")*/
if (GvCVu(gv) && (hv=GvSTASH(gv)) && HvNAME_get(hv))
mro_method_changed_in(hv);
@@
-837,7
+882,7
@@
Perl_leave_scope(pTHX_ I32 base)
Safefree(ptr);
break;
case SAVEt_CLEARSV:
Safefree(ptr);
break;
case SAVEt_CLEARSV:
- ptr = (void*)&PL_curpad[
SSPOPLONG
];
+ ptr = (void*)&PL_curpad[
uv >> SAVE_TIGHT_SHIFT
];
sv = *(SV**)ptr;
DEBUG_Xv(PerlIO_printf(Perl_debug_log,
sv = *(SV**)ptr;
DEBUG_Xv(PerlIO_printf(Perl_debug_log,
@@
-913,9
+958,9
@@
Perl_leave_scope(pTHX_ I32 base)
(*SSPOPDXPTR)(aTHX_ ptr);
break;
case SAVEt_REGCONTEXT:
(*SSPOPDXPTR)(aTHX_ ptr);
break;
case SAVEt_REGCONTEXT:
+ /* regexp must have croaked */
case SAVEt_ALLOC:
case SAVEt_ALLOC:
- i = SSPOPINT;
- PL_savestack_ix -= i; /* regexp must have croaked */
+ PL_savestack_ix -= uv >> SAVE_TIGHT_SHIFT;
break;
case SAVEt_STACK_POS: /* Position on Perl stack */
i = SSPOPINT;
break;
case SAVEt_STACK_POS: /* Position on Perl stack */
i = SSPOPINT;
@@
-1063,11
+1108,11
@@
Perl_leave_scope(pTHX_ I32 base)
case SAVEt_I16: /* I16 reference */
ptr = SSPOPPTR;
case SAVEt_I16: /* I16 reference */
ptr = SSPOPPTR;
- *(I16*)ptr = (I16)
SSPOPINT
;
+ *(I16*)ptr = (I16)
(uv >> 8)
;
break;
case SAVEt_I8: /* I8 reference */
ptr = SSPOPPTR;
break;
case SAVEt_I8: /* I8 reference */
ptr = SSPOPPTR;
- *(I8*)ptr = (I8)
SSPOPINT
;
+ *(I8*)ptr = (I8)
(uv >> 8)
;
break;
case SAVEt_DESTRUCTOR:
ptr = SSPOPPTR;
break;
case SAVEt_DESTRUCTOR:
ptr = SSPOPPTR;
@@
-1113,6
+1158,8
@@
Perl_leave_scope(pTHX_ I32 base)
}
PL_tainted = was;
}
PL_tainted = was;
+
+ PERL_ASYNC_CHECK();
}
void
}
void