@@ -1003,9 +1003,9 @@ fn compare_scalar(
10031003 }
10041004 ( NUMBER_TAG , NUMBER_TAG ) => {
10051005 let left_offset = left_jentry. length as usize ;
1006- let left_num = Number :: decode ( & left[ ..left_offset] ) ;
1006+ let left_num = Number :: decode ( & left[ ..left_offset] ) ? ;
10071007 let right_offset = right_jentry. length as usize ;
1008- let right_num = Number :: decode ( & right[ ..right_offset] ) ;
1008+ let right_num = Number :: decode ( & right[ ..right_offset] ) ? ;
10091009 Ok ( left_num. cmp ( & right_num) )
10101010 }
10111011 ( TRUE_TAG , TRUE_TAG ) => Ok ( Ordering :: Equal ) ,
@@ -1047,7 +1047,7 @@ fn compare_array(
10471047 let mut jentry_offset = 0 ;
10481048 let mut left_val_offset = 4 * left_length;
10491049 let mut right_val_offset = 4 * right_length;
1050- let length = if left_length < right_length {
1050+ let length = if left_length <= right_length {
10511051 left_length
10521052 } else {
10531053 right_length
@@ -1088,34 +1088,39 @@ fn compare_object(
10881088 let left_length = ( left_header & CONTAINER_HEADER_LEN_MASK ) as usize ;
10891089 let right_length = ( right_header & CONTAINER_HEADER_LEN_MASK ) as usize ;
10901090
1091- let mut jentry_offset = 0 ;
1091+ let mut left_jentry_offset = 0 ;
10921092 let mut left_val_offset = 8 * left_length;
1093+ let mut right_jentry_offset = 0 ;
10931094 let mut right_val_offset = 8 * right_length;
10941095
1095- let length = if left_length < right_length {
1096- left_length
1097- } else {
1098- right_length
1099- } ;
1100- // read all key jentries first
1101- let mut left_key_jentries: VecDeque < JEntry > = VecDeque :: with_capacity ( length) ;
1102- let mut right_key_jentries: VecDeque < JEntry > = VecDeque :: with_capacity ( length) ;
1103- for _ in 0 ..length {
1104- let left_encoded = read_u32 ( left, jentry_offset) ?;
1096+ // read all left key jentries and right key jentries first.
1097+ // Note: since the values are stored after the keys,
1098+ // we must first read all the key jentries to get the correct value offset.
1099+ let mut left_key_jentries: VecDeque < JEntry > = VecDeque :: with_capacity ( left_length) ;
1100+ let mut right_key_jentries: VecDeque < JEntry > = VecDeque :: with_capacity ( right_length) ;
1101+ for _ in 0 ..left_length {
1102+ let left_encoded = read_u32 ( left, left_jentry_offset) ?;
11051103 let left_key_jentry = JEntry :: decode_jentry ( left_encoded) ;
1106- let right_encoded = read_u32 ( right, jentry_offset) ?;
1107- let right_key_jentry = JEntry :: decode_jentry ( right_encoded) ;
11081104
1109- jentry_offset += 4 ;
1105+ left_jentry_offset += 4 ;
11101106 left_val_offset += left_key_jentry. length as usize ;
1111- right_val_offset += right_key_jentry. length as usize ;
1112-
11131107 left_key_jentries. push_back ( left_key_jentry) ;
1108+ }
1109+ for _ in 0 ..right_length {
1110+ let right_encoded = read_u32 ( right, right_jentry_offset) ?;
1111+ let right_key_jentry = JEntry :: decode_jentry ( right_encoded) ;
1112+
1113+ right_jentry_offset += 4 ;
1114+ right_val_offset += right_key_jentry. length as usize ;
11141115 right_key_jentries. push_back ( right_key_jentry) ;
11151116 }
11161117
1117- let mut left_jentry_offset = 4 * left_length;
1118- let mut right_jentry_offset = 4 * right_length;
1118+ let length = if left_length <= right_length {
1119+ left_length
1120+ } else {
1121+ right_length
1122+ } ;
1123+
11191124 let mut left_key_offset = 8 * left_length;
11201125 let mut right_key_offset = 8 * right_length;
11211126 for _ in 0 ..length {
@@ -1247,8 +1252,7 @@ pub fn as_number(value: &[u8]) -> Option<Number> {
12471252 match jentry. type_code {
12481253 NUMBER_TAG => {
12491254 let length = jentry. length as usize ;
1250- let num = Number :: decode ( & value[ 8 ..8 + length] ) ;
1251- Some ( num)
1255+ Number :: decode ( & value[ 8 ..8 + length] ) . ok ( )
12521256 }
12531257 _ => None ,
12541258 }
@@ -1523,7 +1527,7 @@ fn scalar_to_serde_json(jentry: JEntry, value: &[u8]) -> Result<serde_json::Valu
15231527 FALSE_TAG => serde_json:: Value :: Bool ( false ) ,
15241528 NUMBER_TAG => {
15251529 let len = jentry. length as usize ;
1526- let n = Number :: decode ( & value[ ..len] ) ;
1530+ let n = Number :: decode ( & value[ ..len] ) ? ;
15271531 match n {
15281532 Number :: Int64 ( v) => serde_json:: Value :: Number ( serde_json:: Number :: from ( v) ) ,
15291533 Number :: UInt64 ( v) => serde_json:: Value :: Number ( serde_json:: Number :: from ( v) ) ,
@@ -1733,7 +1737,7 @@ fn scalar_to_string(
17331737 TRUE_TAG => json. push_str ( "true" ) ,
17341738 FALSE_TAG => json. push_str ( "false" ) ,
17351739 NUMBER_TAG => {
1736- let num = Number :: decode ( & value[ * value_offset..* value_offset + length] ) ;
1740+ let num = Number :: decode ( & value[ * value_offset..* value_offset + length] ) ? ;
17371741 json. push_str ( & num. to_string ( ) ) ;
17381742 }
17391743 STRING_TAG => {
@@ -1860,15 +1864,16 @@ fn scalar_convert_to_comparable(depth: u8, jentry: &JEntry, value: &[u8], buf: &
18601864 }
18611865 NUMBER_TAG => {
18621866 let length = jentry. length as usize ;
1863- let num = Number :: decode ( & value[ ..length] ) ;
1864- let n = num. as_f64 ( ) . unwrap ( ) ;
1865- // https://github.com/rust-lang/rust/blob/9c20b2a8cc7588decb6de25ac6a7912dcef24d65/library/core/src/num/f32.rs#L1176-L1260
1866- let s = n. to_bits ( ) as i64 ;
1867- let v = s ^ ( ( ( s >> 63 ) as u64 ) >> 1 ) as i64 ;
1868- let mut b = v. to_be_bytes ( ) ;
1869- // Toggle top "sign" bit to ensure consistent sort order
1870- b[ 0 ] ^= 0x80 ;
1871- buf. extend_from_slice ( & b) ;
1867+ if let Ok ( num) = Number :: decode ( & value[ ..length] ) {
1868+ let n = num. as_f64 ( ) . unwrap ( ) ;
1869+ // https://github.com/rust-lang/rust/blob/9c20b2a8cc7588decb6de25ac6a7912dcef24d65/library/core/src/num/f32.rs#L1176-L1260
1870+ let s = n. to_bits ( ) as i64 ;
1871+ let v = s ^ ( ( ( s >> 63 ) as u64 ) >> 1 ) as i64 ;
1872+ let mut b = v. to_be_bytes ( ) ;
1873+ // Toggle top "sign" bit to ensure consistent sort order
1874+ b[ 0 ] ^= 0x80 ;
1875+ buf. extend_from_slice ( & b) ;
1876+ }
18721877 }
18731878 _ => { }
18741879 }
0 commit comments