This is a live mirror of the Perl 5 development currently hosted at
https://github.com/perl/perl5
https://perl5.git.perl.org
/
perl5.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Document tricks, work-arounds for user-defined casing
[perl5.git]
/
scope.c
diff --git
a/scope.c
b/scope.c
index
8a769a3
..
92e9523
100644
(file)
--- a/
scope.c
+++ b/
scope.c
@@
-392,10
+392,16
@@
void
Perl_save_int(pTHX_ int *intp)
{
dVAR;
Perl_save_int(pTHX_ int *intp)
{
dVAR;
+ const UV shifted = (UV)*intp << SAVE_TIGHT_SHIFT;
PERL_ARGS_ASSERT_SAVE_INT;
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
}
void
@@
-405,7
+411,9
@@
Perl_save_I8(pTHX_ I8 *bytep)
PERL_ARGS_ASSERT_SAVE_I8;
PERL_ARGS_ASSERT_SAVE_I8;
- save_pushi32ptr(*bytep, bytep, SAVEt_I8);
+ SSCHECK(2);
+ SSPUSHPTR(bytep);
+ SSPUSHUV(SAVEt_I8 | ((UV)*bytep << 8));
}
void
}
void
@@
-415,17
+423,25
@@
Perl_save_I16(pTHX_ I16 *intp)
PERL_ARGS_ASSERT_SAVE_I16;
PERL_ARGS_ASSERT_SAVE_I16;
- save_pushi32ptr(*intp, intp, SAVEt_I16);
+ SSCHECK(2);
+ SSPUSHPTR(intp);
+ SSPUSHUV(SAVEt_I16 | ((UV)*intp << 8));
}
void
Perl_save_I32(pTHX_ I32 *intp)
{
dVAR;
}
void
Perl_save_I32(pTHX_ I32 *intp)
{
dVAR;
+ const UV shifted = (UV)*intp << SAVE_TIGHT_SHIFT;
PERL_ARGS_ASSERT_SAVE_I32;
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
}
/* Cannot use save_sptr() to store a char* since the SV** cast will
@@
-792,6
+808,10
@@
Perl_leave_scope(pTHX_ I32 base)
PL_localizing = 0;
}
break;
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;
case SAVEt_INT: /* int reference */
ptr = SSPOPPTR;
*(int*)ptr = (int)SSPOPINT;
@@
-800,6
+820,10
@@
Perl_leave_scope(pTHX_ I32 base)
ptr = SSPOPPTR;
*(bool*)ptr = cBOOL(uv >> 8);
break;
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
case SAVEt_I32: /* I32 reference */
ptr = SSPOPPTR;
#ifdef PERL_DEBUG_READONLY_OPS
@@
-1084,11
+1108,11
@@
Perl_leave_scope(pTHX_ I32 base)
case SAVEt_I16: /* I16 reference */
ptr = SSPOPPTR;
case SAVEt_I16: /* I16 reference */
ptr = SSPOPPTR;
- *(I16*)ptr = (I16)
SSPOPINT
;
+ *(I16*)ptr = (I16)
(uv >> 8)
;
break;
case SAVEt_I8: /* I8 reference */
ptr = SSPOPPTR;
break;
case SAVEt_I8: /* I8 reference */
ptr = SSPOPPTR;
- *(I8*)ptr = (I8)
SSPOPINT
;
+ *(I8*)ptr = (I8)
(uv >> 8)
;
break;
case SAVEt_DESTRUCTOR:
ptr = SSPOPPTR;
break;
case SAVEt_DESTRUCTOR:
ptr = SSPOPPTR;