Skip to content
Browse files

When saving I32s, if the value is small enough save it with the type.

This uses a new type, SAVEt_I32_SMALL.
  • Loading branch information...
1 parent c0b977f commit 89abef211f482f5f37aeb9b02c71c4452feb5c34 Nicholas Clark committed
Showing with 13 additions and 1 deletion.
  1. +11 −1 scope.c
  2. +1 −0 scope.h
  3. +1 −0 sv.c
View
12 scope.c
@@ -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
@@ -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
View
1 scope.h
@@ -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
View
1 sv.c
@@ -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:

0 comments on commit 89abef2

Please sign in to comment.
Something went wrong with that request. Please try again.