Skip to content

Commit

Permalink
When saving I32s, if the value is small enough save it with the type.
Browse files Browse the repository at this point in the history
This uses a new type, SAVEt_I32_SMALL.
  • Loading branch information
nwc10 committed May 5, 2010
1 parent c0b977f commit 89abef2
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 1 deletion.
12 changes: 11 additions & 1 deletion scope.c
Expand Up @@ -426,10 +426,16 @@ void
Perl_save_I32(pTHX_ I32 *intp)
{
dVAR;
const UV shifted = (UV)*intp << SAVE_TIGHT_SHIFT;

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
Expand Down Expand Up @@ -804,6 +810,10 @@ Perl_leave_scope(pTHX_ I32 base)
ptr = SSPOPPTR;
*(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;
#ifdef PERL_DEBUG_READONLY_OPS
Expand Down
1 change: 1 addition & 0 deletions scope.h
Expand Up @@ -55,6 +55,7 @@
#define SAVEt_STACK_CXPOS 44
#define SAVEt_PARSER 45
#define SAVEt_ADELETE 46
#define SAVEt_I32_SMALL 47

#define SAVEf_SETMAGIC 1
#define SAVEf_KEEPOLDELEM 2
Expand Down
1 change: 1 addition & 0 deletions sv.c
Expand Up @@ -11583,6 +11583,7 @@ Perl_ss_dup(pTHX_ PerlInterpreter *proto_perl, CLONE_PARAMS* param)
ptr = POPPTR(ss,ix);
TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
/* Fall through */
case SAVEt_I32_SMALL:
case SAVEt_I16: /* I16 reference */
case SAVEt_I8: /* I8 reference */
case SAVEt_BOOL:
Expand Down

0 comments on commit 89abef2

Please sign in to comment.