Просмотр исходного кода

fix https://github.com/pocketpy/pocketpy/issues/360

blueloveTH 10 месяцев назад
Родитель
Сommit
ccb0c8cd1c
3 измененных файлов с 10 добавлено и 4 удалено
  1. 2 2
      src/common/algorithm.c
  2. 1 1
      tests/05_list.py
  3. 7 1
      tests/95_bugs.py

+ 2 - 2
src/common/algorithm.c

@@ -12,10 +12,10 @@ static bool _stable_sort_merge(char* a,
                   int (*f_lt)(const void* a, const void* b, void* extra),
                   void* extra) {
     while(a < a_end && b < b_end) {
-        int res = f_lt(a, b, extra);
+        int res = f_lt(b, a, extra);
         // check error
         if(res == -1) return false;
-        if(res) {
+        if(res == 0) {  // !(b<a) -> (a>=b)
             memcpy(r, a, elem_size);
             a += elem_size;
         } else {

+ 1 - 1
tests/05_list.py

@@ -88,7 +88,7 @@ assert list(range(5, 1, -2)) == [5, 3]
 # test sort
 a = [8, 2, 4, 2, 9]
 assert a.sort() == None
-assert a == [2, 2, 4, 8, 9]
+assert (a == [2, 2, 4, 8, 9]), a
 
 a = []
 assert a.sort() == None

+ 7 - 1
tests/95_bugs.py

@@ -142,4 +142,10 @@ assert a.__new__ == list.__new__
 class A:
     x: list[int] = [i for i in range(1, 4)]
 
-assert A.x == [1, 2, 3]
+assert A.x == [1, 2, 3]
+
+# stable sort
+a = [(0, 1), (1, 1), (1, 2)]
+b = sorted(a, key=lambda x: x[0])
+if b != [(0, 1), (1, 1), (1, 2)]:
+    assert False, b