[EMAIL PROTECTED] wrote:
# New Ticket Created by Salvador Fandiño
# Please include the string: [perl #36350]
# in the subject line of all future correspondence about this issue.
# <URL: https://rt.perl.org/rt3/Ticket/Display.html?id=36350 >
This is a bug report for perl from [EMAIL PROTECTED],
generated with the help of perlbug 1.35 running under perl v5.8.5.
-----------------------------------------------------------------
[Please enter your report here]
sorting a list of numbers as integers (via 'use integer') in
descending order gives an unstable sort:
$ perl
use sort stable;
@a=(2.7, 1.7, 1, 4.8, 4.3, 0.8);
use integer;
@u = sort { $b <=> $a } @a;
@s = sort { int $b <=> int $a } @a;
sub pa { print join(", ", @_), "\n"}
pa @a; pa @s; pa @u'
__END__
2.7, 1.7, 1, 4.8, 4.3, 0.8
4.8, 4.3, 2.7, 1.7, 1, 0.8
4.3, 4.8, 2.7, 1, 1.7, 0.8
Cheers,
- Salvador.
I have not been able to reproduce the bug on any perl compiled by
myself, but anyway, I am sure the problem is caused by the nasty macro
SORTHINTS(hintsv), that relays on the evaluation order of something like
result = (v = foo(), bar(v));
The patch attached breaks the macro in two: dSORTHINTS and SORTHINTS,
they do the same operation but in two steps.
Cheers,
- Salvador.
--- pp_sort.c~ 2005-06-20 12:16:05.000000000 +0200
+++ pp_sort.c 2005-06-21 18:09:04.000000000 +0200
@@ -46,9 +46,8 @@
#define sv_cmp_static Perl_sv_cmp
#define sv_cmp_locale_static Perl_sv_cmp_locale
-#define SORTHINTS(hintsv) \
- (((hintsv) = GvSV(gv_fetchpv("sort::hints", GV_ADDMULTI, SVt_IV))), \
- (SvIOK(hintsv) ? ((I32)SvIV(hintsv)) : 0))
+#define dSORTHINTS SV *hintsv = GvSV(gv_fetchpv("sort::hints", GV_ADDMULTI, SVt_IV))
+#define SORTHINTS (SvIOK(hintsv) ? ((I32)SvIV(hintsv)) : 0)
#ifndef SMALLSORT
#define SMALLSORT (200)
@@ -1347,9 +1346,10 @@
STATIC void
S_qsortsv(pTHX_ gptr *list1, size_t nmemb, SVCOMPARE_t cmp, U32 flags)
{
- SV *hintsv;
- if (SORTHINTS(hintsv) & HINT_SORT_STABLE) {
+ dSORTHINTS;
+
+ if (SORTHINTS & HINT_SORT_STABLE) {
register gptr **pp, *q;
register size_t n, j, i;
gptr *small[SMALLSORT], **indir, tmp;
@@ -1442,14 +1442,8 @@
{
void (*sortsvp)(pTHX_ SV **array, size_t nmemb, SVCOMPARE_t cmp, U32 flags)
= S_mergesortsv;
- SV *hintsv;
-
- /* Sun's Compiler (cc: WorkShop Compilers 4.2 30 Oct 1996 C 4.2) used
- to miscompile this function under optimization -O. If you get test
- errors related to picking the correct sort() function, try recompiling
- this file without optimiziation. -- A.D. 4/2002.
- */
- const I32 hints = SORTHINTS(hintsv);
+ dSORTHINTS;
+ const I32 hints = SORTHINTS;
if (hints & HINT_SORT_QUICKSORT) {
sortsvp = S_qsortsv;
}
@@ -1467,14 +1461,8 @@
{
void (*sortsvp)(pTHX_ SV **array, size_t nmemb, SVCOMPARE_t cmp, U32 flags)
= S_mergesortsv;
- SV *hintsv;
-
- /* Sun's Compiler (cc: WorkShop Compilers 4.2 30 Oct 1996 C 4.2) used
- to miscompile this function under optimization -O. If you get test
- errors related to picking the correct sort() function, try recompiling
- this file without optimiziation. -- A.D. 4/2002.
- */
- const I32 hints = SORTHINTS(hintsv);
+ dSORTHINTS;
+ const I32 hints = SORTHINTS;
if (hints & HINT_SORT_QUICKSORT) {
sortsvp = S_qsortsv;
}