@@ -605,6 +605,35 @@ fn float3() {
605605 assert_eq ! ( v_simd, v_serde) ;
606606}
607607
608+ // https://github.com/simd-lite/simd-json/issues/455
609+ // Float parsing was corrupted when a long decimal number extended >= 13 bytes
610+ // past a 64-byte SIMD chunk boundary.
611+ #[ test]
612+ fn float_across_chunk_boundary ( ) {
613+ // "3077999.0000000000000000" (24 bytes) starts at byte offset 56;
614+ // 8 bytes are in chunk 0, the remaining 16 spill into chunk 1.
615+ let json: & [ u8 ] =
616+ br#"{"asks":[{"price":3077990.0,"amount":0.111111},{"price":3077999.0000000000000000,"amount":0.5}]}"# ;
617+ assert_eq ! ( & json[ 56 ..80 ] , b"3077999.0000000000000000" ) ;
618+ let mut d = json. to_vec ( ) ;
619+ let v_serde: serde_json:: Value = serde_json:: from_slice ( json) . expect ( "serde_json" ) ;
620+ let v_simd: serde_json:: Value = from_slice ( & mut d) . expect ( "simd_json" ) ;
621+ assert_eq ! ( v_simd, v_serde) ;
622+
623+ // Sweep the number start offset within the 64-byte chunk to cover every
624+ // possible boundary split of the 24-byte number.
625+ for pad in 0 ..64 {
626+ let json = format ! (
627+ r#"{{"pad":"{}","price":3077999.0000000000000000,"amount":0.5}}"# ,
628+ "x" . repeat( pad)
629+ ) ;
630+ let mut d = json. clone ( ) . into_bytes ( ) ;
631+ let v_serde: serde_json:: Value = serde_json:: from_str ( & json) . expect ( "serde_json" ) ;
632+ let v_simd: serde_json:: Value = from_slice ( & mut d) . expect ( "simd_json" ) ;
633+ assert_eq ! ( v_simd, v_serde, "mismatch at pad {pad}" ) ;
634+ }
635+ }
636+
608637#[ test]
609638fn map0 ( ) {
610639 let mut d = String :: from ( r#"{"snot": "badger"}"# ) ;
0 commit comments