@@ -901,16 +901,34 @@ export class Series<T extends Scalar = Scalar> {
901901 if ( allNumeric ) {
902902 if ( ascending ) {
903903 for ( let i = 0 , si = 0 ; i < finCount ; i ++ , si += 3 ) {
904- const idx = srcBuf [ si ] ! ;
905- perm [ pos ] = idx ;
906- outData [ pos ] = vals [ idx ] as T ;
904+ const origIdx = srcBuf [ si ] ! ;
905+ const keyLo = srcBuf [ si + 1 ] ! ;
906+ const keyHi = srcBuf [ si + 2 ] ! ;
907+ perm [ pos ] = origIdx ;
908+ if ( keyHi & 0x80000000 ) {
909+ _fvalsU32 [ 0 ] = keyLo ;
910+ _fvalsU32 [ 1 ] = ( keyHi ^ 0x80000000 ) >>> 0 ;
911+ } else {
912+ _fvalsU32 [ 0 ] = ~ keyLo >>> 0 ;
913+ _fvalsU32 [ 1 ] = ~ keyHi >>> 0 ;
914+ }
915+ outData [ pos ] = _fvals [ 0 ] as T ;
907916 pos = pos + 1 ;
908917 }
909918 } else {
910919 for ( let i = finCount - 1 , si = ( finCount - 1 ) * 3 ; i >= 0 ; i -- , si -= 3 ) {
911- const idx = srcBuf [ si ] ! ;
912- perm [ pos ] = idx ;
913- outData [ pos ] = vals [ idx ] as T ;
920+ const origIdx = srcBuf [ si ] ! ;
921+ const keyLo = srcBuf [ si + 1 ] ! ;
922+ const keyHi = srcBuf [ si + 2 ] ! ;
923+ perm [ pos ] = origIdx ;
924+ if ( keyHi & 0x80000000 ) {
925+ _fvalsU32 [ 0 ] = keyLo ;
926+ _fvalsU32 [ 1 ] = ( keyHi ^ 0x80000000 ) >>> 0 ;
927+ } else {
928+ _fvalsU32 [ 0 ] = ~ keyLo >>> 0 ;
929+ _fvalsU32 [ 1 ] = ~ keyHi >>> 0 ;
930+ }
931+ outData [ pos ] = _fvals [ 0 ] as T ;
914932 pos = pos + 1 ;
915933 }
916934 }
@@ -926,16 +944,36 @@ export class Series<T extends Scalar = Scalar> {
926944 if ( allNumeric ) {
927945 if ( ascending ) {
928946 for ( let i = 0 , si = 0 ; i < finCount ; i ++ , si += 3 ) {
929- const idx = srcBuf [ si ] ! ;
930- perm [ pos ] = idx ;
931- outData [ pos ] = vals [ idx ] as T ;
947+ const origIdx = srcBuf [ si ] ! ;
948+ const keyLo = srcBuf [ si + 1 ] ! ;
949+ const keyHi = srcBuf [ si + 2 ] ! ;
950+ perm [ pos ] = origIdx ;
951+ // Reverse the IEEE-754 sign-transform to recover the original float bits,
952+ // avoiding a random read into the JS values array.
953+ if ( keyHi & 0x80000000 ) {
954+ _fvalsU32 [ 0 ] = keyLo ;
955+ _fvalsU32 [ 1 ] = ( keyHi ^ 0x80000000 ) >>> 0 ;
956+ } else {
957+ _fvalsU32 [ 0 ] = ~ keyLo >>> 0 ;
958+ _fvalsU32 [ 1 ] = ~ keyHi >>> 0 ;
959+ }
960+ outData [ pos ] = _fvals [ 0 ] as T ;
932961 pos = pos + 1 ;
933962 }
934963 } else {
935964 for ( let i = finCount - 1 , si = ( finCount - 1 ) * 3 ; i >= 0 ; i -- , si -= 3 ) {
936- const idx = srcBuf [ si ] ! ;
937- perm [ pos ] = idx ;
938- outData [ pos ] = vals [ idx ] as T ;
965+ const origIdx = srcBuf [ si ] ! ;
966+ const keyLo = srcBuf [ si + 1 ] ! ;
967+ const keyHi = srcBuf [ si + 2 ] ! ;
968+ perm [ pos ] = origIdx ;
969+ if ( keyHi & 0x80000000 ) {
970+ _fvalsU32 [ 0 ] = keyLo ;
971+ _fvalsU32 [ 1 ] = ( keyHi ^ 0x80000000 ) >>> 0 ;
972+ } else {
973+ _fvalsU32 [ 0 ] = ~ keyLo >>> 0 ;
974+ _fvalsU32 [ 1 ] = ~ keyHi >>> 0 ;
975+ }
976+ outData [ pos ] = _fvals [ 0 ] as T ;
939977 pos = pos + 1 ;
940978 }
941979 }
0 commit comments