summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicholas Clark <nick@ccl4.org>2010-02-20 12:21:52 +0000
committerNicholas Clark <nick@ccl4.org>2010-05-01 14:01:41 +0100
commitc6bf6a65e4bf512beae58d59446046f4ca20372f (patch)
tree1c57f74df902dcff874fbc60c8649788ad6919ce
parent620d5b66847dea9c84e6d8017fd953345ed9af51 (diff)
downloadperl-c6bf6a65e4bf512beae58d59446046f4ca20372f.tar.gz
On the save stack, store the save type as the bottom 6 bits of a UV.
This makes the other 26 (or 58) bits available for save data.
-rw-r--r--mathoms.c8
-rw-r--r--mg.c9
-rw-r--r--perl.h1
-rw-r--r--regcomp.c2
-rw-r--r--regexec.c4
-rw-r--r--scope.c28
-rw-r--r--scope.h9
-rw-r--r--sv.c8
8 files changed, 41 insertions, 28 deletions
diff --git a/mathoms.c b/mathoms.c
index 626bbb36bc..aaae227c4c 100644
--- a/mathoms.c
+++ b/mathoms.c
@@ -1171,7 +1171,7 @@ Perl_save_long(pTHX_ long int *longp)
SSCHECK(3);
SSPUSHLONG(*longp);
SSPUSHPTR(longp);
- SSPUSHINT(SAVEt_LONG);
+ SSPUSHUV(SAVEt_LONG);
}
void
@@ -1184,7 +1184,7 @@ Perl_save_iv(pTHX_ IV *ivp)
SSCHECK(3);
SSPUSHIV(*ivp);
SSPUSHPTR(ivp);
- SSPUSHINT(SAVEt_IV);
+ SSPUSHUV(SAVEt_IV);
}
void
@@ -1196,7 +1196,7 @@ Perl_save_nogv(pTHX_ GV *gv)
SSCHECK(2);
SSPUSHPTR(gv);
- SSPUSHINT(SAVEt_NSTAB);
+ SSPUSHUV(SAVEt_NSTAB);
}
void
@@ -1213,7 +1213,7 @@ Perl_save_list(pTHX_ register SV **sarg, I32 maxsarg)
SSCHECK(3);
SSPUSHPTR(sarg[i]); /* remember the pointer */
SSPUSHPTR(sv); /* remember the value */
- SSPUSHINT(SAVEt_ITEM);
+ SSPUSHUV(SAVEt_ITEM);
}
}
diff --git a/mg.c b/mg.c
index c89be40f5f..59ead344d0 100644
--- a/mg.c
+++ b/mg.c
@@ -3071,11 +3071,12 @@ S_restore_magic(pTHX_ const void *p)
*/
if (PL_savestack_ix == mgs->mgs_ss_ix)
{
- I32 popval = SSPOPINT;
- assert(popval == SAVEt_DESTRUCTOR_X);
+ UV type = SSPOPUV;
+ I32 popval;
+ assert(type == SAVEt_DESTRUCTOR_X);
PL_savestack_ix -= 2;
- popval = SSPOPINT;
- assert(popval == SAVEt_ALLOC);
+ type = SSPOPUV;
+ assert(type == SAVEt_ALLOC);
popval = SSPOPINT;
PL_savestack_ix -= popval;
}
diff --git a/perl.h b/perl.h
index 89997a0d4a..c21aaa9308 100644
--- a/perl.h
+++ b/perl.h
@@ -3324,6 +3324,7 @@ union any {
void* any_ptr;
I32 any_i32;
IV any_iv;
+ UV any_uv;
long any_long;
bool any_bool;
void (*any_dptr) (void*);
diff --git a/regcomp.c b/regcomp.c
index a9ebb73568..1a815c67fd 100644
--- a/regcomp.c
+++ b/regcomp.c
@@ -9883,7 +9883,7 @@ Perl_save_re_context(pTHX)
state = (struct re_save_state *)(PL_savestack + PL_savestack_ix);
PL_savestack_ix += SAVESTACK_ALLOC_FOR_RE_SAVE_STATE;
- SSPUSHINT(SAVEt_RE_STATE);
+ SSPUSHUV(SAVEt_RE_STATE);
Copy(&PL_reg_state, state, 1, struct re_save_state);
diff --git a/regexec.c b/regexec.c
index 32efc6724b..cf79417b2c 100644
--- a/regexec.c
+++ b/regexec.c
@@ -335,7 +335,7 @@ S_regcppush(pTHX_ I32 parenfloor)
SSPUSHINT(*PL_reglastcloseparen);
SSPUSHPTR(PL_reginput);
SSPUSHINT(total_elems);
- SSPUSHINT(SAVEt_REGCONTEXT); /* Magic cookie. */
+ SSPUSHUV(SAVEt_REGCONTEXT); /* Magic cookie. */
return retval;
}
@@ -367,7 +367,7 @@ S_regcppop(pTHX_ const regexp *rex)
PERL_ARGS_ASSERT_REGCPPOP;
/* Pop REGCP_OTHER_ELEMS before the parentheses loop starts. */
- i = SSPOPINT;
+ i = SSPOPUV;
assert(i == SAVEt_REGCONTEXT); /* Check that the magic cookie is there. */
i = SSPOPINT; /* Parentheses elements to pop. */
input = (char *) SSPOPPTR;
diff --git a/scope.c b/scope.c
index 64939338ce..78e57602c9 100644
--- a/scope.c
+++ b/scope.c
@@ -202,7 +202,7 @@ Perl_save_pushptrptr(pTHX_ void *const ptr1, void *const ptr2, const int type)
SSCHECK(3);
SSPUSHPTR(ptr1);
SSPUSHPTR(ptr2);
- SSPUSHINT(type);
+ SSPUSHUV(type);
}
SV *
@@ -271,7 +271,7 @@ Perl_save_set_svflags(pTHX_ SV* sv, U32 mask, U32 val)
SSPUSHPTR(sv);
SSPUSHINT(mask);
SSPUSHINT(val);
- SSPUSHINT(SAVEt_SET_SVFLAGS);
+ SSPUSHUV(SAVEt_SET_SVFLAGS);
}
void
@@ -376,7 +376,7 @@ Perl_save_bool(pTHX_ bool *boolp)
SSCHECK(3);
SSPUSHBOOL(*boolp);
SSPUSHPTR(boolp);
- SSPUSHINT(SAVEt_BOOL);
+ SSPUSHUV(SAVEt_BOOL);
}
void
@@ -386,7 +386,7 @@ Perl_save_pushi32ptr(pTHX_ const I32 i, void *const ptr, const int type)
SSCHECK(3);
SSPUSHINT(i);
SSPUSHPTR(ptr);
- SSPUSHINT(type);
+ SSPUSHUV(type);
}
void
@@ -471,7 +471,7 @@ Perl_save_padsv_and_mortalize(pTHX_ PADOFFSET off)
SSPUSHPTR(SvREFCNT_inc_simple_NN(PL_curpad[off]));
SSPUSHPTR(PL_comppad);
SSPUSHLONG((long)off);
- SSPUSHINT(SAVEt_PADSV_AND_MORTALIZE);
+ SSPUSHUV(SAVEt_PADSV_AND_MORTALIZE);
}
void
@@ -500,7 +500,7 @@ Perl_save_pushptr(pTHX_ void *const ptr, const int type)
dVAR;
SSCHECK(2);
SSPUSHPTR(ptr);
- SSPUSHINT(type);
+ SSPUSHUV(type);
}
void
@@ -513,7 +513,7 @@ Perl_save_clearsv(pTHX_ SV **svp)
ASSERT_CURPAD_ACTIVE("save_clearsv");
SSCHECK(2);
SSPUSHLONG((long)(svp-PL_curpad));
- SSPUSHINT(SAVEt_CLEARSV);
+ SSPUSHUV(SAVEt_CLEARSV);
SvPADSTALE_off(*svp); /* mark lexical as active */
}
@@ -563,7 +563,7 @@ Perl_save_destructor(pTHX_ DESTRUCTORFUNC_NOCONTEXT_t f, void* p)
SSCHECK(3);
SSPUSHDPTR(f);
SSPUSHPTR(p);
- SSPUSHINT(SAVEt_DESTRUCTOR);
+ SSPUSHUV(SAVEt_DESTRUCTOR);
}
void
@@ -573,7 +573,7 @@ Perl_save_destructor_x(pTHX_ DESTRUCTORFUNC_t f, void* p)
SSCHECK(3);
SSPUSHDXPTR(f);
SSPUSHPTR(p);
- SSPUSHINT(SAVEt_DESTRUCTOR_X);
+ SSPUSHUV(SAVEt_DESTRUCTOR_X);
}
void
@@ -602,7 +602,7 @@ S_save_pushptri32ptr(pTHX_ void *const ptr1, const I32 i, void *const ptr2,
SSPUSHPTR(ptr1);
SSPUSHINT(i);
SSPUSHPTR(ptr2);
- SSPUSHINT(type);
+ SSPUSHUV(type);
}
void
@@ -644,7 +644,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));
- SSPUSHINT(SAVEt_HELEM);
+ SSPUSHUV(SAVEt_HELEM);
save_scalar_at(sptr, flags);
if (flags & SAVEf_KEEPOLDELEM)
return;
@@ -681,7 +681,7 @@ Perl_save_alloc(pTHX_ I32 size, I32 pad)
PL_savestack_ix += elems;
SSPUSHINT(elems);
- SSPUSHINT(SAVEt_ALLOC);
+ SSPUSHUV(SAVEt_ALLOC);
return start;
}
@@ -705,9 +705,11 @@ Perl_leave_scope(pTHX_ I32 base)
DEBUG_l(Perl_deb(aTHX_ "savestack: releasing items %ld -> %ld\n",
(long)PL_savestack_ix, (long)base));
while (PL_savestack_ix > base) {
+ UV uv = SSPOPUV;
+ const U8 type = (U8)uv & SAVE_MASK;
TAINT_NOT;
- switch (SSPOPINT) {
+ switch (type) {
case SAVEt_ITEM: /* normal string */
value = MUTABLE_SV(SSPOPPTR);
sv = MUTABLE_SV(SSPOPPTR);
diff --git a/scope.h b/scope.h
index 808108ebcc..8763f34f0c 100644
--- a/scope.h
+++ b/scope.h
@@ -59,6 +59,9 @@
#define SAVEf_SETMAGIC 1
#define SAVEf_KEEPOLDELEM 2
+#define SAVE_TIGHT_SHIFT 6
+#define SAVE_MASK 0x3F
+
#define save_aelem(av,idx,sptr) save_aelem_flags(av,idx,sptr,SAVEf_SETMAGIC)
#define save_helem(hv,key,sptr) save_helem_flags(hv,key,sptr,SAVEf_SETMAGIC)
@@ -72,6 +75,7 @@
#define SSPUSHLONG(i) (PL_savestack[PL_savestack_ix++].any_long = (long)(i))
#define SSPUSHBOOL(p) (PL_savestack[PL_savestack_ix++].any_bool = (p))
#define SSPUSHIV(i) (PL_savestack[PL_savestack_ix++].any_iv = (IV)(i))
+#define SSPUSHUV(u) (PL_savestack[PL_savestack_ix++].any_uv = (UV)(u))
#define SSPUSHPTR(p) (PL_savestack[PL_savestack_ix++].any_ptr = (void*)(p))
#define SSPUSHDPTR(p) (PL_savestack[PL_savestack_ix++].any_dptr = (p))
#define SSPUSHDXPTR(p) (PL_savestack[PL_savestack_ix++].any_dxptr = (p))
@@ -79,6 +83,7 @@
#define SSPOPLONG (PL_savestack[--PL_savestack_ix].any_long)
#define SSPOPBOOL (PL_savestack[--PL_savestack_ix].any_bool)
#define SSPOPIV (PL_savestack[--PL_savestack_ix].any_iv)
+#define SSPOPUV (PL_savestack[--PL_savestack_ix].any_uv)
#define SSPOPPTR (PL_savestack[--PL_savestack_ix].any_ptr)
#define SSPOPDPTR (PL_savestack[--PL_savestack_ix].any_dptr)
#define SSPOPDXPTR (PL_savestack[--PL_savestack_ix].any_dxptr)
@@ -192,7 +197,7 @@ scope has the given name. Name must be a literal string.
STMT_START { \
SSCHECK(2); \
SSPUSHINT(PL_stack_sp - PL_stack_base); \
- SSPUSHINT(SAVEt_STACK_POS); \
+ SSPUSHUV(SAVEt_STACK_POS); \
} STMT_END
#define SAVEOP() save_op()
@@ -222,7 +227,7 @@ scope has the given name. Name must be a literal string.
SSCHECK(3); \
SSPUSHINT(cxstack[cxstack_ix].blk_oldsp); \
SSPUSHINT(cxstack_ix); \
- SSPUSHINT(SAVEt_STACK_CXPOS); \
+ SSPUSHUV(SAVEt_STACK_CXPOS); \
} STMT_END
#define SAVEPARSER(p) save_pushptr((p), SAVEt_PARSER)
diff --git a/sv.c b/sv.c
index 2e3ba69548..31db3152ee 100644
--- a/sv.c
+++ b/sv.c
@@ -11430,6 +11430,8 @@ Perl_si_dup(pTHX_ PERL_SI *si, CLONE_PARAMS* param)
#define TOPLONG(ss,ix) ((ss)[ix].any_long)
#define POPIV(ss,ix) ((ss)[--(ix)].any_iv)
#define TOPIV(ss,ix) ((ss)[ix].any_iv)
+#define POPUV(ss,ix) ((ss)[--(ix)].any_uv)
+#define TOPUV(ss,ix) ((ss)[ix].any_uv)
#define POPBOOL(ss,ix) ((ss)[--(ix)].any_bool)
#define TOPBOOL(ss,ix) ((ss)[ix].any_bool)
#define POPPTR(ss,ix) ((ss)[--(ix)].any_ptr)
@@ -11502,8 +11504,10 @@ Perl_ss_dup(pTHX_ PerlInterpreter *proto_perl, CLONE_PARAMS* param)
Newxz(nss, max, ANY);
while (ix > 0) {
- const I32 type = POPINT(ss,ix);
- TOPINT(nss,ix) = type;
+ const UV uv = POPUV(ss,ix);
+ const U8 type = (U8)uv & SAVE_MASK;
+
+ TOPUV(nss,ix) = uv;
switch (type) {
case SAVEt_HELEM: /* hash element */
sv = (const SV *)POPPTR(ss,ix);