ecere/containers/Array: Fixed quick sort issues on Emscripten
[sdk] / ecere / src / com / containers / Array.ec
index b27c325..096bde3 100644 (file)
@@ -30,14 +30,14 @@ private:
 static inline void quickSort(void *base, uintsize nel, uintsize w, char * piv, int (*compare)(void *, const void *, const void *), void *arg)
 {
    #define MAX_LEVELS  300
-   uintsize beg[MAX_LEVELS], end[MAX_LEVELS];
+   intsize beg[MAX_LEVELS], end[MAX_LEVELS];
    int frame = 0;
 
    beg[0] = 0;
    end[0] = nel;
    while(frame >= 0)
    {
-      uintsize L = beg[frame], R = end[frame]-1;
+      intsize L = beg[frame], R = end[frame]-1;
       if(L < R)
       {
          memcpy(piv, (char *)base + L*w, w);
@@ -64,7 +64,7 @@ static inline void quickSort(void *base, uintsize nel, uintsize w, char * piv, i
          // Process smaller partition first
          if(end[frame]-beg[frame] > end[frame-1]-beg[frame-1])
          {
-            uintsize swap;
+            intsize swap;
             swap = beg[frame]; beg[frame] = beg[frame-1]; beg[frame-1] = swap;
             swap = end[frame]; end[frame] = end[frame-1]; end[frame-1] = swap;
          }
@@ -170,6 +170,7 @@ public:
       Array array = eInstance_New(_class); //.fullName);
       uint count, c;
       Class Dclass = class(D);
+      incref array;
       channel.Get(count);
 #ifdef _DEBUG
       //printf("%d %ss\n", count, Dclass.name);
@@ -391,7 +392,7 @@ public:
    void Sort(bool ascending)
    {
       Class Dclass = class(D);
-      bool byRef = (Dclass.type == systemClass && !Dclass.byValueSystemClass) || Dclass.type == bitClass || Dclass.type == enumClass || Dclass.type == unitClass;
+      bool byRef = (Dclass.type == systemClass && !Dclass.byValueSystemClass) || Dclass.type == bitClass || Dclass.type == enumClass || Dclass.type == unitClass || Dclass.type == structClass;
       _qsortrx(array, count, Dclass.typeSize, (void *)Dclass._vTbl[__ecereVMethodID_class_OnCompare], null, Dclass, !byRef, ascending);
    }
 };