When saving I32s, if the value is small enough save it with the type.
Nicholas Clark [Sat, 20 Feb 2010 19:20:09 +0000 (19:20 +0000)]
This uses a new type, SAVEt_I32_SMALL.

scope.c
scope.h
sv.c

diff --git a/scope.c b/scope.c
index 57c00b6..15081c7 100644 (file)
--- a/scope.c
+++ b/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
diff --git a/scope.h b/scope.h
index 8763f34..9b337e7 100644 (file)
--- a/scope.h
+++ b/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
diff --git a/sv.c b/sv.c
index 3e0367b..80f7ea2 100644 (file)
--- a/sv.c
+++ b/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: