[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;
     }

Reply via email to