diff options
author | Nicholas Clark <nick@ccl4.org> | 2010-02-20 19:39:37 +0000 |
---|---|---|
committer | Nicholas Clark <nick@ccl4.org> | 2010-05-05 13:44:49 +0100 |
commit | 994d373a075399b04d509cb2732e0a956c88e014 (patch) | |
tree | f63c576e17112f54901861f1272a0d0946d5ddbc /scope.c | |
parent | 89abef211f482f5f37aeb9b02c71c4452feb5c34 (diff) | |
download | perl-994d373a075399b04d509cb2732e0a956c88e014.tar.gz |
When saving ints, if the value is small enough save it with the type.
This uses a new type, SAVEt_INT_SMALL.
Diffstat (limited to 'scope.c')
-rw-r--r-- | scope.c | 12 |
1 files changed, 11 insertions, 1 deletions
@@ -392,10 +392,16 @@ void Perl_save_int(pTHX_ int *intp) { dVAR; + const UV shifted = (UV)*intp << SAVE_TIGHT_SHIFT; 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 @@ -802,6 +808,10 @@ Perl_leave_scope(pTHX_ I32 base) 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; |