@@ -315,10 +315,8 @@ static int datatype_name_cmp(jl_value_t *a, jl_value_t *b) JL_NOTSAFEPOINT
315
315
316
316
// sort singletons first, then DataTypes, then UnionAlls,
317
317
// ties broken alphabetically including module name & type parameters
318
- static int union_sort_cmp (const void * ap , const void * bp ) JL_NOTSAFEPOINT
318
+ static int union_sort_cmp (jl_value_t * a , jl_value_t * b ) JL_NOTSAFEPOINT
319
319
{
320
- jl_value_t * a = * (jl_value_t * * )ap ;
321
- jl_value_t * b = * (jl_value_t * * )bp ;
322
320
if (a == NULL )
323
321
return b == NULL ? 0 : 1 ;
324
322
if (b == NULL )
@@ -353,16 +351,33 @@ static int union_sort_cmp(const void *ap, const void *bp) JL_NOTSAFEPOINT
353
351
}
354
352
}
355
353
354
+ static void isort_union (jl_value_t * * a , size_t len ) JL_NOTSAFEPOINT
355
+ {
356
+ size_t i , j ;
357
+ for (i = 1 ; i < len ; i ++ ) {
358
+ jl_value_t * x = a [i ];
359
+ for (j = i ; j > 0 ; j -- ) {
360
+ jl_value_t * y = a [j - 1 ];
361
+ if (!(union_sort_cmp (x , y ) < 0 ))
362
+ break ;
363
+ a [j ] = y ;
364
+ }
365
+ a [j ] = x ;
366
+ }
367
+ }
368
+
356
369
JL_DLLEXPORT jl_value_t * jl_type_union (jl_value_t * * ts , size_t n )
357
370
{
358
- if (n == 0 ) return (jl_value_t * )jl_bottom_type ;
371
+ if (n == 0 )
372
+ return (jl_value_t * )jl_bottom_type ;
359
373
size_t i ;
360
- for ( i = 0 ; i < n ; i ++ ) {
374
+ for ( i = 0 ; i < n ; i ++ ) {
361
375
jl_value_t * pi = ts [i ];
362
376
if (!(jl_is_type (pi ) || jl_is_typevar (pi )) || jl_is_vararg_type (pi ))
363
377
jl_type_error ("Union" , (jl_value_t * )jl_type_type , pi );
364
378
}
365
- if (n == 1 ) return ts [0 ];
379
+ if (n == 1 )
380
+ return ts [0 ];
366
381
367
382
size_t nt = count_union_components (ts , n );
368
383
jl_value_t * * temp ;
@@ -371,9 +386,9 @@ JL_DLLEXPORT jl_value_t *jl_type_union(jl_value_t **ts, size_t n)
371
386
flatten_type_union (ts , n , temp , & count );
372
387
assert (count == nt );
373
388
size_t j ;
374
- for ( i = 0 ; i < nt ; i ++ ) {
375
- int has_free = temp [i ]!= NULL && jl_has_free_typevars (temp [i ]);
376
- for ( j = 0 ; j < nt ; j ++ ) {
389
+ for ( i = 0 ; i < nt ; i ++ ) {
390
+ int has_free = temp [i ] != NULL && jl_has_free_typevars (temp [i ]);
391
+ for ( j = 0 ; j < nt ; j ++ ) {
377
392
if (j != i && temp [i ] && temp [j ]) {
378
393
if (temp [i ] == temp [j ] || temp [i ] == jl_bottom_type ||
379
394
temp [j ] == (jl_value_t * )jl_any_type ||
@@ -385,7 +400,7 @@ JL_DLLEXPORT jl_value_t *jl_type_union(jl_value_t **ts, size_t n)
385
400
}
386
401
}
387
402
}
388
- qsort (temp , nt , sizeof ( jl_value_t * ), union_sort_cmp );
403
+ isort_union (temp , nt );
389
404
jl_value_t * * ptu = & temp [nt ];
390
405
* ptu = jl_bottom_type ;
391
406
int k ;
0 commit comments