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
add intuit-only match to s///
[perl5.git]
/
pp_sort.c
diff --git
a/pp_sort.c
b/pp_sort.c
index
d6a5e88
..
08aa2d5
100644
(file)
--- a/
pp_sort.c
+++ b/
pp_sort.c
@@
-1432,7
+1432,7
@@
S_qsortsv(pTHX_ gptr *list1, size_t nmemb, SVCOMPARE_t cmp, U32 flags)
Sort an array. Here is an example:
Sort an array. Here is an example:
- sortsv(AvARRAY(av), av_
len
(av)+1, Perl_sv_cmp_locale);
+ sortsv(AvARRAY(av), av_
top_index
(av)+1, Perl_sv_cmp_locale);
Currently this always uses mergesort. See sortsv_flags for a more
flexible routine.
Currently this always uses mergesort. See sortsv_flags for a more
flexible routine.
@@
-1483,6
+1483,7
@@
PP(pp_sort)
OP* const nextop = PL_op->op_next;
I32 overloading = 0;
bool hasargs = FALSE;
OP* const nextop = PL_op->op_next;
I32 overloading = 0;
bool hasargs = FALSE;
+ bool copytmps;
I32 is_xsub = 0;
I32 sorting_av = 0;
const U8 priv = PL_op->op_private;
I32 is_xsub = 0;
I32 sorting_av = 0;
const U8 priv = PL_op->op_private;
@@
-1588,7
+1589,10
@@
PP(pp_sort)
if (SvREADONLY(av))
Perl_croak_no_modify();
else
if (SvREADONLY(av))
Perl_croak_no_modify();
else
+ {
SvREADONLY_on(av);
SvREADONLY_on(av);
+ save_pushptr((void *)av, SAVEt_READONLY_OFF);
+ }
p1 = p2 = AvARRAY(av);
sorting_av = 1;
}
p1 = p2 = AvARRAY(av);
sorting_av = 1;
}
@@
-1601,8
+1605,11
@@
PP(pp_sort)
/* shuffle stack down, removing optional initial cv (p1!=p2), plus
* any nulls; also stringify or converting to integer or number as
* required any args */
/* shuffle stack down, removing optional initial cv (p1!=p2), plus
* any nulls; also stringify or converting to integer or number as
* required any args */
+ copytmps = !sorting_av && PL_sortcop;
for (i=max; i > 0 ; i--) {
if ((*p1 = *p2++)) { /* Weed out nulls. */
for (i=max; i > 0 ; i--) {
if ((*p1 = *p2++)) { /* Weed out nulls. */
+ if (copytmps && SvPADTMP(*p1) && !IS_PADGV(*p1))
+ *p1 = sv_mortalcopy(*p1);
SvTEMP_off(*p1);
if (!PL_sortcop) {
if (priv & OPpSORT_NUMERIC) {
SvTEMP_off(*p1);
if (!PL_sortcop) {
if (priv & OPpSORT_NUMERIC) {
@@
-1648,10
+1655,8
@@
PP(pp_sort)
if (!hasargs && !is_xsub) {
SAVESPTR(PL_firstgv);
SAVESPTR(PL_secondgv);
if (!hasargs && !is_xsub) {
SAVESPTR(PL_firstgv);
SAVESPTR(PL_secondgv);
- SAVESPTR(PL_sortstash);
PL_firstgv = gv_fetchpvs("a", GV_ADD|GV_NOTQUAL, SVt_PV);
PL_secondgv = gv_fetchpvs("b", GV_ADD|GV_NOTQUAL, SVt_PV);
PL_firstgv = gv_fetchpvs("a", GV_ADD|GV_NOTQUAL, SVt_PV);
PL_secondgv = gv_fetchpvs("b", GV_ADD|GV_NOTQUAL, SVt_PV);
- PL_sortstash = stash;
SAVESPTR(GvSV(PL_firstgv));
SAVESPTR(GvSV(PL_secondgv));
}
SAVESPTR(GvSV(PL_firstgv));
SAVESPTR(GvSV(PL_secondgv));
}